GHOST/Wayland: correct tablet serial argument for setting cursors

While the previous logic tended to work as it would use the serial
for the last active table event - follow the spec and and always pass
in the serial for the proximity_in event.
This commit is contained in:
Campbell Barton
2025-07-02 23:11:19 +10:00
parent 2b9b6fc5eb
commit 3d15acee1f

View File

@@ -540,6 +540,10 @@ struct GWL_TabletTool {
GWL_CursorShape shape;
GWL_Seat *seat = nullptr;
/** The serial, set on `proximity_in`, cleared on `proximity_out`. */
uint32_t serial = 0;
/** Used to delay clearing tablet focused wl_surface until the frame is handled. */
bool proximity = false;
@@ -703,7 +707,11 @@ struct GWL_SeatStatePointer {
int theme_scale = 1;
/** The serial of the last used pointer or tablet. */
/**
* The serial of the last used pointer or tablet.
*
* \note For tablet cursors, use: #GWL_TabletTool::serial instead.
*/
uint32_t serial = 0;
GHOST_Buttons buttons = GHOST_Buttons();
@@ -2822,11 +2830,11 @@ static void gwl_seat_cursor_buffer_show(GWL_Seat *seat)
zwp_tablet_tool_v2_get_user_data(zwp_tablet_tool_v2));
if (tablet_tool->shape.device) {
wp_cursor_shape_device_v1_set_shape(
tablet_tool->shape.device, seat->tablet.serial, tablet_tool->shape.enum_id);
tablet_tool->shape.device, tablet_tool->serial, tablet_tool->shape.enum_id);
}
else {
zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2,
seat->tablet.serial,
tablet_tool->serial,
tablet_tool->wl.surface_cursor,
hotspot_x,
hotspot_y);
@@ -2848,7 +2856,9 @@ static void gwl_seat_cursor_buffer_hide(GWL_Seat *seat)
{
wl_pointer_set_cursor(seat->wl.pointer, seat->pointer.serial, nullptr, 0, 0);
for (zwp_tablet_tool_v2 *zwp_tablet_tool_v2 : seat->wp.tablet_tools) {
zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2, seat->tablet.serial, nullptr, 0, 0);
GWL_TabletTool *tablet_tool = static_cast<GWL_TabletTool *>(
zwp_tablet_tool_v2_get_user_data(zwp_tablet_tool_v2));
zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2, tablet_tool->serial, nullptr, 0, 0);
}
}
@@ -2881,7 +2891,7 @@ static void gwl_seat_cursor_buffer_set(const GWL_Seat *seat,
zwp_tablet_tool_v2_get_user_data(zwp_tablet_tool_v2));
cursor_buffer_set_surface_impl(wl_image, buffer, tablet_tool->wl.surface_cursor);
zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2,
seat->tablet.serial,
tablet_tool->serial,
visible ? tablet_tool->wl.surface_cursor : nullptr,
hotspot_x,
hotspot_y);
@@ -4589,6 +4599,7 @@ static void tablet_tool_handle_proximity_in(void *data,
GWL_TabletTool *tablet_tool = static_cast<GWL_TabletTool *>(data);
tablet_tool->proximity = true;
tablet_tool->serial = serial;
GWL_Seat *seat = tablet_tool->seat;
seat->cursor_source_serial = serial;
@@ -4618,6 +4629,7 @@ static void tablet_tool_handle_proximity_out(void *data,
/* Defer clearing the wl_surface until the frame is handled.
* Without this, the frame can not access the wl_surface. */
tablet_tool->proximity = false;
tablet_tool->serial = 0;
}
static void tablet_tool_handle_down(void *data,
@@ -8545,7 +8557,7 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_set(const GHOST_TStandardCursor
return GHOST_kFailure;
}
}
wp_cursor_shape_device_v1_set_shape(tablet_tool->shape.device, seat->tablet.serial, *wl_shape);
wp_cursor_shape_device_v1_set_shape(tablet_tool->shape.device, tablet_tool->serial, *wl_shape);
/* Set this to make sure we remember which shape we set when unhiding cursors. */
tablet_tool->shape.enum_id = *wl_shape;
}