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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3228>
This commit is contained in:
Jonas Ådahl 2023-08-29 20:22:10 +02:00 committed by Marge Bot
parent f5e063ab57
commit 27b790d8c1
4 changed files with 56 additions and 49 deletions

View File

@ -62,6 +62,7 @@ typedef struct _MetaRenderer MetaRenderer;
typedef struct _MetaRendererView MetaRendererView; typedef struct _MetaRendererView MetaRendererView;
typedef struct _MetaRemoteDesktop MetaRemoteDesktop; typedef struct _MetaRemoteDesktop MetaRemoteDesktop;
typedef struct _MetaRemoteDesktopSession MetaRemoteDesktopSession;
typedef struct _MetaScreenCast MetaScreenCast; typedef struct _MetaScreenCast MetaScreenCast;
typedef struct _MetaScreenCastSession MetaScreenCastSession; typedef struct _MetaScreenCastSession MetaScreenCastSession;
typedef struct _MetaScreenCastStream MetaScreenCastStream; typedef struct _MetaScreenCastStream MetaScreenCastStream;

View File

@ -26,6 +26,7 @@
#include "backends/meta-dbus-session-manager.h" #include "backends/meta-dbus-session-manager.h"
#include "backends/meta-dbus-session-watcher.h" #include "backends/meta-dbus-session-watcher.h"
#include "backends/meta-remote-access-controller-private.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-area-stream.h"
#include "backends/meta-screen-cast-monitor-stream.h" #include "backends/meta-screen-cast-monitor-stream.h"
#include "backends/meta-screen-cast-stream.h" #include "backends/meta-screen-cast-stream.h"
@ -41,7 +42,7 @@ enum
{ {
PROP_0, PROP_0,
PROP_SESSION_TYPE, PROP_REMOTE_DESKTOP_SESSION,
N_PROPS N_PROPS
}; };
@ -66,6 +67,8 @@ struct _MetaScreenCastSession
gboolean is_active; gboolean is_active;
gboolean disable_animations; gboolean disable_animations;
MetaRemoteDesktopSession *remote_desktop_session;
}; };
static void initable_init_iface (GInitableIface *iface); static void initable_init_iface (GInitableIface *iface);
@ -230,6 +233,12 @@ meta_screen_cast_session_get_session_type (MetaScreenCastSession *session)
return session->session_type; return session->session_type;
} }
MetaRemoteDesktopSession *
meta_screen_cast_session_get_remote_desktop_session (MetaScreenCastSession *session)
{
return session->remote_desktop_session;
}
static gboolean static gboolean
check_permission (MetaScreenCastSession *session, check_permission (MetaScreenCastSession *session,
GDBusMethodInvocation *invocation) GDBusMethodInvocation *invocation)
@ -248,6 +257,14 @@ meta_screen_cast_session_initable_init (GInitable *initable,
GDBusConnection *connection; GDBusConnection *connection;
static unsigned int global_session_number = 0; 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 = session->object_path =
g_strdup_printf (META_SCREEN_CAST_SESSION_DBUS_PATH "/u%u", g_strdup_printf (META_SCREEN_CAST_SESSION_DBUS_PATH "/u%u",
++global_session_number); ++global_session_number);
@ -799,8 +816,12 @@ meta_screen_cast_session_set_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_SESSION_TYPE: case PROP_REMOTE_DESKTOP_SESSION:
session->session_type = g_value_get_enum (value); 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; break;
case N_PROPS + META_DBUS_SESSION_PROP_SESSION_MANAGER: case N_PROPS + META_DBUS_SESSION_PROP_SESSION_MANAGER:
@ -828,8 +849,8 @@ meta_screen_cast_session_get_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_SESSION_TYPE: case PROP_REMOTE_DESKTOP_SESSION:
g_value_set_enum (value, session->session_type); g_value_set_object (value, session->remote_desktop_session);
break; break;
case N_PROPS + META_DBUS_SESSION_PROP_SESSION_MANAGER: 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->set_property = meta_screen_cast_session_set_property;
object_class->get_property = meta_screen_cast_session_get_property; object_class->get_property = meta_screen_cast_session_get_property;
obj_props[PROP_SESSION_TYPE] = obj_props[PROP_REMOTE_DESKTOP_SESSION] =
g_param_spec_enum ("session-type", NULL, NULL, g_param_spec_object ("remote-desktop-session", NULL, NULL,
META_TYPE_SCREEN_CAST_SESSION_TYPE, META_TYPE_REMOTE_DESKTOP_SESSION,
META_SCREEN_CAST_SESSION_TYPE_NORMAL, G_PARAM_READWRITE |
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, obj_props); g_object_class_install_properties (object_class, N_PROPS, obj_props);
meta_dbus_session_install_properties (object_class, N_PROPS); meta_dbus_session_install_properties (object_class, N_PROPS);
} }

