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.
This commit is contained in:
Peter Hutterer 2018-12-14 15:28:29 +10:00 committed by Carlos Garnacho
parent e95e045898
commit 38cba6895a
4 changed files with 12 additions and 9 deletions

View File

@ -434,14 +434,15 @@ gdk_seat_tool_removed (GdkSeat *seat,
GdkDeviceTool * GdkDeviceTool *
gdk_seat_get_tool (GdkSeat *seat, gdk_seat_get_tool (GdkSeat *seat,
guint64 serial) guint64 serial,
guint64 hw_id)
{ {
GdkSeatClass *seat_class; GdkSeatClass *seat_class;
g_return_val_if_fail (GDK_IS_SEAT (seat), NULL); g_return_val_if_fail (GDK_IS_SEAT (seat), NULL);
seat_class = GDK_SEAT_GET_CLASS (seat); seat_class = GDK_SEAT_GET_CLASS (seat);
return seat_class->get_tool (seat, serial); return seat_class->get_tool (seat, serial, hw_id);
} }
/** /**

View File

@ -282,7 +282,8 @@ gdk_seat_default_get_slaves (GdkSeat *seat,
static GdkDeviceTool * static GdkDeviceTool *
gdk_seat_default_get_tool (GdkSeat *seat, gdk_seat_default_get_tool (GdkSeat *seat,
guint64 serial) guint64 serial,
guint64 hw_id)
{ {
GdkSeatDefaultPrivate *priv; GdkSeatDefaultPrivate *priv;
GdkDeviceTool *tool; GdkDeviceTool *tool;
@ -297,7 +298,7 @@ gdk_seat_default_get_tool (GdkSeat *seat,
{ {
tool = g_ptr_array_index (priv->tools, i); tool = g_ptr_array_index (priv->tools, i);
if (tool->serial == serial) if (tool->serial == serial && tool->hw_id == hw_id)
return tool; return tool;
} }
@ -457,8 +458,7 @@ gdk_seat_default_remove_tool (GdkSeatDefault *seat,
priv = gdk_seat_default_get_instance_private (seat); priv = gdk_seat_default_get_instance_private (seat);
if (tool != gdk_seat_get_tool (GDK_SEAT (seat), if (tool != gdk_seat_get_tool (GDK_SEAT (seat), tool->serial, tool->hw_id))
gdk_device_tool_get_serial (tool)))
return; return;
g_signal_emit_by_name (seat, "tool-removed", tool); g_signal_emit_by_name (seat, "tool-removed", tool);

View File

@ -57,7 +57,8 @@ struct _GdkSeatClass
GdkSeatCapabilities capabilities); GdkSeatCapabilities capabilities);
GdkDeviceTool * (* get_tool) (GdkSeat *seat, GdkDeviceTool * (* get_tool) (GdkSeat *seat,
guint64 serial); guint64 serial,
guint64 tool_id);
GList * (* get_master_pointers) (GdkSeat *seat, GList * (* get_master_pointers) (GdkSeat *seat,
GdkSeatCapabilities capabilities); GdkSeatCapabilities capabilities);
}; };
@ -74,6 +75,7 @@ void gdk_seat_tool_removed (GdkSeat *seat,
GdkDeviceTool * GdkDeviceTool *
gdk_seat_get_tool (GdkSeat *seat, gdk_seat_get_tool (GdkSeat *seat,
guint64 serial); guint64 serial,
guint64 hw_id);
#endif /* __GDK_SEAT_PRIVATE_H__ */ #endif /* __GDK_SEAT_PRIVATE_H__ */

View File

@ -1096,7 +1096,7 @@ handle_property_change (GdkX11DeviceManagerXI2 *device_manager,
device_get_tool_serial_and_id (device, &serial_id, &tool_id)) device_get_tool_serial_and_id (device, &serial_id, &tool_id))
{ {
seat = gdk_device_get_seat (device); 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) if (!tool && serial_id > 0)
{ {