[cells-gtk-cvs] CVS update: root/cells-gtk/addon.lisp root/cells-gtk/buttons.lisp root/cells-gtk/callback.lisp root/cells-gtk/cells-gtk.lisp root/cells-gtk/dialogs.lisp root/cells-gtk/display.lisp root/cells-gtk/entry.lisp root/cells-gtk/gtk-app.lisp root/cells-gtk/layout.lisp root/cells-gtk/menus.lisp root/cells-gtk/textview.lisp root/cells-gtk/tree-view.lisp root/cells-gtk/widgets.lisp

Kenny Tilton ktilton at common-lisp.net
Sun Dec 5 06:33:31 UTC 2004


Update of /project/cells-gtk/cvsroot/root/cells-gtk
In directory common-lisp.net:/tmp/cvs-serv13216/cells-gtk

Modified Files:
	addon.lisp buttons.lisp callback.lisp cells-gtk.lisp 
	dialogs.lisp display.lisp entry.lisp gtk-app.lisp layout.lisp 
	menus.lisp textview.lisp tree-view.lisp widgets.lisp 
Log Message:
Port to AllegroCl and Lispworks on win32 using UFFI
Date: Sun Dec  5 07:33:23 2004
Author: ktilton

Index: root/cells-gtk/addon.lisp
diff -u root/cells-gtk/addon.lisp:1.1 root/cells-gtk/addon.lisp:1.2
--- root/cells-gtk/addon.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/addon.lisp	Sun Dec  5 07:33:22 2004
@@ -16,6 +16,7 @@
  
 |#
 
+
 (in-package :cgtk)
 
 (def-widget calendar ()
@@ -25,19 +26,18 @@
   :on-day-selected (callback (widg signal data)
 		      (setf (md-value self) (get-date self))))
 
+
 (defmethod get-date ((self calendar))
-  (with-c-var (year 'uint)
-    (with-c-var (month 'uint)
-      (with-c-var (day 'uint)
-	(gtk-calendar-get-date (id self) 
-			       (ffi:c-var-address year)
-			       (ffi:c-var-address month)
-			       (ffi:c-var-address day))
-	(encode-universal-time 0 0 0 day (1+ month) year)))))
+  (with-foreign-objects ((year :int)(month :int)(day :int))
+    (gtk-calendar-get-date (id self) year month day)
+    (encode-universal-time 0 0 0 (deref-pointer day :int)
+      (1+ (deref-pointer month :int)) (deref-pointer year :int))))
 
 (def-c-output init ((self calendar))
   (when new-value
     (multiple-value-bind (sec min hour day month year) (decode-universal-time new-value)
+      
+      (declare (ignorable sec min hour))
       (gtk-calendar-select-month (id self) (1- month) year)
       (gtk-calendar-select-day (id self) day))
     (setf (md-value self) new-value)))


Index: root/cells-gtk/buttons.lisp
diff -u root/cells-gtk/buttons.lisp:1.1 root/cells-gtk/buttons.lisp:1.2
--- root/cells-gtk/buttons.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/buttons.lisp	Sun Dec  5 07:33:22 2004
@@ -28,8 +28,7 @@
 
 (def-c-output label ((self button))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-button-set-label (id self) str))))
+    (gtk-button-set-label (id self) new-value)))
 
 (def-c-output markup ((self button))
   (when new-value    
@@ -38,24 +37,22 @@
 (def-c-output .kids ((self button))
   (assert-bin self)
   (dolist (kid (kids self))
-    (gtk-container-add (id self) (id kid)))
-  (call-next-method))
+    (gtk-container-add (id self) (id kid))))
 
 (def-c-output stock ((self button))
   (when new-value
     (setf (label self) (string-downcase (format nil "gtk-~a" new-value)))
-    (trc (label self)) (force-output)
+    (trc "stock" (label self)) (force-output)
     (setf (use-stock self) t)))
 
-
 (def-widget toggle-button (button)
   ((init :accessor init :initarg :init :initform nil))
   (mode active)
   (toggled)
   :active (c-in nil)
-  :on-toggled  (callback (widget event data)
-		  (let ((state (gtk-toggle-button-get-active widget)))
-		      (setf (md-value self) state))))
+  :on-toggled (callback (widget event data)
+                (let ((state (gtk-toggle-button-get-active widget)))
+                  (setf (md-value self) state))))
 
 (def-c-output init ((self toggle-button))
   (setf (active self) new-value)
@@ -73,13 +70,12 @@
   :new-args (c? (and (upper self box)
 		     (list
 		      (if (eql (first (kids (fm-parent self))) self) 
-			  nil
+			  c-null
 			  (id (first (kids (fm-parent self))))))))
   :on-toggled  (callback (widget event data)
-		 (let ((state (gtk-toggle-button-get-active widget)))		   
-		   (setf (md-value self) state))))
+                (let ((state (gtk-toggle-button-get-active widget)))
+                  (setf (md-value self) state))))
   
 (def-c-output .md-value ((self radio-button))
   (when (and new-value (upper self box))
-    (setf (md-value (upper self box)) (md-name self)))
-  (call-next-method))
+    (setf (md-value (upper self box)) (md-name self))))


