[cells-gtk-cvs] CVS update: root/cells-gtk/textview.lisp

Peter Denno pdenno at common-lisp.net
Sat Feb 26 22:29:24 UTC 2005


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

Modified Files:
	textview.lisp 
Log Message:
Implementation of populate-popup signal handling.
Date: Sat Feb 26 23:29:23 2005
Author: pdenno

Index: root/cells-gtk/textview.lisp
diff -u root/cells-gtk/textview.lisp:1.2 root/cells-gtk/textview.lisp:1.3
--- root/cells-gtk/textview.lisp:1.2	Sun Dec  5 07:33:23 2004
+++ root/cells-gtk/textview.lisp	Sat Feb 26 23:29:23 2005
@@ -30,7 +30,10 @@
 			      -1))
 
 (def-widget text-view ()
-  ((buffer :accessor buffer :initarg :buffer :initform (mk-text-buffer)))
+  ((buffer :accessor buffer :initarg :buffer :initform (mk-text-buffer))
+   (populate-popup :accessor populate-popup :initarg :populate-popup :initform (c-in nil))
+   (depopulate-popup :accessor depopulate-popup :initarg :depopulate-popup :initform (c-in nil))
+   (old-popups :cell nil :accessor old-popups :initform nil))
   ()
   ()
   :kids (c? (when (buffer self) (list (buffer self))))
@@ -40,3 +43,64 @@
 (def-c-output buffer ((self text-view))
   (when new-value
     (gtk-text-view-set-buffer (id self) (id (buffer self)))))
+
+;;; --------Populate-add -------------------------------------------------
+;;; Menu-items that are appended to the existing textview popup menu on 
+;;; the populate-popup signal. They are made fresh from populate-adds.
+
+(defclass populate-adds ()
+  ((label :initarg :label :initform nil)
+   (on-activate :initarg :on-activate :initform nil)
+   (owner :initarg :owner :initform nil)
+   (kids :initarg :kids :initform nil)))
+
+;;; Returns a list of populate-adds objects. These contain the :on-activate closures, 
+;;; but do not create the menu-item, which must be made each time they are needed, 
+;;; in the handler.
+(defmacro def-populate-adds (&body menu-items)
+  `(list 
+    ,@(loop for (type . args) in menu-items 
+           when (eql type :menu-item)
+           collect `(funcall #'make-instance 'populate-adds , at args))))
+
+(ff-defun-callable :cdecl :void text-view-populate-popup-handler
+  ((widget :pointer-void) (signal :pointer-void) (data :pointer-void))
+  (declare (ignorable signal data))
+  (let ((popup-menu (gtk-adds-text-view-popup-menu widget)))
+    (bwhen (text-view (gtk-object-find widget))
+      (bwhen (cb (callback-recover text-view :populate-popup))
+        (funcall cb popup-menu))))
+  1)
+
+(def-c-output populate-popup ((self text-view))
+  (when new-value
+      (callback-register self :populate-popup (populate-popup-closure (reverse new-value) self))
+      (gtk-signal-connect (id self) "populate-popup"
+                          (ffx:ff-register-callable 'text-view-populate-popup-handler))))
+
+(defun populate-popup-closure (p-adds text-view)
+  (let (accum)
+    (labels ((do-padds (p-add)
+               (let ((item (with-slots (label on-activate owner kids) p-add
+                             (mk-menu-item :label label :owner owner :on-activate on-activate
+                                           :kids (mapcar #'do-padds kids)))))
+                 (push item accum)
+                 item)))
+      #'(lambda (popup-menu)
+          (loop for old in (old-popups text-view) do 
+               (bwhen (sub (submenu old)) 
+                 (gtk-object-forget (id sub) sub))
+               (gtk-object-forget (id old) old))
+          (let ((tops (mapcar #'do-padds p-adds)))
+            (setf (old-popups text-view) accum)
+            (mapc #'(lambda (i) (to-be i) (gtk-menu-shell-prepend popup-menu (id i))) tops))))))
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (export '(def-populate-adds populate-adds)))
+
+
+
+
+
+
+




More information about the Cells-gtk-cvs mailing list