Commit 6480c703 authored by Nelson Benítez León's avatar Nelson Benítez León

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
parent 6a6f3974
......@@ -801,10 +801,27 @@ ev_sidebar_thumbnails_device_scale_factor_changed_cb (EvSidebarThumbnails *sideb
ev_sidebar_thumbnails_reload (sidebar_thumbnails);
}
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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment