]> Pileus Git - ~andy/gtk/commitdiff
gdk: Get the right event window for pointer emulated events
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 27 Feb 2012 12:09:59 +0000 (13:09 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 1 Mar 2012 21:25:28 +0000 (16:25 -0500)
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

gdk/gdkwindow.c

index 43721fcf206a10974e07942151907d37bbbe4085..7a84aee90a2cf07010202befd39ca3eb4155a786 100644 (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)
     {