gdk: Get the right event window for pointer emulated events

get_event_window() just checked on GDK_TOUCH_MASK, including for emulated
pointer events, so at the very least those should also match evmasks with
no touch events whatsoever
This commit is contained in:
Carlos Garnacho 2012-02-27 13:09:59 +01:00 committed by Matthias Clasen
parent 0bb2e6f264
commit 28e7d3c148

View File

@ -9139,9 +9139,10 @@ get_event_window (GdkDisplay *display,
GdkEventType type,
GdkModifierType mask,
guint *evmask_out,
gboolean pointer_emulated,
gulong serial)
{
guint evmask;
guint evmask, emulated_mask = 0;
GdkWindow *grab_window;
GdkDeviceGrabInfo *grab;
GdkTouchGrabInfo *touch_grab;
@ -9149,13 +9150,30 @@ get_event_window (GdkDisplay *display,
touch_grab = _gdk_display_has_touch_grab (display, device, sequence, serial);
grab = _gdk_display_get_last_device_grab (display, device);
if (is_touch_type (type) && pointer_emulated)
{
switch (type)
{
case GDK_TOUCH_BEGIN:
emulated_mask |= GDK_BUTTON_PRESS_MASK;
break;
case GDK_TOUCH_UPDATE:
emulated_mask |= GDK_BUTTON_MOTION_MASK;
break;
case GDK_TOUCH_END:
emulated_mask |= GDK_BUTTON_RELEASE_MASK;
default:
break;
}
}
if (touch_grab != NULL &&
(!grab || grab->implicit || touch_grab->serial >= grab->serial_start))
{
evmask = touch_grab->event_mask;
evmask = update_evmask_for_button_motion (evmask, mask);
if (evmask & type_masks[type])
if (evmask & (type_masks[type] | emulated_mask))
{
if (evmask_out)
*evmask_out = evmask;
@ -9172,7 +9190,7 @@ get_event_window (GdkDisplay *display,
grab_window = grab->window;
if (evmask & type_masks[type])
if (evmask & (type_masks[type] | emulated_mask))
{
if (evmask_out)
*evmask_out = evmask;
@ -9187,7 +9205,7 @@ get_event_window (GdkDisplay *display,
evmask = pointer_window->event_mask;
evmask = update_evmask_for_button_motion (evmask, mask);
if (evmask & type_masks[type])
if (evmask & (type_masks[type] | emulated_mask))
{
if (evmask_out)
*evmask_out = evmask;
@ -9203,7 +9221,7 @@ get_event_window (GdkDisplay *display,
evmask = grab->event_mask;
evmask = update_evmask_for_button_motion (evmask, mask);
if (evmask & type_masks[type])
if (evmask & (type_masks[type] | emulated_mask))
{
if (evmask_out)
*evmask_out = evmask;
@ -9384,6 +9402,7 @@ proxy_pointer_event (GdkDisplay *display,
source_event->type,
state,
&evmask,
_gdk_event_get_pointer_emulated (source_event),
serial);
if (event_type == GDK_TOUCH_UPDATE)
@ -9620,7 +9639,9 @@ proxy_button_event (GdkEvent *source_event,
sequence,
pointer_window,
type, state,
&evmask, serial);
&evmask,
_gdk_event_get_pointer_emulated (source_event),
serial);
if (type == GDK_TOUCH_BEGIN || type == GDK_TOUCH_END)
{