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