xdg-desktop-portal-gnome/0004-screencastwidget-rewor...

745 lines
29 KiB
Diff

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;
}
-static void
-start_done (ScreenCastSession *screen_cast_session)
-{
- GnomeScreenCastSession *gnome_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_ready (GnomeScreenCastSession *gnome_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)
-{
- session_close ((Session *)screen_cast_session);
-}
-
-static gboolean
-start_session (ScreenCastSession *screen_cast_session,
- GVariant *selections,
- GError **error)
-{
- GnomeScreenCastSession *gnome_screen_cast_session;
- g_autoptr(GVariant) source_selections = NULL;
-
- 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);
-
- g_variant_lookup (selections, "selected_screen_cast_sources", "@a(u?)",
- &source_selections);
- if (!gnome_screen_cast_session_record_selections (gnome_screen_cast_session,
- source_selections,
- &screen_cast_session->select,
- error))
- return FALSE;
-
- if (!gnome_screen_cast_session_start (gnome_screen_cast_session, error))
- return FALSE;
-
- return TRUE;
-}
-
static gboolean
handle_start (XdpImplScreenCast *object,
GDBusMethodInvocation *invocation,
diff --git a/src/screencast.h b/src/screencast.h
index f5033b2..a9be16b 100644
--- a/src/screencast.h
+++ b/src/screencast.h
@@ -21,6 +21,9 @@
#include <glib.h>
#include <gio/gio.h>
+#include "displaystatetracker.h"
+#include "shellintrospect.h"
+
typedef enum _ScreenCastSourceType
{
SCREEN_CAST_SOURCE_TYPE_MONITOR = 1,
@@ -42,5 +45,14 @@ typedef struct _ScreenCastSelection
ScreenCastCursorMode cursor_mode;
} ScreenCastSelection;
+typedef struct
+{
+ ScreenCastSourceType type;
+ union {
+ Monitor *monitor;
+ Window *window;
+ } data;
+} ScreenCastStreamInfo;
+
gboolean screen_cast_init (GDBusConnection *connection,
GError **error);
diff --git a/src/screencastdialog.c b/src/screencastdialog.c
index 56d4d49..3e3b064 100644
--- a/src/screencastdialog.c
+++ b/src/screencastdialog.c
@@ -59,8 +59,8 @@ static void
button_clicked (GtkWidget *button,
ScreenCastDialog *dialog)
{
+ g_autoptr(GPtrArray) streams = NULL;
int response;
- GVariant *selections;
gtk_widget_hide (GTK_WIDGET (dialog));
@@ -68,22 +68,17 @@ button_clicked (GtkWidget *button,
{
ScreenCastWidget *screen_cast_widget =
SCREEN_CAST_WIDGET (dialog->screen_cast_widget);
- GVariantBuilder selections_builder;
response = GTK_RESPONSE_OK;
-
- g_variant_builder_init (&selections_builder, G_VARIANT_TYPE ("a{sv}"));
- screen_cast_widget_add_selections (screen_cast_widget,
- &selections_builder);
- selections = g_variant_builder_end (&selections_builder);
+ streams = screen_cast_widget_get_selected_streams (screen_cast_widget);
}
else
{
response = GTK_RESPONSE_CANCEL;
- selections = NULL;
+ streams = NULL;
}
- g_signal_emit (dialog, signals[DONE], 0, response, selections);
+ g_signal_emit (dialog, signals[DONE], 0, response, streams);
}
static void
@@ -127,7 +122,7 @@ screen_cast_dialog_class_init (ScreenCastDialogClass *klass)
NULL,
G_TYPE_NONE, 2,
G_TYPE_INT,
- G_TYPE_VARIANT);
+ G_TYPE_PTR_ARRAY);
init_screen_cast_widget ();
diff --git a/src/screencastwidget.c b/src/screencastwidget.c
index 454c93e..3119245 100644
--- a/src/screencastwidget.c
+++ b/src/screencastwidget.c
@@ -69,51 +69,6 @@ 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)
{
@@ -571,25 +526,6 @@ 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 source_selections_builder;
-
- g_variant_builder_init (&source_selections_builder, G_VARIANT_TYPE ("a(u?)"));
- if (!add_selections (widget, &source_selections_builder))
- {
- g_variant_builder_clear (&source_selections_builder);
- }
- else
- {
- g_variant_builder_add (selections_builder, "{sv}",
- "selected_screen_cast_sources",
- g_variant_builder_end (&source_selections_builder));
- }
-}
-
void
screen_cast_widget_set_app_id (ScreenCastWidget *widget,
const char *app_id)
@@ -649,3 +585,53 @@ 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);
}
+
+GPtrArray *
+screen_cast_widget_get_selected_streams (ScreenCastWidget *self)
+{
+ ScreenCastStreamInfo *info;
+ g_autoptr(GPtrArray) streams = NULL;
+ g_autoptr(GList) selected_monitor_rows = NULL;
+ g_autoptr(GList) selected_window_rows = NULL;
+ GList *l;
+
+ streams = g_ptr_array_new_with_free_func (g_free);
+
+ selected_monitor_rows =
+ gtk_list_box_get_selected_rows (GTK_LIST_BOX (self->monitor_list));
+ selected_window_rows =
+ gtk_list_box_get_selected_rows (GTK_LIST_BOX (self->window_list));
+
+ if (!selected_monitor_rows && !selected_window_rows)
+ return g_steal_pointer (&streams);
+
+ 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);
+
+ info = g_new0 (ScreenCastStreamInfo, 1);
+ info->type = SCREEN_CAST_SOURCE_TYPE_MONITOR;
+ info->data.monitor = monitor;
+ g_ptr_array_add (streams, info);
+ }
+
+ 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);
+
+ info = g_new0 (ScreenCastStreamInfo, 1);
+ info->type = SCREEN_CAST_SOURCE_TYPE_WINDOW;
+ info->data.window = window;
+ g_ptr_array_add (streams, info);
+ }
+
+ return g_steal_pointer (&streams);
+}
diff --git a/src/screencastwidget.h b/src/screencastwidget.h
index 34360a3..ad95903 100644
--- a/src/screencastwidget.h
+++ b/src/screencastwidget.h
@@ -39,5 +39,4 @@ void screen_cast_widget_set_allow_multiple (ScreenCastWidget *widget,
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);
+GPtrArray *screen_cast_widget_get_selected_streams (ScreenCastWidget *self);