Index: root/cells-gtk/callback.lisp
diff -u root/cells-gtk/callback.lisp:1.1 root/cells-gtk/callback.lisp:1.2
--- root/cells-gtk/callback.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/callback.lisp	Sun Dec  5 07:33:22 2004
@@ -4,7 +4,7 @@
   (let ((id (intern (string-upcase
                      (format nil "~a.~a" (id self) callback-id)))))
     (trc "registering callback" self :id id)
-    (setf (gethash id (callbacks .gtk-app)) (cons fun self))
+    (setf (gethash id (callbacks (nearest self gtk-app))) (cons fun self))
     id))
 
 (defun dispatch-callback (gtk-app callback)


Index: root/cells-gtk/cells-gtk.lisp
diff -u root/cells-gtk/cells-gtk.lisp:1.1 root/cells-gtk/cells-gtk.lisp:1.2
--- root/cells-gtk/cells-gtk.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/cells-gtk.lisp	Sun Dec  5 07:33:22 2004
@@ -18,8 +18,26 @@
 
 (defpackage :cells-gtk
   (:nicknames :cgtk)
-  (:use :common-lisp :utils-kt :cells :gtk-ffi :ffi))
+  (:use :common-lisp :utils-kt :cells :gtk-ffi
+    #+clisp :ffi #-clisp :uffi #-clisp #:ffx))
 
 (in-package :cgtk)
 
-(defvar *gtk-debug* nil)
+
+(defun gtk-tree-store-set-kids (model val-tree par-iter index column-types items-factory &optional path)
+  (with-foreign-object (iter 'gtk-tree-iter)
+    (setf (get-slot-value iter 'gtk-tree-iter 'stamp) 0)
+    (setf (get-slot-value iter 'gtk-tree-iter 'user-data) 0)
+    (setf (get-slot-value iter 'gtk-tree-iter 'user-data2) 0)
+    (setf (get-slot-value iter 'gtk-tree-iter 'user-data3) 0)
+    (gtk-ffi::gtk-tree-store-append model iter par-iter)
+    (gtk-ffi::gtk-tree-store-set model iter
+      column-types
+      (append
+       (funcall items-factory val-tree)
+       (list (format nil "(~{~d ~})" (reverse (cons index path))))))
+    (when (subtypep (class-name (class-of val-tree)) 'cells:family)
+      (loop for sub-tree in (cells:kids val-tree)
+          for pos from 0 do
+            (gtk-tree-store-set-kids model sub-tree iter 
+              pos column-types items-factory (cons index path))))))
\ No newline at end of file


Index: root/cells-gtk/dialogs.lisp
diff -u root/cells-gtk/dialogs.lisp:1.1 root/cells-gtk/dialogs.lisp:1.2
--- root/cells-gtk/dialogs.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/dialogs.lisp	Sun Dec  5 07:33:22 2004
@@ -27,7 +27,7 @@
   (markup)
   ()
   :position :mouse
-  :new-args (c? (list nil
+  :new-args (c? (list c-null
 		      2
 		      (ecase (message-type self)
 			(:info 0)
@@ -74,24 +74,24 @@
     (gtk-file-filter-add-pattern (id self) pattern)))
 
 (def-object file-chooser ()
-   ((action :accessor action :initarg :action :initform nil)
-    (action-id :accessor action-id
-	       :initform (c? (ecase (action self)
-			       (:open 0)
-			       (:save 1)
-			       (:select-folder 2)
-			       (:create-folder 3))))
-    (filters :accessor filters :initarg :filters :initform nil)
-    (filters-ids :accessor filters-ids 
-		 :initform (c? (loop for filter in (filters self) collect
-				     (id (make-be 'file-filter :name (first filter) :patterns (rest filter)))))))
-   (local-only select-multiple current-name filename
+  ((action :accessor action :initarg :action :initform nil)
+   (action-id :accessor action-id
+     :initform (c? (ecase (action self)
+                     (:open 0)
+                     (:save 1)
+                     (:select-folder 2)
+                     (:create-folder 3))))
+   (filters :accessor filters :initarg :filters :initform nil)
+   (filters-ids :accessor filters-ids 
+     :initform (c? (loop for filter in (filters self) collect
+                         (id (make-be 'file-filter :name (first filter) :patterns (rest filter)))))))
+  (local-only select-multiple current-name filename
     current-folder uri current-folder-uri use-preview-label filter)
-   (selection-changed)
-   :on-selection-changed (callback (widget signal data)
-			    (if (select-multiple self)
-				(setf (md-value self) (gtk-file-chooser-get-filenames-strs (id self)))
-				(setf (md-value self) (gtk-file-chooser-get-filename (id self))))))
+  (selection-changed)
+  :on-selection-changed (callback (widget signal data)
+                          (if (select-multiple self)
+                              (setf (md-value self) (gtk-file-chooser-get-filenames-strs (id self)))
+                            (setf (md-value self) (gtk-file-chooser-get-filename (id self))))))
 
 (def-c-output filters-ids ((self file-chooser))
   (dolist (filter-id new-value)
@@ -113,7 +113,7 @@
   ()
   :on-selection-changed nil
   :position :mouse
-  :new-args (c? (list (title self) nil (action-id self)
+  :new-args (c? (list (title self) c-null (action-id self)
 		      "gtk-cancel" -6 ;;response-cancel
 		      (format nil "gtk-~a"
 			      (string-downcase 
@@ -138,4 +138,5 @@
   (let ((dialog (to-be (apply #'mk-file-chooser-dialog inits))))
     (md-value dialog)))
 
-(export '(show-message file-chooser))
\ No newline at end of file
+(eval-when (compile load eval)
+  (export '(show-message file-chooser)))
\ No newline at end of file


Index: root/cells-gtk/display.lisp
diff -u root/cells-gtk/display.lisp:1.1 root/cells-gtk/display.lisp:1.2
--- root/cells-gtk/display.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/display.lisp	Sun Dec  5 07:33:22 2004
@@ -60,20 +60,17 @@
 
 (def-c-output text ((self label))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-label-set-text-with-mnemonic (id self) str))))
+    (gtk-label-set-text-with-mnemonic (id self) new-value)))
 
 (def-c-output markup ((self label))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-label-set-markup-with-mnemonic  (id self) str))))
+    (gtk-label-set-markup-with-mnemonic  (id self) new-value)))
 
 (def-widget accel-label ()
   ((text :accessor text :initarg :text :initform nil))
   ()
   ()
-  :id (c? (with-gtk-string (str (text self))
-	    (gtk-accel-label-new str))))
+  :id (c? (gtk-accel-label-new (text self))))
 
 (def-widget image ()
   ((filename :accessor filename :initarg :filename :initform nil)
@@ -110,14 +107,13 @@
   :has-resize-grip t)
 
 (defmethod new-context ((self statusbar) context)
-  (let ((cid (gtk-statusbar-get-context-id (id self) (format nil "~a" context))))
-    (setf (gethash context (contexts self)) cid)))
+  (setf (gethash context (contexts self))
+    (gtk-statusbar-get-context-id (id self) (format nil "~a" context))))
 
 (defmethod push-message ((self statusbar) message &optional (context 'main))
   (let ((id (gethash context (contexts self))))
     (when id
-      (with-gtk-string (str message)
-	(gtk-statusbar-push (id self) id str)))))
+      (gtk-statusbar-push (id self) id message))))
 
 (defmethod pop-message ((self statusbar) &optional (context 'main))
   (let ((id (gethash context (contexts self))))
@@ -156,4 +152,5 @@
 	(:bottom 3)
 	(t 0)))))
 
-(export '(with-markup push-message pop-message pulse))
\ No newline at end of file
+(eval-when (compile load eval)
+  (export '(with-markup push-message pop-message pulse)))
\ No newline at end of file


Index: root/cells-gtk/entry.lisp
diff -u root/cells-gtk/entry.lisp:1.1 root/cells-gtk/entry.lisp:1.2
--- root/cells-gtk/entry.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/entry.lisp	Sun Dec  5 07:33:22 2004
@@ -29,34 +29,37 @@
    (text :accessor text :initarg :text :initform (c-in nil))
    (init :accessor init :initarg :init :initform nil))
   (editable has-frame max-length)
-  (changed activate)
-  :on-changed (callback-if (auto-update self)
-		 (widget event data)
-		 (let ((txt (get-gtk-string (gtk-entry-get-text widget))))
-		   (trc  nil "ENTRY (ON-CHANGED)" txt) (force-output)
-		   (setf (md-value self) txt)))
-  :on-activate (callback-if (not (auto-update self))
-		   (widget event data)
-		   (let ((txt (get-gtk-string (gtk-entry-get-text widget))))
-		     (trc  nil "ENTRY (ON-ACTIVATE)" txt) (force-output)
-		       (setf (md-value self) (if (equal txt "") nil txt)))))
+  (changed activate))
+;;;  :on-changed (callback-if (auto-update self)
+;;;                (widget event data)
+;;;                (let ((txt (get-gtk-string (gtk-entry-get-text widget))))
+;;;                  (trc  nil "ENTRY (ON-CHANGED)" txt) (force-output)
+;;;                  (setf (md-value self) txt)))
+;;;  :on-activate (callback-if (not (auto-update self))
+;;;                 (widget event data)
+;;;                 (let ((txt (get-gtk-string (gtk-entry-get-text widget))))
+;;;                   (trc  nil "ENTRY (ON-ACTIVATE)" txt) (force-output)
+;;;                   (setf (md-value self) (if (equal txt "") nil txt)))))
 
 (def-c-output text ((self entry))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-entry-set-text (id self) str))))
+    (gtk-entry-set-text (id self) new-value)))
 
 (def-c-output init ((self entry))
-  (setf (text self) (or new-value ""))
-  (setf (md-value self) (or new-value "")))
+  (when (stringp new-value) ;; could be null or numeric for spin button
+    (setf (text self) new-value)
+    (setf (md-value self) new-value)))
 
 (def-c-output completion ((self entry))
   (when new-value
-    (let ((store (make-instance 'list-store :item-types (list :string))))
+    (gvi :pre-mk-store)
+    (let ((store (make-be 'list-store :item-types (list :string))))
+      (gvi :post-mk-store)
       (gtk-list-store-set-items (id store) (list :string) (mapcar #'list new-value))
+      (gvi :post-set-items)
       (let ((completion (make-be 'entry-completion :model (id store))))
-	(gtk-entry-completion-set-text-column (id completion) 0)
-	(gtk-entry-set-completion (id self) (id completion))))))
+        (gtk-entry-completion-set-text-column (id completion) 0)
+        (gtk-entry-set-completion (id self) (id completion))))))
 
 ;; (def-widget adjustment ()
 ;;   () () ())


Index: root/cells-gtk/gtk-app.lisp
diff -u root/cells-gtk/gtk-app.lisp:1.1 root/cells-gtk/gtk-app.lisp:1.2
--- root/cells-gtk/gtk-app.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/gtk-app.lisp	Sun Dec  5 07:33:22 2004
@@ -20,18 +20,19 @@
 
 (defmodel gtk-app (window)
   ((splash-screen-image :accessor splash-screen-image :initarg :splash-screen-image :initform nil)
-   (tooltips :accessor tooltips :initform (make-be 'tooltips))
+   (tooltips :initarg :tooltips :accessor tooltips :initform (make-be 'tooltips))
    (tooltips-enable :accessor tooltips-enable :initarg :tooltips-enable :initform (c-in t))
    (tooltips-delay :accessor tooltips-delay :initarg :tooltips-delay :initform (c-in nil)))
   (:default-initargs
-      :on-delete-event (lambda (widget event data)
-			 (declare (ignore widget event data))
+      :on-delete-event (lambda (self widget event data)
+			 (declare (ignore self widget event data))
 			 (gtk-main-quit))))
 
 (def-c-output tooltips-enable ((self gtk-app))
-  (if new-value
-      (gtk-tooltips-enable (id (tooltips self)))
-      (gtk-tooltips-disable (id (tooltips self)))))
+  (when (tooltips self)
+    (if new-value
+        (gtk-tooltips-enable (id (tooltips self)))
+      (gtk-tooltips-disable (id (tooltips self))))))
 
 (def-c-output tooltips-delay ((self gtk-app))
   (when new-value
@@ -52,35 +53,62 @@
   (let ((*gtk-debug* debug))
     (when (not *gtk-initialized*)
       (when *gtk-debug*
-	(trc "GTK INITIALIZATION") (force-output))
-      (g-thread-init nil)
+        (trc "GTK INITIALIZATION") (force-output))
+      (g-thread-init c-null)
       (gdk-threads-init)
-      (assert (gtk-init-check nil nil))
+      (assert (gtk-init-check c-null c-null))
       (setf *gtk-initialized* t))
-
+    
     (with-gdk-threads
-	(let ((app (make-instance app-name :visible (c-in nil)))
-	      (splash))
-	  (when (splash-screen-image app)
-	    (setf splash (make-instance 'splash-screen :image-path (splash-screen-image app)
-					:visible (c-in nil)))
-	    (gtk-window-set-auto-startup-notification nil)
-	    (to-be splash)
-	    (setf (visible splash) t)
-	    (loop while (gtk-events-pending) do
-		 (gtk-main-iteration)))
-	  
-	  (to-be app)
-	  
-	  (when splash
-	    (not-to-be splash)
-	    (gtk-window-set-auto-startup-notification t))
-	  
-	  (setf (visible app) t)
-	  
-	  (when *gtk-debug*
-	    (trc "STARTING GTK-MAIN") (force-output))
-	  (gtk-main)))))
-
-(export '(gtk-app title icon tooltips tooltips-enable tooltips-delay
-	  start-app))
\ No newline at end of file
+        ;(gvi :withread)
+        (let ((app (make-instance app-name :visible (c-in nil)))
+              (splash))
+          (when (splash-screen-image app)
+            (setf splash (make-instance 'splash-screen :image-path (splash-screen-image app)
+                           :visible (c-in nil)))
+            (gtk-window-set-auto-startup-notification nil)
+            (to-be splash)
+            (setf (visible splash) t)
+            (loop while (gtk-events-pending) do
+                  (gtk-main-iteration)))
+          (gvi :splashup)
+          (to-be app)
+          (gvi :appup)
+          (when splash
+            (not-to-be splash)
+            (gvi :splashdown)
+            (gtk-window-set-auto-startup-notification t))
+          (setf (visible app) t)
+          
+          (when *gtk-debug*
+            (trc "STARTING GTK-MAIN") (force-output))
+          (gtk-main)))))
+
+(defvar *gtk-global-callbacks* nil)
+(defvar *gtk-loaded* nil)
+
+(defun gtk-reset ()
+  (cell-reset)
+  (gtk-objects-init)
+  (setf *gtk-global-callbacks*
+    (make-array 128 :adjustable t :fill-pointer 0)))
+
+(defun gtk-global-callback-register (callback)
+  (vector-push-extend callback
+    *gtk-global-callbacks* 16))
+
+(defun gtk-global-callback-funcall (n)
+  (funcall (aref *gtk-global-callbacks* n)))
+
+(defun cells-gtk-init ()
+  (gtk-reset)
+  (unless *gtk-loaded*
+    (loop for lib in '(:gthread :glib :gobject :gdk :gtk)
+        do (assert (uffi:load-foreign-library (gtk-ffi::libname lib)
+                     :force-load #+lispworks t #-lispworks nil
+                     :module (string lib)))
+        finally (setf *gtk-loaded* t))))
+
+(eval-when (compile load eval)
+  (export '(gtk-app gtk-reset cells-gtk-init title icon tooltips tooltips-enable tooltips-delay
+             start-app gtk-global-callback-register gtk-global-callback-funcall)))
\ No newline at end of file


Index: root/cells-gtk/layout.lisp
diff -u root/cells-gtk/layout.lisp:1.1 root/cells-gtk/layout.lisp:1.2
--- root/cells-gtk/layout.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/layout.lisp	Sun Dec  5 07:33:22 2004
@@ -30,8 +30,7 @@
   (when new-value
     (dolist (kid new-value)
       (gtk-box-pack-start (id self) (id kid) 
-			  (expand? kid) (fill? kid) (padding? kid)))
-    (call-next-method)))
+			  (expand? kid) (fill? kid) (padding? kid)))))
 
 (def-widget hbox (box)
   () () ()
@@ -84,8 +83,7 @@
     (and (cadr new-value)
 	 (gtk-paned-add2 (id self) (id (make-be 'frame 
 						    :shadow 'in
-						    :kids (list (cadr new-value)))))))
-  (call-next-method))
+						    :kids (list (cadr new-value))))))))
 
 (def-widget vpaned ()
   () () ())
@@ -98,8 +96,7 @@
     (and (cadr new-value)
 	 (gtk-paned-add2 (id self) (id (make-be 'frame 
 						    :shadow 'in
-						    :kids (list (cadr new-value)))))))
-  (call-next-method))
+						    :kids (list (cadr new-value))))))))
   
 
 (def-widget frame ()
@@ -112,8 +109,7 @@
 
 (def-c-output label ((self frame))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-frame-set-label (id self) str))))
