When multithreading is supported, run gtk_main with Gdk threads lock acquired
[cl-gtk2.git] / gtk / gtk.main_loop_events.lisp
1 (in-package :gtk)
2
3 (defcfun gtk-init-check :boolean
4   (argc (:pointer :int))
5   (argv (:pointer (:pointer :string))))
6
7 (defun gtk-init ()
8   (gtk-init-check (foreign-alloc :int :initial-element 0)
9                   (foreign-alloc :string :initial-contents '("/usr/bin/sbcl")))
10   #+nil(with-foreign-objects ((argc :int)
11                          (argv '(:pointer :string) 1))
12     (setf (mem-ref argc :int) 0
13           (mem-ref argv '(:pointer :string)) (foreign-alloc :string :count 1
14                                                             :initial-element "/usr/bin/sbcl"))
15     (unwind-protect
16          (unless (gtk-init-check argc argv)
17            (error "Cannot initialize Gtk+"))
18       (foreign-free (mem-ref argv '(:pointer :string))))))
19
20 (at-init () (gtk-init))
21
22 (defcfun (%gtk-main "gtk_main") :void)
23
24 #+thread-support
25 (defun gtk-main ()
26   (with-gdk-threads-lock (%gtk-main)))
27
28 #-thread-support
29 (defun gtk-main ()
30   (%gtk-main))
31
32 #+thread-support
33 (defvar *main-thread* nil)
34
35 #+thread-support
36 (at-finalize ()
37   (when (and *main-thread* (bt:thread-alive-p *main-thread*))
38     (bt:destroy-thread *main-thread*)
39     (setf *main-thread* nil)))
40
41 #+thread-support
42 (defun ensure-gtk-main ()
43   (when (and *main-thread* (not (bt:thread-alive-p *main-thread*)))
44     (setf *main-thread* nil))
45   (unless *main-thread*
46     (setf *main-thread* (bt:make-thread (lambda () (gtk-main)) :name "cl-gtk2 main thread"))))
47
48 #+thread-support
49 (defun join-main-thread ()
50   (when *main-thread*
51     (bt:join-thread *main-thread*)))
52
53 #+thread-support
54 (export 'join-main-thread)
55
56 #-thread-support
57 (defun ensure-gtk-main ()
58   (gtk-main))
59
60 (export 'ensure-gtk-main)
61
62 #+thread-support
63 (defun leave-gtk-main ()) ;noop on multithreading
64
65 #-thread-support
66 (defun leave-gtk-main ()
67   (gtk-main-quit))
68
69 (export 'leave-gtk-main)
70
71 (defcfun gtk-main-level :uint)
72
73 (defcfun gtk-main-quit :void)
74
75 (defcfun gtk-grab-add :void
76   (widget g-object))
77
78 (defcfun gtk-grab-get-current g-object)
79
80 (defcfun gtk-grab-remove :void
81   (widget g-object))