[vlc-commits] xdg-shell: keep track of wl_seat globals

Rémi Denis-Courmont git at videolan.org
Tue May 22 21:58:14 CEST 2018


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue May 22 21:22:57 2018 +0300| [aba21024417d27f98f7eed1a2792315273920d04] | committer: Rémi Denis-Courmont

xdg-shell: keep track of wl_seat globals

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=aba21024417d27f98f7eed1a2792315273920d04
---

 modules/video_output/Makefile.am         |   8 ++-
 modules/video_output/wayland/input.c     | 109 +++++++++++++++++++++++++++++++
 modules/video_output/wayland/input.h     |  27 ++++++++
 modules/video_output/wayland/xdg-shell.c |  10 +++
 4 files changed, 151 insertions(+), 3 deletions(-)

diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index 8108ac3ca3..a9ee0438c6 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -202,7 +202,7 @@ video_output/wayland/viewporter-protocol.c: \
 		$(WAYLAND_PROTOCOLS)/stable/viewporter/viewporter.xml
 	$(AM_V_GEN)$(WAYLAND_SCANNER) private-code $< $@
 
-libwl_shell_plugin_la_SOURCES = video_output/wayland/xdg-shell.c
+libwl_shell_plugin_la_SOURCES = $(libxdg_shell_plugin_la_SOURCES)
 nodist_libwl_shell_plugin_la_SOURCES = \
 	video_output/wayland/server-decoration-client-protocol.h \
 	video_output/wayland/server-decoration-protocol.c
@@ -211,7 +211,9 @@ libwl_shell_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) \
 libwl_shell_plugin_la_CFLAGS = $(WAYLAND_CLIENT_CFLAGS)
 libwl_shell_plugin_la_LIBADD = $(WAYLAND_CLIENT_LIBS) $(LIBPTHREAD)
 
-libxdg_shell_plugin_la_SOURCES = video_output/wayland/xdg-shell.c
+libxdg_shell_plugin_la_SOURCES = \
+	video_output/wayland/input.h video_output/wayland/input.c \
+	video_output/wayland/xdg-shell.c
 nodist_libxdg_shell_plugin_la_SOURCES = \
 	video_output/wayland/xdg-shell-client-protocol.h \
 	video_output/wayland/xdg-shell-protocol.c \
@@ -238,7 +240,7 @@ video_output/wayland/server-decoration-protocol.c: \
 		video_output/wayland/server-decoration.xml
 EXTRA_DIST += video_output/wayland/server-decoration.xml
 
-libxdg_shell_v6_plugin_la_SOURCES = video_output/wayland/xdg-shell.c
+libxdg_shell_v6_plugin_la_SOURCES = $(libxdg_shell_plugin_la_SOURCES)
 nodist_libxdg_shell_v6_plugin_la_SOURCES = \
 	video_output/wayland/xdg-shell-unstable-v6-client-protocol.h \
 	video_output/wayland/xdg-shell-unstable-v6-protocol.c \
