Refactoring of gobject:define-vtable
[cl-gtk2.git] / glib / glib.lisp
old mode 100644 (file)
new mode 100755 (executable)
index 5999997..9fa7dcb
            #:g-idle-add-full
            #:g-idle-add
            #:g-timeout-add-full
-           #:g-source-remove)
+           #:g-source-remove
+           #:at-finalize
+           #:with-g-error
+           #:with-catching-to-g-error
+           #:g-error-condition
+           #:g-error-condition-domain
+           #:g-error-condition-code
+           #:g-error-condition-message)
   (:documentation
    "Cl-gtk2-glib is wrapper for @a[http://library.gnome.org/devel/glib/]{GLib}."))
 
   (defun register-initializer (key fn)
     (unless (gethash key *initializers-table*)
       (setf (gethash key *initializers-table*) t
-            *initializers* (nconc *initializers* (list fn))))))
+            *initializers* (nconc *initializers* (list fn)))))
+  (defvar *finalizers-table* (make-hash-table :test 'equalp))
+  (defvar *finalizers* nil)
+  (defun register-finalizer (key fn)
+    (unless (gethash key *finalizers-table*)
+      (setf (gethash key *finalizers-table*) t
+            *finalizers* (nconc *finalizers* (list fn))))))
 
 (defun run-initializers ()
   (iter (for fn in *initializers*)
         (funcall fn)))
 
+(defun run-finalizers ()
+  (iter (for fn in *finalizers*)
+        (funcall fn)))
+
+#+sbcl
+(pushnew 'run-initializers sb-ext:*init-hooks*)
+#+openmcl
+(pushnew 'run-initializers ccl:*restore-lisp-functions*)
+
+#+sbcl
+(pushnew 'run-finalizers sb-ext:*save-hooks*)
+#+openmcl
+(pushnew 'run-finalizers ccl:*save-exit-functions*)
+
 (defmacro at-init ((&rest keys) &body body)
   "
 @arg[keys]{list of expression}
@@ -64,10 +91,13 @@ In this example, for every @code{class}, @code{(initialize-gobject-class-g-type
   `(progn (register-initializer (list ,@keys ',body) (lambda () ,@body))
           ,@body))
 
+(defmacro at-finalize ((&rest keys) &body body)
+  `(register-finalizer (list ,@keys ',body) (lambda () ,@body)))
+
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (define-foreign-library glib
     (:unix (:or "libglib-2.0.so.0" "libglib-2.0.so"))
-    (:win32 "libglib-2.0-0.dll")
+    (:windows "libglib-2.0-0.dll")
     (t (:default "libglib-2.0"))))
 
 (use-foreign-library glib)
@@ -75,7 +105,7 @@ In this example, for every @code{class}, @code{(initialize-gobject-class-g-type
 (eval-when (:compile-toplevel :load-toplevel :execute)
   (define-foreign-library gthread
     (:unix (:or "libgthread-2.0.so.0"  "libgthread-2.0.so"))
-    (:win32 "libgthread-2.0-0.dll")
+    (:windows "libgthread-2.0-0.dll")
     (t "libgthread-2.0")))
 
 (use-foreign-library gthread)
@@ -401,12 +431,11 @@ Adds a function to be called whenever there are no higher priority events pendin
 (defcfun (g-thread-init "g_thread_init") :void
   (vtable :pointer))
 
-(defvar *threads-initialized-p* nil)
+(defcfun g-thread-get-initialized :boolean)
 
 (at-init ()
-  (unless *threads-initialized-p*
-    (g-thread-init (null-pointer))
-    (setf *threads-initialized-p* t)))
+  (unless (g-thread-get-initialized)
+    (g-thread-init (null-pointer))))
 
 (defcenum g-thread-priority
   :g-thread-priority-low