From abfa100b384e782840268f3b1c8454f54d668745 Mon Sep 17 00:00:00 2001 From: Jens Peters Date: Sat, 20 Apr 2024 11:40:23 +0200 Subject: [PATCH] input: add tablet tool setup --- include/input/tablet-tool.h | 22 +++++++++++++++++++ include/input/tablet.h | 3 +++ src/input/meson.build | 1 + src/input/tablet-tool.c | 44 +++++++++++++++++++++++++++++++++++++ src/input/tablet.c | 6 +++++ 5 files changed, 76 insertions(+) create mode 100644 include/input/tablet-tool.h create mode 100644 src/input/tablet-tool.c diff --git a/include/input/tablet-tool.h b/include/input/tablet-tool.h new file mode 100644 index 00000000..8e578a41 --- /dev/null +++ b/include/input/tablet-tool.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef LABWC_TABLET_TOOL_H +#define LABWC_TABLET_TOOL_H + +#include +#include + +struct seat; + +struct drawing_tablet_tool { + struct seat *seat; + struct wlr_tablet_v2_tablet_tool *tool_v2; + struct { + struct wl_listener set_cursor; + struct wl_listener destroy; + } handlers; +}; + +void tablet_tool_init(struct seat *seat, + struct wlr_tablet_tool *wlr_tablet_tool); + +#endif /* LABWC_TABLET_TOOL_H */ diff --git a/include/input/tablet.h b/include/input/tablet.h index b97ddb0d..8f6d4e1c 100644 --- a/include/input/tablet.h +++ b/include/input/tablet.h @@ -3,14 +3,17 @@ #define LABWC_TABLET_H #include +#include struct seat; struct wlr_device; struct wlr_input_device; struct drawing_tablet { + struct wlr_input_device *wlr_input_device; struct seat *seat; struct wlr_tablet *tablet; + struct wlr_tablet_v2_tablet *tablet_v2; double x, y; struct { struct wl_listener proximity; diff --git a/src/input/meson.build b/src/input/meson.build index 4d56f00d..a9a6f5e3 100644 --- a/src/input/meson.build +++ b/src/input/meson.build @@ -2,6 +2,7 @@ labwc_sources += files( 'cursor.c', 'tablet.c', 'tablet-pad.c', + 'tablet-tool.c', 'gestures.c', 'input.c', 'keyboard.c', diff --git a/src/input/tablet-tool.c b/src/input/tablet-tool.c new file mode 100644 index 00000000..ee8667d6 --- /dev/null +++ b/src/input/tablet-tool.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include +#include +#include +#include +#include +#include "common/macros.h" +#include "common/mem.h" +#include "config/rcxml.h" +#include "input/cursor.h" +#include "input/tablet-tool.h" +#include "labwc.h" + +static void +handle_destroy(struct wl_listener *listener, void *data) +{ + struct drawing_tablet_tool *tool = + wl_container_of(listener, tool, handlers.destroy); + + wl_list_remove(&tool->handlers.set_cursor.link); + wl_list_remove(&tool->handlers.destroy.link); + free(tool); +} + +void +tablet_tool_init(struct seat *seat, + struct wlr_tablet_tool *wlr_tablet_tool) +{ + wlr_log(WLR_DEBUG, "setting up tablet tool"); + struct drawing_tablet_tool *tool = znew(*tool); + tool->seat = seat; + tool->tool_v2 = + wlr_tablet_tool_create(seat->server->tablet_manager, + seat->seat, wlr_tablet_tool); + wlr_tablet_tool->data = tool; + wlr_log(WLR_INFO, "tablet tool capabilities:%s%s%s%s%s%s", + wlr_tablet_tool->tilt ? " tilt" : "", + wlr_tablet_tool->pressure ? " pressure" : "", + wlr_tablet_tool->distance ? " distance" : "", + wlr_tablet_tool->rotation ? " rotation" : "", + wlr_tablet_tool->slider ? " slider" : "", + wlr_tablet_tool->wheel ? " wheel" : ""); + CONNECT_SIGNAL(wlr_tablet_tool, &tool->handlers, destroy); +} diff --git a/src/input/tablet.c b/src/input/tablet.c index 2d0d6882..bce20a70 100644 --- a/src/input/tablet.c +++ b/src/input/tablet.c @@ -10,6 +10,7 @@ #include "config/rcxml.h" #include "input/cursor.h" #include "input/tablet.h" +#include "labwc.h" static bool tool_supports_absolute_motion(struct wlr_tablet_tool *tool) @@ -168,8 +169,13 @@ tablet_init(struct seat *seat, struct wlr_input_device *wlr_device) wlr_log(WLR_DEBUG, "setting up tablet"); struct drawing_tablet *tablet = znew(*tablet); tablet->seat = seat; + tablet->wlr_input_device = wlr_device; tablet->tablet = wlr_tablet_from_input_device(wlr_device); tablet->tablet->data = tablet; + if (seat->server->tablet_manager) { + tablet->tablet_v2 = wlr_tablet_create( + seat->server->tablet_manager, seat->seat, wlr_device); + } tablet->x = 0.0; tablet->y = 0.0; wlr_log(WLR_INFO, "tablet dimensions: %.2fmm x %.2fmm",