diff options
Diffstat (limited to 'src/backends/meta-remote-desktop-session.c')
-rw-r--r-- | src/backends/meta-remote-desktop-session.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/backends/meta-remote-desktop-session.c b/src/backends/meta-remote-desktop-session.c index 821b16724..73bcf663b 100644 --- a/src/backends/meta-remote-desktop-session.c +++ b/src/backends/meta-remote-desktop-session.c @@ -30,6 +30,7 @@ #include "backends/meta-dbus-session-watcher.h" #include "backends/meta-screen-cast-session.h" +#include "backends/meta-remote-access-controller-private.h" #include "backends/native/meta-backend-native.h" #include "backends/x11/meta-backend-x11.h" #include "cogl/cogl.h" @@ -59,6 +60,8 @@ struct _MetaRemoteDesktopSession ClutterVirtualInputDevice *virtual_pointer; ClutterVirtualInputDevice *virtual_keyboard; ClutterVirtualInputDevice *virtual_touchscreen; + + MetaRemoteDesktopSessionHandle *handle; }; static void @@ -75,12 +78,41 @@ G_DEFINE_TYPE_WITH_CODE (MetaRemoteDesktopSession, G_IMPLEMENT_INTERFACE (META_TYPE_DBUS_SESSION, meta_dbus_session_init_iface)) +struct _MetaRemoteDesktopSessionHandle +{ + MetaRemoteAccessHandle parent; + + MetaRemoteDesktopSession *session; +}; + +G_DEFINE_TYPE (MetaRemoteDesktopSessionHandle, + meta_remote_desktop_session_handle, + META_TYPE_REMOTE_ACCESS_HANDLE) + +static MetaRemoteDesktopSessionHandle * +meta_remote_desktop_session_handle_new (MetaRemoteDesktopSession *session); + static gboolean meta_remote_desktop_session_is_running (MetaRemoteDesktopSession *session) { return !!session->virtual_pointer; } +static void +init_remote_access_handle (MetaRemoteDesktopSession *session) +{ + MetaBackend *backend = meta_get_backend (); + MetaRemoteAccessController *remote_access_controller; + MetaRemoteAccessHandle *remote_access_handle; + + session->handle = meta_remote_desktop_session_handle_new (session); + + remote_access_controller = meta_backend_get_remote_access_controller (backend); + remote_access_handle = META_REMOTE_ACCESS_HANDLE (session->handle); + meta_remote_access_controller_notify_new_handle (remote_access_controller, + remote_access_handle); +} + static gboolean meta_remote_desktop_session_start (MetaRemoteDesktopSession *session, GError **error) @@ -107,6 +139,8 @@ meta_remote_desktop_session_start (MetaRemoteDesktopSession *session, clutter_device_manager_create_virtual_device (device_manager, CLUTTER_TOUCHSCREEN_DEVICE); + init_remote_access_handle (session); + return TRUE; } @@ -131,6 +165,14 @@ meta_remote_desktop_session_close (MetaRemoteDesktopSession *session) meta_dbus_remote_desktop_session_emit_closed (skeleton); g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (session)); + if (session->handle) + { + MetaRemoteAccessHandle *remote_access_handle = + META_REMOTE_ACCESS_HANDLE (session->handle); + + meta_remote_access_handle_notify_stopped (remote_access_handle); + } + g_object_unref (session); } @@ -729,6 +771,7 @@ meta_remote_desktop_session_finalize (GObject *object) g_assert (!meta_remote_desktop_session_is_running (session)); + g_clear_object (&session->handle); g_free (session->peer_name); g_free (session->session_id); g_free (session->object_path); @@ -763,3 +806,40 @@ meta_remote_desktop_session_class_init (MetaRemoteDesktopSessionClass *klass) object_class->finalize = meta_remote_desktop_session_finalize; } + +static MetaRemoteDesktopSessionHandle * +meta_remote_desktop_session_handle_new (MetaRemoteDesktopSession *session) +{ + MetaRemoteDesktopSessionHandle *handle; + + handle = g_object_new (META_TYPE_REMOTE_DESKTOP_SESSION_HANDLE, NULL); + handle->session = session; + + return handle; +} + +static void +meta_remote_desktop_session_handle_stop (MetaRemoteAccessHandle *handle) +{ + MetaRemoteDesktopSession *session; + + session = META_REMOTE_DESKTOP_SESSION_HANDLE (handle)->session; + if (!session) + return; + + meta_remote_desktop_session_close (session); +} + +static void +meta_remote_desktop_session_handle_init (MetaRemoteDesktopSessionHandle *handle) +{ +} + +static void +meta_remote_desktop_session_handle_class_init (MetaRemoteDesktopSessionHandleClass *klass) +{ + MetaRemoteAccessHandleClass *remote_access_handle_class = + META_REMOTE_ACCESS_HANDLE_CLASS (klass); + + remote_access_handle_class->stop = meta_remote_desktop_session_handle_stop; +} |