From: espen Date: Thu, 6 Jan 2005 21:00:51 +0000 (+0000) Subject: New method CREATE-CALLBACK-FUNCTION X-Git-Tag: clg-0-90~121 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/commitdiff_plain/2519d4caa43668fbd35d4f0bb1c34ff648b118b7 New method CREATE-CALLBACK-FUNCTION --- diff --git a/gtk/gtkcontainer.lisp b/gtk/gtkcontainer.lisp index 010fca1..767b0fa 100644 --- a/gtk/gtkcontainer.lisp +++ b/gtk/gtkcontainer.lisp @@ -15,7 +15,7 @@ ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -;; $Id: gtkcontainer.lisp,v 1.15 2004/12/29 21:14:23 espen Exp $ +;; $Id: gtkcontainer.lisp,v 1.16 2005/01/06 21:00:53 espen Exp $ (in-package "GTK") @@ -30,6 +30,15 @@ (defmethod shared-initialize ((container container) names &rest initargs initargs :child :children)) +(defmethod create-callback-function ((container container) function arg1) + (if (eq arg1 :children) + #'(lambda (&rest args) + (mapc #'(lambda (child) + (apply function child (rest args))) + (container-children container))) + (call-next-method))) + + (defbinding %container-add () nil (container container) (widget widget)) diff --git a/gtk/gtkwidget.lisp b/gtk/gtkwidget.lisp index dc0cb85..9696911 100644 --- a/gtk/gtkwidget.lisp +++ b/gtk/gtkwidget.lisp @@ -15,7 +15,7 @@ ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -;; $Id: gtkwidget.lisp,v 1.13 2004/12/20 20:09:53 espen Exp $ +;; $Id: gtkwidget.lisp,v 1.14 2005/01/06 21:00:51 espen Exp $ (in-package "GTK") @@ -49,7 +49,23 @@ (defmethod slot-unbound ((class gobject-class) (object widget) slot) :parent parent :child object)))) (t (call-next-method)))) - +(defmethod create-callback-function ((widget widget) function arg1) + (if (eq arg1 :parent) + #'(lambda (&rest args) + (if (slot-boundp widget 'parent) + (apply function (widget-parent widget) (rest args)) + (signal-connect widget 'parent-set + #'(lambda (old-parent) + (declare (ignore old-parent)) + (let ((*signal-stop-emission* + #'(lambda () + (warn "Ignoring emission stop in delayed signal handler")))) + (apply function (widget-parent widget) (rest args)))) + :remove t) +; (warn "Widget has no parent -- ignoring signal") + )) + (call-next-method))) + (defun child-property-value (widget slot) (slot-value (widget-child-properties widget) slot))