move config option loading for the kernel into config.c/h
[mikachu/openbox.git] / openbox / grab.c
1 #include "openbox.h"
2 #include "event.h"
3 #include "xerror.h"
4
5 #include <glib.h>
6 #include <X11/Xlib.h>
7
8 static guint kgrabs, pgrabs, sgrabs;
9
10 #define MASK_LIST_SIZE 8
11
12 /*! A list of all possible combinations of keyboard lock masks */
13 static unsigned int mask_list[MASK_LIST_SIZE];
14
15 void grab_keyboard(gboolean grab)
16 {
17     if (grab) {
18         if (kgrabs++ == 0)
19             XGrabKeyboard(ob_display, ob_root, 0, GrabModeAsync, GrabModeSync,
20                           event_lasttime);
21     } else if (kgrabs > 0) {
22         if (--kgrabs == 0)
23             XUngrabKeyboard(ob_display, event_lasttime);
24     }
25 }
26
27 void grab_pointer(gboolean grab, Cursor cur)
28 {
29     if (grab) {
30         if (pgrabs++ == 0)
31             XGrabPointer(ob_display, ob_root, False, 0, GrabModeAsync,
32                          GrabModeAsync, FALSE, cur, event_lasttime);
33     } else if (pgrabs > 0) {
34         if (--pgrabs == 0)
35             XUngrabPointer(ob_display, event_lasttime);
36     }
37 }
38
39 void grab_server(gboolean grab)
40 {
41     if (grab) {
42         if (sgrabs++ == 0) {
43             XGrabServer(ob_display);
44             XSync(ob_display, FALSE);
45         }
46     } else if (sgrabs > 0) {
47         if (--sgrabs == 0) {
48             XUngrabServer(ob_display);
49             XFlush(ob_display);
50         }
51     }
52 }
53
54 void grab_startup()
55 {
56     guint i = 0;
57
58     kgrabs = pgrabs = sgrabs = 0;
59
60     mask_list[i++] = 0;
61     mask_list[i++] = LockMask;
62     mask_list[i++] = NumLockMask;
63     mask_list[i++] = LockMask | NumLockMask;
64     mask_list[i++] = ScrollLockMask;
65     mask_list[i++] = ScrollLockMask | LockMask;
66     mask_list[i++] = ScrollLockMask | NumLockMask;
67     mask_list[i++] = ScrollLockMask | LockMask | NumLockMask;
68     g_assert(i == MASK_LIST_SIZE);
69 }
70
71 void grab_shutdown()
72 {
73     while (kgrabs) grab_keyboard(FALSE);
74     while (pgrabs) grab_pointer(FALSE, None);
75     while (sgrabs) grab_server(FALSE);
76 }
77
78 void grab_button(guint button, guint state, Window win, guint mask,
79                  int pointer_mode)
80 {
81     guint i;
82
83     for (i = 0; i < MASK_LIST_SIZE; ++i)
84         XGrabButton(ob_display, button, state | mask_list[i], win, FALSE, mask,
85                     pointer_mode, GrabModeSync, None, None);
86 }
87
88 void ungrab_button(guint button, guint state, Window win)
89 {
90     guint i;
91
92     for (i = 0; i < MASK_LIST_SIZE; ++i)
93         XUngrabButton(ob_display, button, state | mask_list[i], win);
94 }
95
96 void grab_key(guint keycode, guint state, int keyboard_mode)
97 {
98     guint i;
99
100     xerror_set_ignore(TRUE); /* can get BadAccess' from these */
101     xerror_occured = FALSE;
102     for (i = 0; i < MASK_LIST_SIZE; ++i)
103         XGrabKey(ob_display, keycode, state | mask_list[i], ob_root, FALSE,
104                  GrabModeSync, keyboard_mode);
105     xerror_set_ignore(FALSE);
106     if (xerror_occured)
107         g_warning("failed to grab keycode %d modifiers %d", keycode, state);
108 }
109
110 void ungrab_all_keys()
111 {
112     XUngrabKey(ob_display, AnyKey, AnyModifier, ob_root);
113 }