Updating branch refs/heads/master to 803adcaa403278913e306a29b05fe40814dfa6c5 (commit) from 1e23b9a0675d4eaa2b75e7e7dadab293b456f7ac (commit)
commit 803adcaa403278913e306a29b05fe40814dfa6c5 Author: Nick Schermer <n...@xfce.org> Date: Mon Sep 24 19:51:28 2012 +0200 Regenerate thumbnails on file changes (bug #8473). Watch file changes in the model and if this occurs, poke the thumbnailer to regenerate the thumbnail. Also reduce the file-change emission a bit for cacse we don't respond to (thumbnailing wise). thunar/thunar-file.c | 6 ++- thunar/thunar-standard-view.c | 65 +++++++++++++++++++++++++++++++++++++++++ thunar/thunar-thumbnailer.c | 30 +++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) diff --git a/thunar/thunar-file.c b/thunar/thunar-file.c index c238d67..eb4406e 100644 --- a/thunar/thunar-file.c +++ b/thunar/thunar-file.c @@ -2831,8 +2831,10 @@ thunar_file_set_thumb_state (ThunarFile *file, file->flags = (file->flags & ~THUNAR_FILE_THUMB_STATE_MASK) | (state); /* notify others of this change, so that all components can update - * their file information */ - thunar_file_monitor_file_changed (file); + * their file information. loading is only a state for the thumbnailer, + * so don't emit changes for that */ + if (state != THUNAR_FILE_THUMB_STATE_LOADING) + thunar_file_monitor_file_changed (file); } diff --git a/thunar/thunar-standard-view.c b/thunar/thunar-standard-view.c index c60d508..2450dfe 100644 --- a/thunar/thunar-standard-view.c +++ b/thunar/thunar-standard-view.c @@ -252,6 +252,10 @@ static void thunar_standard_view_drag_end (Gtk static void thunar_standard_view_row_deleted (ThunarListModel *model, GtkTreePath *path, ThunarStandardView *standard_view); +static void thunar_standard_view_row_changed (ThunarListModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + ThunarStandardView *standard_view); static void thunar_standard_view_restore_selection (ThunarListModel *model, GtkTreePath *path, ThunarStandardView *standard_view); @@ -265,6 +269,9 @@ static gboolean thunar_standard_view_drag_scroll_timer (gpo static void thunar_standard_view_drag_scroll_timer_destroy (gpointer user_data); static gboolean thunar_standard_view_drag_timer (gpointer user_data); static void thunar_standard_view_drag_timer_destroy (gpointer user_data); +static void thunar_standard_view_finished_thumbnailing (ThunarThumbnailer *thumbnailer, + guint request, + ThunarStandardView *standard_view); static void thunar_standard_view_cancel_thumbnailing (ThunarStandardView *standard_view); static void thunar_standard_view_schedule_thumbnail_timeout (ThunarStandardView *standard_view); static void thunar_standard_view_schedule_thumbnail_idle (ThunarStandardView *standard_view); @@ -349,6 +356,9 @@ struct _ThunarStandardViewPrivate guint thumbnail_source_id; gboolean thumbnailing_scheduled; + /* file insert signal */ + gulong row_changed_id; + /* Tree path for restoring the selection after selecting and * deleting an item */ GtkTreePath *selection_before_delete; @@ -557,6 +567,7 @@ thunar_standard_view_init (ThunarStandardView *standard_view) /* create a thumbnailer */ standard_view->priv->thumbnailer = thunar_thumbnailer_new (); + g_signal_connect (G_OBJECT (standard_view->priv->thumbnailer), "request-finished", G_CALLBACK (thunar_standard_view_finished_thumbnailing), standard_view); standard_view->priv->thumbnailing_scheduled = FALSE; /* initialize the scrolled window */ @@ -602,6 +613,7 @@ thunar_standard_view_init (ThunarStandardView *standard_view) /* setup the list model */ standard_view->model = thunar_list_model_new (); g_signal_connect (G_OBJECT (standard_view->model), "row-deleted", G_CALLBACK (thunar_standard_view_row_deleted), standard_view); + standard_view->priv->row_changed_id = g_signal_connect (G_OBJECT (standard_view->model), "row-changed", G_CALLBACK (thunar_standard_view_row_changed), standard_view); g_signal_connect_after (G_OBJECT (standard_view->model), "row-deleted", G_CALLBACK (thunar_standard_view_restore_selection), standard_view); g_signal_connect (G_OBJECT (standard_view->model), "error", G_CALLBACK (thunar_standard_view_error), standard_view); exo_binding_new (G_OBJECT (standard_view->preferences), "misc-case-sensitive", G_OBJECT (standard_view->model), "case-sensitive"); @@ -1273,6 +1285,12 @@ thunar_standard_view_set_loading (ThunarStandardView *standard_view, /* apply the new state */ standard_view->loading = loading; + /* block or unblock the insert signal to avoid queuing thumbnail reloads */ + if (loading) + g_signal_handler_block (standard_view->model, standard_view->priv->row_changed_id); + else + g_signal_handler_unblock (standard_view->model, standard_view->priv->row_changed_id); + /* check if we're done loading and have a scheduled scroll_to_file */ if (G_UNLIKELY (!loading && standard_view->priv->scroll_to_file != NULL)) { @@ -3190,6 +3208,40 @@ thunar_standard_view_row_deleted (ThunarListModel *model, static void +thunar_standard_view_row_changed (ThunarListModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + ThunarStandardView *standard_view) +{ + ThunarFile *file; + gboolean show_thumbnails; + + _thunar_return_if_fail (THUNAR_IS_LIST_MODEL (model)); + _thunar_return_if_fail (path != NULL); + _thunar_return_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view)); + _thunar_return_if_fail (standard_view->model == model); + + if (standard_view->priv->thumbnail_request != 0) + return; + + g_object_get (standard_view->icon_factory, "show-thumbnails", &show_thumbnails, NULL); + if (!show_thumbnails) + return; + + /* queue a thumbnail request */ + file = thunar_list_model_get_file (standard_view->model, iter); + if (thunar_file_get_thumb_state (file) == THUNAR_FILE_THUMB_STATE_UNKNOWN) + { + thunar_standard_view_cancel_thumbnailing (standard_view); + thunar_thumbnailer_queue_file (standard_view->priv->thumbnailer, file, + &standard_view->priv->thumbnail_request); + } + g_object_unref (G_OBJECT (file)); +} + + + +static void thunar_standard_view_restore_selection (ThunarListModel *model, GtkTreePath *path, ThunarStandardView *standard_view) @@ -3385,6 +3437,19 @@ thunar_standard_view_drag_timer_destroy (gpointer user_data) static void +thunar_standard_view_finished_thumbnailing (ThunarThumbnailer *thumbnailer, + guint request, + ThunarStandardView *standard_view) +{ + _thunar_return_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view)); + + if (standard_view->priv->thumbnail_request == request) + standard_view->priv->thumbnail_request = 0; +} + + + +static void thunar_standard_view_cancel_thumbnailing (ThunarStandardView *standard_view) { _thunar_return_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view)); diff --git a/thunar/thunar-thumbnailer.c b/thunar/thunar-thumbnailer.c index 6248d9b..1b7cde9 100644 --- a/thunar/thunar-thumbnailer.c +++ b/thunar/thunar-thumbnailer.c @@ -89,6 +89,13 @@ typedef struct _ThunarThumbnailerJob ThunarThumbnailerJob; typedef struct _ThunarThumbnailerIdle ThunarThumbnailerIdle; #endif +/* Signal identifiers */ +enum +{ + REQUEST_FINISHED, + LAST_SIGNAL, +}; + static void thunar_thumbnailer_finalize (GObject *object); @@ -183,6 +190,10 @@ struct _ThunarThumbnailerIdle +static guint thumbnailer_signals[LAST_SIGNAL]; + + + G_DEFINE_TYPE (ThunarThumbnailer, thunar_thumbnailer, G_TYPE_OBJECT); @@ -194,6 +205,22 @@ thunar_thumbnailer_class_init (ThunarThumbnailerClass *klass) gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = thunar_thumbnailer_finalize; + + /** + * ThunarThumbnailer:request-finished: + * @thumbnailer : a #ThunarThumbnailer. + * @request : id of the request that is finished. + * + * Emitted by @thumbnailer, when a request is finished + * by the thumbnail generator + **/ + thumbnailer_signals[REQUEST_FINISHED] = + g_signal_new (I_("request-finished"), + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, 1, G_TYPE_UINT); } @@ -470,6 +497,9 @@ thunar_thumbnailer_thumbnailer_finished (DBusGProxy *proxy, /* this job is finished, forget about the handle */ job->handle = 0; + /* tell everybody we're done here */ + g_signal_emit (G_OBJECT (thumbnailer), thumbnailer_signals[REQUEST_FINISHED], 0, job->request); + /* remove job from the list */ g_mutex_lock (thumbnailer->lock); thumbnailer->jobs = g_slist_delete_link (thumbnailer->jobs, lp); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits