[gtk+/wip/wayland-tablet: 547/555] x11: Emit proximity in/out events out of Wacom Serial ID property changes
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/wayland-tablet: 547/555] x11: Emit proximity in/out events out of Wacom Serial ID property changes
- Date: Tue, 29 Mar 2016 18:21:26 +0000 (UTC)
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]