mouse and key bindings plugins work. segfault somewhere still on shutdown
[mikachu/openbox.git] / openbox / grab.c
1 #include "openbox.h"
2 #include <glib.h>
3 #include <X11/Xlib.h>
4
5 static guint kgrabs, pgrabs, sgrabs;
6
7 void grab_keyboard(gboolean grab)
8 {
9     if (grab) {
10         if (kgrabs++ == 0)
11             XGrabKeyboard(ob_display, ob_root, 0, GrabModeAsync, GrabModeSync,
12                           CurrentTime);
13     } else if (kgrabs > 0) {
14         if (--kgrabs == 0)
15             XUngrabKeyboard(ob_display, CurrentTime);
16     }
17 }
18
19 void grab_pointer(gboolean grab, Cursor cur)
20 {
21     if (grab) {
22         if (pgrabs++ == 0)
23             XGrabPointer(ob_display, ob_root, False, 0, GrabModeAsync,
24                          GrabModeAsync, FALSE, cur, CurrentTime);
25     } else if (pgrabs > 0) {
26         if (--pgrabs == 0)
27             XUngrabPointer(ob_display, CurrentTime);
28     }
29 }
30
31 void grab_server(gboolean grab)
32 {
33     if (grab) {
34         if (sgrabs++ == 0) {
35             XGrabServer(ob_display);
36             XSync(ob_display, FALSE);
37         }
38     } else if (sgrabs > 0) {
39         if (--sgrabs == 0) {
40             XUngrabServer(ob_display);
41             XFlush(ob_display);
42         }
43     }
44 }
45
46 void grab_startup()
47 {
48     kgrabs = pgrabs = sgrabs = 0;
49 }
50
51 void grab_shutdown()
52 {
53     while (kgrabs) grab_keyboard(FALSE);
54     while (pgrabs) grab_pointer(FALSE, None);
55     while (sgrabs) grab_server(FALSE);
56 }