C callbacks cleaned up and ported to new API
authorespen <espen>
Sun, 19 Feb 2006 19:31:14 +0000 (19:31 +0000)
committerespen <espen>
Sun, 19 Feb 2006 19:31:14 +0000 (19:31 +0000)
glib/gcallback.lisp
glib/gerror.lisp
glib/gobject.lisp
gtk/gtk.lisp
gtk/gtkcontainer.lisp
gtk/gtkselection.lisp
gtk/gtktext.lisp
gtk/gtktree.lisp

index 976bc64..0598e44 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gcallback.lisp,v 1.29 2006-02-08 19:56:25 espen Exp $
+;; $Id: gcallback.lisp,v 1.30 2006-02-19 19:31:14 espen Exp $
 
 (in-package "GLIB")
 
   (register-user-data function))
 
 ;; Callback marshal for regular signal handlers
-(defcallback closure-marshal (nil
-                             (gclosure pointer)
-                             (return-value gvalue)
-                             (n-params unsigned-int) 
-                             (param-values pointer)
-                             (invocation-hint pointer) 
-                             (callback-id unsigned-int))
+(define-callback closure-marshal nil
+    ((gclosure gclosure) (return-value gvalue) (n-params unsigned-int) 
+     (param-values pointer) (invocation-hint pointer) 
+     (callback-id unsigned-int))
   (declare (ignore gclosure invocation-hint))
   (callback-trampoline callback-id n-params param-values return-value))
 
 ;; Callback function for emission hooks
-(defcallback signal-emission-hook (nil
-                                  (invocation-hint pointer)
-                                  (n-params unsigned-int) 
-                                  (param-values pointer)
-                                  (callback-id unsigned-int))
+(define-callback signal-emission-hook nil
+    ((invocation-hint pointer) (n-params unsigned-int) (param-values pointer)
+     (callback-id unsigned-int))
   (callback-trampoline callback-id n-params param-values))
 
 (defun callback-trampoline (callback-id n-params param-values &optional
 (defbinding source-remove () boolean
   (tag unsigned-int))
 
-(defcallback source-callback-marshal (nil (callback-id unsigned-int))
+(define-callback source-callback-marshal nil ((callback-id unsigned-int))
   (callback-trampoline callback-id 0 nil))
 
 (defbinding (timeout-add "g_timeout_add_full")
     (interval function &optional (priority +priority-default+)) unsigned-int 
   (priority int)
   (interval unsigned-int)
-  ((callback source-callback-marshal) pointer)
+  (source-callback-marshal callback)
   ((register-callback-function function) unsigned-long)
-  ((callback user-data-destroy-func) pointer))
+  (user-data-destroy-callback callback))
 
 (defun timeout-remove (timeout)
   (source-remove timeout))
 (defbinding (idle-add "g_idle_add_full")
     (function &optional (priority +priority-default-idle+)) unsigned-int 
   (priority int)
-  ((callback source-callback-marshal) pointer)
+  (source-callback-marshal callback)
   ((register-callback-function function) unsigned-long)
-  ((callback user-data-destroy-func) pointer))
+  (user-data-destroy-callback callback))
 
 (defun idle-remove (idle)
   (source-remove idle))
     unsigned-int
   ((ensure-signal-id-from-type signal type) unsigned-int)
   (detail quark)
-  ((callback signal-emission-hook) pointer)
+  (signal-emission-hook callback)
   ((register-callback-function function) unsigned-int)
-  ((callback user-data-destroy-func) pointer))
+  (user-data-destroy-callback callback))
 
 (defbinding signal-remove-emission-hook (type signal hook-id) nil
   ((ensure-signal-id-from-type signal type) unsigned-int)
   (handler-id unsigned-int))
 
 (deftype gclosure () 'pointer)
-(register-type 'gclosure "GClosure")
+(register-type 'gclosure '|g_closure_get_type|)
 
 (defbinding (callback-closure-new "clg_callback_closure_new") () gclosure
   (callback-id unsigned-int) 
-  (callback pointer)
-  (destroy-notify pointer))
+  (callback callback)
+  (destroy-notify callback))
 
 (defun make-callback-closure (function)
   (let ((callback-id (register-callback-function function)))
     (values
-     (callback-closure-new 
-      callback-id (callback closure-marshal) 
-      (callback user-data-destroy-func))
+     (callback-closure-new callback-id closure-marshal user-data-destroy-callback)
      callback-id)))
 
 (defgeneric compute-signal-function (gobject signal function object))
@@ -449,19 +442,41 @@ once."
 
 ;;;; Convenient macros
 
-(defmacro def-callback-marshal (name (return-type &rest args))
-  (let ((names (loop 
-               for arg in args 
-               collect (if (atom arg) (gensym) (first arg))))
-       (types (loop 
-               for arg in args 
-               collect (if (atom arg) arg (second arg)))))
-    `(defcallback ,name (,return-type ,@(mapcar #'list names types)
-                        (callback-id unsigned-int))
-      (invoke-callback callback-id ',return-type ,@names))))
+(defmacro define-callback-marshal (name return-type args &key (callback-id :last))
+  (let* ((ignore ())
+        (params ())
+        (names (loop 
+                for arg in args 
+                collect (if (or 
+                             (eq arg :ignore) 
+                             (and (consp arg) (eq (first arg) :ignore)))
+                            (let ((name (gensym "IGNORE")))
+                              (push name ignore)
+                              name)
+                          (let ((name (if (atom arg)
+                                          (gensym (string arg))
+                                        (first arg))))
+                            (push name params)
+                            name))))
+        (types (loop 
+                for arg in args 
+                collect (cond
+                         ((eq arg :ignore) 'pointer)
+                         ((atom arg) arg)
+                         (t (second arg))))))
+    `(define-callback ,name ,return-type 
+       ,(ecase callback-id
+         (:first `((callback-id unsigned-int) ,@(mapcar #'list names types)))
+         (:last `(,@(mapcar #'list names types) (callback-id unsigned-int))))
+       (declare (ignore ,@ignore))
+       (invoke-callback callback-id ',return-type ,@params))))
 
 (defmacro with-callback-function ((id function) &body body)
   `(let ((,id (register-callback-function ,function)))
     (unwind-protect
         (progn ,@body)
       (destroy-user-data ,id))))
+
+;; For backward compatibility
+(defmacro def-callback-marshal (name (return-type &rest args))
+  `(define-callback-marshal ,name ,return-type ,args))
index c8cbd23..e19063f 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gerror.lisp,v 1.3 2006-02-13 20:03:29 espen Exp $
+;; $Id: gerror.lisp,v 1.4 2006-02-19 19:31:14 espen Exp $
 
 
 (in-package "GLIB")
 
 (defparameter *fatal-log-levels* '(error-log-level critical-log-level))
 
-(defcallback log-handler (nil 
-                          (domain (copy-of string))
-                          (log-level log-levels)
-                          (message (copy-of string)))
+(define-callback log-handler nil 
+    ((domain string) (log-level log-levels) (message string))
   (let ((fatal-p (or
                  (find :fatal log-level)
                  (some 
     (funcall (if fatal-p #'error #'warn) condition
      :domain domain :message message)))
 
-(setf (extern-alien "log_handler" system-area-pointer) (callback log-handler))
+(setf (extern-alien "log_handler" system-area-pointer) 
+ (callback-address log-handler))
 
 
 #+glib2.6
   ;; abort (SIGABORT being signaled). To make things even worse, SBCL
   ;; doesn't handle SIGABRT at all.
   (defbinding %log-set-default-handler () pointer
-    ((callback log-handler) pointer)
+    ((progn log-handler) callback)
     (nil null))
   (%log-set-default-handler))
index 51086f5..aa951f8 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gobject.lisp,v 1.47 2006-02-15 09:45:41 espen Exp $
+;; $Id: gobject.lisp,v 1.48 2006-02-19 19:31:14 espen Exp $
 
 (in-package "GLIB")
 
@@ -64,7 +64,8 @@
 
 #+glib2.8
 (progn
-  (defcallback toggle-ref-callback (nil (data pointer) (location pointer) (last-ref-p boolean))
+  (define-callback toggle-ref-callback nil
+      ((data pointer) (location pointer) (last-ref-p boolean))
     #+debug-ref-counting
     (if last-ref-p
        (format t "Object at 0x~8,'0X has no foreign references~%" (sap-int location))
 
   (defbinding %object-add-toggle-ref () pointer
     (location pointer)
-    ((callback toggle-ref-callback) pointer)
+    (toggle-ref-callback callback)
     (nil null))
 
   (defbinding %object-remove-toggle-ref () pointer
     (location pointer)
-    ((callback toggle-ref-callback) pointer)
+    (toggle-ref-callback callback)
     (nil null)))
 
 (defmethod reference-foreign ((class gobject-class) location)
 
 #+debug-ref-counting
 (progn
-  (defcallback weak-ref-callback (nil (data pointer) (location pointer))
+  (define-callback weak-ref-callback nil ((data pointer) (location pointer))
     (format t "Object at 0x~8,'0X being finalized~%" (sap-int location)))
   
   (defbinding %object-weak-ref () pointer
     (location pointer)
-    ((callback weak-ref-callback) pointer)
+    (weak-ref-callback callback)
     (nil null)))
 
 
   (object gobject)
   (id quark)
   (data unsigned-long)
-  (destroy-marshal pointer))
+  (destroy-marshal callback))
 
-(defcallback user-data-destroy-func (nil (id unsigned-int))
+(define-callback user-data-destroy-callback nil ((id unsigned-int))
   (destroy-user-data id))
 
-(export 'user-data-destroy-func)
-
 (defun (setf user-data) (data object key)
   (%object-set-qdata-full object (quark-intern key)
-   (register-user-data data) (callback user-data-destroy-func))
+   (register-user-data data) user-data-destroy-callback)
   data)
 
 ;; deprecated
index ae4eb10..5ba1626 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gtk.lisp,v 1.53 2006-02-16 19:39:34 espen Exp $
+;; $Id: gtk.lisp,v 1.54 2006-02-19 19:31:14 espen Exp $
 
 
 (in-package "GTK")
 
 #+gtk2.6
 (progn
-  (def-callback-marshal %about-dialog-activate-link-func 
-    (nil (dialog about-dialog) (link (copy-of string))))
+  (define-callback-marshal %about-dialog-activate-link-callback nil
+    (about-dialog (link string)))
 
   (defbinding about-dialog-set-email-hook (function) nil
-    ((callback %about-dialog-activate-link-func) pointer)
+    (%about-dialog-activate-link-callback callback)
     ((register-callback-function function) unsigned-int)
-    ((callback user-data-destroy-func) pointer))
+    (user-data-destroy-callback callback))
   
   (defbinding about-dialog-set-url-hook (function) nil
-    ((callback %about-dialog-activate-link-func) pointer)
+    (%about-dialog-activate-link-callback callback)
     ((register-callback-function function) unsigned-int)
-    ((callback user-data-destroy-func) pointer)))
+    (user-data-destroy-callback callback)))
 
 
 ;;; Acccel group
 (defbinding accel-map-save () nil
   (filename pathname))
 
-(defcallback %accel-map-foreach-func 
-    (nil
-     (callback-id unsigned-int) (accel-path (copy-of string)) 
-     (key unsigned-int) (modifiers gdk:modifier-type) (changed boolean))
-  (invoke-callback callback-id nil accel-path key modifiers changed))
+(define-callback-marshal %accel-map-foreach-callback nil
+  ((accel-path string) (key unsigned-int) 
+   (modifiers gdk:modifier-type) (changed boolean)) :callback-id :first)
 
 (defbinding %accel-map-foreach (callback-id) nil
   (callback-id unsigned-int)
-  (%accel-map-foreach-func callback))
+  (%accel-map-foreach-callback callback))
 
 (defbinding %accel-map-foreach-unfiltered (callback-id) nil
   (callback-id unsigned-int)
-  (%accel-map-foreach-func callback))
+  (%accel-map-foreach-callback callback))
 
 (defun accel-map-foreach (function &optional (filter-p t))
   (with-callback-function (id function)
 
 ;;; Entry Completion
 
-(def-callback-marshal %entry-completion-match-func
-    (boolean entry-completion string (copy-of tree-iter)))
+(define-callback-marshal %entry-completion-match-callback boolean 
+  (entry-completion string tree-iter))
 
 (defbinding entry-completion-set-match-func (completion function) nil
   (completion entry-completion)
-  ((callback %entry-completion-match-func) pointer)
+  (%entry-completion-match-callback callback)
   ((register-callback-function function) unsigned-int)
-  ((callback user-data-destroy-func) pointer))
+  (user-data-destroy-callback callback))
 
 (defbinding entry-completion-complete () nil
   (completion entry-completion))
 (defbinding file-filter-add-pixbuf-formats () nil
   (filter file-filter))
 
-(def-callback-marshal %file-filter-func (boolean file-filter-info))
+(define-callback-marshal %file-filter-callback boolean (file-filter-info))
 
 (defbinding file-filter-add-custom (filter needed function) nil
   (filter file-filter)
   (needed file-filter-flags)
-  ((callback %file-filter-func) pointer)
+  (%file-filter-callback callback)
   ((register-callback-function function) unsigned-int)
-  ((callback user-data-destroy-func) pointer))
+  (user-data-destroy-callback callback))
 
 (defbinding file-filter-get-needed () file-filter-flags
   (filter file-filter))
   (top-attach unsigned-int)
   (bottom-attach unsigned-int))
 
-(def-callback-marshal %menu-position-func (nil (menu menu) (x int) (y int) (push-in boolean)))
+(define-callback-marshal %menu-position-callback nil 
+  (menu (x int) (y int) (push-in boolean)))
 
 (defbinding %menu-popup () nil
   (menu menu)
   (parent-menu-shell (or null menu-shell))
   (parent-menu-item (or null menu-item))
-  (callback-func (or null pointer))
+  (callback (or null callback))
   (callback-id unsigned-int)
   (button unsigned-int)
   (activate-time (unsigned 32)))
       (with-callback-function (id callback)
        (%menu-popup 
         menu parent-menu-shell parent-menu-item 
-        (callback %menu-position-func) id button activate-time))
+        %menu-position-callback id button activate-time))
     (%menu-popup
      menu parent-menu-shell parent-menu-item nil 0 button activate-time)))
  
   (%menu-set-active menu (%menu-position menu child))
   child)
   
-(defcallback %menu-detach-func (nil (widget widget) (menu menu))
+(define-callback %menu-detach-callback nil ((widget widget) (menu menu))
   (funcall (object-data menu 'detach-func) widget menu))
 
 (defbinding %menu-attach-to-widget () nil
   (menu menu)
   (widget widget)
-  ((callback %menu-detach-func) pointer))
+  (%menu-detach-callback callback))
 
 (defun menu-attach-to-widget (menu widget function)
   (setf (object-data menu 'detach-func) function)
index 2987297..4cd200e 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gtkcontainer.lisp,v 1.18 2005-04-23 16:48:52 espen Exp $
+;; $Id: gtkcontainer.lisp,v 1.19 2006-02-19 19:31:14 espen Exp $
 
 (in-package "GTK")
 
 (defbinding container-check-resize () nil
   (container container))
 
-(def-callback-marshal %foreach-callback (nil widget))
+(define-callback-marshal %foreach-callback nil (widget))
 
 (defbinding %container-foreach (container callback-id) nil
   (container container)
-  ((callback %foreach-callback) pointer)
+  (%foreach-callback callback)
   (callback-id unsigned-int))
 
 (defun container-foreach (container function)
 
 (defbinding %container-forall (container callback-id) nil
   (container container)
-  ((callback %foreach-callback) pointer)
+  (%foreach-callback callback)
   (callback-id unsigned-int))
 
 (defun container-forall (container function)
index 3c0eee2..56d86e7 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gtkselection.lisp,v 1.5 2006-02-09 22:32:47 espen Exp $
+;; $Id: gtkselection.lisp,v 1.6 2006-02-19 19:31:15 espen Exp $
 
 
 (in-package "GTK")
   ((gdk:atom-intern selection) gdk:atom))
 
 
-(defcallback %clipboard-get-func (nil (clipboard pointer)
-                                     (selection-data selection-data)
-                                     (info int)
-                                     (user-data unsigned-int))
-  (funcall (car (find-user-data user-data)) selection-data info))
+(define-callback %clipboard-get-callback nil
+    ((clipboard pointer) (selection-data selection-data)
+     (info int) (callback-ids unsigned-int))
+  (funcall (car (find-user-data callback-ids)) selection-data info))
 
-(defcallback %clipboard-clear-func (nil (clipboard pointer)
-                                       (user-data unsigned-int))
-  (funcall (cdr (find-user-data user-data))))
+(define-callback %clipboard-clear-callback nil
+    ((clipboard pointer) (callback-ids unsigned-int))
+  (funcall (cdr (find-user-data callback-ids))))
 
 (defbinding clipboard-set-with-data (clipboard targets get-func clear-func) gobject
   (clipboard clipboard)
   (targets (vector (inlined target-entry)))
   ((length targets) unsigned-int)
-  (%clipboard-get-func callback)
-  (%clipboard-clear-func callback)
+  (%clipboard-get-callback callback)
+  (%clipboard-clear-callback callback)
   ((register-user-data (cons get-func clear-func)) unsigned-int))
 
 (defbinding clipboard-clear () nil
     #+gtk2.6
     (gdk:pixbuf (clipboard-set-image clipboard object))))
 
-(defcallback %clipboard-receive-func (nil (clipboard pointer)
-                                         (selection-data selection-data)
-                                         (user-data unsigned-int))
-  (funcall (find-user-data user-data) selection-data))
+(define-callback-marshal %clipboard-receive-callback nil 
+ ((:ignore clipboard) selection-data))
 
 (defbinding clipboard-request-contents (clipboard target callback) nil
   (clipboard clipboard)
   ((gdk:atom-intern target) gdk:atom)
-  (%clipboard-receive-func callback)
+  (%clipboard-receive-callback callback)
   ((register-callback-function callback) unsigned-int))
 
-(defcallback %clipboard-text-receive-func (nil (clipboard pointer)
-                                              (text (copy-of string))
-                                              (user-data unsigned-int))
-  (funcall (find-user-data user-data) text))
+(define-callback-marshal %clipboard-text-receive-callback nil
+  ((:ignore clipboard) (text string)))
+
 
 (defbinding clipboard-request-text (clipboard callback) nil
   (clipboard clipboard)
-  (%clipboard-text-receive-func callback)
+  (%clipboard-text-receive-callback callback)
   ((register-callback-function callback) unsigned-int))
 
 #+gtk2.6
 (progn
-  (defcallback %clipboard-image-receive-func (nil (clipboard pointer)
-                                                 (image gdk:pixbuf)
-                                                 (user-data unsigned-int))
-    (funcall (find-user-data user-data) image))
+  (define-callback-marshal %clipboard-image-receive-callback nil 
+    ((:ignore clipboard) (image gdk:pixbuf)))
 
   (defbinding clipboard-request-image (clipboard callback) nil
     (clipboard clipboard)
-    (%clipboard-image-receive-func callback)
+    (%clipboard-image-receive-callback callback)
     ((register-callback-function callback) unsigned-int)))
 
 
-(defcallback %clipboard-targets-receive-func 
-    (nil (clipboard pointer)
-        (atoms (vector gdk:atom n-atoms))
-        (n-atoms unsigned-int)
-        (user-data unsigned-int))
-  (funcall (find-user-data user-data) atoms))
+(define-callback %clipboard-targets-receive-callback nil
+    ((clipboard pointer) (atoms (vector gdk:atom n-atoms))
+     (n-atoms unsigned-int) (callback-id unsigned-int))
+  (funcall (find-user-data callback-id) atoms))
 
 (defbinding clipboard-request-targets (clipboard callback) nil
   (clipboard clipboard)
-  (%clipboard-targets-receive-func callback)
+  (%clipboard-targets-receive-callback callback)
   ((register-callback-function callback) unsigned-int))
 
 (defbinding clipboard-wait-for-contents () selection-data
index d7a5e19..2a28816 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gtktext.lisp,v 1.6 2005-04-23 16:48:52 espen Exp $
+;; $Id: gtktext.lisp,v 1.7 2006-02-19 19:31:15 espen Exp $
 
 
 (in-package "GTK")
   (iter text-iter)
   ((%ensure-tag tag iter) text-tag))
 
-(def-callback-marshal %text-char-predicate (boolean int))
+(define-callback-marshal %text-char-predicate-callback boolean (int))
 
 (defbinding text-iter-forward-find-char (iter predicate &optional limit) boolean
   (iter text-iter)
-  ((callback %text-char-predicate) pointer)
+  (%text-char-predicate-callback callback)
   ((register-callback-function predicate) unsigned-int)
   (limit (or null text-iter)))
 
 (defbinding text-iter-backward-find-char (iter predicate &optional limit) boolean
   (iter text-iter)
-  ((callback %text-char-predicate) pointer)
+  (%text-char-predicate-callback callback)
   ((register-callback-function predicate) unsigned-int)
   (limit (or null text-iter)))
 
   (table text-tag-table)
   (name string))
 
-(def-callback-marshal %text-tag-table-foreach (nil text-tag))
+(define-callback-marshal %text-tag-table-foreach-callback nil (text-tag))
 
 (defbinding text-tag-table-foreach (table function) nil
   (table text-tag-table)
-  ((callback %text-tag-table-foreach) pointer)
+  (%text-tag-table-foreach-callback callback)
   ((register-callback-function function) unsigned-int))
 
 
index 81c6896..52ee220 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gtktree.lisp,v 1.14 2006-02-09 22:32:47 espen Exp $
+;; $Id: gtktree.lisp,v 1.15 2006-02-19 19:31:15 espen Exp $
 
 
 (in-package "GTK")
   ((string-downcase attribute) string)
   (column int))
 
-(def-callback-marshal %cell-layout-data-func 
-    (nil cell-layout cell-renderer tree-model (copy-of tree-iter)))
+(define-callback-marshal %cell-layout-data-callback nil 
+  (cell-layout cell-renderer tree-model tree-iter))
 
 (defbinding cell-layout-set-cell-data-func (cell-layout cell function) nil
   (cell-layout cell-layout)
   (cell cell-renderer)
-  (%cell-layout-data-func callback)
+  (%cell-layout-data-callback callback)
   ((register-callback-function function) unsigned-int)
-  (user-data-destroy-func callback))
+  (user-data-destroy-callback callback))
 
 (defbinding cell-layout-clear-attributes () nil
   (cell-layout cell-layout)
   (iter tree-iter :return)
   (child tree-iter))
 
-(def-callback-marshal %tree-model-foreach-func 
-  (boolean tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
+(define-callback-marshal %tree-model-foreach-callback boolean 
+  (tree-model tree-path tree-iter))
 
-(defbinding %tree-model-foreach () nil
+(defbinding %tree-model-foreach (tree-model callback-id) nil
   (tree-model tree-model)
-  ((progn %tree-model-foreach-func) callback)
+  (%tree-model-foreach-callback callback)
   (callback-id unsigned-int))
 
 (defun tree-model-foreach (model function)
 
 ;;; Tree Selection
 
-(def-callback-marshal %tree-selection-func (boolean tree-selection tree-model (path (copy-of tree-path)) (path-currently-selected boolean)))
+(define-callback-marshal %tree-selection-callback boolean 
+  (tree-selection tree-model tree-path (path-currently-selected boolean)))
 
 (defbinding tree-selection-set-select-function (selection function) nil
   (selection tree-selection)
-  (%tree-selection-func callback)
+  (%tree-selection-callback callback)
   ((register-callback-function function) unsigned-int)
-  (user-data-destroy-func callback))
+  (user-data-destroy-callback callback))
 
 (defbinding tree-selection-get-selected 
     (selection &optional (iter (make-instance 'tree-iter))) boolean
   (nil null) 
   (iter tree-iter :return))
 
-(def-callback-marshal %tree-selection-foreach-func (nil tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
+(define-callback-marshal %tree-selection-foreach-callback nil (tree-model tree-path tree-iter))
 
-(defbinding %tree-selection-selected-foreach () nil
+(defbinding %tree-selection-selected-foreach (tree-selection callback-id) nil
   (tree-selection tree-selection)
-  ((progn %tree-selection-foreach-func) callback)
+  (%tree-selection-foreach-callback callback)
   (callback-id unsigned-int))
 
 (defun tree-selection-selected-foreach (selection function)
   (define-enum-type sort-order (:before -1) (:equal 0) (:after 1)))
 
 
-(def-callback-marshal %tree-iter-compare-func 
-  ((or int sort-order) tree-model (a (copy-of tree-iter)) (b (copy-of tree-iter))))
+(define-callback-marshal %tree-iter-compare-callback (or int sort-order)
+  (tree-model (a tree-iter) (b tree-iter)))
 
 (defbinding tree-sortable-sort-column-changed () nil
   (sortable tree-sortable))
 (defbinding %tree-sortable-set-sort-func (sortable column function) nil
   (sortable tree-sortable)
   ((column-index sortable column) int)
-  (%tree-iter-compare-func callback)
+  (%tree-iter-compare-callback callback)
   ((register-callback-function function) unsigned-int)
-  (user-data-destroy-func callback))
+  (user-data-destroy-callback callback))
 
 (defbinding %tree-sortable-set-default-sort-func () nil
   (sortable tree-sortable)
-  (compare-func (or null pointer))
+  (compare-func (or null callback))
   (callback-id unsigned-int)
-  (destroy-func (or null pointer)))
+  (destroy-func (or null callback)))
 
 (defun tree-sortable-set-sort-func (sortable column function)
   "Sets the comparison function used when sorting to be FUNCTION. If
@@ -633,9 +634,9 @@ then the model will sort using this function."
     (%tree-sortable-set-default-sort-func sortable nil 0 nil))
    ((eq column :default) 
     (%tree-sortable-set-default-sort-func sortable 
-     (callback %tree-iter-compare-func)
+     %tree-iter-compare-callback
      (register-callback-function function)
-     (callback user-data-destroy-func)))
+     user-data-destroy-callback))
    ((%tree-sortable-set-sort-func sortable column function))))
 
 (defbinding tree-sortable-has-default-sort-func-p () boolean
@@ -849,11 +850,11 @@ then the model will sort using this function."
   (tree-view tree-view)
   (path tree-path))
 
-(def-callback-marshal %tree-view-mapping-func (nil tree-view (path (copy-of tree-path))))
+(define-callback-marshal %tree-view-mapping-callback nil (tree-view tree-path))
 
-(defbinding %tree-view-map-expanded-rows () nil
+(defbinding %tree-view-map-expanded-rows (tree-view callback-id) nil
   (tree-view tree-view)
-  ((progn %tree-view-mapping-func) callback)
+  (%tree-view-mapping-callback callback)
   (callback-id unsigned-int))
 
 (defun map-expanded-rows (function tree-view)
@@ -901,12 +902,11 @@ then the model will sort using this function."
     (icon-view icon-view)
     (x int) (y int))
 
-  (def-callback-marshal %icon-view-foreach-func 
-    (nil icon-view (path (copy-of tree-path))))
+  (define-callback-marshal %icon-view-foreach-callback nil (icon-view tree-path))
 
-  (defbinding %icon-view-selected-foreach () tree-path
+  (defbinding %icon-view-selected-foreach (icon-view callback-id) tree-path
     (icon-view icon-view)
-    ((progn %icon-view-foreach-func) callback)
+    (%icon-view-foreach-callback callback)
     (callback-id unsigned-int))
   
   (defun icon-view-foreach (icon-view function)