[gnome-software] shell: Avoid hiding and immediately reshowing the back button



commit 910a52a4155baf6ea1ab5b50efe50af38fcddcd6
Author: Kalev Lember <kalevlember gmail com>
Date:   Thu Jul 31 17:09:56 2014 +0200

    shell: Avoid hiding and immediately reshowing the back button
    
    Otherwise gtk+ gets confused and requires an enter/leave event to make
    the button work again.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=733728

 src/gs-shell-category.c |    2 --
 src/gs-shell-details.c  |    2 --
 src/gs-shell.c          |   23 ++++++++++++++++++++---
 3 files changed, 20 insertions(+), 7 deletions(-)
---
diff --git a/src/gs-shell-category.c b/src/gs-shell-category.c
index 6363320..6f4fd28 100644
--- a/src/gs-shell-category.c
+++ b/src/gs-shell-category.c
@@ -54,8 +54,6 @@ gs_shell_category_refresh (GsShellCategory *shell)
        GtkWidget *widget;
        GsCategory *category;
 
-       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_back"));
-       gtk_widget_show (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "application_details_header"));
        gtk_widget_show (widget);
        category = priv->category;
diff --git a/src/gs-shell-details.c b/src/gs-shell-details.c
index f70e0a2..2db1cd6 100644
--- a/src/gs-shell-details.c
+++ b/src/gs-shell-details.c
@@ -152,8 +152,6 @@ gs_shell_details_refresh (GsShellDetails *shell_details)
 
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "application_details_header"));
        gtk_widget_show (widget);
-       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_back"));
-       gtk_widget_show (widget);
 
        kind = gs_app_get_kind (priv->app);
        state = gs_app_get_state (priv->app);
diff --git a/src/gs-shell.c b/src/gs-shell.c
index 9d72bff..f629697 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -151,8 +151,6 @@ gs_shell_change_mode (GsShell *shell,
        gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "application_details_header"));
        gtk_widget_hide (widget);
-       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_back"));
-       gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "buttonbox_main"));
        gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "header_selection_menu_button"));
@@ -166,6 +164,10 @@ gs_shell_change_mode (GsShell *shell,
        /* TRANSLATORS: this is the main window title */
        gtk_window_set_title (priv->main_window, _("Software"));
 
+       /* show the back button if needed */
+       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_back"));
+       gtk_widget_set_visible (widget, !g_queue_is_empty (priv->back_entry_stack));
+
        /* update main buttons according to mode */
        priv->ignore_primary_buttons = TRUE;
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "button_all"));
@@ -454,6 +456,21 @@ window_key_press_event (GtkWidget *win, GdkEventKey *event, GsShell *shell)
        return GDK_EVENT_PROPAGATE;
 }
 
+static gboolean
+main_window_closed_cb (GtkWidget *dialog, GdkEvent *event, gpointer user_data)
+{
+       GsShell *shell = user_data;
+       GsShellPrivate *priv = shell->priv;
+       BackEntry *entry;
+
+       while ((entry = g_queue_pop_head (priv->back_entry_stack)) != NULL) {
+               free_back_entry (entry);
+       }
+
+       gtk_widget_hide (dialog);
+       return TRUE;
+}
+
 /**
  * gs_shell_setup:
  */
@@ -477,7 +494,7 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
                                           GS_DATA G_DIR_SEPARATOR_S "icons");
 
        g_signal_connect (priv->main_window, "delete-event",
-                         G_CALLBACK (gtk_widget_hide_on_delete), NULL);
+                         G_CALLBACK (main_window_closed_cb), shell);
 
        /* fix up the header bar */
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "header"));


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