X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=gtk%2Fgtk.main_loop_events.lisp;h=244a7d770f3c8fc5b617a6f9d24ac8673e75d6a4;hb=1f9c939a43d645eaf55e4d375f6b1b609dd1c5bd;hp=6c7376a46cd78eef95a415d19a3bb773c2ebc8f8;hpb=0d03b82a77743d2ea5ef69bea08735fa12857d92;p=cl-gtk2.git diff --git a/gtk/gtk.main_loop_events.lisp b/gtk/gtk.main_loop_events.lisp index 6c7376a..244a7d7 100644 --- a/gtk/gtk.main_loop_events.lisp +++ b/gtk/gtk.main_loop_events.lisp @@ -17,24 +17,64 @@ (error "Cannot initialize Gtk+")) (foreign-free (mem-ref argv '(:pointer :string)))))) -(gtk-init) +(at-init () (gtk-init)) -(defcfun gtk-test-register-all-types :void) +(defcfun (%gtk-main "gtk_main") :void) -(gtk-test-register-all-types) +(defun gtk-main () + (with-gdk-threads-lock (%gtk-main))) -(defcfun gtk-events-pending :boolean) +#+thread-support +(progn + (defvar *main-thread* nil) + (defvar *main-thread-level* nil) + (defvar *main-thread-lock* (bt:make-lock "*main-thread* lock")) -(defcfun gtk-main :void) + (at-finalize () + (when (and *main-thread* (bt:thread-alive-p *main-thread*)) + (bt:destroy-thread *main-thread*) + (setf *main-thread* nil))) -(defcfun gtk-main-level :uint) + (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)) -(defcfun gtk-main-quit :void) + (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 +(progn + (defun ensure-gtk-main () + (gtk-main) + (values)) + + (defun leave-gtk-main () + (gtk-main-quit)) + + (defun join-gtk-main ())) -(defcfun gtk-main-iteration :boolean) +(export 'ensure-gtk-main) -(defcfun gtk-main-iteration-do :boolean - (blocking :boolean)) +(export 'leave-gtk-main) + +(export 'join-gtk-main) + +(defcfun gtk-main-level :uint) + +(defcfun gtk-main-quit :void) (defcfun gtk-grab-add :void (widget g-object))