[gtk+/wip/wayland-tablet: 547/555] x11: Emit proximity in/out events out of Wacom Serial ID property changes



commit 84b1032f9a74a1de976f3ac4fc7a88d7f1e9404c
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Jun 30 17:18:56 2015 +0200

    x11: Emit proximity in/out events out of Wacom Serial ID property changes
    
    We have no proximity events in XI2, but the changes around this property
    will roughly match the times when it would be emitted, so can be used
    as the base to emulate these.
    
    Changes for this property will be received independently of the pointer
    position, so we should take care to not emit it if the pointer is not
    above any known window, emission around crossing events should be
    taken care of too, left for a next commit.

 gdk/x11/gdkdevicemanager-xi2.c |   51 ++++++++++++++++++++++++++++++++++++----
 1 files changed, 46 insertions(+), 5 deletions(-)
---
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
index 497a18a..f5f9968 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
@@ -1004,15 +1004,50 @@ device_get_tool_serial (GdkDevice *device)
 }
 
 static void
+translate_proximity (GdkDevice       *device,
+                     GdkDeviceTool   *tool,
+                     GdkEvent        *event,
+                     XIPropertyEvent *ev)
+{
+  GdkDevice *master = NULL;
+  GdkWindow *window;
+
+  if (gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_MASTER)
+    master = gdk_device_get_associated_device (device);
+
+  if (!master)
+    master = device;
+
+  window = gdk_device_get_window_at_position (master, NULL, NULL);
+
+  if (!window)
+    return;
+
+  event->proximity.type = tool ? GDK_PROXIMITY_IN : GDK_PROXIMITY_OUT;
+  event->proximity.window = window;
+  event->proximity.time = ev->time;
+  event->proximity.send_event = FALSE;
+  gdk_event_set_device (event, master);
+  gdk_event_set_source_device (event, device);
+}
+
+static gboolean
 handle_property_change (GdkX11DeviceManagerXI2 *device_manager,
-                        XIPropertyEvent        *ev)
+                        XIPropertyEvent        *ev,
+                        GdkEvent               *event)
 {
+  GdkDisplay *display;
   GdkDevice *device;
+  Atom wacom_serial_prop;
 
   device = g_hash_table_lookup (device_manager->id_table,
                                 GUINT_TO_POINTER (ev->deviceid));
 
-  if (ev->property == gdk_x11_get_xatom_by_name ("Wacom Serial IDs"))
+  display = gdk_device_manager_get_display (GDK_DEVICE_MANAGER (device_manager));
+  wacom_serial_prop = XInternAtom (GDK_DISPLAY_XDISPLAY (display),
+                                   "Wacom Serial IDs", True);
+
+  if (wacom_serial_prop != None && ev->property == wacom_serial_prop)
     {
       GdkDeviceTool *tool = NULL;
       guint serial_id;
@@ -1033,7 +1068,12 @@ handle_property_change (GdkX11DeviceManagerXI2 *device_manager,
         }
 
       gdk_device_update_tool (device, tool);
+
+      translate_proximity (device, tool, event, ev);
+      return TRUE;
     }
+
+  return FALSE;
 }
 
 static GdkCrossingMode
@@ -1437,9 +1477,10 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
       return_val = FALSE;
       break;
     case XI_PropertyEvent:
-      handle_property_change (device_manager,
-                              (XIPropertyEvent *) ev);
-      return_val = FALSE;
+      if (!handle_property_change (device_manager,
+                                   (XIPropertyEvent *) ev,
+                                   event))
+        return_val = FALSE;
       break;
     case XI_KeyPress:
     case XI_KeyRelease:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]