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 _MetaRemoteDesktop MetaRemoteDesktop;
typedef struct _MetaRemoteDesktopSession MetaRemoteDesktopSession;
typedef struct _MetaScreenCast MetaScreenCast;
typedef struct _MetaScreenCastSession MetaScreenCastSession;
typedef struct _MetaScreenCastStream MetaScreenCastStream;

View File

@ -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);
}

View File

@ -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);

View File

@ -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))
{