+    (gtk-frame-set-label (id self) new-value)))
 
 (def-c-output shadow ((self frame))
   (when new-value
@@ -128,8 +124,7 @@
 (def-c-output .kids ((self frame))
   (assert-bin self)
   (dolist (kid new-value)
-    (gtk-container-add (id self) (id kid)))
-  (call-next-method))
+    (gtk-container-add (id self) (id kid))))
 
 (def-widget aspect-frame (frame)
   ((xalign :accessor xalign :initarg :xalign :initform 0.5)
@@ -158,14 +153,12 @@
 
 (def-c-output label ((self expander))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-expander-set-label (id self) str))))
+    (gtk-expander-set-label (id self) new-value)))
 
 (def-c-output .kids ((self expander))
   (assert-bin self)
   (dolist (kid new-value)
-    (gtk-container-add (id self) (id kid)))
-  (call-next-method))
+    (gtk-container-add (id self) (id kid))))
 
 (def-widget scrolled-window ()
   ()
@@ -173,15 +166,14 @@
   ()
   :expand t :fill t
   :policy (list 1 1)
-  :new-args (list nil nil))
+  :new-args (list c-null c-null))
 
 (def-c-output .kids ((self scrolled-window))
   (assert-bin self)
   (dolist (kid new-value)
     (if (member (class-name (class-of kid)) '(listbox treebox tree-view text-view layout) :test #'equal)
 	(gtk-container-add (id self) (id kid))
-	(gtk-scrolled-window-add-with-viewport (id self) (id kid))))
-  (call-next-method))
+	(gtk-scrolled-window-add-with-viewport (id self) (id kid)))))
 
 (def-widget notebook ()
   ((tab-labels :accessor tab-labels :initarg :tab-labels :initform nil)
@@ -221,8 +213,7 @@
   (loop for page from 0 to (length new-value) do
 	(setf (current-page self) page)) 
   (when (and (show-page self) (>= (show-page self) 0) (< (show-page self) (length new-value)))
-    (setf (current-page self) (show-page self)))
-  (call-next-method))
+    (setf (current-page self) (show-page self))))
 
 (def-widget alignment ()
   ((xalign :accessor xalign :initarg :xalign :initform 0.5)
@@ -273,5 +264,4 @@
 (def-c-output .kids ((self alignment))
   (assert-bin self)
   (dolist (kid new-value)
-    (gtk-container-add (id self) (id kid)))
-  (call-next-method))
+    (gtk-container-add (id self) (id kid))))


Index: root/cells-gtk/menus.lisp
diff -u root/cells-gtk/menus.lisp:1.1 root/cells-gtk/menus.lisp:1.2
--- root/cells-gtk/menus.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/menus.lisp	Sun Dec  5 07:33:22 2004
@@ -26,9 +26,9 @@
   (changed)
   :new-tail '-text
   :on-changed (callback (widget event data)
-		 (let ((pos (gtk-combo-box-get-active (id self))))
-		   (setf (md-value self) (and (not (= pos -1))
-					      (nth pos (items self)))))))
+                (let ((pos (gtk-combo-box-get-active (id self))))
+                  (setf (md-value self) (and (not (= pos -1))
+                                          (nth pos (items self)))))))
 
 (def-c-output items ((self combo-box))
   (when old-value
@@ -36,8 +36,7 @@
       (gtk-combo-box-remove-text (id self) 0)))
   (when new-value
     (dolist (item (items self))
-      (with-gtk-string (str (funcall (items-factory self) item))
-	(gtk-combo-box-append-text (id self) str)))
+      (gtk-combo-box-append-text (id self) (funcall (items-factory self) item)))
     (when (init self)
       (let ((index (position (init self) (items self))))
 	(when index
@@ -58,8 +57,7 @@
   (when new-value
     (loop for item in new-value
 	  for pos from 0 do
-	  (gtk-toolbar-insert (id self) (id item) pos)))
-  (call-next-method))
+	  (gtk-toolbar-insert (id self) (id item) pos))))
 
 (def-c-output orientation ((self toolbar))
   (when new-value
@@ -88,8 +86,7 @@
   (assert-bin self)
   (when new-value
     (dolist (kid new-value)
-      (gtk-container-add (id self) (id kid))))
-  (call-next-method))
+      (gtk-container-add (id self) (id kid)))))
 
 (def-widget separator-tool-item (tool-item)
   ()
@@ -103,7 +100,7 @@
    (label-widget :accessor label-widget :initarg :label-widget :initform (c-in nil)))
   (use-underline stock-id)
   (clicked)
