diff --git a/src/backends/meta-remote-desktop-session.c b/src/backends/meta-remote-desktop-session.c index d01b5e6a8..e7cedb40d 100644 --- a/src/backends/meta-remote-desktop-session.c +++ b/src/backends/meta-remote-desktop-session.c @@ -66,6 +66,8 @@ struct _MetaRemoteDesktopSession ClutterVirtualInputDevice *virtual_touchscreen; MetaRemoteDesktopSessionHandle *handle; + + gboolean is_clipboard_enabled; }; static void @@ -791,6 +793,164 @@ handle_notify_touch_up (MetaDBusRemoteDesktopSession *skeleton, return TRUE; } +static gboolean +handle_enable_clipboard (MetaDBusRemoteDesktopSession *skeleton, + GDBusMethodInvocation *invocation, + GVariant *arg_options) +{ + MetaRemoteDesktopSession *session = META_REMOTE_DESKTOP_SESSION (skeleton); + + meta_topic (META_DEBUG_REMOTE_DESKTOP, + "Enable clipboard for %s", + g_dbus_method_invocation_get_sender (invocation)); + + if (session->is_clipboard_enabled) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "Already enabled"); + return TRUE; + } + + session->is_clipboard_enabled = TRUE; + + meta_dbus_remote_desktop_session_complete_enable_clipboard (skeleton, + invocation); + + return TRUE; +} + +static gboolean +handle_disable_clipboard (MetaDBusRemoteDesktopSession *skeleton, + GDBusMethodInvocation *invocation) +{ + MetaRemoteDesktopSession *session = META_REMOTE_DESKTOP_SESSION (skeleton); + + meta_topic (META_DEBUG_REMOTE_DESKTOP, + "Disable clipboard for %s", + g_dbus_method_invocation_get_sender (invocation)); + + if (!session->is_clipboard_enabled) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "Was not enabled"); + return TRUE; + } + + meta_dbus_remote_desktop_session_complete_disable_clipboard (skeleton, + invocation); + + return TRUE; +} + +static gboolean +handle_set_selection (MetaDBusRemoteDesktopSession *skeleton, + GDBusMethodInvocation *invocation, + GVariant *arg_options) +{ + MetaRemoteDesktopSession *session = META_REMOTE_DESKTOP_SESSION (skeleton); + + meta_topic (META_DEBUG_REMOTE_DESKTOP, + "Set selection for %s", + g_dbus_method_invocation_get_sender (invocation)); + + if (!session->is_clipboard_enabled) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "Clipboard not enabled"); + return TRUE; + } + + meta_dbus_remote_desktop_session_complete_set_selection (skeleton, + invocation); + + return TRUE; +} + +static gboolean +handle_selection_write (MetaDBusRemoteDesktopSession *skeleton, + GDBusMethodInvocation *invocation, + GUnixFDList *fd_list, + unsigned int serial) +{ + MetaRemoteDesktopSession *session = META_REMOTE_DESKTOP_SESSION (skeleton); + + meta_topic (META_DEBUG_REMOTE_DESKTOP, + "Write selection for %s", + g_dbus_method_invocation_get_sender (invocation)); + + if (!session->is_clipboard_enabled) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "Clipboard not enabled"); + return TRUE; + } + + meta_dbus_remote_desktop_session_complete_selection_write (skeleton, + invocation, + NULL, + NULL); + + return TRUE; +} + +static gboolean +handle_selection_write_done (MetaDBusRemoteDesktopSession *skeleton, + GDBusMethodInvocation *invocation, + unsigned int arg_serial, + gboolean arg_success) +{ + MetaRemoteDesktopSession *session = META_REMOTE_DESKTOP_SESSION (skeleton); + + meta_topic (META_DEBUG_REMOTE_DESKTOP, + "Write selection done for %s", + g_dbus_method_invocation_get_sender (invocation)); + + if (!session->is_clipboard_enabled) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "Clipboard not enabled"); + return TRUE; + } + + meta_dbus_remote_desktop_session_complete_selection_write_done (skeleton, + invocation); + + return TRUE; +} + +static gboolean +handle_selection_read (MetaDBusRemoteDesktopSession *skeleton, + GDBusMethodInvocation *invocation, + GUnixFDList *fd_list, + const char *mime_type) +{ + MetaRemoteDesktopSession *session = META_REMOTE_DESKTOP_SESSION (skeleton); + + meta_topic (META_DEBUG_REMOTE_DESKTOP, + "Read selection for %s", + g_dbus_method_invocation_get_sender (invocation)); + + if (!session->is_clipboard_enabled) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "Clipboard not enabled"); + return TRUE; + } + + meta_dbus_remote_desktop_session_complete_selection_read (skeleton, + invocation, + NULL, + NULL); + + return TRUE; +} + static void meta_remote_desktop_session_init_iface (MetaDBusRemoteDesktopSessionIface *iface) { @@ -806,6 +966,12 @@ meta_remote_desktop_session_init_iface (MetaDBusRemoteDesktopSessionIface *iface iface->handle_notify_touch_down = handle_notify_touch_down; iface->handle_notify_touch_motion = handle_notify_touch_motion; iface->handle_notify_touch_up = handle_notify_touch_up; + iface->handle_enable_clipboard = handle_enable_clipboard; + iface->handle_disable_clipboard = handle_disable_clipboard; + iface->handle_set_selection = handle_set_selection; + iface->handle_selection_write = handle_selection_write; + iface->handle_selection_write_done = handle_selection_write_done; + iface->handle_selection_read = handle_selection_read; } static void diff --git a/src/org.gnome.Mutter.RemoteDesktop.xml b/src/org.gnome.Mutter.RemoteDesktop.xml index d93413f6d..0b79f70a6 100644 --- a/src/org.gnome.Mutter.RemoteDesktop.xml +++ b/src/org.gnome.Mutter.RemoteDesktop.xml @@ -195,6 +195,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +