(in-package :gobject)
+;;; Signal handler closures
+
(defcstruct lisp-signal-handler-closure
(:parent-instance g-closure)
(:object :pointer)
(:function-id :int))
+(defctype lisp-signal-handler-closure (:struct lisp-signal-handler-closure))
(defun finalize-lisp-signal-handler-closure (closure)
(let* ((function-id (foreign-slot-value closure 'lisp-signal-handler-closure :function-id))
(let ((id (find-free-signal-handler-id object))
(handlers (g-object-signal-handlers object)))
(if id
- (setf (aref handlers id) handler)
- (vector-push-extend handler handlers))))
+ (progn (setf (aref handlers id) handler) id)
+ (progn (vector-push-extend handler handlers) (1- (length handlers))))))
(defun retrieve-handler-from-object (object handler-id)
(aref (g-object-signal-handlers object) handler-id))
(for type in (signal-info-param-types signal-info))
(set-g-value (mem-aref params 'g-value (1+ i)) arg type :zero-g-value t))
(prog1
- (if (g-type= (signal-info-return-type signal-info) +g-type-void+)
+ (if (eq (signal-info-return-type signal-info) (gtype +g-type-void+))
(g-signal-emitv params (signal-info-id signal-info) signal-name (null-pointer))
(with-foreign-object (return-value 'g-value)
(g-value-zero return-value)
(g-value-unset return-value))))
(iter (for i from 0 below (1+ params-count))
(g-value-unset (mem-aref params 'g-value i))))))))
+
+(defcfun (disconnect-signal "g_signal_handler_disconnect") :void
+ (object g-object)
+ (handler-id :ulong))