summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2012-01-05 00:51:32 +0100
committerCarlos Garnacho <carlosg@gnome.org>2012-02-18 17:48:52 +0100
commit10bd4f8a7260ff66ebac1b1de5dabbbd451dfcf5 (patch)
tree0760763c3054ea0733a01a20f3e4f283db9111ed
parent1d986aa8a447b29c31279cc36e3408f220e1cc02 (diff)
downloadgtk+-10bd4f8a7260ff66ebac1b1de5dabbbd451dfcf5.tar.gz
gdk: Have touch grabs behave like the implicit grab wrt crossing events
These are equivalent to an implicit grab (with !owner_events), so if the touch leaves or enters the grab window, the other window won't receive the corresponding counter-event.
-rw-r--r--gdk/gdkwindow.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 1187732307..f5633f8884 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -8435,14 +8435,28 @@ send_crossing_event (GdkDisplay *display,
GdkEvent *event;
guint32 window_event_mask, type_event_mask;
GdkDeviceGrabInfo *grab;
+ GdkTouchGrabInfo *touch_grab = NULL;
GdkPointerWindowInfo *pointer_info;
gboolean block_event = FALSE;
+ guint touch_id;
grab = _gdk_display_has_device_grab (display, device, serial);
pointer_info = _gdk_display_get_pointer_info (display, device);
- if (grab != NULL &&
- !grab->owner_events)
+ if (event_in_queue &&
+ gdk_event_get_touch_id (event_in_queue, &touch_id))
+ touch_grab = _gdk_display_has_touch_grab (display, device,
+ touch_id, serial);
+
+ if (touch_grab)
+ {
+ if (window != touch_grab->window)
+ return;
+
+ window_event_mask = touch_grab->event_mask;
+ }
+ else if (grab != NULL &&
+ !grab->owner_events)
{
/* !owner_event => only report events wrt grab window, ignore rest */
if ((GdkWindow *)window != grab->window)