|
|
314a7ca |
From 243eadc7979e35756a4f0e349ee97bbbd3a268c3 Mon Sep 17 00:00:00 2001
|
|
|
314a7ca |
From: Jason Gerecke <killertofu@gmail.com>
|
|
|
314a7ca |
Date: Fri, 14 Oct 2016 14:50:18 -0700
|
|
|
314a7ca |
Subject: [PATCH xserver 03/12] xwayland: Listen for wp_tablet_seat events
|
|
|
314a7ca |
|
|
|
314a7ca |
The wp_tablet_seat interface provides us with notifications as tablets,
|
|
|
314a7ca |
tools, and pads are connected to the system. Add listener functions and
|
|
|
314a7ca |
store references to the obtained devices.
|
|
|
314a7ca |
|
|
|
314a7ca |
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
|
|
|
314a7ca |
Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
|
|
|
314a7ca |
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
|
|
314a7ca |
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
|
|
314a7ca |
Acked-by: Ping Cheng <ping.cheng@wacom.com>
|
|
|
314a7ca |
(cherry picked from commit 47c4415912b5b16b115135be365beb370858df76)
|
|
|
314a7ca |
---
|
|
|
314a7ca |
hw/xwayland/xwayland-input.c | 94 ++++++++++++++++++++++++++++++++++++++++++++
|
|
|
314a7ca |
hw/xwayland/xwayland.h | 22 +++++++++++
|
|
|
314a7ca |
2 files changed, 116 insertions(+)
|
|
|
314a7ca |
|
|
|
314a7ca |
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
|
|
|
314a7ca |
index 1d2be978e..d5d12933c 100644
|
|
|
314a7ca |
--- a/hw/xwayland/xwayland-input.c
|
|
|
314a7ca |
+++ b/hw/xwayland/xwayland-input.c
|
|
|
314a7ca |
@@ -1191,6 +1191,69 @@ xwl_seat_destroy(struct xwl_seat *xwl_seat)
|
|
|
314a7ca |
|
|
|
314a7ca |
|
|
|
314a7ca |
static void
|
|
|
314a7ca |
+tablet_seat_handle_add_tablet(void *data, struct zwp_tablet_seat_v2 *tablet_seat,
|
|
|
314a7ca |
+ struct zwp_tablet_v2 *tablet)
|
|
|
314a7ca |
+{
|
|
|
314a7ca |
+ struct xwl_seat *xwl_seat = data;
|
|
|
314a7ca |
+ struct xwl_tablet *xwl_tablet;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xwl_tablet = calloc(sizeof *xwl_tablet, 1);
|
|
|
314a7ca |
+ if (xwl_tablet == NULL) {
|
|
|
314a7ca |
+ ErrorF("%s ENOMEM\n", __func__);
|
|
|
314a7ca |
+ return;
|
|
|
314a7ca |
+ }
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xwl_tablet->tablet = tablet;
|
|
|
314a7ca |
+ xwl_tablet->seat = xwl_seat;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xorg_list_add(&xwl_tablet->link, &xwl_seat->tablets);
|
|
|
314a7ca |
+}
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+static void
|
|
|
314a7ca |
+tablet_seat_handle_add_tool(void *data, struct zwp_tablet_seat_v2 *tablet_seat,
|
|
|
314a7ca |
+ struct zwp_tablet_tool_v2 *tool)
|
|
|
314a7ca |
+{
|
|
|
314a7ca |
+ struct xwl_seat *xwl_seat = data;
|
|
|
314a7ca |
+ struct xwl_tablet_tool *xwl_tablet_tool;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xwl_tablet_tool = calloc(sizeof *xwl_tablet_tool, 1);
|
|
|
314a7ca |
+ if (xwl_tablet_tool == NULL) {
|
|
|
314a7ca |
+ ErrorF("%s ENOMEM\n", __func__);
|
|
|
314a7ca |
+ return;
|
|
|
314a7ca |
+ }
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xwl_tablet_tool->tool = tool;
|
|
|
314a7ca |
+ xwl_tablet_tool->seat = xwl_seat;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xorg_list_add(&xwl_tablet_tool->link, &xwl_seat->tablet_tools);
|
|
|
314a7ca |
+}
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+static void
|
|
|
314a7ca |
+tablet_seat_handle_add_pad(void *data, struct zwp_tablet_seat_v2 *tablet_seat,
|
|
|
314a7ca |
+ struct zwp_tablet_pad_v2 *pad)
|
|
|
314a7ca |
+{
|
|
|
314a7ca |
+ struct xwl_seat *xwl_seat = data;
|
|
|
314a7ca |
+ struct xwl_tablet_pad *xwl_tablet_pad;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xwl_tablet_pad = calloc(sizeof *xwl_tablet_pad, 1);
|
|
|
314a7ca |
+ if (xwl_tablet_pad == NULL) {
|
|
|
314a7ca |
+ ErrorF("%s ENOMEM\n", __func__);
|
|
|
314a7ca |
+ return;
|
|
|
314a7ca |
+ }
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xwl_tablet_pad->pad = pad;
|
|
|
314a7ca |
+ xwl_tablet_pad->seat = xwl_seat;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xorg_list_add(&xwl_tablet_pad->link, &xwl_seat->tablet_pads);
|
|
|
314a7ca |
+}
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+static const struct zwp_tablet_seat_v2_listener tablet_seat_listener = {
|
|
|
314a7ca |
+ tablet_seat_handle_add_tablet,
|
|
|
314a7ca |
+ tablet_seat_handle_add_tool,
|
|
|
314a7ca |
+ tablet_seat_handle_add_pad
|
|
|
314a7ca |
+};
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+static void
|
|
|
314a7ca |
init_tablet_manager_seat(struct xwl_screen *xwl_screen,
|
|
|
314a7ca |
struct xwl_seat *xwl_seat)
|
|
|
314a7ca |
{
|
|
|
314a7ca |
@@ -1200,11 +1263,42 @@ init_tablet_manager_seat(struct xwl_screen *xwl_screen,
|
|
|
314a7ca |
xwl_seat->tablet_seat =
|
|
|
314a7ca |
zwp_tablet_manager_v2_get_tablet_seat(xwl_screen->tablet_manager,
|
|
|
314a7ca |
xwl_seat->seat);
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xorg_list_init(&xwl_seat->tablets);
|
|
|
314a7ca |
+ xorg_list_init(&xwl_seat->tablet_tools);
|
|
|
314a7ca |
+ xorg_list_init(&xwl_seat->tablet_pads);
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ zwp_tablet_seat_v2_add_listener(xwl_seat->tablet_seat, &tablet_seat_listener, xwl_seat);
|
|
|
314a7ca |
}
|
|
|
314a7ca |
|
|
|
314a7ca |
static void
|
|
|
314a7ca |
release_tablet_manager_seat(struct xwl_seat *xwl_seat)
|
|
|
314a7ca |
{
|
|
|
314a7ca |
+ struct xwl_tablet *xwl_tablet, *next_xwl_tablet;
|
|
|
314a7ca |
+ struct xwl_tablet_tool *xwl_tablet_tool, *next_xwl_tablet_tool;
|
|
|
314a7ca |
+ struct xwl_tablet_pad *xwl_tablet_pad, *next_xwl_tablet_pad;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xorg_list_for_each_entry_safe(xwl_tablet_pad, next_xwl_tablet_pad,
|
|
|
314a7ca |
+ &xwl_seat->tablet_pads, link) {
|
|
|
314a7ca |
+ xorg_list_del(&xwl_tablet_pad->link);
|
|
|
314a7ca |
+ zwp_tablet_pad_v2_destroy(xwl_tablet_pad->pad);
|
|
|
314a7ca |
+ free(xwl_tablet_pad);
|
|
|
314a7ca |
+ }
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xorg_list_for_each_entry_safe(xwl_tablet_tool, next_xwl_tablet_tool,
|
|
|
314a7ca |
+ &xwl_seat->tablet_tools, link) {
|
|
|
314a7ca |
+ xorg_list_del(&xwl_tablet_tool->link);
|
|
|
314a7ca |
+ zwp_tablet_tool_v2_destroy(xwl_tablet_tool->tool);
|
|
|
314a7ca |
+ free(xwl_tablet_tool);
|
|
|
314a7ca |
+ }
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ xorg_list_for_each_entry_safe(xwl_tablet, next_xwl_tablet,
|
|
|
314a7ca |
+ &xwl_seat->tablets, link) {
|
|
|
314a7ca |
+ xorg_list_del(&xwl_tablet->link);
|
|
|
314a7ca |
+ zwp_tablet_v2_destroy(xwl_tablet->tablet);
|
|
|
314a7ca |
+ free(xwl_tablet);
|
|
|
314a7ca |
+ }
|
|
|
314a7ca |
+
|
|
|
314a7ca |
if (xwl_seat->tablet_seat) {
|
|
|
314a7ca |
zwp_tablet_seat_v2_destroy(xwl_seat->tablet_seat);
|
|
|
314a7ca |
xwl_seat->tablet_seat = NULL;
|
|
|
314a7ca |
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
|
|
|
314a7ca |
index 2752d731c..a7f30b3c8 100644
|
|
|
314a7ca |
--- a/hw/xwayland/xwayland.h
|
|
|
314a7ca |
+++ b/hw/xwayland/xwayland.h
|
|
|
314a7ca |
@@ -174,6 +174,28 @@ struct xwl_seat {
|
|
|
314a7ca |
double dx_unaccel;
|
|
|
314a7ca |
double dy_unaccel;
|
|
|
314a7ca |
} pending_pointer_event;
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+ struct xorg_list tablets;
|
|
|
314a7ca |
+ struct xorg_list tablet_tools;
|
|
|
314a7ca |
+ struct xorg_list tablet_pads;
|
|
|
314a7ca |
+};
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+struct xwl_tablet {
|
|
|
314a7ca |
+ struct xorg_list link;
|
|
|
314a7ca |
+ struct zwp_tablet_v2 *tablet;
|
|
|
314a7ca |
+ struct xwl_seat *seat;
|
|
|
314a7ca |
+};
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+struct xwl_tablet_tool {
|
|
|
314a7ca |
+ struct xorg_list link;
|
|
|
314a7ca |
+ struct zwp_tablet_tool_v2 *tool;
|
|
|
314a7ca |
+ struct xwl_seat *seat;
|
|
|
314a7ca |
+};
|
|
|
314a7ca |
+
|
|
|
314a7ca |
+struct xwl_tablet_pad {
|
|
|
314a7ca |
+ struct xorg_list link;
|
|
|
314a7ca |
+ struct zwp_tablet_pad_v2 *pad;
|
|
|
314a7ca |
+ struct xwl_seat *seat;
|
|
|
314a7ca |
};
|
|
|
314a7ca |
|
|
|
314a7ca |
struct xwl_output {
|
|
|
314a7ca |
--
|
|
|
314a7ca |
2.13.5
|
|
|
314a7ca |
|