wayland: Add zxdg_foreign_v2 protocol support

This commit is contained in:
Matthias Clasen 2022-11-09 12:22:00 +01:00
parent f9982a61e6
commit 0ba8e16e14
4 changed files with 53 additions and 21 deletions

View File

@ -52,6 +52,7 @@
#include "tablet-unstable-v2-client-protocol.h" #include "tablet-unstable-v2-client-protocol.h"
#include <wayland/xdg-shell-unstable-v6-client-protocol.h> #include <wayland/xdg-shell-unstable-v6-client-protocol.h>
#include <wayland/xdg-foreign-unstable-v1-client-protocol.h> #include <wayland/xdg-foreign-unstable-v1-client-protocol.h>
#include <wayland/xdg-foreign-unstable-v2-client-protocol.h>
#include <wayland/server-decoration-client-protocol.h> #include <wayland/server-decoration-client-protocol.h>
#include "wm-button-layout-translation.h" #include "wm-button-layout-translation.h"
@ -455,6 +456,12 @@ gdk_registry_handle_global (void *data,
wl_registry_bind (display_wayland->wl_registry, id, wl_registry_bind (display_wayland->wl_registry, id,
&zxdg_exporter_v1_interface, 1); &zxdg_exporter_v1_interface, 1);
} }
else if (strcmp (interface, "zxdg_exporter_v2") == 0)
{
display_wayland->xdg_exporter_v2 =
wl_registry_bind (display_wayland->wl_registry, id,
&zxdg_exporter_v2_interface, 1);
}
else if (strcmp (interface, "zxdg_importer_v1") == 0) else if (strcmp (interface, "zxdg_importer_v1") == 0)
{ {
display_wayland->xdg_importer = display_wayland->xdg_importer =

View File

@ -104,6 +104,7 @@ struct _GdkWaylandDisplay
struct zwp_primary_selection_device_manager_v1 *primary_selection_manager; struct zwp_primary_selection_device_manager_v1 *primary_selection_manager;
struct zwp_tablet_manager_v2 *tablet_manager; struct zwp_tablet_manager_v2 *tablet_manager;
struct zxdg_exporter_v1 *xdg_exporter; struct zxdg_exporter_v1 *xdg_exporter;
struct zxdg_exporter_v2 *xdg_exporter_v2;
struct zxdg_importer_v1 *xdg_importer; struct zxdg_importer_v1 *xdg_importer;
struct zwp_keyboard_shortcuts_inhibit_manager_v1 *keyboard_shortcuts_inhibit; struct zwp_keyboard_shortcuts_inhibit_manager_v1 *keyboard_shortcuts_inhibit;
struct org_kde_kwin_server_decoration_manager *server_decoration_manager; struct org_kde_kwin_server_decoration_manager *server_decoration_manager;

View File

@ -35,6 +35,7 @@
#include "gdkdevice-wayland-private.h" #include "gdkdevice-wayland-private.h"
#include <wayland/xdg-shell-unstable-v6-client-protocol.h> #include <wayland/xdg-shell-unstable-v6-client-protocol.h>
#include <wayland/xdg-foreign-unstable-v2-client-protocol.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -250,6 +251,7 @@ struct _GdkWaylandToplevel
struct org_kde_kwin_server_decoration *server_decoration; struct org_kde_kwin_server_decoration *server_decoration;
struct zxdg_exported_v1 *xdg_exported; struct zxdg_exported_v1 *xdg_exported;
struct zxdg_exported_v2 *xdg_exported_v2;
struct { struct {
GdkWaylandToplevelExported callback; GdkWaylandToplevelExported callback;
@ -5236,16 +5238,29 @@ gdk_wayland_toplevel_restore_system_shortcuts (GdkToplevel *toplevel)
} }
static void static void
xdg_exported_handle2 (void *data, xdg_exported_handle_v1 (void *data,
struct zxdg_exported_v1 *zxdg_exported_v1, struct zxdg_exported_v1 *zxdg_exported_v1,
const char *handle) const char *handle)
{ {
g_task_return_pointer (G_TASK (data), g_strdup (handle), g_free); g_task_return_pointer (G_TASK (data), g_strdup (handle), g_free);
g_object_unref (data); g_object_unref (data);
} }
static const struct zxdg_exported_v1_listener xdg_exported_listener2 = { static const struct zxdg_exported_v1_listener xdg_exported_listener_v1 = {
xdg_exported_handle2 xdg_exported_handle_v1
};
static void
xdg_exported_handle_v2 (void *data,
struct zxdg_exported_v2 *zxdg_exported_v2,
const char *handle)
{
g_task_return_pointer (G_TASK (data), g_strdup (handle), g_free);
g_object_unref (data);
}
static const struct zxdg_exported_v2_listener xdg_exported_listener_v2 = {
xdg_exported_handle_v2
}; };
static void static void
@ -5258,24 +5273,32 @@ gdk_wayland_toplevel_real_export_handle (GdkToplevel *toplevel,
GdkSurface *surface = GDK_SURFACE (toplevel); GdkSurface *surface = GDK_SURFACE (toplevel);
GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (toplevel)); GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (toplevel));
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
struct zxdg_exported_v1 *xdg_exported;
GTask *task; GTask *task;
task = g_task_new (toplevel, cancellable, callback, user_data); task = g_task_new (toplevel, cancellable, callback, user_data);
if (!display_wayland->xdg_exporter) if (display_wayland->xdg_exporter_v2)
{
wayland_toplevel->xdg_exported_v2 =
zxdg_exporter_v2_export_toplevel (display_wayland->xdg_exporter_v2,
gdk_wayland_surface_get_wl_surface (surface));
zxdg_exported_v2_add_listener (wayland_toplevel->xdg_exported_v2,
&xdg_exported_listener_v2, task);
}
else if (display_wayland->xdg_exporter)
{
wayland_toplevel->xdg_exported =
zxdg_exporter_v1_export (display_wayland->xdg_exporter,
gdk_wayland_surface_get_wl_surface (surface));
zxdg_exported_v1_add_listener (wayland_toplevel->xdg_exported,
&xdg_exported_listener_v1, task);
}
else
{ {
g_task_return_pointer (task, NULL, NULL); g_task_return_pointer (task, NULL, NULL);
g_object_unref (task); g_object_unref (task);
return; return;
} }
xdg_exported =
zxdg_exporter_v1_export (display_wayland->xdg_exporter,
gdk_wayland_surface_get_wl_surface (surface));
zxdg_exported_v1_add_listener (xdg_exported, &xdg_exported_listener2, task);
wayland_toplevel->xdg_exported = xdg_exported;
} }
static char * static char *
@ -5289,16 +5312,16 @@ gdk_wayland_toplevel_real_export_handle_finish (GdkToplevel *toplevel,
static void static void
gdk_wayland_toplevel_real_unexport_handle (GdkToplevel *toplevel) gdk_wayland_toplevel_real_unexport_handle (GdkToplevel *toplevel)
{ {
GdkWaylandToplevel *wayland_toplevel; GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel);
GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (toplevel));
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel)); g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel));
wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel); if (display_wayland->xdg_exporter_v2)
g_clear_pointer (&wayland_toplevel->xdg_exported_v2, zxdg_exported_v2_destroy);
g_return_if_fail (wayland_toplevel->xdg_exported); else if (display_wayland->xdg_exporter)
g_clear_pointer (&wayland_toplevel->xdg_exported, zxdg_exported_v1_destroy);
g_clear_pointer (&wayland_toplevel->xdg_exported,
zxdg_exported_v1_destroy);
} }
static void static void

View File

@ -51,6 +51,7 @@ proto_sources = [
['xdg-shell', 'unstable', 'v6', ], ['xdg-shell', 'unstable', 'v6', ],
['xdg-shell', 'stable', ], ['xdg-shell', 'stable', ],
['xdg-foreign', 'unstable', 'v1', ], ['xdg-foreign', 'unstable', 'v1', ],
['xdg-foreign', 'unstable', 'v2', ],
['tablet', 'unstable', 'v2', ], ['tablet', 'unstable', 'v2', ],
['keyboard-shortcuts-inhibit', 'unstable', 'v1', ], ['keyboard-shortcuts-inhibit', 'unstable', 'v1', ],
['server-decoration', 'private' ], ['server-decoration', 'private' ],