wayland: Get/initialize a xdg_session_v1 object
Add the internal API to let the upper layers define a session ID (e.g. saved from previous runs), and retrieve the session ID eventually used (e.g. in case the session is created from scratch).
This commit is contained in:
committed by
Matthias Clasen
parent
27894be982
commit
a06c412f5f
@@ -62,6 +62,7 @@
|
||||
#include "linux-dmabuf-unstable-v1-client-protocol.h"
|
||||
#include "presentation-time-client-protocol.h"
|
||||
#include "xx-color-management-v4-client-protocol.h"
|
||||
#include "xx-session-management-v1-client-protocol.h"
|
||||
|
||||
#include "wm-button-layout-translation.h"
|
||||
|
||||
@@ -101,6 +102,7 @@
|
||||
#define NO_XDG_OUTPUT_DONE_SINCE_VERSION 3
|
||||
#define OUTPUT_VERSION 3
|
||||
#define XDG_WM_DIALOG_VERSION 1
|
||||
#define XX_SESSION_MANAGEMENT_VERSION 1
|
||||
|
||||
#ifdef HAVE_TOPLEVEL_STATE_SUSPENDED
|
||||
#define XDG_WM_BASE_VERSION 6
|
||||
@@ -311,6 +313,46 @@ static const struct org_kde_kwin_server_decoration_manager_listener server_decor
|
||||
.default_mode = server_decoration_manager_default_mode
|
||||
};
|
||||
|
||||
static void
|
||||
session_listener_created (void *data,
|
||||
struct xx_session_v1 *xdg_session_v1,
|
||||
const char *id)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
|
||||
GDK_DEBUG (MISC, "session created: %s", id);
|
||||
|
||||
if (g_strcmp0 (display_wayland->session_id, id) != 0)
|
||||
{
|
||||
g_clear_pointer (&display_wayland->session_id, g_free);
|
||||
display_wayland->session_id = g_strdup (id);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
session_listener_restored (void *data,
|
||||
struct xx_session_v1 *xdg_session_v1)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
|
||||
GDK_DEBUG (MISC, "session restored: %s", display_wayland->session_id);
|
||||
}
|
||||
|
||||
static void
|
||||
session_listener_replaced (void *data,
|
||||
struct xx_session_v1 *xdg_session_v1)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
|
||||
GDK_DEBUG (MISC, "session replaced: %s", display_wayland->session_id);
|
||||
}
|
||||
|
||||
static const struct xx_session_v1_listener xdg_session_listener = {
|
||||
.created = session_listener_created,
|
||||
.restored = session_listener_restored,
|
||||
.replaced = session_listener_replaced,
|
||||
};
|
||||
|
||||
/*
|
||||
* gdk_wayland_display_prefers_ssd:
|
||||
* @display: (type GdkWaylandDisplay): a `GdkDisplay`
|
||||
@@ -393,6 +435,14 @@ gdk_registry_handle_global (void *data,
|
||||
&xdg_wm_dialog_v1_interface,
|
||||
MIN (version, XDG_WM_DIALOG_VERSION));
|
||||
}
|
||||
else if (strcmp (interface, xx_session_manager_v1_interface.name) == 0 &&
|
||||
gdk_has_feature (GDK_FEATURE_SESSION_MANAGEMENT))
|
||||
{
|
||||
display_wayland->xdg_session_manager =
|
||||
wl_registry_bind (display_wayland->wl_registry, id,
|
||||
&xx_session_manager_v1_interface,
|
||||
MIN (version, XX_SESSION_MANAGEMENT_VERSION));
|
||||
}
|
||||
else if (strcmp (interface, gtk_shell1_interface.name) == 0)
|
||||
{
|
||||
display_wayland->gtk_shell =
|
||||
@@ -767,6 +817,8 @@ gdk_wayland_display_dispose (GObject *object)
|
||||
g_clear_pointer (&display_wayland->linux_dmabuf, zwp_linux_dmabuf_v1_destroy);
|
||||
g_clear_pointer (&display_wayland->dmabuf_formats_info, dmabuf_formats_info_free);
|
||||
g_clear_pointer (&display_wayland->color, gdk_wayland_color_free);
|
||||
g_clear_pointer (&display_wayland->xdg_session, xx_session_v1_destroy);
|
||||
g_clear_pointer (&display_wayland->xdg_session_manager, xx_session_manager_v1_destroy);
|
||||
|
||||
g_clear_pointer (&display_wayland->shm, wl_shm_destroy);
|
||||
g_clear_pointer (&display_wayland->wl_registry, wl_registry_destroy);
|
||||
@@ -2809,3 +2861,51 @@ gdk_wayland_display_dispatch_queue (GdkDisplay *display,
|
||||
_exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gdk_wayland_display_register_session (GdkDisplay *display,
|
||||
const char *name)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
|
||||
GDK_DEBUG (MISC, "register session %s", name);
|
||||
|
||||
if (!display_wayland->xdg_session_manager)
|
||||
return;
|
||||
|
||||
g_clear_pointer (&display_wayland->session_id, g_free);
|
||||
display_wayland->session_id = g_strdup (name);
|
||||
|
||||
display_wayland->xdg_session =
|
||||
xx_session_manager_v1_get_session (display_wayland->xdg_session_manager,
|
||||
XX_SESSION_MANAGER_V1_REASON_LAUNCH,
|
||||
name);
|
||||
xx_session_v1_add_listener (display_wayland->xdg_session,
|
||||
&xdg_session_listener,
|
||||
display_wayland);
|
||||
|
||||
wl_display_roundtrip (display_wayland->wl_display);
|
||||
}
|
||||
|
||||
void
|
||||
gdk_wayland_display_unregister_session (GdkDisplay *display)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
|
||||
if (!display_wayland->xdg_session_manager)
|
||||
return;
|
||||
|
||||
if (display_wayland->xdg_session)
|
||||
xx_session_v1_remove (display_wayland->xdg_session);
|
||||
|
||||
g_clear_pointer (&display_wayland->session_id, g_free);
|
||||
g_clear_pointer (&display_wayland->xdg_session, xx_session_v1_destroy);
|
||||
}
|
||||
|
||||
const char *
|
||||
gdk_wayland_display_get_current_session_id (GdkDisplay *display)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
|
||||
return display_wayland->session_id;
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include <gdk/wayland/presentation-time-client-protocol.h>
|
||||
#include <gdk/wayland/single-pixel-buffer-v1-client-protocol.h>
|
||||
#include <gdk/wayland/xdg-dialog-v1-client-protocol.h>
|
||||
#include <gdk/wayland/xdg-session-management-v1-client-protocol.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <gdk/gdkkeys.h>
|
||||
@@ -124,6 +125,8 @@ struct _GdkWaylandDisplay
|
||||
struct wp_viewporter *viewporter;
|
||||
struct wp_presentation *presentation;
|
||||
struct wp_single_pixel_buffer_manager_v1 *single_pixel_buffer;
|
||||
struct xdg_session_manager_v1 *xdg_session_manager;
|
||||
struct xdg_session_v1 *xdg_session;
|
||||
GdkWaylandColor *color;
|
||||
|
||||
GList *async_roundtrips;
|
||||
@@ -153,6 +156,8 @@ struct _GdkWaylandDisplay
|
||||
|
||||
GListStore *monitors;
|
||||
|
||||
char *session_id;
|
||||
|
||||
gint64 last_bell_time_ms;
|
||||
};
|
||||
|
||||
|
||||
@@ -65,5 +65,12 @@ gboolean gdk_wayland_display_query_registry (GdkDisplay *di
|
||||
GDK_AVAILABLE_IN_4_4
|
||||
gpointer gdk_wayland_display_get_egl_display (GdkDisplay *display);
|
||||
|
||||
void gdk_wayland_display_register_session (GdkDisplay *display,
|
||||
const char *name);
|
||||
|
||||
void gdk_wayland_display_unregister_session (GdkDisplay *display);
|
||||
|
||||
const char * gdk_wayland_display_get_current_session_id (GdkDisplay *display);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
Reference in New Issue
Block a user