diff options
| author | Carlos Garnacho <carlosg@gnome.org> | 2012-01-05 00:51:32 +0100 |
|---|---|---|
| committer | Carlos Garnacho <carlosg@gnome.org> | 2012-02-18 17:48:52 +0100 |
| commit | 10bd4f8a7260ff66ebac1b1de5dabbbd451dfcf5 (patch) | |
| tree | 0760763c3054ea0733a01a20f3e4f283db9111ed | |
| parent | 1d986aa8a447b29c31279cc36e3408f220e1cc02 (diff) | |
| download | gtk+-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.c | 18 |
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) |
