void GrabButtonSet(unsigned int button, unsigned int modifiers, Win win, unsigned int event_mask, unsigned int csr, int confine __UNUSED__) { Bool owner_events = False; int pointer_mode = GrabModeSync; int keyboard_mode = GrabModeAsync; int i; #if USE_XI2 EXIEventMask em; XIGrabModifiers modifiers_inouts[8]; int num_modifiers; EXIMaskSetup(&em, DEV_PTR, event_mask); if (modifiers == AnyModifier) { num_modifiers = 1; modifiers_inouts[0].modifiers = XIAnyModifier; modifiers_inouts[0].status = 0; } else { num_modifiers = 0; for (i = 0; i < 8; i++) { if (i && !Mode.masks.mod_combos[i]) continue; modifiers_inouts[num_modifiers].modifiers = modifiers | Mode.masks.mod_combos[i]; modifiers_inouts[num_modifiers].status = 0; num_modifiers++; } } XIGrabButton(disp, DEV_PTR, button, WinGetXwin(win), ECsrGet(csr), pointer_mode, keyboard_mode, owner_events, &em.em, num_modifiers, modifiers_inouts); #else EX_Window confine_to = (confine) ? WinGetXwin(win) : NoXID; if (modifiers == AnyModifier) { XGrabButton(disp, button, modifiers, WinGetXwin(win), owner_events, event_mask, pointer_mode, keyboard_mode, confine_to, ECsrGet(csr)); return; } for (i = 0; i < 8; i++) { if (i && !Mode.masks.mod_combos[i]) continue; XGrabButton(disp, button, modifiers | Mode.masks.mod_combos[i], WinGetXwin(win), owner_events, event_mask, pointer_mode, keyboard_mode, confine_to, ECsrGet(csr)); } #endif }
void grab_button (int deviceid, gboolean grab, GdkScreen *screen) { GdkWindow *root; XIGrabModifiers mods; root = gdk_screen_get_root_window (screen); mods.modifiers = XIAnyModifier; if (grab) { XIEventMask evmask; unsigned char mask[(XI_LASTEVENT + 7)/8]; memset (mask, 0, sizeof (mask)); XISetMask (mask, XI_ButtonRelease); XISetMask (mask, XI_ButtonPress); evmask.deviceid = deviceid; evmask.mask_len = sizeof (mask); evmask.mask = mask; gdk_error_trap_push(); XIGrabButton (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), deviceid, XIAnyButton, GDK_WINDOW_XID (root), None, GrabModeAsync, GrabModeAsync, False, &evmask, 1, &mods); gdk_error_trap_pop_ignored (); } else { gdk_error_trap_push(); XIUngrabButton (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), deviceid, XIAnyButton, GDK_WINDOW_XID (root), 1, &mods); gdk_error_trap_pop_ignored (); } }
gboolean xfwm_device_grab_button (XfwmDevices *devices, Display *display, guint button, guint modifiers, Window grab_window, gboolean owner_events, guint event_mask, gint grab_mode, gint paired_device_mode, Window confine_to, Cursor cursor) { gboolean result; Status status; #ifdef HAVE_XI2 XIGrabModifiers xi2_modifiers; XIEventMask xievent_mask; #endif #ifdef HAVE_XI2 if (devices->xi2_available) { xi2_modifiers.modifiers = xi2_modifier_mask (modifiers); xi2_modifiers.status = 0; xfwm_device_fill_xi2_event_mask (&xievent_mask, event_mask); status = XIGrabButton (display, devices->pointer.xi2_device, button, grab_window, cursor, grab_mode, paired_device_mode, owner_events, &xievent_mask, 1, &xi2_modifiers); g_free (xievent_mask.mask); result = (status == XIGrabSuccess); } else #endif { status = XGrabButton (display, button, modifiers, grab_window, owner_events, event_mask, grab_mode, paired_device_mode, confine_to, cursor); result = (status == GrabSuccess); } return result; }