X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/e69e261866aaac26d68697d2b36e1783be232c1c..d1b6a54e578ad5b6980545e9132f90e3f3ebc95f:/glib/gcallback.lisp diff --git a/glib/gcallback.lisp b/glib/gcallback.lisp index 329bb60..c25f62b 100644 --- a/glib/gcallback.lisp +++ b/glib/gcallback.lisp @@ -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.46 2007-08-20 11:15:13 espen Exp $ +;; $Id: gcallback.lisp,v 1.50 2008-05-06 00:04:42 espen Exp $ (in-package "GLIB") @@ -170,7 +170,7 @@ (defbinding signal-lookup (name type) unsigned-int ((signal-name-to-string name) string) ((find-type-number type t) type-number)) -(defbinding signal-name () (copy-of string) +(defbinding signal-name () (or null (copy-of string)) (signal-id unsigned-int)) (defbinding signal-list-ids (type) (vector unsigned-int n-ids) @@ -244,6 +244,8 @@ (defun describe-signal (signal-id &optional type) ;;;; Signal connecting and controlling +(define-flags-type connect-flags :after :swapped) + (defvar *overridden-signals* (make-hash-table :test 'equalp)) (defbinding %signal-override-class-closure () nil @@ -451,28 +453,34 @@ (defmethod signal-connect ((gobject gobject) signal function :REMOVE is non NIL, the handler will be removed after beeing invoked once. ARGS is a list of additional arguments passed to the callback function." -(let* ((signal-id (compute-signal-id gobject signal)) - (detail-quark (if detail (quark-intern detail) 0)) - (signal-stop-emission - #'(lambda () - (%signal-stop-emission gobject signal-id detail-quark))) - (callback (compute-signal-function gobject signal function object args)) - (wrapper #'(lambda (&rest args) - (let ((*signal-stop-emission* signal-stop-emission)) - (apply callback args))))) - (multiple-value-bind (closure-id callback-id) - (make-callback-closure wrapper signal-handler-marshal) - (let ((handler-id (%signal-connect-closure-by-id - gobject signal-id detail-quark closure-id after))) - (when remove - (update-user-data callback-id - #'(lambda (&rest args) + (let* ((signal-id (compute-signal-id gobject signal)) + (detail-quark (if detail (quark-intern detail) 0)) + (callback + (compute-signal-function gobject signal function object args)) + (wrapper + #'(lambda (&rest args) + (let ((*signal-stop-emission* + #'(lambda () + (%signal-stop-emission (first args) + signal-id detail-quark)))) + (apply callback args))))) + (multiple-value-bind (closure-id callback-id) + (make-callback-closure wrapper signal-handler-marshal) + (let ((handler-id (%signal-connect-closure-by-id + gobject signal-id detail-quark closure-id after))) + (when remove + (update-user-data callback-id + #'(lambda (&rest args) + (let ((gobject (first args))) (unwind-protect - (let ((*signal-stop-emission* signal-stop-emission)) - (apply callback args)) + (let ((*signal-stop-emission* + #'(lambda () + (%signal-stop-emission gobject + signal-id detail-quark)))) + (apply callback args)) (when (signal-handler-is-connected-p gobject handler-id) - (signal-handler-disconnect gobject handler-id)))))) - handler-id)))) + (signal-handler-disconnect gobject handler-id))))))) + handler-id)))) ;;;; Signal emission @@ -504,7 +512,7 @@ (defun create-signal-emit-function (signal-id) finally (if return-type (return - (with-gvalue (return-value) + (with-gvalue (return-value return-type) (%signal-emitv params signal-id detail return-value))) (%signal-emitv params signal-id detail (make-pointer 0)))) (loop