struct wl_listener set_cursor;
struct wl_listener destroy;
} handlers;
+ struct wl_list link; /* seat.tablet_tools */
};
void tablet_tool_init(struct seat *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;
#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"
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
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);
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);
}
}
wlr_cursor_attach_output_layout(seat->cursor, server->output_layout);
+ wl_list_init(&seat->tablet_tools);
+
input_handlers_init(seat);
}