[eog: 1/2] EogThumbView: Use gtk_widget_queue_draw to display thumbnails faster




commit cba7fe58c4b1da49b1ed987f9299bd753bbfa11d
Author: Krifa75 <yahiaoui fakhri gmail com>
Date:   Fri Oct 16 18:08:40 2020 +0200

    EogThumbView: Use gtk_widget_queue_draw to display thumbnails faster
    
    Inspired by by a similar change in Evince this intercepts signals from
    the store to avoid too many time consuming relayouts of the GtkIconView.
    This noticeably reduces sluggishness when scrolling through very large
    collections of images.
    
    See !76.

 src/eog-list-store.c | 18 ++++++++++++++++++
 src/eog-list-store.h |  2 ++
 src/eog-thumb-view.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+)
---
diff --git a/src/eog-list-store.c b/src/eog-list-store.c
index a7112814..6cd74e01 100644
--- a/src/eog-list-store.c
+++ b/src/eog-list-store.c
@@ -39,6 +39,13 @@ struct _EogListStorePrivate {
 
 G_DEFINE_TYPE_WITH_PRIVATE (EogListStore, eog_list_store, GTK_TYPE_LIST_STORE);
 
+enum {
+       SIGNAL_DRAW_THUMBNAIL,
+       SIGNAL_LAST
+};
+
+static gint signals[SIGNAL_LAST];
+
 static void
 foreach_monitors_free (gpointer data, gpointer user_data)
 {
@@ -87,6 +94,15 @@ eog_list_store_class_init (EogListStoreClass *klass)
 
        object_class->dispose = eog_list_store_dispose;
        object_class->finalize = eog_list_store_finalize;
+
+       signals[SIGNAL_DRAW_THUMBNAIL] =
+               g_signal_new ("draw-thumbnail",
+                             EOG_TYPE_LIST_STORE,
+                             G_SIGNAL_RUN_LAST,
+                             G_STRUCT_OFFSET (EogListStoreClass, draw_thumbnail),
+                             NULL, NULL,
+                             g_cclosure_marshal_VOID__VOID,
+                             G_TYPE_NONE, 0);
 }
 
 /*
@@ -291,6 +307,8 @@ eog_job_thumbnail_cb (EogJobThumbnail *job, gpointer data)
        }
 
        g_object_unref (file);
+
+       g_signal_emit (store, signals[SIGNAL_DRAW_THUMBNAIL], 0);
 }
 
 static void
diff --git a/src/eog-list-store.h b/src/eog-list-store.h
index 77b41da9..06b5c638 100644
--- a/src/eog-list-store.h
+++ b/src/eog-list-store.h
@@ -64,6 +64,8 @@ struct _EogListStore {
 struct _EogListStoreClass {
         GtkListStoreClass parent_class;
 
+       void (* draw_thumbnail)            (EogListStore *store);
+
        /* Padding for future expansion */
        void (* _eog_reserved1) (void);
        void (* _eog_reserved2) (void);
diff --git a/src/eog-thumb-view.c b/src/eog-thumb-view.c
index 6493f17e..36a6bdf9 100644
--- a/src/eog-thumb-view.c
+++ b/src/eog-thumb-view.c
@@ -82,6 +82,7 @@ struct _EogThumbViewPrivate {
        gint n_images;
        gulong image_add_id;
        gulong image_removed_id;
+       gulong image_thumbnail_id;
 };
 
 G_DEFINE_TYPE_WITH_CODE (EogThumbView, eog_thumb_view, GTK_TYPE_ICON_VIEW,
@@ -176,6 +177,11 @@ eog_thumb_view_dispose (GObject *object)
                priv->image_removed_id = 0;
        }
 
+       if (model && priv->image_thumbnail_id) {
+               g_signal_handler_disconnect (model, priv->image_thumbnail_id);
+               priv->image_thumbnail_id = 0;
+       }
+
        G_OBJECT_CLASS (eog_thumb_view_parent_class)->dispose (object);
 }
 
@@ -640,6 +646,7 @@ eog_thumb_view_init (EogThumbView *thumbview)
        thumbview->priv->visible_range_changed_id = 0;
        thumbview->priv->image_add_id = 0;
        thumbview->priv->image_removed_id = 0;
+       thumbview->priv->image_thumbnail_id = 0;
 }
 
 /**
@@ -696,6 +703,29 @@ eog_thumb_view_row_deleted_cb (GtkTreeModel    *tree_model,
        eog_thumb_view_update_columns (view);
 }
 
+static void
+eog_thumb_view_row_changed_cb (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
+eog_thumb_view_draw_thumbnail_cb (EogListStore *store,
+                                 EogThumbView *view)
+{
+        gtk_widget_queue_draw (GTK_WIDGET(view));
+       return;
+}
+
 /**
  * eog_thumb_view_set_model:
  * @thumbview: A #EogThumbView.
@@ -729,8 +759,18 @@ eog_thumb_view_set_model (EogThumbView *thumbview, EogListStore *store)
                                                     priv->image_removed_id);
 
                }
+               if (priv->image_thumbnail_id != 0) {
+                       g_signal_handler_disconnect (existing,
+                                                    priv->image_thumbnail_id);
+
+               }
        }
 
+       guint signal_id = g_signal_lookup ("row-changed", GTK_TYPE_TREE_MODEL);
+       g_signal_connect (GTK_TREE_MODEL (store), "row-changed",
+                         G_CALLBACK (eog_thumb_view_row_changed_cb),
+                         GUINT_TO_POINTER (signal_id));
+
        priv->image_add_id = g_signal_connect (G_OBJECT (store), "row-inserted",
                                    G_CALLBACK (eog_thumb_view_row_inserted_cb),
                                    thumbview);
@@ -738,6 +778,10 @@ eog_thumb_view_set_model (EogThumbView *thumbview, EogListStore *store)
                                     "row-deleted",
                                     G_CALLBACK (eog_thumb_view_row_deleted_cb),
                                     thumbview);
+       priv->image_thumbnail_id = g_signal_connect (G_OBJECT (store),
+                                    "draw-thumbnail",
+                                    G_CALLBACK (eog_thumb_view_draw_thumbnail_cb),
+                                    thumbview);
 
        thumbview->priv->start_thumb = thumbview->priv->end_thumb = 0;
        thumbview->priv->n_images = eog_list_store_length (store);


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