(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))
+(progn
+ (defun ensure-gtk-main ()
+ (gtk-main)
+ (values))
-(export 'ensure-gtk-main)
+ (defun leave-gtk-main ()
+ (gtk-main-quit))
+
+ (defun join-gtk-main ()))
-#+thread-support
-(defun leave-gtk-main ()) ;noop on multithreading
-
-#-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)