Also fixes the upgrade path from f26 to rawhide. Original patch from Caolán McNamara for f26.
83 lines
2.9 KiB
Diff
83 lines
2.9 KiB
Diff
From 6480c7039bdf7e8f15f7d1415460db255910c40b Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Nelson=20Ben=C3=ADtez=20Le=C3=B3n?=
|
|
<nbenitezl+gnome@gmail.com>
|
|
Date: Sun, 28 May 2017 22:35:05 +0500
|
|
Subject: [PATCH] sidebar-thumbnails: fix clunky scrolling
|
|
|
|
Caused by GtkIconView doing an invalidate and relayout of *all*
|
|
items in the view anytime we update model data in any indiviual
|
|
item (which happens with all the items that are getting in and out
|
|
of the scrolling area while we scroll). This caused GtkIconView to
|
|
machine-gunned us with "size-allocate" signals, a signal we were
|
|
using to update thumbnails when the sidebar is resized.
|
|
|
|
Fixed by connecting to the GtkTreeModel "row-changed" signal before
|
|
GtkIconView does it, and stop emission from there.
|
|
|
|
As we don't depend now on "size-allocate" signals to show thumbnails
|
|
while we scroll, just queue a draw on the icon view when a
|
|
thumbnail finish rendering.
|
|
|
|
Thanks Jose Aliste for first spotting the problem.
|
|
|
|
https://bugzilla.gnome.org/show_bug.cgi?id=691448
|
|
---
|
|
shell/ev-sidebar-thumbnails.c | 24 ++++++++++++++++++++++++
|
|
1 file changed, 24 insertions(+)
|
|
|
|
diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c
|
|
index 253eabf..c22e92e 100644
|
|
--- a/shell/ev-sidebar-thumbnails.c
|
|
+++ b/shell/ev-sidebar-thumbnails.c
|
|
@@ -802,9 +802,26 @@ ev_sidebar_thumbnails_device_scale_factor_changed_cb (EvSidebarThumbnails *sideb
|
|
}
|
|
|
|
static void
|
|
+ev_sidebar_thumbnails_row_changed (GtkTreeModel *model,
|
|
+ GtkTreePath *path,
|
|
+ GtkTreeIter *iter,
|
|
+ gpointer data)
|
|
+{
|
|
+ guint signal_id;
|
|
+
|
|
+ signal_id = GPOINTER_TO_UINT (data);
|
|
+
|
|
+ /* PREVENT GtkIconView "row-changed" handler to be reached, as it will
|
|
+ * perform a full invalidate and relayout of all items, See bug:
|
|
+ * https://bugzilla.gnome.org/show_bug.cgi?id=691448#c9 */
|
|
+ g_signal_stop_emission (model, signal_id, 0);
|
|
+}
|
|
+
|
|
+static void
|
|
ev_sidebar_thumbnails_init (EvSidebarThumbnails *ev_sidebar_thumbnails)
|
|
{
|
|
EvSidebarThumbnailsPrivate *priv;
|
|
+ guint signal_id;
|
|
|
|
priv = ev_sidebar_thumbnails->priv = EV_SIDEBAR_THUMBNAILS_GET_PRIVATE (ev_sidebar_thumbnails);
|
|
|
|
@@ -814,6 +831,11 @@ ev_sidebar_thumbnails_init (EvSidebarThumbnails *ev_sidebar_thumbnails)
|
|
G_TYPE_BOOLEAN,
|
|
EV_TYPE_JOB_THUMBNAIL);
|
|
|
|
+ signal_id = g_signal_lookup ("row-changed", GTK_TYPE_TREE_MODEL);
|
|
+ g_signal_connect (GTK_TREE_MODEL (priv->list_store), "row-changed",
|
|
+ G_CALLBACK (ev_sidebar_thumbnails_row_changed),
|
|
+ GUINT_TO_POINTER (signal_id));
|
|
+
|
|
priv->swindow = gtk_scrolled_window_new (NULL, NULL);
|
|
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->swindow),
|
|
@@ -962,6 +984,8 @@ thumbnail_job_completed_callback (EvJobThumbnail *job,
|
|
COLUMN_JOB, NULL,
|
|
-1);
|
|
cairo_surface_destroy (surface);
|
|
+
|
|
+ gtk_widget_queue_draw (priv->icon_view);
|
|
}
|
|
|
|
static void
|
|
--
|
|
2.9.3
|
|
|