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

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