diff --git a/src/device.c b/src/device.c index 796be92a5a67b8b0ffb26d24d1835a517cd570a7..47403b1c8fca2c97b8db73a80016d3ac98112856 100644 --- a/src/device.c +++ b/src/device.c @@ -402,20 +402,59 @@ xfwm_device_grab_button (XfwmDevices *devices, Display *display, gint grab_mode, gint paired_device_mode, Window confine_to, Cursor cursor) { - gboolean status; + gboolean result; + Status status; +#ifdef HAVE_XI2 + XIGrabModifiers xi2_modifiers; + XIEventMask xievent_mask; +#endif - status = XGrabButton (display, button, modifiers, grab_window, - owner_events, event_mask, grab_mode, paired_device_mode, - confine_to, cursor); +#ifdef HAVE_XI2 + if (devices->xi2_available) + { + xi2_modifiers.modifiers = xi2_modifier_mask (modifiers); + xi2_modifiers.status = 0; - return status; + 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; } void xfwm_device_ungrab_button (XfwmDevices *devices, Display *display, guint button, guint modifiers, Window grab_window) { - XUngrabButton (display, button, modifiers, grab_window); +#ifdef HAVE_XI2 + XIGrabModifiers xi2_modifiers; +#endif + +#ifdef HAVE_XI2 + if (devices->xi2_available) + { + xi2_modifiers.modifiers = xi2_modifier_mask (modifiers); + xi2_modifiers.status = 0; + + XIUngrabButton (display, devices->pointer.xi2_device, button, + grab_window, 1, &xi2_modifiers); + } + else +#endif + { + XUngrabButton (display, button, modifiers, grab_window); + } } gboolean