[gnome-software] gs-app-row: Coalesce refresh operations where possible



commit 4a12e80565351793e6c615770ee8abc38e9d032c
Author: Philip Withnall <withnall endlessm com>
Date:   Mon Jun 15 17:49:17 2020 +0100

    gs-app-row: Coalesce refresh operations where possible
    
    Instead of rebuilding the entire widget state every time something
    changes, schedule a refresh to happen in an idle callback. This allows
    refreshes to be coalesced, which reduces the number of refreshes
    happening overall. Previously, for example, `gs_app_row_refresh()` was
    being called 3 times as part of constructing and setting up a new
    `GsAppRow` in `GsInstalledPage`.
    
    This speeds up populating the `GsInstalledPage`.
    
    `gs_app_row_refresh()` has been removed as a public symbol for
    `GsAppRow` since refreshes should be managed internally to the widget.
    It was unused elsewhere.
    
    This, in conjunction with the previous commit, decreases the time for
    `gs_installed_page_get_installed_cb()` from 500ms to 300ms (for 114
    apps), and spreads out the cost of setting up the widgets for each app
    row over one or more subsequent main context iterations, which reduces
    freezing of the UI.
    
    Signed-off-by: Philip Withnall <withnall endlessm com>

 src/gs-app-row.c | 34 +++++++++++++++++++++-------------
 src/gs-app-row.h |  1 -
 2 files changed, 21 insertions(+), 14 deletions(-)
---
diff --git a/src/gs-app-row.c b/src/gs-app-row.c
index b281a3d0..47597c4c 100644
--- a/src/gs-app-row.c
+++ b/src/gs-app-row.c
@@ -236,8 +236,8 @@ gs_app_row_refresh_button (GsAppRow *app_row, gboolean missing_search_result)
        }
 }
 
-void
-gs_app_row_refresh (GsAppRow *app_row)
+static void
+gs_app_row_actually_refresh (GsAppRow *app_row)
 {
        GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row);
        GtkStyleContext *context;
@@ -508,21 +508,29 @@ gs_app_row_refresh_idle_cb (gpointer user_data)
        GsAppRow *app_row = GS_APP_ROW (user_data);
        GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row);
        priv->pending_refresh_id = 0;
-       gs_app_row_refresh (app_row);
-       return FALSE;
+       gs_app_row_actually_refresh (app_row);
+       return G_SOURCE_REMOVE;
 }
 
+/* Schedule an idle call to gs_app_row_actually_refresh() unless one’s already pending. */
 static void
-gs_app_row_notify_props_changed_cb (GsApp *app,
-                                   GParamSpec *pspec,
-                                   GsAppRow *app_row)
+gs_app_row_schedule_refresh (GsAppRow *app_row)
 {
        GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row);
+
        if (priv->pending_refresh_id > 0)
                return;
        priv->pending_refresh_id = g_idle_add (gs_app_row_refresh_idle_cb, app_row);
 }
 
+static void
+gs_app_row_notify_props_changed_cb (GsApp *app,
+                                   GParamSpec *pspec,
+                                   GsAppRow *app_row)
+{
+       gs_app_row_schedule_refresh (app_row);
+}
+
 static void
 gs_app_row_set_app (GsAppRow *app_row, GsApp *app)
 {
@@ -545,7 +553,7 @@ gs_app_row_set_app (GsAppRow *app_row, GsApp *app)
 
        g_object_notify (G_OBJECT (app_row), "app");
 
-       gs_app_row_refresh (app_row);
+       gs_app_row_schedule_refresh (app_row);
 }
 
 static void
@@ -750,7 +758,7 @@ gs_app_row_set_colorful (GsAppRow *app_row, gboolean colorful)
        GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row);
 
        priv->colorful = colorful;
-       gs_app_row_refresh (app_row);
+       gs_app_row_schedule_refresh (app_row);
 }
 
 void
@@ -760,7 +768,7 @@ gs_app_row_set_show_buttons (GsAppRow *app_row, gboolean show_buttons)
 
        priv->show_buttons = show_buttons;
        g_object_notify (G_OBJECT (app_row), "show-buttons");
-       gs_app_row_refresh (app_row);
+       gs_app_row_schedule_refresh (app_row);
 }
 
 void
@@ -769,7 +777,7 @@ gs_app_row_set_show_rating (GsAppRow *app_row, gboolean show_rating)
        GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row);
 
        priv->show_rating = show_rating;
-       gs_app_row_refresh (app_row);
+       gs_app_row_schedule_refresh (app_row);
 }
 
 void
@@ -779,7 +787,7 @@ gs_app_row_set_show_source (GsAppRow *app_row, gboolean show_source)
 
        priv->show_source = show_source;
        g_object_notify (G_OBJECT (app_row), "show-source");
-       gs_app_row_refresh (app_row);
+       gs_app_row_schedule_refresh (app_row);
 }
 
 void
@@ -788,7 +796,7 @@ gs_app_row_set_show_installed_size (GsAppRow *app_row, gboolean show_size)
        GsAppRowPrivate *priv = gs_app_row_get_instance_private (app_row);
        priv->show_installed_size = show_size;
        g_object_notify (G_OBJECT (app_row), "show-installed-size");
-       gs_app_row_refresh (app_row);
+       gs_app_row_schedule_refresh (app_row);
 }
 
 /**
diff --git a/src/gs-app-row.h b/src/gs-app-row.h
index e7156824..f0e11c88 100644
--- a/src/gs-app-row.h
+++ b/src/gs-app-row.h
@@ -26,7 +26,6 @@ struct _GsAppRowClass
 };
 
 GtkWidget      *gs_app_row_new                         (GsApp          *app);
-void            gs_app_row_refresh                     (GsAppRow       *app_row);
 void            gs_app_row_unreveal                    (GsAppRow       *app_row);
 void            gs_app_row_set_colorful                (GsAppRow       *app_row,
                                                         gboolean        colorful);


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