[evince/gnome-3-24] sidebar-thumbnails: fix clunky scrolling



commit 8b24be3b5606e9279d1fb50b908efd1e1ef12a7b
Author: Nelson Benítez León <nbenitezl+gnome gmail com>
Date:   Sun May 28 22:35:05 2017 +0500

    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 files changed, 24 insertions(+), 0 deletions(-)
---
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


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