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 |
#include "openbox.h" #include "event.h" #include "xerror.h" #include <glib.h> #include <X11/Xlib.h> #define GRAB_PTR_MASK (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask) #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]; int grab_keyboard(gboolean grab) { static guint kgrabs = 0; if (grab) { if (kgrabs++ == 0) XGrabKeyboard(ob_display, ob_root, FALSE, GrabModeAsync, GrabModeAsync, event_lasttime); } else if (kgrabs > 0) { if (--kgrabs == 0) XUngrabKeyboard(ob_display, event_lasttime); } return kgrabs; } int grab_pointer(gboolean grab, Cursor cur) { static guint pgrabs = 0; if (grab) { if (pgrabs++ == 0) XGrabPointer(ob_display, ob_root, False, GRAB_PTR_MASK, GrabModeAsync, GrabModeAsync, FALSE, cur, event_lasttime); } else if (pgrabs > 0) { if (--pgrabs == 0) XUngrabPointer(ob_display, event_lasttime); } return pgrabs; } int grab_pointer_window(gboolean grab, Cursor cur, Window win) { static guint pgrabs = 0; if (grab) { if (pgrabs++ == 0) XGrabPointer(ob_display, win, False, GRAB_PTR_MASK, GrabModeAsync, GrabModeAsync, TRUE, cur, event_lasttime); } else if (pgrabs > 0) { if (--pgrabs == 0) XUngrabPointer(ob_display, event_lasttime); } return pgrabs; } 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, None)); while (grab_pointer_window(FALSE, None, None)); while (grab_server(FALSE)); } void grab_button(guint button, guint state, Window win, guint mask, int pointer_mode) { guint i; for (i = 0; i < MASK_LIST_SIZE; ++i) XGrabButton(ob_display, button, state | mask_list[i], win, FALSE, mask, pointer_mode, GrabModeSync, None, 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, 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], ob_root, FALSE, GrabModeSync, keyboard_mode); xerror_set_ignore(FALSE); if (xerror_occured) g_warning("failed to grab keycode %d modifiers %d", keycode, state); } void ungrab_all_keys() { XUngrabKey(ob_display, AnyKey, AnyModifier, ob_root); } |