Blame SOURCES/0003-xwayland-Listen-for-wp_tablet_seat-events.patch

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