From 27b790d8c12c17fb4da4bca885874c9cf690f0c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 29 Aug 2023 20:22:10 +0200 Subject: [PATCH] screen-cast: Pass remote desktop session on construction We already have the remote desktop session ID, and we'll soon need the actual remote desktop session in the screen cast session, so pass it on construction. The old screen cast type is set implicitly instead. Part-of: --- src/backends/meta-backend-types.h | 1 + src/backends/meta-screen-cast-session.c | 44 +++++++++++++------ src/backends/meta-screen-cast-session.h | 3 ++ src/backends/meta-screen-cast.c | 57 +++++++++---------------- 4 files changed, 56 insertions(+), 49 deletions(-) diff --git a/src/backends/meta-backend-types.h b/src/backends/meta-backend-types.h index 134374d4b..15244fb65 100644 --- a/src/backends/meta-backend-types.h +++ b/src/backends/meta-backend-types.h @@ -62,6 +62,7 @@ typedef struct _MetaRenderer MetaRenderer; typedef struct _MetaRendererView MetaRendererView; typedef struct _MetaRemoteDesktop MetaRemoteDesktop; +typedef struct _MetaRemoteDesktopSession MetaRemoteDesktopSession; typedef struct _MetaScreenCast MetaScreenCast; typedef struct _MetaScreenCastSession MetaScreenCastSession; typedef struct _MetaScreenCastStream MetaScreenCastStream; diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c index 424a58926..275c02824 100644 --- a/src/backends/meta-screen-cast-session.c +++ b/src/backends/meta-screen-cast-session.c @@ -26,6 +26,7 @@ #include "backends/meta-dbus-session-manager.h" #include "backends/meta-dbus-session-watcher.h" #include "backends/meta-remote-access-controller-private.h" +#include "backends/meta-remote-desktop-session.h" #include "backends/meta-screen-cast-area-stream.h" #include "backends/meta-screen-cast-monitor-stream.h" #include "backends/meta-screen-cast-stream.h" @@ -41,7 +42,7 @@ enum { PROP_0, - PROP_SESSION_TYPE, + PROP_REMOTE_DESKTOP_SESSION, N_PROPS }; @@ -66,6 +67,8 @@ struct _MetaScreenCastSession gboolean is_active; gboolean disable_animations; + + MetaRemoteDesktopSession *remote_desktop_session; }; static void initable_init_iface (GInitableIface *iface); @@ -230,6 +233,12 @@ meta_screen_cast_session_get_session_type (MetaScreenCastSession *session) return session->session_type; } +MetaRemoteDesktopSession * +meta_screen_cast_session_get_remote_desktop_session (MetaScreenCastSession *session) +{ + return session->remote_desktop_session; +} + static gboolean check_permission (MetaScreenCastSession *session, GDBusMethodInvocation *invocation) @@ -248,6 +257,14 @@ meta_screen_cast_session_initable_init (GInitable *initable, GDBusConnection *connection; static unsigned int global_session_number = 0; + if (session->remote_desktop_session) + { + if (!meta_remote_desktop_session_register_screen_cast (session->remote_desktop_session, + session, + error)) + return FALSE; + } + session->object_path = g_strdup_printf (META_SCREEN_CAST_SESSION_DBUS_PATH "/u%u", ++global_session_number); @@ -799,8 +816,12 @@ meta_screen_cast_session_set_property (GObject *object, switch (prop_id) { - case PROP_SESSION_TYPE: - session->session_type = g_value_get_enum (value); + case PROP_REMOTE_DESKTOP_SESSION: + session->remote_desktop_session = g_value_get_object (value); + if (session->remote_desktop_session) + session->session_type = META_SCREEN_CAST_SESSION_TYPE_REMOTE_DESKTOP; + else + session->session_type = META_SCREEN_CAST_SESSION_TYPE_NORMAL; break; case N_PROPS + META_DBUS_SESSION_PROP_SESSION_MANAGER: @@ -828,8 +849,8 @@ meta_screen_cast_session_get_property (GObject *object, switch (prop_id) { - case PROP_SESSION_TYPE: - g_value_set_enum (value, session->session_type); + case PROP_REMOTE_DESKTOP_SESSION: + g_value_set_object (value, session->remote_desktop_session); break; case N_PROPS + META_DBUS_SESSION_PROP_SESSION_MANAGER: @@ -861,13 +882,12 @@ meta_screen_cast_session_class_init (MetaScreenCastSessionClass *klass) object_class->set_property = meta_screen_cast_session_set_property; object_class->get_property = meta_screen_cast_session_get_property; - obj_props[PROP_SESSION_TYPE] = - g_param_spec_enum ("session-type", NULL, NULL, - META_TYPE_SCREEN_CAST_SESSION_TYPE, - META_SCREEN_CAST_SESSION_TYPE_NORMAL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS); + obj_props[PROP_REMOTE_DESKTOP_SESSION] = + g_param_spec_object ("remote-desktop-session", NULL, NULL, + META_TYPE_REMOTE_DESKTOP_SESSION, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPS, obj_props); meta_dbus_session_install_properties (object_class, N_PROPS); } diff --git a/src/backends/meta-screen-cast-session.h b/src/backends/meta-screen-cast-session.h index ee8514ea3..765fc3cb9 100644 --- a/src/backends/meta-screen-cast-session.h +++ b/src/backends/meta-screen-cast-session.h @@ -22,6 +22,7 @@ #include "backends/meta-screen-cast.h" +#include "backends/meta-backend-types.h" #include "backends/meta-screen-cast-stream.h" #include "meta/meta-remote-access-controller.h" @@ -48,6 +49,8 @@ char * meta_screen_cast_session_get_peer_name (MetaScreenCastSession *session); MetaScreenCastSessionType meta_screen_cast_session_get_session_type (MetaScreenCastSession *session); +MetaRemoteDesktopSession * meta_screen_cast_session_get_remote_desktop_session (MetaScreenCastSession *session); + gboolean meta_screen_cast_session_start (MetaScreenCastSession *session, GError **error); diff --git a/src/backends/meta-screen-cast.c b/src/backends/meta-screen-cast.c index 904363ed3..786074b89 100644 --- a/src/backends/meta-screen-cast.c +++ b/src/backends/meta-screen-cast.c @@ -93,22 +93,17 @@ meta_screen_cast_create_dma_buf_handle (MetaScreenCast *screen_cast, return dmabuf_handle; } -static gboolean -register_remote_desktop_screen_cast_session (MetaScreenCastSession *session, - const char *remote_desktop_session_id, - GError **error) +static MetaRemoteDesktopSession * +find_remote_desktop_session (MetaDbusSessionManager *session_manager, + const char *remote_desktop_session_id, + GError **error) { - MetaScreenCast *screen_cast = - meta_screen_cast_session_get_screen_cast (session); - MetaDbusSessionManager *session_manager = - META_DBUS_SESSION_MANAGER (screen_cast); MetaBackend *backend = meta_dbus_session_manager_get_backend (session_manager); MetaRemoteDesktop *remote_desktop = meta_backend_get_remote_desktop (backend); MetaDbusSessionManager *remote_desktop_session_manager = META_DBUS_SESSION_MANAGER (remote_desktop); MetaDbusSession *remote_desktop_dbus_session; - MetaRemoteDesktopSession *remote_desktop_session; remote_desktop_dbus_session = meta_dbus_session_manager_get_session (remote_desktop_session_manager, @@ -117,17 +112,10 @@ register_remote_desktop_screen_cast_session (MetaScreenCastSession *session, { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "No remote desktop session found"); - return FALSE; + return NULL; } - remote_desktop_session = - META_REMOTE_DESKTOP_SESSION (remote_desktop_dbus_session); - if (!meta_remote_desktop_session_register_screen_cast (remote_desktop_session, - session, - error)) - return FALSE; - - return TRUE; + return META_REMOTE_DESKTOP_SESSION (remote_desktop_dbus_session); } static gboolean @@ -139,7 +127,7 @@ handle_create_session (MetaDBusScreenCast *skeleton, MetaDbusSessionManager *session_manager = META_DBUS_SESSION_MANAGER (screen_cast); char *remote_desktop_session_id = NULL; - MetaScreenCastSessionType session_type; + MetaRemoteDesktopSession *remote_desktop_session = NULL; MetaDbusSession *dbus_session; MetaScreenCastSession *session; g_autoptr (GError) error = NULL; @@ -150,15 +138,24 @@ handle_create_session (MetaDBusScreenCast *skeleton, &remote_desktop_session_id); if (remote_desktop_session_id) - session_type = META_SCREEN_CAST_SESSION_TYPE_REMOTE_DESKTOP; - else - session_type = META_SCREEN_CAST_SESSION_TYPE_NORMAL; + { + remote_desktop_session = find_remote_desktop_session (session_manager, + remote_desktop_session_id, + &error); + if (!remote_desktop_session) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "%s", error->message); + return G_DBUS_METHOD_INVOCATION_HANDLED; + } + } dbus_session = meta_dbus_session_manager_create_session (session_manager, invocation, &error, - "session-type", session_type, + "remote-desktop-session", remote_desktop_session, NULL); if (!dbus_session) { @@ -169,20 +166,6 @@ handle_create_session (MetaDBusScreenCast *skeleton, } session = META_SCREEN_CAST_SESSION (dbus_session); - if (remote_desktop_session_id) - { - if (!register_remote_desktop_screen_cast_session (session, - remote_desktop_session_id, - &error)) - { - g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, - G_DBUS_ERROR_FAILED, - "%s", error->message); - meta_dbus_session_close (dbus_session); - return G_DBUS_METHOD_INVOCATION_HANDLED; - } - } - if (g_variant_lookup (properties, "disable-animations", "b", &disable_animations)) {