diff --git a/modules/video_output/wayland/input.c b/modules/video_output/wayland/input.c
new file mode 100644
index 0000000000..2abc8a85a5
--- /dev/null
+++ b/modules/video_output/wayland/input.c
@@ -0,0 +1,109 @@
+/**
+ * @file input.c
+ * @brief Wayland input events for VLC media player
+ */
+/*****************************************************************************
+ * Copyright © 2018 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <assert.h>
+#include <inttypes.h>
+#include <stdlib.h>
+#include <wayland-client.h>
+#include <vlc_common.h>
+#include <vlc_vout_window.h>
+
+#include "input.h"
+
+struct seat_data
+{
+    vout_window_t *owner;
+    struct wl_seat *seat;
+
+    uint32_t version;
+    struct wl_list node;
+};
+
+static void seat_capabilities_cb(void *data, struct wl_seat *seat,
+                                 uint32_t capabilities)
+{
+    struct seat_data *sd = data;
+    struct vout_window_t *wnd = sd->owner;
+
+    msg_Dbg(wnd, "seat capabilities: 0x%"PRIx32, capabilities);
+    (void) seat;
+}
+
+static void seat_name_cb(void *data, struct wl_seat *seat, const char *name)
+{
+    struct seat_data *sd = data;
+
+    msg_Dbg(sd->owner, "seat name: %s", name);
+    (void) seat;
+}
+
+static const struct wl_seat_listener seat_cbs =
+{
+    seat_capabilities_cb,
+    seat_name_cb,
+};
+
+int seat_create(vout_window_t *wnd, struct wl_registry *registry,
+                uint32_t name, uint32_t version, struct wl_list *list)
+{
+    struct seat_data *sd = malloc(sizeof (*sd));
+    if (unlikely(sd == NULL))
+        return -1;
+
+    if (version > 5)
+        version = 5;
+
+    sd->owner = wnd;
+    sd->version = version;
+
+    sd->seat = wl_registry_bind(registry, name, &wl_seat_interface, version);
+    if (unlikely(sd->seat == NULL))
+    {
+        free(sd);
+        return -1;
+    }
+
+    wl_seat_add_listener(sd->seat, &seat_cbs, sd);
+    wl_list_insert(list, &sd->node);
+    return 0;
+}
+
+static void seat_destroy(struct seat_data *sd)
+{
+    wl_list_remove(&sd->node);
+
+    if (sd->version >= WL_SEAT_RELEASE_SINCE_VERSION)
+        wl_seat_release(sd->seat);
+    else
+        wl_seat_destroy(sd->seat);
+    free(sd);
+}
+
+void seat_destroy_all(struct wl_list *list)
+{
+    while (!wl_list_empty(list))
+        seat_destroy(container_of(list->next, struct seat_data, node));
+}
diff --git a/modules/video_output/wayland/input.h b/modules/video_output/wayland/input.h
new file mode 100644
index 0000000000..4f618f6614
--- /dev/null
+++ b/modules/video_output/wayland/input.h
@@ -0,0 +1,27 @@
+/*****************************************************************************
+ * Copyright © 2018 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#include <stdint.h>
+
+struct vout_window_t;
+struct wl_registry;
+struct wl_list;
+
+int seat_create(struct vout_window_t *wnd, struct wl_registry *,
+                uint32_t name, uint32_t version, struct wl_list *list);
+void seat_destroy_all(struct wl_list *list);
diff --git a/modules/video_output/wayland/xdg-shell.c b/modules/video_output/wayland/xdg-shell.c
index 8f056c1357..22f03250a5 100644
--- a/modules/video_output/wayland/xdg-shell.c
+++ b/modules/video_output/wayland/xdg-shell.c
@@ -90,6 +90,8 @@
 #include <vlc_plugin.h>
 #include <vlc_vout_window.h>
 
+#include "input.h"
+
 struct vout_window_sys_t
 {
     struct wl_registry *registry;
@@ -106,6 +108,8 @@ struct vout_window_sys_t
     unsigned height;
     bool fullscreen;
 
+    struct wl_list seats;
+
     vlc_thread_t thread;
 };
 
@@ -439,6 +443,9 @@ static void registry_global_cb(void *data, struct wl_registry *registry,
         sys->wm_base = wl_registry_bind(registry, name, &xdg_wm_base_interface,
                                         1);
     else
+    if (!strcmp(iface, "wl_seat"))
+        seat_create(wnd, registry, name, vers, &sys->seats);
+    else
     if (!strcmp(iface, "org_kde_kwin_server_decoration_manager"))
         sys->deco_manager = wl_registry_bind(registry, name,
                          &org_kde_kwin_server_decoration_manager_interface, 1);
@@ -484,6 +491,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
     sys->width = cfg->width;
     sys->height = cfg->height;
     sys->fullscreen = false;
+    wl_list_init(&sys->seats);
     wnd->sys = sys;
 
     /* Connect to the display server */
@@ -589,6 +597,7 @@ static int Open(vout_window_t *wnd, const vout_window_cfg_t *cfg)
     return VLC_SUCCESS;
 
 error:
+    seat_destroy_all(&sys->seats);
     if (sys->deco != NULL)
         org_kde_kwin_server_decoration_destroy(sys->deco);
     if (sys->deco_manager != NULL)
@@ -618,6 +627,7 @@ static void Close(vout_window_t *wnd)
     vlc_cancel(sys->thread);
     vlc_join(sys->thread, NULL);
 
+    seat_destroy_all(&sys->seats);
     if (sys->deco != NULL)
         org_kde_kwin_server_decoration_destroy(sys->deco);
     if (sys->deco_manager != NULL)



More information about the vlc-commits mailing list