;; 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: gcallback.lisp,v 1.13 2004-11-07 01:23:38 espen Exp $
+;; $Id: gcallback.lisp,v 1.16 2004-12-05 13:54:10 espen Exp $
(in-package "GLIB")
;;;; Timeouts and idle functions
+(defconstant +priority-high+ -100)
+(defconstant +priority-default+ 0)
+(defconstant +priority-high-idle+ 100)
+(defconstant +priority-default-idle+ 200)
+(defconstant +priority-low+ 300)
+
+(defbinding source-remove () boolean
+ (tag unsigned-int))
+
(defcallback source-callback-marshal (nil (callback-id unsigned-int))
(callback-trampoline callback-id 0 nil (make-pointer 0)))
(defbinding (timeout-add "g_timeout_add_full")
- (function interval &optional (priority 0)) unsigned-int
+ (interval function &optional (priority +priority-default+)) unsigned-int
(priority int)
(interval unsigned-int)
- (*source-callback-marshal* pointer)
+ ((callback source-callback-marshal) pointer)
((register-callback-function function) unsigned-long)
((callback %destroy-user-data) pointer))
+(defun timeout-remove (timeout)
+ (source-remove timeout))
+
(defbinding (idle-add "g_idle_add_full")
- (function &optional (priority 0)) unsigned-int
+ (function &optional (priority +priority-default-idle+)) unsigned-int
(priority int)
- (*source-callback-marshal* pointer)
+ ((callback source-callback-marshal) pointer)
((register-callback-function function) unsigned-long)
((callback %destroy-user-data) pointer))
+(defun idle-remove (idle)
+ (source-remove idle))
;;;; Signals
is T, the object connected to is passed as the first argument to the callback
function, or if :OBJECT is any other non NIL value, it is passed as the first
argument instead. If :AFTER is non NIL, the handler will be called after the
- default handler of the signal."
- (let ((callback-id
- (make-callback-closure
- (cond
- ((or (eq object t) (eq object gobject)) function)
- ((not object)
- #'(lambda (&rest args) (apply function (cdr args))))
- (t
- #'(lambda (&rest args) (apply function object (rest args))))))))
- (signal-connect-closure gobject signal callback-id :after after)))
+ default handler for the signal."
+ (when function
+ (let ((callback-id
+ (make-callback-closure
+ (cond
+ ((or (eq object t) (eq object gobject)) function)
+ ((not object)
+ #'(lambda (&rest args) (apply function (cdr args))))
+ (t
+ #'(lambda (&rest args) (apply function object (rest args))))))))
+ (signal-connect-closure gobject signal callback-id :after after))))
;;; Message logging
(error "~A: ~A" domain message))
(setf (extern-alien "log_handler" system-area-pointer) (callback log-handler))
+
+
+;;;; Convenient macros
+
+(defmacro def-callback-marshal (name (return-type &rest args))
+ (let ((names (loop
+ for arg in args
+ collect (if (atom arg) (gensym) (first arg))))
+ (types (loop
+ for arg in args
+ collect (if (atom arg) arg (second arg)))))
+ `(defcallback ,name (,return-type ,@(mapcar #'list names types)
+ (callback-id unsigned-int))
+ (invoke-callback callback-id ',return-type ,@names))))
+
+(defmacro with-callback-function ((id function) &body body)
+ `(let ((,id (register-callback-function ,function)))
+ (unwind-protect
+ (progn ,@body)
+ (destroy-user-data ,id))))
+
+