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