From 2388f37cc765fc120500580ad24400c8b713aff0 Mon Sep 17 00:00:00 2001 From: Jens Peters Date: Tue, 28 May 2024 20:50:05 +0200 Subject: [PATCH] input: prevent cursor notifications from pointer and tablet tool ... at the same time. Omit cursor notifications from a pointer when a tablet tool (stylus/pen) is in proximity. We expect to get cursor notifications from the tablet tool instead. --- include/input/tablet-tool.h | 1 + include/labwc.h | 2 ++ src/input/cursor.c | 17 +++++++++++++++++ src/input/tablet-tool.c | 2 ++ src/seat.c | 2 ++ 5 files changed, 24 insertions(+) diff --git a/include/input/tablet-tool.h b/include/input/tablet-tool.h index 8e578a41..6da983c4 100644 --- a/include/input/tablet-tool.h +++ b/include/input/tablet-tool.h @@ -14,6 +14,7 @@ struct drawing_tablet_tool { struct wl_listener set_cursor; struct wl_listener destroy; } handlers; + struct wl_list link; /* seat.tablet_tools */ }; void tablet_tool_init(struct seat *seat, diff --git a/include/labwc.h b/include/labwc.h index a47b3a39..419a5ee0 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -193,6 +193,8 @@ struct seat { struct wl_listener touch_motion; struct wl_listener touch_frame; + struct wl_list tablet_tools; + struct wl_listener constraint_commit; struct wl_listener pressed_surface_destroy; diff --git a/src/input/cursor.c b/src/input/cursor.c index dfd13038..e5a214b7 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -17,6 +17,7 @@ #include "idle.h" #include "input/gestures.h" #include "input/touch.h" +#include "input/tablet-tool.h" #include "labwc.h" #include "layers.h" #include "menu/menu.h" @@ -140,6 +141,22 @@ request_cursor_notify(struct wl_listener *listener, void *data) return; } + /* + * Omit cursor notifications from a pointer when a tablet + * tool (stylus/pen) is in proximity. We expect to get cursor + * notifications from the tablet tool instead. + * Receiving cursor notifications from pointer and tablet tool at + * the same time is a side effect of also setting pointer focus + * when a tablet tool enters proximity on a tablet-capable surface. + * See also `notify_motion()` in `input/tablet.c`. + */ + struct drawing_tablet_tool *tool; + wl_list_for_each(tool, &seat->tablet_tools, link) { + if (tool->tool_v2->focused_surface) { + return; + } + } + /* * This event is raised by the seat when a client provides a cursor * image diff --git a/src/input/tablet-tool.c b/src/input/tablet-tool.c index 250c3b91..7c7faac2 100644 --- a/src/input/tablet-tool.c +++ b/src/input/tablet-tool.c @@ -40,6 +40,7 @@ handle_destroy(struct wl_listener *listener, void *data) struct drawing_tablet_tool *tool = wl_container_of(listener, tool, handlers.destroy); + wl_list_remove(&tool->link); wl_list_remove(&tool->handlers.set_cursor.link); wl_list_remove(&tool->handlers.destroy.link); free(tool); @@ -65,4 +66,5 @@ tablet_tool_init(struct seat *seat, wlr_tablet_tool->wheel ? " wheel" : ""); CONNECT_SIGNAL(tool->tool_v2, &tool->handlers, set_cursor); CONNECT_SIGNAL(wlr_tablet_tool, &tool->handlers, destroy); + wl_list_insert(&seat->tablet_tools, &tool->link); } diff --git a/src/seat.c b/src/seat.c index e850694c..5b4afe59 100644 --- a/src/seat.c +++ b/src/seat.c @@ -553,6 +553,8 @@ seat_init(struct server *server) } wlr_cursor_attach_output_layout(seat->cursor, server->output_layout); + wl_list_init(&seat->tablet_tools); + input_handlers_init(seat); }