From c60c2f997c415e9601112026fa1b941156a45635 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Fri, 28 Sep 2018 10:48:31 +0200 Subject: [PATCH] screen-cast-session: Add support for RecordWindow Add support for the RecordWindow screencast method, casting the currently focused window. https://gitlab.gnome.org/GNOME/mutter/merge_requests/306 (cherry picked from commit ec25f3a6b7923627484c6c1c65f8af0bebe56423) --- src/backends/meta-screen-cast-session.c | 52 +++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c index e1b6393e8..3ee02c552 100644 --- a/src/backends/meta-screen-cast-session.c +++ b/src/backends/meta-screen-cast-session.c @@ -26,9 +26,11 @@ #include "backends/meta-backend-private.h" #include "backends/meta-dbus-session-watcher.h" +#include "backends/meta-remote-access-controller-private.h" #include "backends/meta-screen-cast-monitor-stream.h" #include "backends/meta-screen-cast-stream.h" -#include "backends/meta-remote-access-controller-private.h" +#include "backends/meta-screen-cast-window-stream.h" +#include "core/display-private.h" #define META_SCREEN_CAST_SESSION_DBUS_PATH "/org/gnome/Mutter/ScreenCast/Session" @@ -333,6 +335,14 @@ handle_record_window (MetaDBusScreenCastSession *skeleton, GVariant *properties_variant) { MetaScreenCastSession *session = META_SCREEN_CAST_SESSION (skeleton); + GDBusInterfaceSkeleton *interface_skeleton; + GDBusConnection *connection; + MetaWindow *window; + GError *error = NULL; + MetaDisplay *display; + MetaScreenCastWindowStream *window_stream; + MetaScreenCastStream *stream; + char *stream_path; if (!check_permission (session, invocation)) { @@ -342,9 +352,43 @@ handle_record_window (MetaDBusScreenCastSession *skeleton, return TRUE; } - g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, - G_DBUS_ERROR_FAILED, - "Recording a window not yet supported"); + display = meta_get_display (); + window = meta_display_get_focus_window (display); + if (!window) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "Window not found"); + return TRUE; + } + + interface_skeleton = G_DBUS_INTERFACE_SKELETON (skeleton); + connection = g_dbus_interface_skeleton_get_connection (interface_skeleton); + + window_stream = meta_screen_cast_window_stream_new (connection, + window, + &error); + if (!window_stream) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_FAILED, + "Failed to record window: %s", + error->message); + g_error_free (error); + return TRUE; + } + + stream = META_SCREEN_CAST_STREAM (window_stream); + stream_path = meta_screen_cast_stream_get_object_path (stream); + + session->streams = g_list_append (session->streams, stream); + + g_signal_connect (stream, "closed", G_CALLBACK (on_stream_closed), session); + + meta_dbus_screen_cast_session_complete_record_window (skeleton, + invocation, + stream_path); + return TRUE; }