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