Typo.
[cl-gtk2.git] / gtk / gtk.main_loop_events.lisp
index d2809bc..4bac720 100644 (file)
@@ -7,6 +7,8 @@
 (defun gtk-init ()
   (gtk-init-check (foreign-alloc :int :initial-element 0)
                   (foreign-alloc :string :initial-contents '("/usr/bin/sbcl")))
+  #+ (and sbcl (not win32))
+  (sb-unix::enable-interrupt sb-unix:sigpipe #'sb-unix::sigpipe-handler)
   #+nil(with-foreign-objects ((argc :int)
                          (argv '(:pointer :string) 1))
     (setf (mem-ref argc :int) 0
            (error "Cannot initialize Gtk+"))
       (foreign-free (mem-ref argv '(:pointer :string))))))
 
-(gtk-init)
+(at-init () (gtk-init))
 
-(defcfun gtk-main :void)
+(defcfun (%gtk-main "gtk_main") :void)
 
-#+thread-support
-(defvar *main-thread* nil)
-
-#+thread-support
-(defun ensure-gtk-main ()
-  (when (and *main-thread* (not (bt:thread-alive-p *main-thread*)))
-    (setf *main-thread* nil))
-  (unless *main-thread*
-    (setf *main-thread* (bt:make-thread (lambda () (gtk:gtk-main)) :name "cl-gtk2 main thread"))))
+(defun gtk-main ()
+  (with-gdk-threads-lock (%gtk-main)))
 
 #+thread-support
-(defun join-main-thread ()
-  (when *main-thread*
-    (bt:join-thread *main-thread*)))
-
-#+thread-support
-(export 'join-main-thread)
+(progn
+  (defvar *main-thread* nil)
+  (defvar *main-thread-level* nil)
+  (defvar *main-thread-lock* (bt:make-lock "*main-thread* lock"))
+
+  (at-finalize ()
+    (when (and *main-thread* (bt:thread-alive-p *main-thread*))
+      (bt:destroy-thread *main-thread*)
+      (setf *main-thread* nil)))
+
+  (defun ensure-gtk-main ()
+    (bt:with-lock-held (*main-thread-lock*)
+      (when (and *main-thread* (not (bt:thread-alive-p *main-thread*)))
+        (setf *main-thread* nil))
+      (unless *main-thread*
+        (setf *main-thread* (bt:make-thread (lambda () (gtk-main)) :name "cl-gtk2 main thread")
+              *main-thread-level* 0))
+      (incf *main-thread-level*))
+    (values))
+
+  (defun join-gtk-main ()
+    (when *main-thread*
+      (bt:join-thread *main-thread*)))
+
+  (defun leave-gtk-main ()
+    (bt:with-lock-held (*main-thread-lock*)
+      (decf *main-thread-level*)
+      (when (zerop *main-thread-level*)
+        (gtk-main-quit)))))
 
 #-thread-support
-(defun ensure-gtk-main ()
-  (gtk-main))
-
-(export 'ensure-gtk-main)
+(progn
+  (defun ensure-gtk-main ()
+    (gtk-main)
+    (values))
 
-#+thread-support
-(defun leave-gtk-main ()) ;noop on multithreading
+  (defun leave-gtk-main ()
+    (gtk-main-quit))
+  
+  (defun join-gtk-main ()))
 
-#-thread-support
-(defun leave-gtk-main ()
-  (gtk-main-quit))
+(export 'ensure-gtk-main)
 
 (export 'leave-gtk-main)
 
+(export 'join-gtk-main)
+
 (defcfun gtk-main-level :uint)
 
 (defcfun gtk-main-quit :void)
@@ -64,4 +84,4 @@
 (defcfun gtk-grab-get-current g-object)
 
 (defcfun gtk-grab-remove :void
-  (widget g-object))
\ No newline at end of file
+  (widget g-object))