]> git.mdlowis.com Git - proto/labwc.git/commitdiff
input: add tablet tool setup
authorJens Peters <jp7677@gmail.com>
Sat, 20 Apr 2024 09:40:23 +0000 (11:40 +0200)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Mon, 27 May 2024 20:40:50 +0000 (22:40 +0200)
include/input/tablet-tool.h [new file with mode: 0644]
include/input/tablet.h
src/input/meson.build
src/input/tablet-tool.c [new file with mode: 0644]
src/input/tablet.c

diff --git a/include/input/tablet-tool.h b/include/input/tablet-tool.h
new file mode 100644 (file)
index 0000000..8e578a4
--- /dev/null
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef LABWC_TABLET_TOOL_H
+#define LABWC_TABLET_TOOL_H
+
+#include <wayland-server-core.h>
+#include <wlr/types/wlr_tablet_v2.h>
+
+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 */
index b97ddb0d320a4d44cf832a2cb845e237cf59c08f..8f6d4e1c975a65b0d4a84d5b22cddc4951c5cd55 100644 (file)
@@ -3,14 +3,17 @@
 #define LABWC_TABLET_H
 
 #include <wayland-server-core.h>
+#include <wlr/types/wlr_tablet_v2.h>
 
 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;
index 4d56f00dea6557832da312a1dbb6ae5a915b8d5b..a9a6f5e3d43221742408a3a9369d54bc132d4a7f 100644 (file)
@@ -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 (file)
index 0000000..ee8667d
--- /dev/null
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include <assert.h>
+#include <stdlib.h>
+#include <wlr/types/wlr_tablet_pad.h>
+#include <wlr/types/wlr_tablet_tool.h>
+#include <wlr/util/log.h>
+#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);
+}
index 2d0d68826992cc8c29135d9379c4eb5e7ce75669..bce20a70af9bd33a0ec7f0667851d594a31527ab 100644 (file)
@@ -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",