X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=gtk%2Fgtk.main_loop_events.lisp;h=4bac7204e250eb7c28526b5a1eb093a0a41ab690;hb=47b0bf2bfd057e9b409957e8e5cb2241e2fa6573;hp=d2809bca826cb6317e96493eb6c4d2907e447b9c;hpb=c337b7547910e38567837fee1cabab7ebe597e5c;p=cl-gtk2.git diff --git a/gtk/gtk.main_loop_events.lisp b/gtk/gtk.main_loop_events.lisp index d2809bc..4bac720 100644 --- a/gtk/gtk.main_loop_events.lisp +++ b/gtk/gtk.main_loop_events.lisp @@ -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 @@ -17,43 +19,61 @@ (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))