[gnome-software: 9/29] gs-shell: Drop internal mode state in favour of the GtkStack state




commit 5734083ed3bfe84852b961c1123ace58d9f06e06
Author: Philip Withnall <pwithnall endlessos org>
Date:   Thu Jan 21 00:02:57 2021 +0000

    gs-shell: Drop internal mode state in favour of the GtkStack state
    
    This is one less bit of state which can go out of sync. It was
    previously exactly mirroring the `visible-child-name` of `stack_main`.
    
    Signed-off-by: Philip Withnall <pwithnall endlessos org>

 src/gs-shell.c | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)
---
diff --git a/src/gs-shell.c b/src/gs-shell.c
index ecb35c401..bd995438a 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -61,7 +61,6 @@ typedef struct
        GSettings               *settings;
        GCancellable            *cancellable;
        GsPluginLoader          *plugin_loader;
-       GsShellMode              mode;
        GHashTable              *pages;
        GtkWidget               *header_start_widget;
        GtkWidget               *header_end_widget;
@@ -218,7 +217,7 @@ gs_shell_refresh_auto_updates_ui (GsShell *shell)
 #endif
 
        gtk_info_bar_set_revealed (metered_updates_bar,
-                                  priv->mode != GS_SHELL_MODE_LOADING &&
+                                  gs_shell_get_mode (shell) != GS_SHELL_MODE_LOADING &&
                                   automatic_updates_enabled &&
                                   automatic_updates_paused);
        gtk_info_bar_set_default_response (metered_updates_bar, GTK_RESPONSE_OK);
@@ -491,7 +490,6 @@ stack_notify_visible_child_cb (GObject    *object,
        /* do action for mode */
        page = GS_PAGE (g_hash_table_lookup (priv->pages, page_name[mode]));
 
-       priv->mode = mode;
        if (mode == GS_SHELL_MODE_OVERVIEW ||
            mode == GS_SHELL_MODE_INSTALLED ||
            mode == GS_SHELL_MODE_UPDATES)
@@ -600,14 +598,14 @@ save_back_entry (GsShell *shell)
        GsPage *page;
 
        entry = g_new0 (BackEntry, 1);
-       entry->mode = priv->mode;
+       entry->mode = gs_shell_get_mode (shell);
 
        entry->focus = gtk_window_get_focus (priv->main_window);
        if (entry->focus != NULL)
                g_object_add_weak_pointer (G_OBJECT (entry->focus),
                                           (gpointer *) &entry->focus);
 
-       switch (priv->mode) {
+       switch (entry->mode) {
        case GS_SHELL_MODE_CATEGORY:
                page = GS_PAGE (g_hash_table_lookup (priv->pages, "category"));
                entry->category = gs_category_page_get_category (GS_CATEGORY_PAGE (page));
@@ -815,7 +813,7 @@ initial_refresh_done (GsLoadingPage *loading_page, gpointer data)
 
        /* if the "loaded" signal handler didn't change the mode, kick off async
         * overview page refresh, and switch to the page once done */
-       if (priv->mode == GS_SHELL_MODE_LOADING) {
+       if (gs_shell_get_mode (shell) == GS_SHELL_MODE_LOADING) {
                GsPage *page;
 
                page = GS_PAGE (gtk_builder_get_object (priv->builder, "overview_page"));
@@ -883,10 +881,8 @@ search_changed_handler (GObject *entry, GsShell *shell)
 static void
 search_button_clicked_cb (GtkToggleButton *toggle_button, GsShell *shell)
 {
-       GsShellPrivate *priv = gs_shell_get_instance_private (shell);
-
        /* go back when exiting the search view */
-       if (priv->mode == GS_SHELL_MODE_SEARCH &&
+       if (gs_shell_get_mode (shell) == GS_SHELL_MODE_SEARCH &&
            !gtk_toggle_button_get_active (toggle_button))
                gs_shell_go_back (shell);
 }
@@ -1042,7 +1038,7 @@ gs_shell_allow_updates_notify_cb (GsPluginLoader *plugin_loader,
        GtkWidget *widget;
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_updates"));
        gtk_widget_set_visible (widget, gs_plugin_loader_get_allow_updates (plugin_loader) ||
-                                       priv->mode == GS_SHELL_MODE_UPDATES);
+                                       gs_shell_get_mode (shell) == GS_SHELL_MODE_UPDATES);
 }
 
 typedef enum {
@@ -2317,12 +2313,10 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
 void
 gs_shell_reset_state (GsShell *shell)
 {
-       GsShellPrivate *priv = gs_shell_get_instance_private (shell);
-
        /* reset to overview, unless we're in the loading state which advances
         * to overview on its own */
-       if (priv->mode != GS_SHELL_MODE_LOADING)
-               priv->mode = GS_SHELL_MODE_OVERVIEW;
+       if (gs_shell_get_mode (shell) != GS_SHELL_MODE_LOADING)
+               gs_shell_change_mode (shell, GS_SHELL_MODE_OVERVIEW, NULL, TRUE);
 
        gs_shell_clean_back_entry_stack (shell);
 }
@@ -2338,14 +2332,19 @@ gs_shell_get_mode (GsShell *shell)
 {
        GsShellPrivate *priv = gs_shell_get_instance_private (shell);
 
-       return priv->mode;
+       for (gsize i = 0; i < G_N_ELEMENTS (page_name); i++) {
+               if (g_strcmp0 (gtk_stack_get_visible_child_name (priv->stack_main), page_name[i]) == 0)
+                       return (GsShellMode) i;
+       }
+
+       g_assert_not_reached ();
 }
 
 const gchar *
 gs_shell_get_mode_string (GsShell *shell)
 {
        GsShellPrivate *priv = gs_shell_get_instance_private (shell);
-       return page_name[priv->mode];
+       return gtk_stack_get_visible_child_name (priv->stack_main);
 }
 
 void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]