View File

@ -22,6 +22,7 @@
#include "backends/meta-screen-cast.h" #include "backends/meta-screen-cast.h"
#include "backends/meta-backend-types.h"
#include "backends/meta-screen-cast-stream.h" #include "backends/meta-screen-cast-stream.h"
#include "meta/meta-remote-access-controller.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); 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, gboolean meta_screen_cast_session_start (MetaScreenCastSession *session,
GError **error); GError **error);

View File

@ -93,22 +93,17 @@ meta_screen_cast_create_dma_buf_handle (MetaScreenCast *screen_cast,
return dmabuf_handle; return dmabuf_handle;
} }
static gboolean static MetaRemoteDesktopSession *
register_remote_desktop_screen_cast_session (MetaScreenCastSession *session, find_remote_desktop_session (MetaDbusSessionManager *session_manager,
const char *remote_desktop_session_id, const char *remote_desktop_session_id,
GError **error) GError **error)
{ {
MetaScreenCast *screen_cast =
meta_screen_cast_session_get_screen_cast (session);
MetaDbusSessionManager *session_manager =
META_DBUS_SESSION_MANAGER (screen_cast);
MetaBackend *backend = MetaBackend *backend =
meta_dbus_session_manager_get_backend (session_manager); meta_dbus_session_manager_get_backend (session_manager);
MetaRemoteDesktop *remote_desktop = meta_backend_get_remote_desktop (backend); MetaRemoteDesktop *remote_desktop = meta_backend_get_remote_desktop (backend);
MetaDbusSessionManager *remote_desktop_session_manager = MetaDbusSessionManager *remote_desktop_session_manager =
META_DBUS_SESSION_MANAGER (remote_desktop); META_DBUS_SESSION_MANAGER (remote_desktop);
MetaDbusSession *remote_desktop_dbus_session; MetaDbusSession *remote_desktop_dbus_session;
MetaRemoteDesktopSession *remote_desktop_session;
remote_desktop_dbus_session = remote_desktop_dbus_session =
meta_dbus_session_manager_get_session (remote_desktop_session_manager, 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, g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"No remote desktop session found"); "No remote desktop session found");
return FALSE; return NULL;
} }
remote_desktop_session = return META_REMOTE_DESKTOP_SESSION (remote_desktop_dbus_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;
} }
static gboolean static gboolean
@ -139,7 +127,7 @@ handle_create_session (MetaDBusScreenCast *skeleton,
MetaDbusSessionManager *session_manager = MetaDbusSessionManager *session_manager =
META_DBUS_SESSION_MANAGER (screen_cast); META_DBUS_SESSION_MANAGER (screen_cast);
char *remote_desktop_session_id = NULL; char *remote_desktop_session_id = NULL;
MetaScreenCastSessionType session_type; MetaRemoteDesktopSession *remote_desktop_session = NULL;
MetaDbusSession *dbus_session; MetaDbusSession *dbus_session;
MetaScreenCastSession *session; MetaScreenCastSession *session;
g_autoptr (GError) error = NULL; g_autoptr (GError) error = NULL;
@ -150,15 +138,24 @@ handle_create_session (MetaDBusScreenCast *skeleton,
&remote_desktop_session_id); &remote_desktop_session_id);
if (remote_desktop_session_id) if (remote_desktop_session_id)
session_type = META_SCREEN_CAST_SESSION_TYPE_REMOTE_DESKTOP; {
else remote_desktop_session = find_remote_desktop_session (session_manager,
session_type = META_SCREEN_CAST_SESSION_TYPE_NORMAL; 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 = dbus_session =
meta_dbus_session_manager_create_session (session_manager, meta_dbus_session_manager_create_session (session_manager,
invocation, invocation,
&error, &error,
"session-type", session_type, "remote-desktop-session", remote_desktop_session,
NULL); NULL);
if (!dbus_session) if (!dbus_session)
{ {
@ -169,20 +166,6 @@ handle_create_session (MetaDBusScreenCast *skeleton,
} }
session = META_SCREEN_CAST_SESSION (dbus_session); 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", if (g_variant_lookup (properties, "disable-animations", "b",
&disable_animations)) &disable_animations))
{ {