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