diff --git a/panels/multitasking/cc-multitasking-panel.blp b/panels/multitasking/cc-multitasking-panel.blp index 1e0452c34ccdbe407619079a97ada6c60ede246f..2564ac35bc7871eb86c5b9cb02582d65d049de32 100644 --- a/panels/multitasking/cc-multitasking-panel.blp +++ b/panels/multitasking/cc-multitasking-panel.blp @@ -8,7 +8,8 @@ template $CcMultitaskingPanel: $CcPanel { content: Adw.PreferencesPage { Adw.PreferencesGroup { - title: _("General"); + title: _("Screen Edges"); + separate-rows: true; $CcIllustratedRow hot_corner_row { activatable-widget: hot_corner_switch; @@ -24,7 +25,7 @@ template $CcMultitaskingPanel: $CcPanel { $CcIllustratedRow active_screen_edges_row { activatable-widget: active_screen_edges_switch; - title: _("_Active Screen Edges"); + title: _("_Window Resize"); subtitle: _("Drag windows against the top, left, and right screen edges to resize them"); use-underline: true; resource: "/org/gnome/control-center/multitasking/assets/active-screen-edges.svg"; @@ -35,6 +36,16 @@ template $CcMultitaskingPanel: $CcPanel { } } + Adw.PreferencesGroup system_group { + title: _("System"); + visible: false; + + Adw.SwitchRow save_restore_row { + title: _("Reopen Windows After Login"); + subtitle: _("Restore windows that were open when you last used the computer"); + } + } + Adw.PreferencesGroup { title: _("Workspaces"); diff --git a/panels/multitasking/cc-multitasking-panel.c b/panels/multitasking/cc-multitasking-panel.c index 58fa78fb2def2a28ff344d1fda1008de3b9f164e..372f46393875fd691dbafe365c406bb9cdbc25d7 100644 --- a/panels/multitasking/cc-multitasking-panel.c +++ b/panels/multitasking/cc-multitasking-panel.c @@ -30,6 +30,7 @@ struct _CcMultitaskingPanel GSettings *interface_settings; GSettings *mutter_settings; + GSettings *session_settings; GSettings *shell_settings; GSettings *wm_settings; @@ -42,6 +43,8 @@ struct _CcMultitaskingPanel CcIllustratedRow *hot_corner_row; GtkSwitch *hot_corner_switch; AdwSpinRow *number_of_workspaces_spin_row; + AdwSwitchRow *save_restore_row; + AdwPreferencesGroup *system_group; AdwPreferencesGroup *workspaces_display_group; GtkCheckButton *workspaces_primary_display_radio; GtkCheckButton *workspaces_span_displays_radio; @@ -61,6 +64,57 @@ fixed_workspaces_changed_cb (CcMultitaskingPanel *self) multi_workspaces || !fixed_workspaces); } +static void +query_supports_restore_cb (GObject *source_object, + GAsyncResult *result, + gpointer data) +{ + CcMultitaskingPanel *self = CC_MULTITASKING_PANEL (data); + g_autoptr(GVariant) value = NULL; + g_autoptr(GError) error = NULL; + gboolean supported; + + value = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), + result, &error); + if (value == NULL) + { + g_warning ("Failed to determine if save/restore is supported: %s", + error->message); + supported = FALSE; + } + else + { + g_autoptr(GVariant) unwrapped = NULL; + g_variant_get (value, "(v)", &unwrapped); + supported = g_variant_get_boolean (unwrapped); + } + + gtk_widget_set_visible (GTK_WIDGET (self->save_restore_row), supported); + gtk_widget_set_visible (GTK_WIDGET (self->system_group), supported); +} + +static void +check_session_supports_save_restore (CcMultitaskingPanel *self) +{ + g_autoptr(GDBusConnection) bus = NULL; + + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + g_dbus_connection_call (bus, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.freedesktop.DBus.Properties", + "Get", + g_variant_new ("(ss)", + "org.gnome.SessionManager", + "RestoreSupported"), + G_VARIANT_TYPE ("(v)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + cc_panel_get_cancellable (CC_PANEL (self)), + query_supports_restore_cb, + self); +} + /* GObject overrides */ static void @@ -70,6 +124,7 @@ cc_multitasking_panel_finalize (GObject *object) g_clear_object (&self->interface_settings); g_clear_object (&self->mutter_settings); + g_clear_object (&self->session_settings); g_clear_object (&self->shell_settings); g_clear_object (&self->wm_settings); @@ -97,6 +152,8 @@ cc_multitasking_panel_class_init (CcMultitaskingPanelClass *klass) gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, hot_corner_row); gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, hot_corner_switch); gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, number_of_workspaces_spin_row); + gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, save_restore_row); + gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, system_group); gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, workspaces_display_group); gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, workspaces_primary_display_radio); gtk_widget_class_bind_template_child (widget_class, CcMultitaskingPanel, workspaces_span_displays_radio); @@ -167,6 +224,14 @@ cc_multitasking_panel_init (CcMultitaskingPanel *self) "active", G_SETTINGS_BIND_DEFAULT); + self->session_settings = g_settings_new ("org.gnome.desktop.session"); + g_settings_bind (self->session_settings, + "save-restore", + self->save_restore_row, + "active", + G_SETTINGS_BIND_DEFAULT); + check_session_supports_save_restore (self); + if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL) { cc_illustrated_row_set_resource (self->hot_corner_row,