diff --git a/src/eog-list-store.c b/src/eog-list-store.c index a71128145673e00e1fb119399d39fb1987999bdd..6cd74e01b9ed6cb1bafad825a2a84489c1ce7008 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 77b41da9735ba70653908f32f6d3e1ba0f6d4a0b..06b5c638e11924ecce836df00e146a6eb4921af5 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 6493f17e28184d29bbbac56f1676a6100cdd645f..36a6bdf901a601251006f357a99d20fc39491ead 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);