[gnome-software] gs-category-page: Block signal emission while reloading



commit 4e42df8318b98b3fd27c1a9f392b4dd150a011fe
Author: Philip Withnall <withnall endlessm com>
Date:   Wed Apr 1 13:59:44 2020 +0100

    gs-category-page: Block signal emission while reloading
    
    Rather than disconnecting and reconnecting, which is more work and could
    lead to signal handler leaks if, for example,
    `gs_category_page_get_apps_cb()` returns early due to error.
    
    Signed-off-by: Philip Withnall <withnall endlessm com>

 src/gs-category-page.c | 44 +++++++++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 19 deletions(-)
---
diff --git a/src/gs-category-page.c b/src/gs-category-page.c
index 10467436..dec34328 100644
--- a/src/gs-category-page.c
+++ b/src/gs-category-page.c
@@ -157,14 +157,8 @@ gs_category_page_get_apps_cb (GObject *source_object,
                gtk_widget_set_can_focus (gtk_widget_get_parent (tile), FALSE);
        }
 
-       self->sort_rating_handler_id = g_signal_connect (self->sort_rating_button,
-                                                        "clicked",
-                                                        G_CALLBACK (sort_button_clicked),
-                                                        self);
-       self->sort_name_handler_id = g_signal_connect (self->sort_name_button,
-                                                      "clicked",
-                                                      G_CALLBACK (sort_button_clicked),
-                                                      self);
+       g_signal_handler_unblock (self->sort_rating_button, self->sort_rating_handler_id);
+       g_signal_handler_unblock (self->sort_name_button, self->sort_name_handler_id);
 }
 
 static gboolean
@@ -321,17 +315,8 @@ gs_category_page_reload (GsPage *page)
                gtk_widget_set_visible (self->subcats_sort_button, TRUE);
        }
 
-       if (self->sort_rating_handler_id > 0) {
-               g_signal_handler_disconnect (self->sort_rating_button,
-                                            self->sort_rating_handler_id);
-               self->sort_rating_handler_id = 0;
-       }
-
-       if (self->sort_name_handler_id > 0) {
-               g_signal_handler_disconnect (self->sort_name_button,
-                                            self->sort_name_handler_id);
-               self->sort_name_handler_id = 0;
-       }
+       g_signal_handler_block (self->sort_rating_button, self->sort_rating_handler_id);
+       g_signal_handler_block (self->sort_name_button, self->sort_name_handler_id);
 
        gs_container_remove_all (GTK_CONTAINER (self->category_detail_box));
 
@@ -516,6 +501,18 @@ gs_category_page_dispose (GObject *object)
        g_cancellable_cancel (self->cancellable);
        g_clear_object (&self->cancellable);
 
+       if (self->sort_rating_handler_id > 0) {
+               g_signal_handler_disconnect (self->sort_rating_button,
+                                            self->sort_rating_handler_id);
+               self->sort_rating_handler_id = 0;
+       }
+
+       if (self->sort_name_handler_id > 0) {
+               g_signal_handler_disconnect (self->sort_name_button,
+                                            self->sort_name_handler_id);
+               self->sort_name_handler_id = 0;
+       }
+
        g_clear_object (&self->builder);
        g_clear_object (&self->category);
        g_clear_object (&self->subcategory);
@@ -543,6 +540,15 @@ gs_category_page_setup (GsPage *page,
                                    gs_category_page_sort_flow_box_sort_func,
                                    self, NULL);
 
+       self->sort_rating_handler_id = g_signal_connect (self->sort_rating_button,
+                                                        "clicked",
+                                                        G_CALLBACK (sort_button_clicked),
+                                                        self);
+       self->sort_name_handler_id = g_signal_connect (self->sort_name_button,
+                                                      "clicked",
+                                                      G_CALLBACK (sort_button_clicked),
+                                                      self);
+
        adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (self->scrolledwindow_category));
        gtk_container_set_focus_vadjustment (GTK_CONTAINER (self->category_detail_box), adj);
        return TRUE;


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