]> icculus.org git repositories - dana/openbox.git/blob - openbox/grab.c
update the build system, using a single Makefile.am for a sexyass non-recursive make...
[dana/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 #define GRAB_PTR_MASK (ButtonPressMask | ButtonReleaseMask | PointerMotionMask)
9 #define GRAB_KEY_MASK (KeyPressMask | KeyReleaseMask)
10
11 #define MASK_LIST_SIZE 8
12
13 /*! A list of all possible combinations of keyboard lock masks */
14 static unsigned int mask_list[MASK_LIST_SIZE];
15
16 gboolean grab_keyboard(gboolean grab)
17 {
18     static guint kgrabs = 0;
19     gboolean ret = FALSE;
20
21     if (grab) {
22         if (kgrabs++ == 0)
23             ret = XGrabKeyboard(ob_display, ob_root, FALSE, GrabModeAsync,
24                                 GrabModeAsync, event_lasttime) == Success;
25         else
26             ret = TRUE;
27     } else if (kgrabs > 0) {
28         if (--kgrabs == 0)
29             XUngrabKeyboard(ob_display, event_lasttime);
30         ret = TRUE;
31     }
32     return ret;
33 }
34
35 gboolean grab_pointer(gboolean grab, Cursor cur)
36 {
37     static guint pgrabs = 0;
38     gboolean ret = FALSE;
39
40     if (grab) {
41         if (pgrabs++ == 0)
42             ret = XGrabPointer(ob_display, ob_root, False, GRAB_PTR_MASK,
43                                GrabModeAsync, GrabModeAsync, FALSE, cur,
44                                event_lasttime) == Success;
45         else
46             ret = TRUE;
47     } else if (pgrabs > 0) {
48         if (--pgrabs == 0)
49             XUngrabPointer(ob_display, event_lasttime);
50         ret = TRUE;
51     }
52     return ret;
53 }
54
55 gboolean grab_pointer_window(gboolean grab, Cursor cur, Window win)
56 {
57     static guint pgrabs = 0;
58     gboolean ret = FALSE;
59
60     if (grab) {
61         if (pgrabs++ == 0)
62             ret = XGrabPointer(ob_display, win, False, GRAB_PTR_MASK,
63                                GrabModeAsync, GrabModeAsync, TRUE, cur,
64                                event_lasttime) == Success;
65         else
66             ret = TRUE;
67     } else if (pgrabs > 0) {
68         if (--pgrabs == 0)
69             XUngrabPointer(ob_display, event_lasttime);
70         ret = TRUE;
71     }
72     return ret;
73 }
74
75 int grab_server(gboolean grab)
76 {
77     static guint sgrabs = 0;
78     if (grab) {
79         if (sgrabs++ == 0) {
80             XGrabServer(ob_display);
81             XSync(ob_display, FALSE);
82         }
83     } else if (sgrabs > 0) {
84         if (--sgrabs == 0) {
85             XUngrabServer(ob_display);
86             XFlush(ob_display);
87         }
88     }
89     return sgrabs;
90 }
91
92 void grab_startup()
93 {
94     guint i = 0;
95
96     mask_list[i++] = 0;
97     mask_list[i++] = LockMask;
98     mask_list[i++] = NumLockMask;
99     mask_list[i++] = LockMask | NumLockMask;
100     mask_list[i++] = ScrollLockMask;
101     mask_list[i++] = ScrollLockMask | LockMask;
102     mask_list[i++] = ScrollLockMask | NumLockMask;
103     mask_list[i++] = ScrollLockMask | LockMask | NumLockMask;
104     g_assert(i == MASK_LIST_SIZE);
105 }
106
107 void grab_shutdown()
108 {
109     while (grab_keyboard(FALSE));
110     while (grab_pointer(FALSE, None));
111     while (grab_pointer_window(FALSE, None, None));
112     while (grab_server(FALSE));
113 }
114
115 void grab_button_full(guint button, guint state, Window win, guint mask,
116                       int pointer_mode, Cursor cursor)
117 {
118     guint i;
119
120     for (i = 0; i < MASK_LIST_SIZE; ++i)
121         XGrabButton(ob_display, button, state | mask_list[i], win, FALSE, mask,
122                     pointer_mode, GrabModeSync, None, cursor);
123 }
124
125 void grab_button(guint button, guint state, Window win, guint mask)
126 {
127     grab_button_full(button, state, win, mask, GrabModeAsync, None);
128 }
129
130 void ungrab_button(guint button, guint state, Window win)
131 {
132     guint i;
133
134     for (i = 0; i < MASK_LIST_SIZE; ++i)
135         XUngrabButton(ob_display, button, state | mask_list[i], win);
136 }
137
138 void grab_key(guint keycode, guint state, Window win, int keyboard_mode)
139 {
140     guint i;
141
142     xerror_set_ignore(TRUE); /* can get BadAccess' from these */
143     xerror_occured = FALSE;
144     for (i = 0; i < MASK_LIST_SIZE; ++i)
145         XGrabKey(ob_display, keycode, state | mask_list[i], win, FALSE,
146                  GrabModeSync, keyboard_mode);
147     xerror_set_ignore(FALSE);
148     if (xerror_occured)
149         g_warning("failed to grab keycode %d modifiers %d", keycode, state);
150 }
151
152 void ungrab_all_keys(Window win)
153 {
154     XUngrabKey(ob_display, AnyKey, AnyModifier, win);
155 }