diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c index f0e65b3aac..3b009e5c4a 100644 --- a/gdk/x11/gdkdevice-xi2.c +++ b/gdk/x11/gdkdevice-xi2.c @@ -388,6 +388,7 @@ gdk_x11_device_xi2_grab (GdkDevice *device, guint32 time_) { GdkX11DeviceXI2 *device_xi2 = GDK_X11_DEVICE_XI2 (device); + GdkX11DeviceManagerXI2 *device_manager_xi2; GdkDisplay *display; XIEventMask mask; Window xwindow; @@ -395,6 +396,7 @@ gdk_x11_device_xi2_grab (GdkDevice *device, gint status; display = gdk_device_get_display (device); + device_manager_xi2 = GDK_X11_DEVICE_MANAGER_XI2 (gdk_display_get_device_manager (display)); /* FIXME: confine_to is actually unused */ @@ -409,7 +411,9 @@ gdk_x11_device_xi2_grab (GdkDevice *device, } mask.deviceid = device_xi2->device_id; - mask.mask = _gdk_x11_device_xi2_translate_event_mask (event_mask, &mask.mask_len); + mask.mask = _gdk_x11_device_xi2_translate_event_mask (device_manager_xi2, + event_mask, + &mask.mask_len); #ifdef G_ENABLE_DEBUG if (_gdk_debug_flags & GDK_DEBUG_NOGRABS) @@ -625,10 +629,17 @@ gdk_x11_device_xi2_select_window_events (GdkDevice *device, GdkEventMask event_mask) { GdkX11DeviceXI2 *device_xi2 = GDK_X11_DEVICE_XI2 (device); + GdkX11DeviceManagerXI2 *device_manager_xi2; + GdkDisplay *display; XIEventMask evmask; + display = gdk_device_get_display (device); + device_manager_xi2 = GDK_X11_DEVICE_MANAGER_XI2 (gdk_display_get_device_manager (display)); + evmask.deviceid = device_xi2->device_id; - evmask.mask = _gdk_x11_device_xi2_translate_event_mask (event_mask, &evmask.mask_len); + evmask.mask = _gdk_x11_device_xi2_translate_event_mask (device_manager_xi2, + event_mask, + &evmask.mask_len); XISelectEvents (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window), @@ -638,10 +649,14 @@ gdk_x11_device_xi2_select_window_events (GdkDevice *device, } guchar * -_gdk_x11_device_xi2_translate_event_mask (GdkEventMask event_mask, - gint *len) +_gdk_x11_device_xi2_translate_event_mask (GdkX11DeviceManagerXI2 *device_manager_xi2, + GdkEventMask event_mask, + gint *len) { guchar *mask; + gint minor; + + g_object_get (device_manager_xi2, "minor", &minor, NULL); *len = XIMaskLen (XI_LASTEVENT); mask = g_new0 (guchar, *len); @@ -691,7 +706,9 @@ _gdk_x11_device_xi2_translate_event_mask (GdkEventMask event_mask, } #ifdef XINPUT_2_2 - if (event_mask & GDK_TOUCH_MASK) + /* XInput 2.2 includes multitouch support */ + if (minor >= 2 && + event_mask & GDK_TOUCH_MASK) { XISetMask (mask, XI_TouchBegin); XISetMask (mask, XI_TouchUpdate); diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index 05a35c8fad..63f9bf8827 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -1384,7 +1384,9 @@ gdk_x11_device_manager_xi2_select_window_events (GdkEventTranslator *translator, device_manager = GDK_DEVICE_MANAGER (translator); event_mask.deviceid = XIAllMasterDevices; - event_mask.mask = _gdk_x11_device_xi2_translate_event_mask (evmask, &event_mask.mask_len); + event_mask.mask = _gdk_x11_device_xi2_translate_event_mask (GDK_X11_DEVICE_MANAGER_XI2 (device_manager), + evmask, + &event_mask.mask_len); _gdk_x11_device_manager_xi2_select_events (device_manager, window, &event_mask); g_free (event_mask.mask); diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 7a65581dc3..803dad73ea 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -247,8 +247,9 @@ void _gdk_x11_device_xi_translate_axes (GdkDevice *device, #endif #ifdef XINPUT_2 -guchar * _gdk_x11_device_xi2_translate_event_mask (GdkEventMask event_mask, - gint *len); +guchar * _gdk_x11_device_xi2_translate_event_mask (GdkX11DeviceManagerXI2 *device_manager_xi2, + GdkEventMask event_mask, + gint *len); guint _gdk_x11_device_xi2_translate_state (XIModifierState *mods_state, XIButtonState *buttons_state, XIGroupState *group_state);