xdg-desktop-portal-gnome/0001-screencast-trivial-sty...

639 lines
24 KiB
Diff

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>