summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2018-12-14 15:28:29 +1000
committerCarlos Garnacho <carlosg@gnome.org>2018-12-18 21:41:49 +0100
commit38cba6895a5749386954b6de3ac8a6723f4fc5db (patch)
tree5ed40d80176ac4b3095a99d2f1d2edcc97a63dde /gdk
parente95e0458988821ce4d8915c243fa79398515ed27 (diff)
downloadgtk+-38cba6895a5749386954b6de3ac8a6723f4fc5db.tar.gz
x11: make the tool lookup dependent on the hw id as well
Tools on the same physical item have the same serial number, so the eraser and the pen part of a single pen share that serial number. With the current lookup code, we'll always return whichever tool comes first into proximity. Change the code to use the hw id in addition to the serial number, this way we can differ between two tools.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/gdkseat.c5
-rw-r--r--gdk/gdkseatdefault.c8
-rw-r--r--gdk/gdkseatprivate.h6
-rw-r--r--gdk/x11/gdkdevicemanager-xi2.c2
4 files changed, 12 insertions, 9 deletions
diff --git a/gdk/gdkseat.c b/gdk/gdkseat.c
index aa120f298b..6edd383206 100644
--- a/gdk/gdkseat.c
+++ b/gdk/gdkseat.c
@@ -434,14 +434,15 @@ gdk_seat_tool_removed (GdkSeat *seat,
GdkDeviceTool *
gdk_seat_get_tool (GdkSeat *seat,
- guint64 serial)
+ guint64 serial,
+ guint64 hw_id)
{
GdkSeatClass *seat_class;
g_return_val_if_fail (GDK_IS_SEAT (seat), NULL);
seat_class = GDK_SEAT_GET_CLASS (seat);
- return seat_class->get_tool (seat, serial);
+ return seat_class->get_tool (seat, serial, hw_id);
}
/**
diff --git a/gdk/gdkseatdefault.c b/gdk/gdkseatdefault.c
index 2de1c36c5f..14dbb75f97 100644
--- a/gdk/gdkseatdefault.c
+++ b/gdk/gdkseatdefault.c
@@ -282,7 +282,8 @@ gdk_seat_default_get_slaves (GdkSeat *seat,
static GdkDeviceTool *
gdk_seat_default_get_tool (GdkSeat *seat,
- guint64 serial)
+ guint64 serial,
+ guint64 hw_id)
{
GdkSeatDefaultPrivate *priv;
GdkDeviceTool *tool;
@@ -297,7 +298,7 @@ gdk_seat_default_get_tool (GdkSeat *seat,
{
tool = g_ptr_array_index (priv->tools, i);
- if (tool->serial == serial)
+ if (tool->serial == serial && tool->hw_id == hw_id)
return tool;
}
@@ -457,8 +458,7 @@ gdk_seat_default_remove_tool (GdkSeatDefault *seat,
priv = gdk_seat_default_get_instance_private (seat);
- if (tool != gdk_seat_get_tool (GDK_SEAT (seat),
- gdk_device_tool_get_serial (tool)))
+ if (tool != gdk_seat_get_tool (GDK_SEAT (seat), tool->serial, tool->hw_id))
return;
g_signal_emit_by_name (seat, "tool-removed", tool);
diff --git a/gdk/gdkseatprivate.h b/gdk/gdkseatprivate.h
index 97127dbfae..eaeecec8ff 100644
--- a/gdk/gdkseatprivate.h
+++ b/gdk/gdkseatprivate.h
@@ -57,7 +57,8 @@ struct _GdkSeatClass
GdkSeatCapabilities capabilities);
GdkDeviceTool * (* get_tool) (GdkSeat *seat,
- guint64 serial);
+ guint64 serial,
+ guint64 tool_id);
GList * (* get_master_pointers) (GdkSeat *seat,
GdkSeatCapabilities capabilities);
};
@@ -74,6 +75,7 @@ void gdk_seat_tool_removed (GdkSeat *seat,
GdkDeviceTool *
gdk_seat_get_tool (GdkSeat *seat,
- guint64 serial);
+ guint64 serial,
+ guint64 hw_id);
#endif /* __GDK_SEAT_PRIVATE_H__ */
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
index 8c1cc41a70..01d51d3d3a 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
@@ -1096,7 +1096,7 @@ handle_property_change (GdkX11DeviceManagerXI2 *device_manager,
device_get_tool_serial_and_id (device, &serial_id, &tool_id))
{
seat = gdk_device_get_seat (device);
- tool = gdk_seat_get_tool (seat, serial_id);
+ tool = gdk_seat_get_tool (seat, serial_id, tool_id);
if (!tool && serial_id > 0)
{