import CS xdg-desktop-portal-gnome-41.2-3.el9
This commit is contained in:
parent
36c25554e2
commit
c2fa37d6ec
638
SOURCES/0001-screencast-trivial-style-cleanups.patch
Normal file
638
SOURCES/0001-screencast-trivial-style-cleanups.patch
Normal file
@ -0,0 +1,638 @@
|
||||
From d9c897c8b91165f95f011d44f2fea731b4b7eb16 Mon Sep 17 00:00:00 2001
|
||||
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
Date: Wed, 10 Nov 2021 15:32:18 -0300
|
||||
Subject: [PATCH] screencast: Trivial style cleanups
|
||||
|
||||
Move some code around, and cleanup some of the styling.
|
||||
It's getting increasingly harder to follow these files,
|
||||
so start this series of cleanups with them.
|
||||
---
|
||||
src/screencast.c | 30 ++--
|
||||
src/screencastdialog.c | 62 +++----
|
||||
src/screencastdialog.h | 2 +-
|
||||
src/screencastwidget.c | 356 +++++++++++++++++++++--------------------
|
||||
src/screencastwidget.h | 10 +-
|
||||
5 files changed, 238 insertions(+), 222 deletions(-)
|
||||
|
||||
diff --git a/src/gnomescreencast.c b/src/gnomescreencast.c
|
||||
index fd80ca7..abf5b53 100644
|
||||
--- a/src/gnomescreencast.c
|
||||
+++ b/src/gnomescreencast.c
|
||||
@@ -473,6 +473,7 @@ gnome_screen_cast_session_record_selections (GnomeScreenCastSession *gnome_scree
|
||||
select,
|
||||
error))
|
||||
return FALSE;
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/src/screencast.c b/src/screencast.c
|
||||
index 27d8946..38d1d05 100644
|
||||
--- a/src/screencast.c
|
||||
+++ b/src/screencast.c
|
||||
@@ -572,21 +572,6 @@ on_gnome_screen_cast_disabled (GDBusConnection *connection,
|
||||
}
|
||||
}
|
||||
|
||||
-gboolean
|
||||
-screen_cast_init (GDBusConnection *connection,
|
||||
- GError **error)
|
||||
-{
|
||||
- impl_connection = connection;
|
||||
- gnome_screen_cast = gnome_screen_cast_new (connection);
|
||||
-
|
||||
- g_signal_connect (gnome_screen_cast, "enabled",
|
||||
- G_CALLBACK (on_gnome_screen_cast_enabled), NULL);
|
||||
- g_signal_connect (gnome_screen_cast, "disabled",
|
||||
- G_CALLBACK (on_gnome_screen_cast_disabled), NULL);
|
||||
-
|
||||
- return TRUE;
|
||||
-}
|
||||
-
|
||||
static void
|
||||
screen_cast_session_close (Session *session)
|
||||
{
|
||||
@@ -636,3 +621,18 @@ screen_cast_session_class_init (ScreenCastSessionClass *klass)
|
||||
session_class = (SessionClass *)klass;
|
||||
session_class->close = screen_cast_session_close;
|
||||
}
|
||||
+
|
||||
+gboolean
|
||||
+screen_cast_init (GDBusConnection *connection,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ impl_connection = connection;
|
||||
+ gnome_screen_cast = gnome_screen_cast_new (connection);
|
||||
+
|
||||
+ g_signal_connect (gnome_screen_cast, "enabled",
|
||||
+ G_CALLBACK (on_gnome_screen_cast_enabled), NULL);
|
||||
+ g_signal_connect (gnome_screen_cast, "disabled",
|
||||
+ G_CALLBACK (on_gnome_screen_cast_disabled), NULL);
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
diff --git a/src/screencastdialog.c b/src/screencastdialog.c
|
||||
index 306992d..56d4d49 100644
|
||||
--- a/src/screencastdialog.c
|
||||
+++ b/src/screencastdialog.c
|
||||
@@ -51,6 +51,10 @@ static guint signals[N_SIGNALS];
|
||||
|
||||
G_DEFINE_TYPE (ScreenCastDialog, screen_cast_dialog, GTK_TYPE_WINDOW)
|
||||
|
||||
+/*
|
||||
+ * Callbacks
|
||||
+ */
|
||||
+
|
||||
static void
|
||||
button_clicked (GtkWidget *button,
|
||||
ScreenCastDialog *dialog)
|
||||
@@ -84,7 +88,7 @@ button_clicked (GtkWidget *button,
|
||||
|
||||
static void
|
||||
on_has_selection_changed (ScreenCastWidget *screen_cast_widget,
|
||||
- gboolean has_selection,
|
||||
+ gboolean has_selection,
|
||||
ScreenCastDialog *dialog)
|
||||
{
|
||||
if (has_selection)
|
||||
@@ -93,32 +97,9 @@ on_has_selection_changed (ScreenCastWidget *screen_cast_widget,
|
||||
gtk_widget_set_sensitive (dialog->accept_button, FALSE);
|
||||
}
|
||||
|
||||
-ScreenCastDialog *
|
||||
-screen_cast_dialog_new (const char *app_id,
|
||||
- ScreenCastSelection *select)
|
||||
-{
|
||||
- ScreenCastDialog *dialog;
|
||||
- ScreenCastWidget *screen_cast_widget;
|
||||
-
|
||||
- dialog = g_object_new (SCREEN_CAST_TYPE_DIALOG, NULL);
|
||||
- screen_cast_widget = SCREEN_CAST_WIDGET (dialog->screen_cast_widget);
|
||||
- screen_cast_widget_set_app_id (screen_cast_widget, app_id);
|
||||
- screen_cast_widget_set_allow_multiple (screen_cast_widget, select->multiple);
|
||||
- screen_cast_widget_set_source_types (screen_cast_widget,
|
||||
- select->source_types);
|
||||
-
|
||||
- return dialog;
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-screen_cast_dialog_init (ScreenCastDialog *dialog)
|
||||
-{
|
||||
- gtk_widget_init_template (GTK_WIDGET (dialog));
|
||||
-
|
||||
- g_signal_connect (dialog->screen_cast_widget, "has-selection-changed",
|
||||
- G_CALLBACK (on_has_selection_changed), dialog);
|
||||
- gtk_widget_show (dialog->screen_cast_widget);
|
||||
-}
|
||||
+/*
|
||||
+ * GtkWindow overrides
|
||||
+ */
|
||||
|
||||
static gboolean
|
||||
screen_cast_dialog_close_request (GtkWindow *dialog)
|
||||
@@ -155,3 +136,30 @@ screen_cast_dialog_class_init (ScreenCastDialogClass *klass)
|
||||
gtk_widget_class_bind_template_child (widget_class, ScreenCastDialog, screen_cast_widget);
|
||||
gtk_widget_class_bind_template_callback (widget_class, button_clicked);
|
||||
}
|
||||
+
|
||||
+static void
|
||||
+screen_cast_dialog_init (ScreenCastDialog *dialog)
|
||||
+{
|
||||
+ gtk_widget_init_template (GTK_WIDGET (dialog));
|
||||
+
|
||||
+ g_signal_connect (dialog->screen_cast_widget, "has-selection-changed",
|
||||
+ G_CALLBACK (on_has_selection_changed), dialog);
|
||||
+ gtk_widget_show (dialog->screen_cast_widget);
|
||||
+}
|
||||
+
|
||||
+ScreenCastDialog *
|
||||
+screen_cast_dialog_new (const char *app_id,
|
||||
+ ScreenCastSelection *select)
|
||||
+{
|
||||
+ ScreenCastDialog *dialog;
|
||||
+ ScreenCastWidget *screen_cast_widget;
|
||||
+
|
||||
+ dialog = g_object_new (SCREEN_CAST_TYPE_DIALOG, NULL);
|
||||
+ screen_cast_widget = SCREEN_CAST_WIDGET (dialog->screen_cast_widget);
|
||||
+ screen_cast_widget_set_app_id (screen_cast_widget, app_id);
|
||||
+ screen_cast_widget_set_allow_multiple (screen_cast_widget, select->multiple);
|
||||
+ screen_cast_widget_set_source_types (screen_cast_widget,
|
||||
+ select->source_types);
|
||||
+
|
||||
+ return dialog;
|
||||
+}
|
||||
diff --git a/src/screencastdialog.h b/src/screencastdialog.h
|
||||
index 247d93b..1fca470 100644
|
||||
--- a/src/screencastdialog.h
|
||||
+++ b/src/screencastdialog.h
|
||||
@@ -26,5 +26,5 @@
|
||||
G_DECLARE_FINAL_TYPE (ScreenCastDialog, screen_cast_dialog,
|
||||
SCREEN_CAST, DIALOG, GtkWindow)
|
||||
|
||||
-ScreenCastDialog * screen_cast_dialog_new (const char *app_id,
|
||||
+ScreenCastDialog * screen_cast_dialog_new (const char *app_id,
|
||||
ScreenCastSelection *select);
|
||||
diff --git a/src/screencastwidget.c b/src/screencastwidget.c
|
||||
index cdd57dc..454c93e 100644
|
||||
--- a/src/screencastwidget.c
|
||||
+++ b/src/screencastwidget.c
|
||||
@@ -65,6 +65,55 @@ static GQuark quark_window_widget_data;
|
||||
|
||||
G_DEFINE_TYPE (ScreenCastWidget, screen_cast_widget, GTK_TYPE_BOX)
|
||||
|
||||
+/*
|
||||
+ * Auxiliary methods
|
||||
+ */
|
||||
+
|
||||
+static gboolean
|
||||
+add_selections (ScreenCastWidget *widget,
|
||||
+ GVariantBuilder *source_selections_builder)
|
||||
+{
|
||||
+ GList *selected_monitor_rows;
|
||||
+ GList *selected_window_rows;
|
||||
+ GList *l;
|
||||
+
|
||||
+ selected_monitor_rows =
|
||||
+ gtk_list_box_get_selected_rows (GTK_LIST_BOX (widget->monitor_list));
|
||||
+ selected_window_rows =
|
||||
+ gtk_list_box_get_selected_rows (GTK_LIST_BOX (widget->window_list));
|
||||
+ if (!selected_monitor_rows && !selected_window_rows)
|
||||
+ return FALSE;
|
||||
+
|
||||
+ for (l = selected_monitor_rows; l; l = l->next)
|
||||
+ {
|
||||
+ GtkWidget *monitor_widget = gtk_list_box_row_get_child (l->data);
|
||||
+ Monitor *monitor;
|
||||
+
|
||||
+ monitor = g_object_get_qdata (G_OBJECT (monitor_widget),
|
||||
+ quark_monitor_widget_data);
|
||||
+
|
||||
+ g_variant_builder_add (source_selections_builder, "(us)",
|
||||
+ SCREEN_CAST_SOURCE_TYPE_MONITOR,
|
||||
+ monitor_get_connector (monitor));
|
||||
+ }
|
||||
+ g_list_free (selected_monitor_rows);
|
||||
+ for (l = selected_window_rows; l; l = l->next)
|
||||
+ {
|
||||
+ GtkWidget *window_widget = gtk_list_box_row_get_child (l->data);
|
||||
+ Window *window;
|
||||
+
|
||||
+ window = g_object_get_qdata (G_OBJECT (window_widget),
|
||||
+ quark_window_widget_data);
|
||||
+
|
||||
+ g_variant_builder_add (source_selections_builder, "(ut)",
|
||||
+ SCREEN_CAST_SOURCE_TYPE_WINDOW,
|
||||
+ window_get_id (window));
|
||||
+ }
|
||||
+ g_list_free (selected_window_rows);
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
static GtkWidget *
|
||||
create_window_widget (Window *window)
|
||||
{
|
||||
@@ -131,7 +180,7 @@ create_monitor_widget (LogicalMonitor *logical_monitor)
|
||||
}
|
||||
|
||||
static gboolean
|
||||
-should_skip_window (Window *window,
|
||||
+should_skip_window (Window *window,
|
||||
GtkWindow *toplevel)
|
||||
{
|
||||
g_autofree char *processed_app_id = NULL;
|
||||
@@ -254,7 +303,7 @@ unselect_rows (GtkListBox *listbox)
|
||||
}
|
||||
|
||||
static void
|
||||
-on_windows_changed (ShellIntrospect *shell_introspect,
|
||||
+on_windows_changed (ShellIntrospect *shell_introspect,
|
||||
ScreenCastWidget *widget)
|
||||
{
|
||||
update_windows_list (widget);
|
||||
@@ -283,9 +332,9 @@ disconnect_windows_changed_listener (ScreenCastWidget *widget)
|
||||
}
|
||||
|
||||
static void
|
||||
-on_stack_switch (GtkStack *stack,
|
||||
+on_stack_switch (GtkStack *stack,
|
||||
GParamSpec *pspec,
|
||||
- gpointer *data)
|
||||
+ gpointer *data)
|
||||
{
|
||||
ScreenCastWidget *widget = (ScreenCastWidget *)data;
|
||||
GtkWidget *visible_child;
|
||||
@@ -307,9 +356,9 @@ on_stack_switch (GtkStack *stack,
|
||||
}
|
||||
|
||||
static void
|
||||
-on_row_activated (GtkListBox *box,
|
||||
+on_row_activated (GtkListBox *box,
|
||||
GtkListBoxRow *row,
|
||||
- gpointer *data)
|
||||
+ gpointer *data)
|
||||
{
|
||||
if (!row)
|
||||
return;
|
||||
@@ -378,7 +427,7 @@ schedule_selection_change (ScreenCastWidget *widget)
|
||||
}
|
||||
|
||||
static void
|
||||
-on_selected_rows_changed (GtkListBox *box,
|
||||
+on_selected_rows_changed (GtkListBox *box,
|
||||
ScreenCastWidget *widget)
|
||||
{
|
||||
/* GtkListBox activates rows after selecting them, which prevents
|
||||
@@ -403,59 +452,128 @@ update_list_box_header (GtkListBoxRow *row,
|
||||
|
||||
static void
|
||||
on_monitors_changed (DisplayStateTracker *display_state_tracker,
|
||||
- ScreenCastWidget *widget)
|
||||
+ ScreenCastWidget *widget)
|
||||
{
|
||||
update_monitors_list (widget);
|
||||
}
|
||||
|
||||
-static gboolean
|
||||
-add_selections (ScreenCastWidget *widget,
|
||||
- GVariantBuilder *source_selections_builder)
|
||||
+/*
|
||||
+ * GObject overrides
|
||||
+ */
|
||||
+
|
||||
+static void
|
||||
+screen_cast_widget_finalize (GObject *object)
|
||||
{
|
||||
- GList *selected_monitor_rows;
|
||||
- GList *selected_window_rows;
|
||||
- GList *l;
|
||||
+ ScreenCastWidget *widget = SCREEN_CAST_WIDGET (object);
|
||||
|
||||
- selected_monitor_rows =
|
||||
- gtk_list_box_get_selected_rows (GTK_LIST_BOX (widget->monitor_list));
|
||||
- selected_window_rows =
|
||||
- gtk_list_box_get_selected_rows (GTK_LIST_BOX (widget->window_list));
|
||||
- if (!selected_monitor_rows && !selected_window_rows)
|
||||
- return FALSE;
|
||||
+ g_signal_handler_disconnect (widget->display_state_tracker,
|
||||
+ widget->monitors_changed_handler_id);
|
||||
|
||||
- for (l = selected_monitor_rows; l; l = l->next)
|
||||
+ if (widget->windows_changed_handler_id)
|
||||
+ disconnect_windows_changed_listener (widget);
|
||||
+
|
||||
+ if (widget->selection_changed_timeout_id > 0)
|
||||
{
|
||||
- GtkWidget *monitor_widget = gtk_list_box_row_get_child (l->data);
|
||||
- Monitor *monitor;
|
||||
+ g_source_remove (widget->selection_changed_timeout_id);
|
||||
+ widget->selection_changed_timeout_id = 0;
|
||||
+ }
|
||||
|
||||
- monitor = g_object_get_qdata (G_OBJECT (monitor_widget),
|
||||
- quark_monitor_widget_data);
|
||||
+ G_OBJECT_CLASS (screen_cast_widget_parent_class)->finalize (object);
|
||||
+}
|
||||
|
||||
- g_variant_builder_add (source_selections_builder, "(us)",
|
||||
- SCREEN_CAST_SOURCE_TYPE_MONITOR,
|
||||
- monitor_get_connector (monitor));
|
||||
- }
|
||||
- g_list_free (selected_monitor_rows);
|
||||
- for (l = selected_window_rows; l; l = l->next)
|
||||
- {
|
||||
- GtkWidget *window_widget = gtk_list_box_row_get_child (l->data);
|
||||
- Window *window;
|
||||
+static void
|
||||
+screen_cast_widget_class_init (ScreenCastWidgetClass *klass)
|
||||
+{
|
||||
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
- window = g_object_get_qdata (G_OBJECT (window_widget),
|
||||
- quark_window_widget_data);
|
||||
+ object_class->finalize = screen_cast_widget_finalize;
|
||||
|
||||
- g_variant_builder_add (source_selections_builder, "(ut)",
|
||||
- SCREEN_CAST_SOURCE_TYPE_WINDOW,
|
||||
- window_get_id (window));
|
||||
- }
|
||||
- g_list_free (selected_window_rows);
|
||||
+ signals[HAS_SELECTION_CHANGED] = g_signal_new ("has-selection-changed",
|
||||
+ G_TYPE_FROM_CLASS (klass),
|
||||
+ G_SIGNAL_RUN_LAST,
|
||||
+ 0,
|
||||
+ NULL, NULL,
|
||||
+ NULL,
|
||||
+ G_TYPE_NONE, 1,
|
||||
+ G_TYPE_BOOLEAN);
|
||||
|
||||
- return TRUE;
|
||||
+ gtk_widget_class_set_template_from_resource (widget_class, "/org/freedesktop/portal/desktop/gnome/screencastwidget.ui");
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, source_type_switcher);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, source_type);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, monitor_selection);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, window_selection);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, monitor_heading);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, monitor_list);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, window_heading);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, window_list);
|
||||
+ gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, window_list_scrolled);
|
||||
+
|
||||
+ quark_monitor_widget_data = g_quark_from_static_string ("-monitor-widget-connector-quark");
|
||||
+ quark_window_widget_data = g_quark_from_static_string ("-window-widget-connector-quark");
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+screen_cast_widget_init (ScreenCastWidget *widget)
|
||||
+{
|
||||
+ GtkScrolledWindow *scrolled_window;
|
||||
+ GtkAdjustment *vadjustment;
|
||||
+
|
||||
+ gtk_widget_init_template (GTK_WIDGET (widget));
|
||||
+
|
||||
+ screen_cast_widget_set_app_id (widget, NULL);
|
||||
+ screen_cast_widget_set_allow_multiple (widget, FALSE);
|
||||
+
|
||||
+ gtk_list_box_set_header_func (GTK_LIST_BOX (widget->monitor_list),
|
||||
+ update_list_box_header,
|
||||
+ NULL, NULL);
|
||||
+ gtk_list_box_set_header_func (GTK_LIST_BOX (widget->window_list),
|
||||
+ update_list_box_header,
|
||||
+ NULL, NULL);
|
||||
+ scrolled_window = GTK_SCROLLED_WINDOW (widget->window_list_scrolled);
|
||||
+ vadjustment = gtk_scrolled_window_get_vadjustment (scrolled_window);
|
||||
+ gtk_list_box_set_adjustment (GTK_LIST_BOX (widget->window_list), vadjustment);
|
||||
+
|
||||
+ g_signal_connect (widget->source_type, "notify::visible-child",
|
||||
+ G_CALLBACK (on_stack_switch),
|
||||
+ widget);
|
||||
+ g_signal_connect (widget->monitor_list, "row-activated",
|
||||
+ G_CALLBACK (on_row_activated),
|
||||
+ NULL);
|
||||
+ g_signal_connect (widget->window_list, "row-activated",
|
||||
+ G_CALLBACK (on_row_activated),
|
||||
+ NULL);
|
||||
+ g_signal_connect (widget->monitor_list, "selected-rows-changed",
|
||||
+ G_CALLBACK (on_selected_rows_changed),
|
||||
+ widget);
|
||||
+ g_signal_connect (widget->window_list, "selected-rows-changed",
|
||||
+ G_CALLBACK (on_selected_rows_changed),
|
||||
+ widget);
|
||||
+
|
||||
+ widget->display_state_tracker = display_state_tracker_get ();
|
||||
+ widget->monitors_changed_handler_id =
|
||||
+ g_signal_connect (widget->display_state_tracker,
|
||||
+ "monitors-changed",
|
||||
+ G_CALLBACK (on_monitors_changed),
|
||||
+ widget);
|
||||
+ widget->shell_introspect = shell_introspect_get ();
|
||||
+
|
||||
+ update_monitors_list (widget);
|
||||
+ update_windows_list (widget);
|
||||
+
|
||||
+ gtk_widget_show (widget->monitor_list);
|
||||
+ gtk_widget_show (widget->window_list);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+init_screen_cast_widget (void)
|
||||
+{
|
||||
+ g_type_ensure (screen_cast_widget_get_type ());
|
||||
}
|
||||
|
||||
void
|
||||
screen_cast_widget_add_selections (ScreenCastWidget *widget,
|
||||
- GVariantBuilder *selections_builder)
|
||||
+ GVariantBuilder *selections_builder)
|
||||
{
|
||||
GVariantBuilder source_selections_builder;
|
||||
|
||||
@@ -474,7 +592,7 @@ screen_cast_widget_add_selections (ScreenCastWidget *widget,
|
||||
|
||||
void
|
||||
screen_cast_widget_set_app_id (ScreenCastWidget *widget,
|
||||
- const char *app_id)
|
||||
+ const char *app_id)
|
||||
{
|
||||
g_autofree char *monitor_heading = NULL;
|
||||
g_autofree char *window_heading = NULL;
|
||||
@@ -508,7 +626,7 @@ screen_cast_widget_set_app_id (ScreenCastWidget *widget,
|
||||
|
||||
void
|
||||
screen_cast_widget_set_allow_multiple (ScreenCastWidget *widget,
|
||||
- gboolean multiple)
|
||||
+ gboolean multiple)
|
||||
{
|
||||
gtk_list_box_set_selection_mode (GTK_LIST_BOX (widget->monitor_list),
|
||||
multiple ? GTK_SELECTION_MULTIPLE
|
||||
@@ -519,8 +637,8 @@ screen_cast_widget_set_allow_multiple (ScreenCastWidget *widget,
|
||||
}
|
||||
|
||||
void
|
||||
-screen_cast_widget_set_source_types (ScreenCastWidget *screen_cast_widget,
|
||||
- ScreenCastSourceType source_types)
|
||||
+screen_cast_widget_set_source_types (ScreenCastWidget *screen_cast_widget,
|
||||
+ ScreenCastSourceType source_types)
|
||||
{
|
||||
if (source_types & SCREEN_CAST_SOURCE_TYPE_MONITOR)
|
||||
gtk_widget_show (screen_cast_widget->monitor_selection);
|
||||
@@ -531,113 +649,3 @@ screen_cast_widget_set_source_types (ScreenCastWidget *screen_cast_widget,
|
||||
if (__builtin_popcount (source_types) > 1)
|
||||
gtk_widget_show (screen_cast_widget->source_type_switcher);
|
||||
}
|
||||
-
|
||||
-static void
|
||||
-screen_cast_widget_finalize (GObject *object)
|
||||
-{
|
||||
- ScreenCastWidget *widget = SCREEN_CAST_WIDGET (object);
|
||||
-
|
||||
- g_signal_handler_disconnect (widget->display_state_tracker,
|
||||
- widget->monitors_changed_handler_id);
|
||||
-
|
||||
- if (widget->windows_changed_handler_id)
|
||||
- disconnect_windows_changed_listener (widget);
|
||||
-
|
||||
- if (widget->selection_changed_timeout_id > 0)
|
||||
- {
|
||||
- g_source_remove (widget->selection_changed_timeout_id);
|
||||
- widget->selection_changed_timeout_id = 0;
|
||||
- }
|
||||
-
|
||||
- G_OBJECT_CLASS (screen_cast_widget_parent_class)->finalize (object);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-screen_cast_widget_init (ScreenCastWidget *widget)
|
||||
-{
|
||||
- GtkScrolledWindow *scrolled_window;
|
||||
- GtkAdjustment *vadjustment;
|
||||
-
|
||||
- gtk_widget_init_template (GTK_WIDGET (widget));
|
||||
-
|
||||
- screen_cast_widget_set_app_id (widget, NULL);
|
||||
- screen_cast_widget_set_allow_multiple (widget, FALSE);
|
||||
-
|
||||
- gtk_list_box_set_header_func (GTK_LIST_BOX (widget->monitor_list),
|
||||
- update_list_box_header,
|
||||
- NULL, NULL);
|
||||
- gtk_list_box_set_header_func (GTK_LIST_BOX (widget->window_list),
|
||||
- update_list_box_header,
|
||||
- NULL, NULL);
|
||||
- scrolled_window = GTK_SCROLLED_WINDOW (widget->window_list_scrolled);
|
||||
- vadjustment = gtk_scrolled_window_get_vadjustment (scrolled_window);
|
||||
- gtk_list_box_set_adjustment (GTK_LIST_BOX (widget->window_list), vadjustment);
|
||||
-
|
||||
- g_signal_connect (widget->source_type, "notify::visible-child",
|
||||
- G_CALLBACK (on_stack_switch),
|
||||
- widget);
|
||||
- g_signal_connect (widget->monitor_list, "row-activated",
|
||||
- G_CALLBACK (on_row_activated),
|
||||
- NULL);
|
||||
- g_signal_connect (widget->window_list, "row-activated",
|
||||
- G_CALLBACK (on_row_activated),
|
||||
- NULL);
|
||||
- g_signal_connect (widget->monitor_list, "selected-rows-changed",
|
||||
- G_CALLBACK (on_selected_rows_changed),
|
||||
- widget);
|
||||
- g_signal_connect (widget->window_list, "selected-rows-changed",
|
||||
- G_CALLBACK (on_selected_rows_changed),
|
||||
- widget);
|
||||
-
|
||||
- widget->display_state_tracker = display_state_tracker_get ();
|
||||
- widget->monitors_changed_handler_id =
|
||||
- g_signal_connect (widget->display_state_tracker,
|
||||
- "monitors-changed",
|
||||
- G_CALLBACK (on_monitors_changed),
|
||||
- widget);
|
||||
- widget->shell_introspect = shell_introspect_get ();
|
||||
-
|
||||
- update_monitors_list (widget);
|
||||
- update_windows_list (widget);
|
||||
-
|
||||
- gtk_widget_show (widget->monitor_list);
|
||||
- gtk_widget_show (widget->window_list);
|
||||
-}
|
||||
-
|
||||
-static void
|
||||
-screen_cast_widget_class_init (ScreenCastWidgetClass *klass)
|
||||
-{
|
||||
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
-
|
||||
- object_class->finalize = screen_cast_widget_finalize;
|
||||
-
|
||||
- signals[HAS_SELECTION_CHANGED] = g_signal_new ("has-selection-changed",
|
||||
- G_TYPE_FROM_CLASS (klass),
|
||||
- G_SIGNAL_RUN_LAST,
|
||||
- 0,
|
||||
- NULL, NULL,
|
||||
- NULL,
|
||||
- G_TYPE_NONE, 1,
|
||||
- G_TYPE_BOOLEAN);
|
||||
-
|
||||
- gtk_widget_class_set_template_from_resource (widget_class, "/org/freedesktop/portal/desktop/gnome/screencastwidget.ui");
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, source_type_switcher);
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, source_type);
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, monitor_selection);
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, window_selection);
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, monitor_heading);
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, monitor_list);
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, window_heading);
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, window_list);
|
||||
- gtk_widget_class_bind_template_child (widget_class, ScreenCastWidget, window_list_scrolled);
|
||||
-
|
||||
- quark_monitor_widget_data = g_quark_from_static_string ("-monitor-widget-connector-quark");
|
||||
- quark_window_widget_data = g_quark_from_static_string ("-window-widget-connector-quark");
|
||||
-}
|
||||
-
|
||||
-void
|
||||
-init_screen_cast_widget (void)
|
||||
-{
|
||||
- g_type_ensure (screen_cast_widget_get_type ());
|
||||
-}
|
||||
diff --git a/src/screencastwidget.h b/src/screencastwidget.h
|
||||
index 3a1ebd2..34360a3 100644
|
||||
--- a/src/screencastwidget.h
|
||||
+++ b/src/screencastwidget.h
|
||||
@@ -31,13 +31,13 @@ G_DECLARE_FINAL_TYPE (ScreenCastWidget, screen_cast_widget,
|
||||
void init_screen_cast_widget (void);
|
||||
|
||||
void screen_cast_widget_set_app_id (ScreenCastWidget *widget,
|
||||
- const char *app_id);
|
||||
+ const char *app_id);
|
||||
|
||||
void screen_cast_widget_set_allow_multiple (ScreenCastWidget *widget,
|
||||
- gboolean multiple);
|
||||
+ gboolean multiple);
|
||||
|
||||
-void screen_cast_widget_set_source_types (ScreenCastWidget *screen_cast_widget,
|
||||
- ScreenCastSourceType source_types);
|
||||
+void screen_cast_widget_set_source_types (ScreenCastWidget *screen_cast_widget,
|
||||
+ ScreenCastSourceType source_types);
|
||||
|
||||
void screen_cast_widget_add_selections (ScreenCastWidget *widget,
|
||||
- GVariantBuilder *selections_builder);
|
||||
+ GVariantBuilder *selections_builder);
|
||||
diff --git a/src/screencastwidget.ui b/src/screencastwidget.ui
|
||||
index 2417ca5..fb83b94 100644
|
||||
--- a/src/screencastwidget.ui
|
||||
+++ b/src/screencastwidget.ui
|
||||
@@ -19,6 +19,7 @@
|
||||
<child>
|
||||
<object class="GtkStack" id="source_type">
|
||||
<property name="transition-type">crossfade</property>
|
||||
+ <!-- Window selection page -->
|
||||
<child>
|
||||
<object class="GtkStackPage">
|
||||
<property name="name">windows_page</property>
|
||||
@@ -80,6 +81,8 @@
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
+
|
||||
+ <!-- Physical monitor selection page -->
|
||||
<child>
|
||||
<object class="GtkStackPage">
|
||||
<property name="name">monitors_page</property>
|
@ -0,0 +1,223 @@
|
||||
diff --git a/src/displaystatetracker.c b/src/displaystatetracker.c
|
||||
index fc9109e..ebe1105 100644
|
||||
--- a/src/displaystatetracker.c
|
||||
+++ b/src/displaystatetracker.c
|
||||
@@ -62,7 +62,7 @@ G_DEFINE_TYPE (DisplayStateTracker, display_state_tracker, G_TYPE_OBJECT)
|
||||
|
||||
static DisplayStateTracker *_display_state_tracker;
|
||||
|
||||
-static void
|
||||
+void
|
||||
monitor_free (Monitor *monitor)
|
||||
{
|
||||
g_free (monitor->connector);
|
||||
@@ -71,6 +71,19 @@ monitor_free (Monitor *monitor)
|
||||
g_free (monitor);
|
||||
}
|
||||
|
||||
+Monitor *
|
||||
+monitor_dup (Monitor *monitor)
|
||||
+{
|
||||
+ Monitor *new_monitor;
|
||||
+
|
||||
+ new_monitor = g_new0 (Monitor, 1);
|
||||
+ new_monitor->connector = g_strdup (monitor->connector);
|
||||
+ new_monitor->match_string = g_strdup (monitor->match_string);
|
||||
+ new_monitor->display_name = g_strdup (monitor->display_name);
|
||||
+
|
||||
+ return new_monitor;
|
||||
+}
|
||||
+
|
||||
const char *
|
||||
monitor_get_connector (Monitor *monitor)
|
||||
{
|
||||
diff --git a/src/displaystatetracker.h b/src/displaystatetracker.h
|
||||
index 1c3a7dc..e438dda 100644
|
||||
--- a/src/displaystatetracker.h
|
||||
+++ b/src/displaystatetracker.h
|
||||
@@ -26,6 +26,10 @@ typedef struct _LogicalMonitor LogicalMonitor;
|
||||
G_DECLARE_FINAL_TYPE (DisplayStateTracker, display_state_tracker,
|
||||
DISPLAY, STATE_TRACKER, GObject)
|
||||
|
||||
+void monitor_free (Monitor *monitor);
|
||||
+
|
||||
+Monitor * monitor_dup (Monitor *monitor);
|
||||
+
|
||||
const char * monitor_get_connector (Monitor *monitor);
|
||||
|
||||
const char * monitor_get_match_string (Monitor *monitor);
|
||||
diff --git a/src/screencast.c b/src/screencast.c
|
||||
index 0a15033..724ffc9 100644
|
||||
--- a/src/screencast.c
|
||||
+++ b/src/screencast.c
|
||||
@@ -469,6 +469,22 @@ find_best_window_by_app_id_and_title (const char *app_id,
|
||||
return best_match;
|
||||
}
|
||||
|
||||
+void
|
||||
+screen_cast_stream_info_free (ScreenCastStreamInfo *info)
|
||||
+{
|
||||
+ switch (info->type)
|
||||
+ {
|
||||
+ case SCREEN_CAST_SOURCE_TYPE_MONITOR:
|
||||
+ g_clear_pointer (&info->data.monitor, monitor_free);
|
||||
+ break;
|
||||
+ case SCREEN_CAST_SOURCE_TYPE_WINDOW:
|
||||
+ g_clear_pointer (&info->data.window, window_free);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ g_free (info);
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
restore_stream_from_data (ScreenCastSession *screen_cast_session)
|
||||
|
||||
@@ -486,7 +502,8 @@ restore_stream_from_data (ScreenCastSession *screen_cast_session)
|
||||
if (!screen_cast_session->restored.data)
|
||||
return FALSE;
|
||||
|
||||
- streams = g_ptr_array_new_with_free_func (g_free);
|
||||
+ streams =
|
||||
+ g_ptr_array_new_with_free_func ((GDestroyNotify) screen_cast_stream_info_free);
|
||||
|
||||
g_variant_get (screen_cast_session->restored.data,
|
||||
RESTORE_VARIANT_TYPE,
|
||||
@@ -512,7 +529,7 @@ restore_stream_from_data (ScreenCastSession *screen_cast_session)
|
||||
|
||||
info = g_new0 (ScreenCastStreamInfo, 1);
|
||||
info->type = SCREEN_CAST_SOURCE_TYPE_MONITOR;
|
||||
- info->data.monitor = monitor;
|
||||
+ info->data.monitor = monitor_dup (monitor);
|
||||
info->id = id;
|
||||
g_ptr_array_add (streams, info);
|
||||
}
|
||||
@@ -537,7 +554,7 @@ restore_stream_from_data (ScreenCastSession *screen_cast_session)
|
||||
|
||||
info = g_new0 (ScreenCastStreamInfo, 1);
|
||||
info->type = SCREEN_CAST_SOURCE_TYPE_WINDOW;
|
||||
- info->data.window = window;
|
||||
+ info->data.window = window_dup (window);
|
||||
info->id = id;
|
||||
g_ptr_array_add (streams, info);
|
||||
}
|
||||
diff --git a/src/screencast.h b/src/screencast.h
|
||||
index 3d64b4a..ae8988d 100644
|
||||
--- a/src/screencast.h
|
||||
+++ b/src/screencast.h
|
||||
@@ -64,3 +64,5 @@ typedef struct
|
||||
|
||||
gboolean screen_cast_init (GDBusConnection *connection,
|
||||
GError **error);
|
||||
+
|
||||
+void screen_cast_stream_info_free (ScreenCastStreamInfo *info);
|
||||
diff --git a/src/screencastwidget.c b/src/screencastwidget.c
|
||||
index 11743f7..a40c824 100644
|
||||
--- a/src/screencastwidget.c
|
||||
+++ b/src/screencastwidget.c
|
||||
@@ -101,9 +101,10 @@ create_window_widget (Window *window)
|
||||
gtk_widget_set_margin_bottom (window_label, 12);
|
||||
gtk_box_append (GTK_BOX (window_widget), window_label);
|
||||
|
||||
- g_object_set_qdata (G_OBJECT (window_widget),
|
||||
- quark_window_widget_data,
|
||||
- window);
|
||||
+ g_object_set_qdata_full (G_OBJECT (window_widget),
|
||||
+ quark_window_widget_data,
|
||||
+ window_dup (window),
|
||||
+ (GDestroyNotify) window_free);
|
||||
return window_widget;
|
||||
}
|
||||
|
||||
@@ -123,9 +124,12 @@ create_monitor_widget (LogicalMonitor *logical_monitor)
|
||||
GtkWidget *monitor_label;
|
||||
|
||||
if (!l->prev)
|
||||
- g_object_set_qdata (G_OBJECT (monitor_widget),
|
||||
- quark_monitor_widget_data,
|
||||
- monitor);
|
||||
+ {
|
||||
+ g_object_set_qdata_full (G_OBJECT (monitor_widget),
|
||||
+ quark_monitor_widget_data,
|
||||
+ monitor_dup (monitor),
|
||||
+ (GDestroyNotify) monitor_free);
|
||||
+ }
|
||||
|
||||
monitor_label = gtk_label_new (monitor_get_display_name (monitor));
|
||||
gtk_widget_set_margin_top (monitor_label, 12);
|
||||
@@ -599,7 +603,8 @@ screen_cast_widget_get_selected_streams (ScreenCastWidget *self)
|
||||
uint32_t id = 0;
|
||||
GList *l;
|
||||
|
||||
- streams = g_ptr_array_new_with_free_func (g_free);
|
||||
+ streams =
|
||||
+ g_ptr_array_new_with_free_func ((GDestroyNotify) screen_cast_stream_info_free);
|
||||
|
||||
selected_monitor_rows =
|
||||
gtk_list_box_get_selected_rows (GTK_LIST_BOX (self->monitor_list));
|
||||
@@ -619,7 +624,7 @@ screen_cast_widget_get_selected_streams (ScreenCastWidget *self)
|
||||
|
||||
info = g_new0 (ScreenCastStreamInfo, 1);
|
||||
info->type = SCREEN_CAST_SOURCE_TYPE_MONITOR;
|
||||
- info->data.monitor = monitor;
|
||||
+ info->data.monitor = monitor_dup (monitor);
|
||||
info->id = id++;
|
||||
g_ptr_array_add (streams, info);
|
||||
}
|
||||
@@ -634,7 +639,7 @@ screen_cast_widget_get_selected_streams (ScreenCastWidget *self)
|
||||
|
||||
info = g_new0 (ScreenCastStreamInfo, 1);
|
||||
info->type = SCREEN_CAST_SOURCE_TYPE_WINDOW;
|
||||
- info->data.window = window;
|
||||
+ info->data.window = window_dup (window);
|
||||
info->id = id++;
|
||||
g_ptr_array_add (streams, info);
|
||||
}
|
||||
diff --git a/src/shellintrospect.c b/src/shellintrospect.c
|
||||
index 8a81086..d1bcc8c 100644
|
||||
--- a/src/shellintrospect.c
|
||||
+++ b/src/shellintrospect.c
|
||||
@@ -62,7 +62,7 @@ static guint signals[N_SIGNALS];
|
||||
|
||||
static ShellIntrospect *_shell_introspect;
|
||||
|
||||
-static void
|
||||
+void
|
||||
window_free (Window *window)
|
||||
{
|
||||
g_free (window->title);
|
||||
@@ -70,6 +70,19 @@ window_free (Window *window)
|
||||
g_free (window);
|
||||
}
|
||||
|
||||
+Window *
|
||||
+window_dup (Window *window)
|
||||
+{
|
||||
+ Window *new_window;
|
||||
+
|
||||
+ new_window = g_new0 (Window, 1);
|
||||
+ new_window->id = window->id;
|
||||
+ new_window->title = g_strdup (window->title);
|
||||
+ new_window->app_id = g_strdup (window->app_id);
|
||||
+
|
||||
+ return new_window;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
get_windows_cb (GObject *source_object,
|
||||
GAsyncResult *res,
|
||||
diff --git a/src/shellintrospect.h b/src/shellintrospect.h
|
||||
index f63ecee..ea4188f 100644
|
||||
--- a/src/shellintrospect.h
|
||||
+++ b/src/shellintrospect.h
|
||||
@@ -34,6 +34,10 @@ void shell_introspect_ref_listeners (ShellIntrospect *shell_introspect);
|
||||
|
||||
void shell_introspect_unref_listeners (ShellIntrospect *shell_introspect);
|
||||
|
||||
+void window_free (Window *window);
|
||||
+
|
||||
+Window * window_dup (Window *window);
|
||||
+
|
||||
const char * window_get_app_id (Window *window);
|
||||
|
||||
const char * window_get_title (Window *window);
|
@ -0,0 +1,23 @@
|
||||
From a7c03eb9642a244f5623bf5bbe0e29f759554567 Mon Sep 17 00:00:00 2001
|
||||
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
Date: Wed, 10 Nov 2021 15:52:37 -0300
|
||||
Subject: [PATCH] screencast: Cleanup unnecessary forward declaration
|
||||
|
||||
---
|
||||
src/screencast.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/src/screencast.c b/src/screencast.c
|
||||
index 38d1d05..98390ab 100644
|
||||
--- a/src/screencast.c
|
||||
+++ b/src/screencast.c
|
||||
@@ -77,9 +77,6 @@ static GnomeScreenCast *gnome_screen_cast;
|
||||
GType screen_cast_session_get_type (void);
|
||||
G_DEFINE_TYPE (ScreenCastSession, screen_cast_session, session_get_type ())
|
||||
|
||||
-static void
|
||||
-start_done (ScreenCastSession *session);
|
||||
-
|
||||
static gboolean
|
||||
start_session (ScreenCastSession *session,
|
||||
GVariant *selections,
|
452
SOURCES/0003-screencast-more-code-shuffling-and-cleanups.patch
Normal file
452
SOURCES/0003-screencast-more-code-shuffling-and-cleanups.patch
Normal file
@ -0,0 +1,452 @@
|
||||
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);
|
744
SOURCES/0004-screencastwidget-rework-selection-api.patch
Normal file
744
SOURCES/0004-screencastwidget-rework-selection-api.patch
Normal file
@ -0,0 +1,744 @@
|
||||
From 0f6957254e32ab6dc1c132c0f7623bbac31309f6 Mon Sep 17 00:00:00 2001
|
||||
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
|
||||
Date: Wed, 10 Nov 2021 19:54:39 -0300
|
||||
Subject: [PATCH] screencastwidget: Rework selection APIs
|
||||
|
||||
Instead of passing data around using GVariants, add
|
||||
properly types variables and structures all around.
|
||||
This will vastly simplify future commits introducing
|
||||
screencast stream restore.
|
||||
---
|
||||
src/gnomescreencast.c | 51 ++++++-------
|
||||
src/gnomescreencast.h | 8 +-
|
||||
src/remotedesktop.c | 40 +++++-----
|
||||
src/remotedesktopdialog.c | 35 ++++-----
|
||||
src/screencast.c | 151 +++++++++++++++++---------------------
|
||||
src/screencast.h | 12 +++
|
||||
src/screencastdialog.c | 15 ++--
|
||||
src/screencastwidget.c | 132 +++++++++++++++------------------
|
||||
src/screencastwidget.h | 3 +-
|
||||
9 files changed, 203 insertions(+), 244 deletions(-)
|
||||
|
||||
diff --git a/src/gnomescreencast.c b/src/gnomescreencast.c
|
||||
index abf5b53..3f8539c 100644
|
||||
--- a/src/gnomescreencast.c
|
||||
+++ b/src/gnomescreencast.c
|
||||
@@ -274,10 +274,10 @@ cursor_mode_to_gnome_cursor_mode (ScreenCastCursorMode cursor_mode)
|
||||
}
|
||||
|
||||
static gboolean
|
||||
-gnome_screen_cast_session_record_window (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
- const guint64 id,
|
||||
- ScreenCastSelection *select,
|
||||
- GError **error)
|
||||
+gnome_screen_cast_session_record_window (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
+ Window *window,
|
||||
+ ScreenCastSelection *select,
|
||||
+ GError **error)
|
||||
{
|
||||
OrgGnomeMutterScreenCastSession *session_proxy =
|
||||
gnome_screen_cast_session->proxy;
|
||||
@@ -292,7 +292,7 @@ gnome_screen_cast_session_record_window (GnomeScreenCastSession *gnome_screen_ca
|
||||
g_variant_builder_init (&properties_builder, G_VARIANT_TYPE_VARDICT);
|
||||
g_variant_builder_add (&properties_builder, "{sv}",
|
||||
"window-id",
|
||||
- g_variant_new_uint64 (id));
|
||||
+ g_variant_new_uint64 (window_get_id (window)));
|
||||
if (select->cursor_mode)
|
||||
{
|
||||
uint32_t gnome_cursor_mode;
|
||||
@@ -356,10 +356,10 @@ gnome_screen_cast_session_record_window (GnomeScreenCastSession *gnome_screen_ca
|
||||
}
|
||||
|
||||
static gboolean
|
||||
-gnome_screen_cast_session_record_monitor (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
- const char *connector,
|
||||
- ScreenCastSelection *select,
|
||||
- GError **error)
|
||||
+gnome_screen_cast_session_record_monitor (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
+ Monitor *monitor,
|
||||
+ ScreenCastSelection *select,
|
||||
+ GError **error)
|
||||
{
|
||||
OrgGnomeMutterScreenCastSession *session_proxy =
|
||||
gnome_screen_cast_session->proxy;
|
||||
@@ -370,6 +370,7 @@ gnome_screen_cast_session_record_monitor (GnomeScreenCastSession *gnome_screen_c
|
||||
OrgGnomeMutterScreenCastStream *stream_proxy;
|
||||
GnomeScreenCastStream *stream;
|
||||
GVariant *parameters;
|
||||
+ const char *connector;
|
||||
|
||||
g_variant_builder_init (&properties_builder, G_VARIANT_TYPE_VARDICT);
|
||||
if (select->cursor_mode)
|
||||
@@ -383,6 +384,7 @@ gnome_screen_cast_session_record_monitor (GnomeScreenCastSession *gnome_screen_c
|
||||
}
|
||||
properties = g_variant_builder_end (&properties_builder);
|
||||
|
||||
+ connector = monitor_get_connector (monitor);
|
||||
if (!org_gnome_mutter_screen_cast_session_call_record_monitor_sync (session_proxy,
|
||||
connector,
|
||||
properties,
|
||||
@@ -436,40 +438,29 @@ gnome_screen_cast_session_record_monitor (GnomeScreenCastSession *gnome_screen_c
|
||||
}
|
||||
|
||||
gboolean
|
||||
-gnome_screen_cast_session_record_selections (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
- GVariant *selections,
|
||||
- ScreenCastSelection *select,
|
||||
- GError **error)
|
||||
+gnome_screen_cast_session_record_selections (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
+ GPtrArray *streams,
|
||||
+ ScreenCastSelection *select,
|
||||
+ GError **error)
|
||||
{
|
||||
- GVariantIter selections_iter;
|
||||
- GVariant *selection;
|
||||
+ guint i;
|
||||
|
||||
- g_variant_iter_init (&selections_iter, selections);
|
||||
- while ((selection = g_variant_iter_next_value (&selections_iter)))
|
||||
+ for (i = 0; i < streams->len; i++)
|
||||
{
|
||||
- ScreenCastSourceType source_type;
|
||||
- g_autofree char *key = NULL;
|
||||
- g_autoptr(GVariant) variant = NULL;
|
||||
- guint64 id;
|
||||
+ ScreenCastStreamInfo *info = g_ptr_array_index (streams, i);
|
||||
|
||||
- g_variant_get (selection, "(u?)",
|
||||
- &source_type,
|
||||
- &variant);
|
||||
-
|
||||
- switch (source_type)
|
||||
+ switch (info->type)
|
||||
{
|
||||
case SCREEN_CAST_SOURCE_TYPE_MONITOR:
|
||||
- key = g_variant_dup_string (variant, NULL);
|
||||
if (!gnome_screen_cast_session_record_monitor (gnome_screen_cast_session,
|
||||
- key,
|
||||
+ info->data.monitor,
|
||||
select,
|
||||
error))
|
||||
return FALSE;
|
||||
break;
|
||||
case SCREEN_CAST_SOURCE_TYPE_WINDOW:
|
||||
- id = g_variant_get_uint64 (variant);
|
||||
if (!gnome_screen_cast_session_record_window (gnome_screen_cast_session,
|
||||
- id,
|
||||
+ info->data.window,
|
||||
select,
|
||||
error))
|
||||
return FALSE;
|
||||
diff --git a/src/gnomescreencast.h b/src/gnomescreencast.h
|
||||
index 06e4e1e..748cf7d 100644
|
||||
--- a/src/gnomescreencast.h
|
||||
+++ b/src/gnomescreencast.h
|
||||
@@ -34,10 +34,10 @@ const char * gnome_screen_cast_session_get_stream_path_from_id (GnomeScreenCastS
|
||||
void gnome_screen_cast_session_add_stream_properties (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
GVariantBuilder *streams_builder);
|
||||
|
||||
-gboolean gnome_screen_cast_session_record_selections (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
- GVariant *selections,
|
||||
- ScreenCastSelection *select,
|
||||
- GError **error);
|
||||
+gboolean gnome_screen_cast_session_record_selections (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
+ GPtrArray *streams,
|
||||
+ ScreenCastSelection *select,
|
||||
+ GError **error);
|
||||
|
||||
gboolean gnome_screen_cast_session_stop (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
GError **error);
|
||||
diff --git a/src/remotedesktop.c b/src/remotedesktop.c
|
||||
index a1c688a..46d1dcc 100644
|
||||
--- a/src/remotedesktop.c
|
||||
+++ b/src/remotedesktop.c
|
||||
@@ -104,9 +104,10 @@ static void
|
||||
start_done (RemoteDesktopSession *session);
|
||||
|
||||
static gboolean
|
||||
-start_session (RemoteDesktopSession *session,
|
||||
- GVariant *selections,
|
||||
- GError **error);
|
||||
+start_session (RemoteDesktopSession *session,
|
||||
+ RemoteDesktopDeviceType device_types,
|
||||
+ GPtrArray *streams,
|
||||
+ GError **error);
|
||||
|
||||
static void
|
||||
cancel_start_session (RemoteDesktopSession *session,
|
||||
@@ -155,9 +156,10 @@ handle_close (XdpImplRequest *object,
|
||||
}
|
||||
|
||||
static void
|
||||
-remote_desktop_dialog_done (GtkWidget *widget,
|
||||
- int dialog_response,
|
||||
- GVariant *selections,
|
||||
+remote_desktop_dialog_done (GtkWidget *widget,
|
||||
+ int dialog_response,
|
||||
+ RemoteDesktopDeviceType device_types,
|
||||
+ GPtrArray *streams,
|
||||
RemoteDesktopDialogHandle *dialog_handle)
|
||||
{
|
||||
int response;
|
||||
@@ -184,7 +186,7 @@ remote_desktop_dialog_done (GtkWidget *widget,
|
||||
{
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
- if (!start_session (dialog_handle->session, selections, &error))
|
||||
+ if (!start_session (dialog_handle->session, device_types, streams, &error))
|
||||
{
|
||||
g_warning ("Failed to start session: %s", error->message);
|
||||
response = 2;
|
||||
@@ -453,9 +455,9 @@ on_gnome_screen_cast_session_ready (GnomeScreenCastSession *gnome_screen_cast_se
|
||||
}
|
||||
|
||||
static gboolean
|
||||
-open_screen_cast_session (RemoteDesktopSession *remote_desktop_session,
|
||||
- GVariant *source_selections,
|
||||
- GError **error)
|
||||
+open_screen_cast_session (RemoteDesktopSession *remote_desktop_session,
|
||||
+ GPtrArray *streams,
|
||||
+ GError **error)
|
||||
{
|
||||
OrgGnomeMutterRemoteDesktopSession *session_proxy =
|
||||
remote_desktop_session->mutter_session_proxy;
|
||||
@@ -478,7 +480,7 @@ open_screen_cast_session (RemoteDesktopSession *remote_desktop_session,
|
||||
remote_desktop_session);
|
||||
|
||||
if (!gnome_screen_cast_session_record_selections (gnome_screen_cast_session,
|
||||
- source_selections,
|
||||
+ streams,
|
||||
&remote_desktop_session->select.screen_cast,
|
||||
error))
|
||||
return FALSE;
|
||||
@@ -487,23 +489,19 @@ open_screen_cast_session (RemoteDesktopSession *remote_desktop_session,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
-start_session (RemoteDesktopSession *remote_desktop_session,
|
||||
- GVariant *selections,
|
||||
- GError **error)
|
||||
+start_session (RemoteDesktopSession *remote_desktop_session,
|
||||
+ RemoteDesktopDeviceType device_types,
|
||||
+ GPtrArray *streams,
|
||||
+ GError **error)
|
||||
{
|
||||
OrgGnomeMutterRemoteDesktopSession *session_proxy;
|
||||
- RemoteDesktopDeviceType device_types = 0;
|
||||
- g_autoptr(GVariant) source_selections = NULL;
|
||||
gboolean need_streams;
|
||||
|
||||
- g_variant_lookup (selections, "selected_device_types", "u", &device_types);
|
||||
remote_desktop_session->shared.device_types = device_types;
|
||||
|
||||
- if (g_variant_lookup (selections, "selected_screen_cast_sources", "@a(us)",
|
||||
- &source_selections))
|
||||
+ if (streams)
|
||||
{
|
||||
- if (!open_screen_cast_session (remote_desktop_session,
|
||||
- source_selections, error))
|
||||
+ if (!open_screen_cast_session (remote_desktop_session, streams, error))
|
||||
return FALSE;
|
||||
|
||||
need_streams = TRUE;
|
||||
diff --git a/src/remotedesktopdialog.c b/src/remotedesktopdialog.c
|
||||
index a21b008..bae7678 100644
|
||||
--- a/src/remotedesktopdialog.c
|
||||
+++ b/src/remotedesktopdialog.c
|
||||
@@ -61,9 +61,8 @@ static GQuark quark_device_widget_data;
|
||||
|
||||
G_DEFINE_TYPE (RemoteDesktopDialog, remote_desktop_dialog, GTK_TYPE_WINDOW)
|
||||
|
||||
-static void
|
||||
-add_device_type_selections (RemoteDesktopDialog *dialog,
|
||||
- GVariantBuilder *selections_builder)
|
||||
+static RemoteDesktopDeviceType
|
||||
+get_selected_device_types (RemoteDesktopDialog *dialog)
|
||||
{
|
||||
GList *selected_rows;
|
||||
GList *l;
|
||||
@@ -81,43 +80,36 @@ add_device_type_selections (RemoteDesktopDialog *dialog,
|
||||
}
|
||||
g_list_free (selected_rows);
|
||||
|
||||
- g_variant_builder_add (selections_builder, "{sv}",
|
||||
- "selected_device_types",
|
||||
- g_variant_new_uint32 (selected_device_types));
|
||||
+ return selected_device_types;
|
||||
}
|
||||
|
||||
static void
|
||||
button_clicked (GtkWidget *button,
|
||||
RemoteDesktopDialog *dialog)
|
||||
{
|
||||
+ RemoteDesktopDeviceType device_types = 0;
|
||||
+ g_autoptr(GPtrArray) streams = NULL;
|
||||
int response;
|
||||
- GVariant *selections;
|
||||
|
||||
gtk_widget_hide (GTK_WIDGET (dialog));
|
||||
|
||||
if (button == dialog->accept_button)
|
||||
{
|
||||
- GVariantBuilder selections_builder;
|
||||
ScreenCastWidget *screen_cast_widget =
|
||||
SCREEN_CAST_WIDGET (dialog->screen_cast_widget);
|
||||
|
||||
response = GTK_RESPONSE_OK;
|
||||
-
|
||||
- g_variant_builder_init (&selections_builder, G_VARIANT_TYPE_VARDICT);
|
||||
-
|
||||
- add_device_type_selections (dialog, &selections_builder);
|
||||
- if (dialog->screen_cast_enable)
|
||||
- screen_cast_widget_add_selections (screen_cast_widget,
|
||||
- &selections_builder);
|
||||
- selections = g_variant_builder_end (&selections_builder);
|
||||
+ device_types = get_selected_device_types (dialog);
|
||||
+ streams = screen_cast_widget_get_selected_streams (screen_cast_widget);
|
||||
}
|
||||
else
|
||||
{
|
||||
response = GTK_RESPONSE_CANCEL;
|
||||
- selections = NULL;
|
||||
+ device_types = 0;
|
||||
+ streams = NULL;
|
||||
}
|
||||
|
||||
- g_signal_emit (dialog, signals[DONE], 0, response, selections);
|
||||
+ g_signal_emit (dialog, signals[DONE], 0, response, device_types, streams);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -356,7 +348,7 @@ remote_desktop_dialog_close_request (GtkWindow *dialog)
|
||||
{
|
||||
gtk_widget_hide (GTK_WIDGET (dialog));
|
||||
|
||||
- g_signal_emit (dialog, signals[DONE], 0, GTK_RESPONSE_CANCEL, NULL);
|
||||
+ g_signal_emit (dialog, signals[DONE], 0, GTK_RESPONSE_CANCEL, 0, NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -375,9 +367,10 @@ remote_desktop_dialog_class_init (RemoteDesktopDialogClass *klass)
|
||||
0,
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
- G_TYPE_NONE, 2,
|
||||
+ G_TYPE_NONE, 3,
|
||||
+ G_TYPE_INT,
|
||||
G_TYPE_INT,
|
||||
- G_TYPE_VARIANT);
|
||||
+ G_TYPE_PTR_ARRAY);
|
||||
|
||||
init_screen_cast_widget ();
|
||||
|
||||
diff --git a/src/screencast.c b/src/screencast.c
|
||||
index 4ba67aa..2713d26 100644
|
||||
--- a/src/screencast.c
|
||||
+++ b/src/screencast.c
|
||||
@@ -77,11 +77,6 @@ static GnomeScreenCast *gnome_screen_cast;
|
||||
GType screen_cast_session_get_type (void);
|
||||
G_DEFINE_TYPE (ScreenCastSession, screen_cast_session, session_get_type ())
|
||||
|
||||
-static gboolean
|
||||
-start_session (ScreenCastSession *session,
|
||||
- GVariant *selections,
|
||||
- GError **error);
|
||||
-
|
||||
static gboolean
|
||||
is_screen_cast_session (Session *session)
|
||||
{
|
||||
@@ -129,10 +124,76 @@ on_request_handle_close_cb (XdpImplRequest *object,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
+static void
|
||||
+on_gnome_screen_cast_session_ready (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
+ ScreenCastSession *screen_cast_session)
|
||||
+{
|
||||
+ GVariantBuilder streams_builder;
|
||||
+ GVariantBuilder results_builder;
|
||||
+
|
||||
+ g_variant_builder_init (&results_builder, G_VARIANT_TYPE_VARDICT);
|
||||
+ g_variant_builder_init (&streams_builder, G_VARIANT_TYPE ("a(ua{sv})"));
|
||||
+
|
||||
+ gnome_screen_cast_session = screen_cast_session->gnome_screen_cast_session;
|
||||
+ gnome_screen_cast_session_add_stream_properties (gnome_screen_cast_session,
|
||||
+ &streams_builder);
|
||||
+
|
||||
+ g_variant_builder_add (&results_builder, "{sv}",
|
||||
+ "streams",
|
||||
+ g_variant_builder_end (&streams_builder));
|
||||
+
|
||||
+ xdp_impl_screen_cast_complete_start (XDP_IMPL_SCREEN_CAST (impl),
|
||||
+ screen_cast_session->start_invocation, 0,
|
||||
+ g_variant_builder_end (&results_builder));
|
||||
+ screen_cast_session->start_invocation = NULL;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+on_gnome_screen_cast_session_closed (GnomeScreenCastSession *gnome_screen_cast_session,
|
||||
+ ScreenCastSession *screen_cast_session)
|
||||
+{
|
||||
+ session_close ((Session *)screen_cast_session);
|
||||
+}
|
||||
+
|
||||
+static gboolean
|
||||
+start_session (ScreenCastSession *screen_cast_session,
|
||||
+ GPtrArray *streams,
|
||||
+ GError **error)
|
||||
+{
|
||||
+ GnomeScreenCastSession *gnome_screen_cast_session;
|
||||
+
|
||||
+ gnome_screen_cast_session =
|
||||
+ gnome_screen_cast_create_session (gnome_screen_cast, NULL, error);
|
||||
+ if (!gnome_screen_cast_session)
|
||||
+ return FALSE;
|
||||
+
|
||||
+ screen_cast_session->gnome_screen_cast_session = gnome_screen_cast_session;
|
||||
+
|
||||
+ screen_cast_session->session_ready_handler_id =
|
||||
+ g_signal_connect (gnome_screen_cast_session, "ready",
|
||||
+ G_CALLBACK (on_gnome_screen_cast_session_ready),
|
||||
+ screen_cast_session);
|
||||
+ screen_cast_session->session_closed_handler_id =
|
||||
+ g_signal_connect (gnome_screen_cast_session, "closed",
|
||||
+ G_CALLBACK (on_gnome_screen_cast_session_closed),
|
||||
+ screen_cast_session);
|
||||
+
|
||||
+ if (!gnome_screen_cast_session_record_selections (gnome_screen_cast_session,
|
||||
+ streams,
|
||||
+ &screen_cast_session->select,
|
||||
+ error))
|
||||
+ return FALSE;
|
||||
+
|
||||
+ if (!gnome_screen_cast_session_start (gnome_screen_cast_session, error))
|
||||
+ return FALSE;
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
on_screen_cast_dialog_done_cb (GtkWidget *widget,
|
||||
int dialog_response,
|
||||
- GVariant *selections,
|
||||
+ GPtrArray *streams,
|
||||
ScreenCastDialogHandle *dialog_handle)
|
||||
{
|
||||
int response;
|
||||
@@ -159,7 +220,7 @@ on_screen_cast_dialog_done_cb (GtkWidget *widget,
|
||||
{
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
- if (!start_session (dialog_handle->session, selections, &error))
|
||||
+ if (!start_session (dialog_handle->session, streams, &error))
|
||||
{
|
||||
g_warning ("Failed to start session: %s", error->message);
|
||||
response = 2;
|
||||
@@ -234,82 +295,6 @@ create_screen_cast_dialog (ScreenCastSession *session,
|
||||
return dialog_handle;
|
||||