[gnome-software] gs-app-row: Coalesce refresh operations where possible
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] gs-app-row: Coalesce refresh operations where possible
- Date: Tue, 16 Jun 2020 14:09:40 +0000 (UTC)
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]