-  :new-args (list nil nil))
+  :new-args (list c-null c-null))
 
 (def-c-output icon-widget ((self tool-button))
   (when old-value
@@ -119,8 +116,7 @@
 
 (def-c-output label ((self tool-button))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-tool-button-set-label (id self) str))))
+    (gtk-tool-button-set-label (id self) new-value)))
 
 (def-c-output stock ((self tool-button))
   (when new-value
@@ -133,8 +129,7 @@
 (def-c-output .kids ((self menu-shell))  
   (when new-value
     (dolist (kid new-value)
-      (gtk-menu-shell-append (id self) (id kid))))
-  (call-next-method))
+      (gtk-menu-shell-append (id self) (id kid)))))
 
 (def-widget menu-bar (menu-shell)
   () () ())
@@ -196,8 +191,8 @@
   (toggled)
   :active (c-in nil)
   :on-toggled (callback (widget event data)
-		(let ((state (gtk-check-menu-item-get-active widget)))
-		  (setf (md-value self) state))))
+                (let ((state (gtk-check-menu-item-get-active widget)))
+                  (setf (md-value self) state))))
 
 (def-c-output init ((self check-menu-item))
   (setf (active self) new-value)
@@ -214,12 +209,11 @@
 		      (not-first-p (not (eql (first (kids (fm-parent self))) self))))		  
 		      (if (and in-group-p not-first-p)
 			  (list (id (first (kids (fm-parent self)))))			  
-			  (list nil)))))
+			  (list c-null)))))
   
 (def-c-output .md-value ((self radio-menu-item))
   (when (and new-value (upper self menu-item))
-    (setf (md-value (upper self menu-item)) (md-name self)))
-  (call-next-method))
+    (setf (md-value (upper self menu-item)) (md-name self))))
 
 (def-widget image-menu-item (menu-item)
   ((stock :accessor stock :initarg :stock :initform nil)


Index: root/cells-gtk/textview.lisp
diff -u root/cells-gtk/textview.lisp:1.1 root/cells-gtk/textview.lisp:1.2
--- root/cells-gtk/textview.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/textview.lisp	Sun Dec  5 07:33:23 2004
@@ -22,13 +22,12 @@
   ((text :accessor text :initarg :text :initform nil))
   ()
   ()
-  :new-args (c? (list nil)))
+  :new-args (c? (list c-null)))
 
 (def-c-output text ((self text-buffer))
-  (with-gtk-string (txt (or new-value ""))
-    (gtk-text-buffer-set-text (id self) 
-			      txt
-			      -1)))
+  (gtk-text-buffer-set-text (id self) 
+			      (or new-value "")
+			      -1))
 
 (def-widget text-view ()
   ((buffer :accessor buffer :initarg :buffer :initform (mk-text-buffer)))


Index: root/cells-gtk/tree-view.lisp
diff -u root/cells-gtk/tree-view.lisp:1.1 root/cells-gtk/tree-view.lisp:1.2
--- root/cells-gtk/tree-view.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/tree-view.lisp	Sun Dec  5 07:33:23 2004
@@ -37,16 +37,18 @@
    (column-types :accessor column-types :initform (c? (mapcar #'first (columns-def self))))
    (column-inits :accessor  column-inits :initform (c? (mapcar #'second (columns-def self))))
    (column-render :accessor column-render 
-		  :initform (c? (loop for col-def in (columns-def self)
-				      for pos from 0 append
-				      (when (third col-def)
-					(list pos (third col-def))))))
+     :initform (c? (loop for col-def in (columns-def self)
+                       for pos from 0 append
+                         (when (third col-def)
+                           (list pos (third col-def))))))
    (columns :accessor columns
-	    :initform (c? (mapcar #'(lambda (col-init) 
-				      (apply #'make-be 'tree-view-column col-init))
-				  (column-inits self))))
+     :initform (c? (mapcar #'(lambda (col-init)
+                               (apply #'make-be 'tree-view-column
+                                 :container self
+                                 col-init))
+                     (column-inits self))))
    (select-if :unchanged-if #'fail
-	      :accessor select-if :initarg :select-if :initform (c-in nil))
+     :accessor select-if :initarg :select-if :initform (c-in nil))
    (items :accessor items :initarg :items :initform nil)
    (items-factory :accessor items-factory :initarg :items-factory :initform #'identity)
    (selection-mode :accessor selection-mode :initarg :selection-mode :initform :single)
@@ -54,8 +56,9 @@
    (tree-model :accessor tree-model :initarg :tree-model :initform nil))
   ()
   ()
-  :on-select (callback (widget event data)
-	       (setf (md-value self) (get-selection self))))
+  :on-select (lambda (self widget event data)
+               (declare (ignore widget event data))
+               (setf (md-value self) (get-selection self))))
 
 (def-c-output tree-model ((self tree-view))
   (when new-value
@@ -75,16 +78,17 @@
   (let ((selection (gtk-tree-view-get-selection (id self))))
     (let (sel)
       (gtk-tree-selection-selected-foreach selection
-	#'(lambda (model path iter data)	    
-	      (push (item-from-path 
-		     (items self) 
-		     (read-from-string 
-		      (gtk-tree-model-get-cell model iter (length (column-types self)) :string)))
-		    sel))
-	nil)
+        #'(lambda (model path iter data)
+            (declare (ignore data path))
+            (push (item-from-path 
+                   (items self) 
+                   (read-from-string 
+                    (gtk-tree-model-get-cell model iter (length (column-types self)) :string)))
+              sel))
+        nil)
       (if (equal (gtk-tree-selection-get-mode selection) 3) ;;multiple
-	  sel
-	  (first sel)))))
+          sel
+        (first sel)))))
 
 (def-c-output selection-mode ((self tree-view))
   (when new-value
@@ -96,10 +100,25 @@
 	   (:browse 2)
 	   (:multiple 3))))))
 
