453 lines
15 KiB
Diff
453 lines
15 KiB
Diff
From 367f05b980ab780ae3b3380164f2135ce4f487fa Mon Sep 17 00:00:00 2001
|
|
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
|
Date: Wed, 10 Nov 2021 16:04:59 -0300
|
|
Subject: [PATCH] screencast: More code shuffling and cleanups
|
|
|
|
No funcional changes.
|
|
---
|
|
src/screencast.c | 350 +++++++++++++++++++++++------------------------
|
|
1 file changed, 168 insertions(+), 182 deletions(-)
|
|
|
|
diff --git a/src/screencast.c b/src/screencast.c
|
|
index 98390ab..4ba67aa 100644
|
|
--- a/src/screencast.c
|
|
+++ b/src/screencast.c
|
|
@@ -82,10 +82,6 @@ start_session (ScreenCastSession *session,
|
|
GVariant *selections,
|
|
GError **error);
|
|
|
|
-static void
|
|
-cancel_start_session (ScreenCastSession *session,
|
|
- int response);
|
|
-
|
|
static gboolean
|
|
is_screen_cast_session (Session *session)
|
|
{
|
|
@@ -108,10 +104,23 @@ screen_cast_dialog_handle_close (ScreenCastDialogHandle *dialog_handle)
|
|
screen_cast_dialog_handle_free (dialog_handle);
|
|
}
|
|
|
|
+static void
|
|
+cancel_start_session (ScreenCastSession *screen_cast_session,
|
|
+ int response)
|
|
+{
|
|
+ GVariantBuilder results_builder;
|
|
+
|
|
+ g_variant_builder_init (&results_builder, G_VARIANT_TYPE_VARDICT);
|
|
+ xdp_impl_screen_cast_complete_start (XDP_IMPL_SCREEN_CAST (impl),
|
|
+ screen_cast_session->start_invocation,
|
|
+ response,
|
|
+ g_variant_builder_end (&results_builder));
|
|
+}
|
|
+
|
|
static gboolean
|
|
-handle_close (XdpImplRequest *object,
|
|
- GDBusMethodInvocation *invocation,
|
|
- ScreenCastDialogHandle *dialog_handle)
|
|
+on_request_handle_close_cb (XdpImplRequest *object,
|
|
+ GDBusMethodInvocation *invocation,
|
|
+ ScreenCastDialogHandle *dialog_handle)
|
|
{
|
|
cancel_start_session (dialog_handle->session, 2);
|
|
|
|
@@ -121,10 +130,10 @@ handle_close (XdpImplRequest *object,
|
|
}
|
|
|
|
static void
|
|
-screen_cast_dialog_done (GtkWidget *widget,
|
|
- int dialog_response,
|
|
- GVariant *selections,
|
|
- ScreenCastDialogHandle *dialog_handle)
|
|
+on_screen_cast_dialog_done_cb (GtkWidget *widget,
|
|
+ int dialog_response,
|
|
+ GVariant *selections,
|
|
+ ScreenCastDialogHandle *dialog_handle)
|
|
{
|
|
int response;
|
|
|
|
@@ -165,10 +174,10 @@ screen_cast_dialog_done (GtkWidget *widget,
|
|
}
|
|
|
|
static ScreenCastDialogHandle *
|
|
-create_screen_cast_dialog (ScreenCastSession *session,
|
|
+create_screen_cast_dialog (ScreenCastSession *session,
|
|
GDBusMethodInvocation *invocation,
|
|
- Request *request,
|
|
- const char *parent_window)
|
|
+ Request *request,
|
|
+ const char *parent_window)
|
|
{
|
|
ScreenCastDialogHandle *dialog_handle;
|
|
ExternalWindow *external_parent;
|
|
@@ -210,10 +219,9 @@ create_screen_cast_dialog (ScreenCastSession *session,
|
|
dialog_handle->dialog = dialog;
|
|
|
|
g_signal_connect (request, "handle-close",
|
|
- G_CALLBACK (handle_close), dialog_handle);
|
|
-
|
|
+ G_CALLBACK (on_request_handle_close_cb), dialog_handle);
|
|
g_signal_connect (dialog, "done",
|
|
- G_CALLBACK (screen_cast_dialog_done), dialog_handle);
|
|
+ G_CALLBACK (on_screen_cast_dialog_done_cb), dialog_handle);
|
|
|
|
gtk_widget_realize (dialog);
|
|
|
|
@@ -226,145 +234,6 @@ create_screen_cast_dialog (ScreenCastSession *session,
|
|
return dialog_handle;
|
|
}
|
|
|
|
-static ScreenCastSession *
|
|
-screen_cast_session_new (const char *app_id,
|
|
- const char *session_handle)
|
|
-{
|
|
- ScreenCastSession *screen_cast_session;
|
|
-
|
|
- screen_cast_session = g_object_new (screen_cast_session_get_type (),
|
|
- "id", session_handle,
|
|
- NULL);
|
|
-
|
|
- return screen_cast_session;
|
|
-}
|
|
-
|
|
-static gboolean
|
|
-handle_create_session (XdpImplScreenCast *object,
|
|
- GDBusMethodInvocation *invocation,
|
|
- const char *arg_handle,
|
|
- const char *arg_session_handle,
|
|
- const char *arg_app_id,
|
|
- GVariant *arg_options)
|
|
-{
|
|
- g_autoptr(GError) error = NULL;
|
|
- int response;
|
|
- Session *session;
|
|
- GVariantBuilder results_builder;
|
|
-
|
|
- session = (Session *)screen_cast_session_new (arg_app_id,
|
|
- arg_session_handle);
|
|
-
|
|
- if (!session_export (session,
|
|
- g_dbus_method_invocation_get_connection (invocation),
|
|
- &error))
|
|
- {
|
|
- g_clear_object (&session);
|
|
- g_warning ("Failed to create screen cast session: %s", error->message);
|
|
- response = 2;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- response = 0;
|
|
-
|
|
-out:
|
|
- g_variant_builder_init (&results_builder, G_VARIANT_TYPE_VARDICT);
|
|
- xdp_impl_screen_cast_complete_create_session (object,
|
|
- invocation,
|
|
- response,
|
|
- g_variant_builder_end (&results_builder));
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-static gboolean
|
|
-handle_select_sources (XdpImplScreenCast *object,
|
|
- GDBusMethodInvocation *invocation,
|
|
- const char *arg_handle,
|
|
- const char *arg_session_handle,
|
|
- const char *arg_app_id,
|
|
- GVariant *arg_options)
|
|
-{
|
|
- Session *session;
|
|
- int response;
|
|
- uint32_t types;
|
|
- gboolean multiple;
|
|
- ScreenCastCursorMode cursor_mode;
|
|
- ScreenCastSelection select;
|
|
- GVariantBuilder results_builder;
|
|
- GVariant *results;
|
|
-
|
|
- session = lookup_session (arg_session_handle);
|
|
- if (!session)
|
|
- {
|
|
- g_warning ("Tried to select sources on non-existing %s", arg_session_handle);
|
|
- response = 2;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- if (!g_variant_lookup (arg_options, "multiple", "b", &multiple))
|
|
- multiple = FALSE;
|
|
-
|
|
- if (!g_variant_lookup (arg_options, "types", "u", &types))
|
|
- types = SCREEN_CAST_SOURCE_TYPE_MONITOR;
|
|
-
|
|
- if (!(types & (SCREEN_CAST_SOURCE_TYPE_MONITOR |
|
|
- SCREEN_CAST_SOURCE_TYPE_WINDOW)))
|
|
- {
|
|
- g_warning ("Unknown screen cast source type");
|
|
- response = 2;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- if (!g_variant_lookup (arg_options, "cursor_mode", "u", &cursor_mode))
|
|
- cursor_mode = SCREEN_CAST_CURSOR_MODE_HIDDEN;
|
|
-
|
|
- switch (cursor_mode)
|
|
- {
|
|
- case SCREEN_CAST_CURSOR_MODE_HIDDEN:
|
|
- case SCREEN_CAST_CURSOR_MODE_EMBEDDED:
|
|
- case SCREEN_CAST_CURSOR_MODE_METADATA:
|
|
- break;
|
|
- default:
|
|
- g_warning ("Unknown screen cast cursor mode");
|
|
- response = 2;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- select.multiple = multiple;
|
|
- select.source_types = types;
|
|
- select.cursor_mode = cursor_mode;
|
|
-
|
|
- if (is_screen_cast_session (session))
|
|
- {
|
|
- ScreenCastSession *screen_cast_session = (ScreenCastSession *)session;
|
|
-
|
|
- screen_cast_session->select = select;
|
|
- response = 0;
|
|
- }
|
|
- else if (is_remote_desktop_session (session))
|
|
- {
|
|
- RemoteDesktopSession *remote_desktop_session =
|
|
- (RemoteDesktopSession *)session;
|
|
-
|
|
- remote_desktop_session_sources_selected (remote_desktop_session, &select);
|
|
- response = 0;
|
|
- }
|
|
- else
|
|
- {
|
|
- g_warning ("Tried to select sources on invalid session type");
|
|
- response = 2;
|
|
- }
|
|
-
|
|
-out:
|
|
- g_variant_builder_init (&results_builder, G_VARIANT_TYPE_VARDICT);
|
|
- results = g_variant_builder_end (&results_builder);
|
|
- xdp_impl_screen_cast_complete_select_sources (object, invocation,
|
|
- response, results);
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
static void
|
|
start_done (ScreenCastSession *screen_cast_session)
|
|
{
|
|
@@ -391,14 +260,14 @@ start_done (ScreenCastSession *screen_cast_session)
|
|
|
|
static void
|
|
on_gnome_screen_cast_session_ready (GnomeScreenCastSession *gnome_screen_cast_session,
|
|
- ScreenCastSession *screen_cast_session)
|
|
+ ScreenCastSession *screen_cast_session)
|
|
{
|
|
start_done (screen_cast_session);
|
|
}
|
|
|
|
static void
|
|
on_gnome_screen_cast_session_closed (GnomeScreenCastSession *gnome_screen_cast_session,
|
|
- ScreenCastSession *screen_cast_session)
|
|
+ ScreenCastSession *screen_cast_session)
|
|
{
|
|
session_close ((Session *)screen_cast_session);
|
|
}
|
|
@@ -441,27 +310,14 @@ start_session (ScreenCastSession *screen_cast_session,
|
|
return TRUE;
|
|
}
|
|
|
|
-static void
|
|
-cancel_start_session (ScreenCastSession *screen_cast_session,
|
|
- int response)
|
|
-{
|
|
- GVariantBuilder results_builder;
|
|
-
|
|
- g_variant_builder_init (&results_builder, G_VARIANT_TYPE_VARDICT);
|
|
- xdp_impl_screen_cast_complete_start (XDP_IMPL_SCREEN_CAST (impl),
|
|
- screen_cast_session->start_invocation,
|
|
- response,
|
|
- g_variant_builder_end (&results_builder));
|
|
-}
|
|
-
|
|
static gboolean
|
|
-handle_start (XdpImplScreenCast *object,
|
|
+handle_start (XdpImplScreenCast *object,
|
|
GDBusMethodInvocation *invocation,
|
|
- const char *arg_handle,
|
|
- const char *arg_session_handle,
|
|
- const char *arg_app_id,
|
|
- const char *arg_parent_window,
|
|
- GVariant *arg_options)
|
|
+ const char *arg_handle,
|
|
+ const char *arg_session_handle,
|
|
+ const char *arg_app_id,
|
|
+ const char *arg_parent_window,
|
|
+ GVariant *arg_options)
|
|
{
|
|
const char *sender;
|
|
g_autoptr(Request) request = NULL;
|
|
@@ -507,6 +363,133 @@ err:
|
|
return TRUE;
|
|
}
|
|
|
|
+static gboolean
|
|
+handle_select_sources (XdpImplScreenCast *object,
|
|
+ GDBusMethodInvocation *invocation,
|
|
+ const char *arg_handle,
|
|
+ const char *arg_session_handle,
|
|
+ const char *arg_app_id,
|
|
+ GVariant *arg_options)
|
|
+{
|
|
+ Session *session;
|
|
+ int response;
|
|
+ uint32_t types;
|
|
+ gboolean multiple;
|
|
+ ScreenCastCursorMode cursor_mode;
|
|
+ ScreenCastSelection select;
|
|
+ GVariantBuilder results_builder;
|
|
+ GVariant *results;
|
|
+
|
|
+ session = lookup_session (arg_session_handle);
|
|
+ if (!session)
|
|
+ {
|
|
+ g_warning ("Tried to select sources on non-existing %s", arg_session_handle);
|
|
+ response = 2;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ if (!g_variant_lookup (arg_options, "multiple", "b", &multiple))
|
|
+ multiple = FALSE;
|
|
+
|
|
+ if (!g_variant_lookup (arg_options, "types", "u", &types))
|
|
+ types = SCREEN_CAST_SOURCE_TYPE_MONITOR;
|
|
+
|
|
+ if (!(types & (SCREEN_CAST_SOURCE_TYPE_MONITOR |
|
|
+ SCREEN_CAST_SOURCE_TYPE_WINDOW)))
|
|
+ {
|
|
+ g_warning ("Unknown screen cast source type");
|
|
+ response = 2;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ if (!g_variant_lookup (arg_options, "cursor_mode", "u", &cursor_mode))
|
|
+ cursor_mode = SCREEN_CAST_CURSOR_MODE_HIDDEN;
|
|
+
|
|
+ switch (cursor_mode)
|
|
+ {
|
|
+ case SCREEN_CAST_CURSOR_MODE_HIDDEN:
|
|
+ case SCREEN_CAST_CURSOR_MODE_EMBEDDED:
|
|
+ case SCREEN_CAST_CURSOR_MODE_METADATA:
|
|
+ break;
|
|
+ default:
|
|
+ g_warning ("Unknown screen cast cursor mode");
|
|
+ response = 2;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ select.multiple = multiple;
|
|
+ select.source_types = types;
|
|
+ select.cursor_mode = cursor_mode;
|
|
+
|
|
+ if (is_screen_cast_session (session))
|
|
+ {
|
|
+ ScreenCastSession *screen_cast_session = (ScreenCastSession *)session;
|
|
+
|
|
+ screen_cast_session->select = select;
|
|
+ response = 0;
|
|
+ }
|
|
+ else if (is_remote_desktop_session (session))
|
|
+ {
|
|
+ RemoteDesktopSession *remote_desktop_session =
|
|
+ (RemoteDesktopSession *)session;
|
|
+
|
|
+ remote_desktop_session_sources_selected (remote_desktop_session, &select);
|
|
+ response = 0;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ g_warning ("Tried to select sources on invalid session type");
|
|
+ response = 2;
|
|
+ }
|
|
+
|
|
+out:
|
|
+ g_variant_builder_init (&results_builder, G_VARIANT_TYPE_VARDICT);
|
|
+ results = g_variant_builder_end (&results_builder);
|
|
+ xdp_impl_screen_cast_complete_select_sources (object, invocation,
|
|
+ response, results);
|
|
+
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
+static gboolean
|
|
+handle_create_session (XdpImplScreenCast *object,
|
|
+ GDBusMethodInvocation *invocation,
|
|
+ const char *arg_handle,
|
|
+ const char *arg_session_handle,
|
|
+ const char *arg_app_id,
|
|
+ GVariant *arg_options)
|
|
+{
|
|
+ g_autoptr(GError) error = NULL;
|
|
+ int response;
|
|
+ Session *session;
|
|
+ GVariantBuilder results_builder;
|
|
+
|
|
+ session = g_object_new (screen_cast_session_get_type (),
|
|
+ "id", arg_session_handle,
|
|
+ NULL);
|
|
+
|
|
+ if (!session_export (session,
|
|
+ g_dbus_method_invocation_get_connection (invocation),
|
|
+ &error))
|
|
+ {
|
|
+ g_clear_object (&session);
|
|
+ g_warning ("Failed to create screen cast session: %s", error->message);
|
|
+ response = 2;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ response = 0;
|
|
+
|
|
+out:
|
|
+ g_variant_builder_init (&results_builder, G_VARIANT_TYPE_VARDICT);
|
|
+ xdp_impl_screen_cast_complete_create_session (object,
|
|
+ invocation,
|
|
+ response,
|
|
+ g_variant_builder_end (&results_builder));
|
|
+
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
static void
|
|
on_gnome_screen_cast_enabled (GnomeScreenCast *gnome_screen_cast)
|
|
{
|
|
@@ -535,9 +518,12 @@ on_gnome_screen_cast_enabled (GnomeScreenCast *gnome_screen_cast)
|
|
|
|
available_cursor_modes = SCREEN_CAST_CURSOR_MODE_NONE;
|
|
if (gnome_api_version >= 2)
|
|
- available_cursor_modes |= (SCREEN_CAST_CURSOR_MODE_HIDDEN |
|
|
- SCREEN_CAST_CURSOR_MODE_EMBEDDED |
|
|
- SCREEN_CAST_CURSOR_MODE_METADATA);
|
|
+ {
|
|
+ available_cursor_modes |= SCREEN_CAST_CURSOR_MODE_HIDDEN |
|
|
+ SCREEN_CAST_CURSOR_MODE_EMBEDDED |
|
|
+ SCREEN_CAST_CURSOR_MODE_METADATA;
|
|
+ }
|
|
+
|
|
g_object_set (G_OBJECT (impl),
|
|
"available-cursor-modes", available_cursor_modes,
|
|
NULL);
|
|
@@ -620,8 +606,8 @@ screen_cast_session_class_init (ScreenCastSessionClass *klass)
|
|
}
|
|
|
|
gboolean
|
|
-screen_cast_init (GDBusConnection *connection,
|
|
- GError **error)
|
|
+screen_cast_init (GDBusConnection *connection,
|
|
+ GError **error)
|
|
{
|
|
impl_connection = connection;
|
|
gnome_screen_cast = gnome_screen_cast_new (connection);
|