+(ff-defun-callable :cdecl :int tree-view-select-handler
+  ((column-widget (* :void)) (event (* :void)) (data (* :void)))
+  (let ((tree-view (gtk-object-find column-widget)))
+    (let ((cb (callback-recover tree-view :on-select)))
+      (funcall cb tree-view column-widget event data))))
+
 (def-c-output on-select ((self tree-view))
   (when new-value    
-    (let ((sel (gtk-tree-view-get-selection (id self))))
-      (gtk-signal-connect sel "changed" (on-select self)))))
+    (trc "output on-select" self new-value)
+    (let* ((selected-widget (gtk-tree-view-get-selection (id self)))
+           (selected-clos (gtk-object-find selected-widget nil)))
+      (unless selected-clos
+        (trc "whoa!!! no clos for selected" self selected-widget))
+      (when selected-clos
+        (assert (eql self selected-clos))
+        (gtk-object-store selected-widget self) ;; tie column widg to clos tree-view
+        (callback-register self :on-select new-value)
+        (gtk-signal-connect selected-widget "changed"
+          (ff-register-callable 'tree-view-select-handler))))))
 
 (defmodel listbox (tree-view)
   ()
@@ -139,7 +158,7 @@
 (def-c-output select-if ((self treebox))
   (when new-value
     (setf (md-value self) (mapcan (lambda (item) (fm-collect-if item new-value)) 
-				  (items self)))))
+                            (items self)))))
 
 (def-c-output items ((self treebox))
   (when old-value
@@ -147,27 +166,38 @@
   (when new-value
     (loop for sub-tree in new-value
        for index from 0 do
-	 (gtk-tree-store-set-kids (id (tree-model self)) sub-tree nil index
+	 (gtk-tree-store-set-kids (id (tree-model self)) sub-tree c-null index
 				  (append (column-types self) (list :string)) 
 				  (items-factory self)))))
 
+(ff-defun-callable :cdecl :int tree-view-render-call-callback
+    ((tree-column (* :void)) (cell-renderer (* :void))
+     (tree-model (* :void)) (iter (* :void)) (data (* :void)))
+  (let ((self (gtk-object-find tree-column)))
+      (assert self)
+      (let ((cb (callback-recover self :render-cell)))
+        (assert cb () "No :render-cell callback for ~a" self)
+        (funcall cb tree-column cell-renderer tree-model iter data))))
+
 (def-c-output columns ((self tree-view))
   (when new-value
     (loop for col in new-value
-	  for pos from 0	  
-	  for renderer = (case (nth pos (column-types self))
-			     (:boolean (gtk-cell-renderer-toggle-new))
-			     (:icon (gtk-cell-renderer-pixbuf-new))
-			     (t (gtk-cell-renderer-text-new))) do
-	  (gtk-tree-view-column-pack-start (id col) renderer t)
-	  (gtk-tree-view-column-set-cell-data-func (id col) renderer
-						   (gtk-tree-view-render-cell pos 
-									      (nth pos (column-types self))
-									      (getf (column-render self) pos))
-						   nil
-						   nil)
-	 (gtk-tree-view-column-set-sort-column-id (id col) pos)
-	 (gtk-tree-view-insert-column (id self) (id col) pos))))
+        for pos from 0	  
+        for renderer = (case (nth pos (column-types self))
+                         (:boolean (gtk-cell-renderer-toggle-new))
+                         (:icon (gtk-cell-renderer-pixbuf-new))
+                         (t (gtk-cell-renderer-text-new))) do
+          (gtk-tree-view-column-pack-start (id col) renderer t)
+          (gtk-tree-view-column-set-cell-data-func (id col) renderer
+            (progn
+              (callback-register col :render-cell
+                (gtk-tree-view-render-cell pos 
+                  (nth pos (column-types self))
+                  (getf (column-render self) pos)))
+              (ff-register-callable 'tree-view-render-call-callback))
+            nil nil)
+          (gtk-tree-view-column-set-sort-column-id (id col) pos)
+          (gtk-tree-view-insert-column (id self) (id col) pos))))
     
 (def-object tree-view-column ()
   ((title :accessor title :initarg :title :initform nil)
@@ -184,11 +214,11 @@
 
 (def-c-output title ((self tree-view-column))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-tree-view-column-set-title (id self) str))))
+    (gtk-tree-view-column-set-title (id self) new-value)))
 
 (defmacro def-columns (&rest args)
   `(list ,@(loop for (type inits renderer) in args collect
 		 `(list ,type ',inits ,renderer))))
 
-(export '(mk-listbox mk-treebox def-columns))
\ No newline at end of file
+(eval-when (compile load eval)
+  (export '(mk-listbox mk-treebox def-columns)))
\ No newline at end of file


Index: root/cells-gtk/widgets.lisp
diff -u root/cells-gtk/widgets.lisp:1.1 root/cells-gtk/widgets.lisp:1.2
--- root/cells-gtk/widgets.lisp:1.1	Fri Nov 19 00:39:53 2004
+++ root/cells-gtk/widgets.lisp	Sun Dec  5 07:33:23 2004
@@ -18,23 +18,84 @@
 
 (in-package :cgtk)
 
+
 (defmodel gtk-object (family)
-  ((def-gtk-class-name :accessor def-gtk-class-name :initarg :def-gtk-class-name :initform nil)
+  ((container :cell nil :initarg :container :accessor container)
+   (def-gtk-class-name :accessor def-gtk-class-name :initarg :def-gtk-class-name :initform nil)
    (new-function-name :accessor new-function-name :initarg :new-function-name 
-		      :initform (c? (intern (format nil "GTK-~a-NEW~a"
-						    (def-gtk-class-name self)
-						    (or (new-tail self) ""))
-					    :gtk-ffi)))
+     :initform (c? (intern (format nil "GTK-~a-NEW~a"
+                             (def-gtk-class-name self)
+                             (or (new-tail self) ""))
+                     :gtk-ffi)))
    (new-args :accessor new-args :initarg :new-args :initform nil)
    (new-tail :accessor new-tail :initarg :new-tail :initform nil)
    (id :initarg :id :accessor id 
-       :initform (c? (without-c-dependency 
-		      (when *gtk-debug* 
-			(trc "NEW" (new-function-name self) (new-args self)) (force-output))
-		      (apply (symbol-function (new-function-name self)) (new-args self))))))
+     :initform (c? (without-c-dependency 
+                    (when *gtk-debug* 
+                      (trc "NEW ID" (new-function-name self) (new-args self)) (force-output))
+                    (let ((id (apply (symbol-function (new-function-name self))
+                                (new-args self))))
+                      (gtk-object-store id self)
+                      id))))
+   
+   (callbacks :cell nil :accessor callbacks
+     :initform nil
+     :documentation "assoc of event-name, callback closures to handle widget events"))
   (:default-initargs
-      :md-name (c-in nil)
-      :md-value (c-in nil)))
+      :md-name nil ;; kwt: was (c-in nil), but this is not a cell
+    :md-value (c-in nil)))
+
+;; --------- provide id-to-clos lookup ------
+
+(defvar *gtk-objects* nil)
+
+(defun gtk-objects-init ()
+  (setf *gtk-objects* (make-hash-table :size 100 :rehash-size 100)))
+
+(defun gtk-object-store (id gtk-object)
+  (unless *gtk-objects*
+    (gtk-objects-init))
+  (let ((known (gethash id *gtk-objects*)))
+    (cond
+     ((not known)
+      (setf (gethash id *gtk-objects*) gtk-object))
+     ((eql known gtk-object))
+     (t
+      (break "gtk-object-store id ~a already known as ~a, not ~a"
+        id known gtk-object)))))
+
+(defun gtk-object-forget (id gtk-object)
+  (assert *gtk-objects*)
+  (let ((known (gethash id *gtk-objects*)))
+    (cond
+     ((not known))
+     ((eql known gtk-object)
+      (setf (gethash id *gtk-objects*) nil))
+     (t
+      (break "gtk-object-store id ~a known as ~a, not forgettable ~a"
+        id known gtk-object)))))
+
+#+shhh
+(maphash (lambda (k v) (print (list k v))) *gtk-objects*)
+
+(defun gtk-object-find (id &optional must-find-p)
+  (when *gtk-objects*
+    (let ((clos-widget (gethash id *gtk-objects*)))
+      (when must-find-p
+        (assert clos-widget))
+      clos-widget)))
+
+;; ----- fake callbackable closures ------------
+
+(defun callback-register (self callback-key closure)
+  (let ((x (assoc callback-key (callbacks self))))
+    (if x (rplacd x closure)
+      (push (cons callback-key closure) (callbacks self)))))
+
+(defun callback-recover (self callback-key)
+  (cdr (assoc callback-key (callbacks self))))
+
+; ------------------------------------------
 
 (defmethod configure ((self gtk-object) gtk-function value)
   (apply gtk-function (id self) (if (consp value) value (list value))))
@@ -49,79 +110,124 @@
 
 ;;; --- widget --------------------
 
-(eval-when (:compile-toplevel :load-toplevel :execute)
+(defmacro def-gtk-event-handler (event)
+  `(ff-defun-callable :cdecl :int ,(intern (string-upcase (format nil "~a-handler" event)))
+    ((widget (* :void)) (event (* :void)) (data (* :void)))
+    (let ((self (gtk-object-find widget)))
+      (assert self)
+      (let ((cb (callback-recover self ,(intern (symbol-name event) :keyword))))
+        (funcall cb self widget event data)))))
+
+(def-gtk-event-handler clicked)
+(def-gtk-event-handler toggled)
+(def-gtk-event-handler delete-event)
+  
+(defparameter *widget-callbacks*
+  (list (cons 'clicked (ff-register-callable 'clicked-handler))
+    (cons 'toggled (ff-register-callable 'toggled-handler))
+    (cons 'delete-event (ff-register-callable 'delete-event-handler))))
 
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  
   (defmacro def-object (&rest args)
     `(def-gtk gtk-object , at args))
   (defmacro def-widget (&rest args)
     `(def-gtk widget , at args))  
   (defmacro def-gtk (gtk-superclass class
-		     superclasses
-		     (&rest std-slots)
-		     (&rest gtk-slots) (&rest gtk-signals) &rest defclass-options)
-  (multiple-value-bind (slots outputs)
-          (loop for gtk-option-def in gtk-slots
-              for slot-name = (if (atom gtk-option-def)
-				  gtk-option-def (car gtk-option-def))
-              collecting `(,slot-name :initform (c-in nil)
-				      :initarg ,(intern (string slot-name) :keyword)
-				      :accessor ,slot-name)
-              into slot-defs
-              collecting `(def-c-output ,slot-name ((self ,class))
-                            (when (or new-value old-value)
-			      (when *gtk-debug* (TRC ,(format nil "~a-~a" class slot-name) new-value) (force-output))
-                              (configure self #',(gtk-function-name class gtk-option-def)
-					 new-value))
-			   (call-next-method))
-
-              into outputs
-              finally (return (values slot-defs outputs)))
-    (multiple-value-bind (signals-slots signals-outputs)
-	(loop for signal-slot in gtk-signals
+                      superclasses
+                      (&rest std-slots)
+                      (&rest gtk-slots) (&rest gtk-signals) &rest defclass-options)
+    (multiple-value-bind (slots outputs)
+        (loop for gtk-option-def in gtk-slots
+            for slot-name = (if (atom gtk-option-def)
+                                gtk-option-def (car gtk-option-def))
+            collecting `(,slot-name :initform (c-in nil)
+                          :initarg ,(intern (string slot-name) :keyword)
+                          :accessor ,slot-name)
+            into slot-defs
+            collecting `(def-c-output ,slot-name ((self ,class))
+                          (when (or new-value old-value)
+                            #+shhh (when *gtk-debug*
+                              (TRC ,(format nil "output before ~a-~a" class slot-name) new-value) (force-output))
+                            (configure self #',(gtk-function-name class gtk-option-def)
+                              new-value)
+                            #+shhh (when *gtk-debug*
+                              (TRC ,(format nil "output after ~a-~a" class slot-name) new-value) (force-output))))
+              
+            into outputs
+            finally (return (values slot-defs outputs)))
+      (multiple-value-bind (signals-slots signals-outputs)
+          (loop for signal-slot in gtk-signals
               for slot-name = (intern (format nil "ON-~a" signal-slot))
               collecting `(,slot-name :initform nil
-				      :initarg ,(intern (string slot-name) :keyword)
-				      :accessor ,slot-name)
+                            :initarg ,(intern (string slot-name) :keyword)
+                            :accessor ,slot-name)
               into signals-slots-defs
               collecting `(def-c-output ,slot-name ((self ,class))
                             (when new-value
-			      (gtk-signal-connect (id self) ,(string-downcase (string signal-slot)) new-value))
-			   (call-next-method))
+                              #+clisp  (gtk-signal-connect (id self)
+                                         ,(string-downcase (string signal-slot)) 
+                                         new-value)
+                              #-clisp
+                              (progn (callback-register self
+                                       ,(intern (string signal-slot) :keyword)
+                                       new-value)
+                                (gtk-signal-connect (id self)
+                                  ,(string-downcase (string signal-slot)) 
+                                  (cdr (assoc ',signal-slot *widget-callbacks*))))))
               into signals-outputs-defs
               finally (return (values signals-slots-defs signals-outputs-defs)))
         `(progn
-	  (defmodel ,class ,(or superclasses (list gtk-superclass))
-	    (,@(append std-slots slots signals-slots))
-	    (:default-initargs
-		:def-gtk-class-name ',class
-		, at defclass-options))
-	  (export ',class)
-	  (export ',(mapcar #'first (append std-slots slots signals-slots)))
-	  
-	  (defun ,(intern (format nil "MK-~a" class)) (&rest inits)
-	    (when *gtk-debug* (trc "MAKE-INSTANCE" ',class) (force-output))
-	    (apply 'make-instance ',class inits))
-	  (export ',(intern (format nil "MK-~a" class)))
-	  , at outputs
-	  , at signals-outputs)))))
+           (defmodel ,class ,(or superclasses (list gtk-superclass))
+             (,@(append std-slots slots signals-slots))
+             (:default-initargs
+                 :def-gtk-class-name ',class
+               , at defclass-options))
+           (eval-when (compile load eval)
+             (export ',class))
+           (eval-when (compile load eval)
+             (export ',(mapcar #'first (append std-slots slots signals-slots))))
+           
+           (defun ,(intern (format nil "MK-~a" class)) (&rest inits)
+             (when *gtk-debug* (trc "MAKE-INSTANCE" ',class) (force-output))
+             (apply 'make-instance ',class inits))
+           (eval-when (compile load eval)
+             (export ',(intern (format nil "MK-~a" class))))
+           , at outputs
+           , at signals-outputs)))))
 
 (defmacro callback ((widg event data) &body body)
+  #+clisp
   `(c? (without-c-dependency #'(lambda (,widg ,event ,data) 
-				 (declare (ignorable ,widg ,event ,data))
-				 , at body t))))
+                                 (declare (ignorable ,widg ,event ,data))
+                                 , at body t)))
+  #-clisp
+  `(lambda (self ,widg ,event ,data) 
+    (declare (ignorable self ,widg ,event ,data))
+    , at body t))
+
 (defmacro callback-if (condition (widg event data) &body body)
   `(c? (and ,condition
-	(without-c-dependency #'(lambda (,widg ,event ,data) 
-				  (declare (ignorable ,widg ,event ,data))
-				  , at body t)))))
+         #+clisp (without-c-dependency #'(lambda (,widg ,event ,data) 
+                                           (declare (ignorable ,widg ,event ,data))
+                                           , at body t))
+         #-clisp (lambda (self ,widg ,event ,data) 
+                   (declare (ignorable self ,widg ,event ,data))
+                   , at body t))))
+
+(ff-defun-callable :cdecl :int timeout-handler-callback
+    ((data (* :void)))
+  (let ((id (elti data 0)))
+    (gtk-global-callback-funcall id)))
 
 (defun timeout-add (milliseconds function)
-  (g-timeout-add milliseconds 
-		 #'(lambda (x)
-		     (declare (ignore x))
+  (let ((id (gtk-global-callback-register
+              (lambda ()
 		     (with-gdk-threads
-			 (funcall function)))
-		 nil))
+			 (funcall function)))))
+        (c-id (fgn-alloc :int 1)))
+    (setf (elti c-id 0) id)
+    (g-timeout-add milliseconds (ff-register-callable 'timeout-handler-callback) c-id)))
 
 (def-object widget ()
   ((tooltip :accessor tooltip :initarg :tooltip :initform (c-in nil))
@@ -175,14 +281,12 @@
 
 (def-c-output tooltip ((self widget))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-tooltips-set-tip (id (tooltips (upper self gtk-app)))
-				     (id self)
-				     str
-				     ""))))
+    (gtk-tooltips-set-tip (id (tooltips (upper self gtk-app)))
+      (id self) new-value "")))
 
 (defmethod not-to-be :after ((self widget))
   (when *gtk-debug* (trc "WIDGET DESTROY" (md-name self)) (force-output))
+  (gtk-object-forget (id self) self)
   (gtk-widget-destroy (id self)))
 
 (defun assert-bin (container)
@@ -192,7 +296,8 @@
 
 (def-widget window ()
   ((wintype :accessor wintype :initarg wintype :initform 0)
-   (title :accessor title :initarg :title :initform (c? (string (class-name (class-of self)))))
+   (title :accessor title :initarg :title
+     :initform (c? (string (class-name (class-of self)))))
    (icon :initarg :icon :accessor icon :initform nil)
    (decorated :accessor decorated :initarg :decorated :initform (c-in t))
    (position :accessor set-position :initarg :position :initform (c-in nil))
@@ -221,12 +326,11 @@
 
 (def-c-output title ((self window))
   (when new-value
-    (with-gtk-string (str new-value)
-      (gtk-window-set-title (id self) str))))
+    (gtk-window-set-title (id self) new-value)))
 
 (def-c-output icon ((self window))
   (when new-value
-    (gtk-window-set-icon-from-file (id self) new-value nil)))
+    (gtk-window-set-icon-from-file (id self) new-value c-null)))
 
 (def-c-output decorated ((self window))
   (gtk-window-set-decorated (id self) new-value))
@@ -245,8 +349,7 @@
   (assert-bin self)
   (dolist (kid new-value)
     (when *gtk-debug* (trc "WINDOW ADD KID" (md-name self) (md-name kid)) (force-output))
-    (gtk-container-add (id self) (id kid)))
-  (call-next-method))
+    (gtk-container-add (id self) (id kid))))
 
 (def-widget event-box ()
   ((visible-window :accessor visible-window :initarg :visible-window :initform nil))
@@ -260,8 +363,7 @@
 (def-c-output .kids ((self event-box))
   (assert-bin self)
   (when new-value
-    (gtk-container-add (id self) (id (first new-value))))
-  (call-next-method))
-
+    (gtk-container-add (id self) (id (first new-value)))))
 
-(export '(callback callback-if timeout-add focus))
+(eval-when (compile load eval)
+  (export '(callback callback-if timeout-add focus)))




More information about the Cells-gtk-cvs mailing list