Commit d046ca07 authored by Paolo Bacchilega's avatar Paolo Bacchilega
Browse files

update the thumbnail only if the file didn't change recently

do not update the file each time a file_changed signal is emitted
to avoid  excessive file reloads
parent 95f78732
......@@ -99,6 +99,7 @@ struct _GthFileListPrivateData
gboolean cancel;
gboolean dirty;
guint dirty_event;
guint restart_thumb_update;
GList *queue; /* list of GthFileListOp */
GtkCellRenderer *thumbnail_renderer;
GtkCellRenderer *text_renderer;
......@@ -162,6 +163,11 @@ _gth_file_list_clear_queue (GthFileList *file_list)
file_list->priv->dirty = FALSE;
}
if (file_list->priv->restart_thumb_update != 0) {
g_source_remove (file_list->priv->restart_thumb_update);
file_list->priv->restart_thumb_update = 0;
}
g_list_foreach (file_list->priv->queue, (GFunc) gth_file_list_op_free, NULL);
g_list_free (file_list->priv->queue);
file_list->priv->queue = NULL;
......@@ -1056,6 +1062,36 @@ update_thumbs_stopped (gpointer callback_data)
}
static gboolean
restart_thumb_update_cb (gpointer data)
{
GthFileList *file_list = data;
g_source_remove (file_list->priv->restart_thumb_update);
file_list->priv->restart_thumb_update = 0;
if (file_list->priv->queue == NULL)
_gth_file_list_update_next_thumb (file_list);
return FALSE;
}
static gboolean
can_create_file_thumbnail (GthFileData *file_data,
GTimeVal *current_time,
gboolean *young_file_found)
{
gboolean young_file;
young_file = (current_time->tv_sec - gth_file_data_get_mtime (file_data)) <= 1;
if (young_file)
*young_file_found = TRUE;
return ! file_data->error && ! young_file;
}
static void
_gth_file_list_update_next_thumb (GthFileList *file_list)
{
......@@ -1067,6 +1103,8 @@ _gth_file_list_update_next_thumb (GthFileList *file_list)
GthFileData *fd = NULL;
GList *list, *scan;
int new_pos = -1;
GTimeVal current_time;
gboolean young_file_found = FALSE;
if (file_list->priv->cancel || (file_list->priv->queue != NULL)) {
g_idle_add (update_thumbs_stopped, file_list);
......@@ -1098,9 +1136,11 @@ _gth_file_list_update_next_thumb (GthFileList *file_list)
/* Find a not loaded thumbnail among the visible images. */
g_get_current_time (&current_time);
while (pos <= last_pos) {
fd = scan->data;
if (! fd->thumb_loaded && ! fd->error) {
if (! fd->thumb_loaded && can_create_file_thumbnail (fd, &current_time, &young_file_found)) {
new_pos = pos;
break;
}
......@@ -1121,7 +1161,7 @@ _gth_file_list_update_next_thumb (GthFileList *file_list)
scan = g_list_nth (list, pos);
while (scan && ((pos - last_pos) <= N_LOOKAHEAD)) {
fd = scan->data;
if (! fd->thumb_created && ! fd->error) {
if (! fd->thumb_created && can_create_file_thumbnail (fd, &current_time, &young_file_found)) {
new_pos = pos;
break;
}
......@@ -1138,7 +1178,7 @@ _gth_file_list_update_next_thumb (GthFileList *file_list)
scan = g_list_nth (list, pos);
while (scan && ((first_pos - pos) <= N_LOOKAHEAD)) {
fd = scan->data;
if (! fd->thumb_created && ! fd->error) {
if (! fd->thumb_created && can_create_file_thumbnail (fd, &current_time, &young_file_found)) {
new_pos = pos;
break;
}
......@@ -1155,12 +1195,15 @@ _gth_file_list_update_next_thumb (GthFileList *file_list)
if (new_pos == -1) {
_gth_file_list_thumbs_completed (file_list);
if (young_file_found && (file_list->priv->restart_thumb_update == 0))
file_list->priv->restart_thumb_update = g_timeout_add (1500, restart_thumb_update_cb, file_list);
return;
}
/* We create thumbnail files for all images in the folder, but we only
load the visible ones (and N_LOOKAHEAD before and N_LOOKAHEAD after the visible range),
to minimize memory consumption in large folders. */
file_list->priv->update_thumb_in_view = (new_pos >= (first_pos - N_LOOKAHEAD)) &&
(new_pos <= (last_pos + N_LOOKAHEAD));
file_list->priv->thumb_pos = new_pos;
......
......@@ -76,7 +76,7 @@ void gth_file_list_set_sort_func (GthFileList *file_list,
gboolean inverse_sort);
void gth_file_list_enable_thumbs (GthFileList *file_list,
gboolean enable);
void gth_file_list_set_thumb_size (GthFileList *file_list,
void gth_file_list_set_thumb_size (GthFileList *file_list,
int size);
GtkWidget * gth_file_list_get_view (GthFileList *file_list);
int gth_file_list_first_file (GthFileList *file_list,
......
......@@ -34,7 +34,7 @@
#define GTH_MONITOR_N_EVENTS 3
#define MONITOR_UPDATE_DELAY 500
#define DEBUG_MONITOR 1
#undef DEBUG_MONITOR
struct _GthFileSourceVfsPrivate
{
......
......@@ -45,7 +45,7 @@
#define THUMBNAIL_LARGE_SIZE 256
#define THUMBNAIL_NORMAL_SIZE 128
#define THUMBNAIL_DIR_PERMISSIONS 0700
#define KILL_THUMBNAILER_DELAY 3000
#define MAX_THUMBNAILER_LIFETIME 2000 /* kill the thumbnailer after this amount of time*/
struct _GthThumbLoaderPrivateData
{
......@@ -468,7 +468,7 @@ image_loader_ready_cb (GthImageLoader *iloader,
tloader->priv->thumbnailer_watch = g_child_watch_add (tloader->priv->thumbnailer_pid,
watch_thumbnailer_cb,
tloader);
tloader->priv->thumbnailer_timeout = g_timeout_add (KILL_THUMBNAILER_DELAY,
tloader->priv->thumbnailer_timeout = g_timeout_add (MAX_THUMBNAILER_LIFETIME,
kill_thumbnailer_cb,
tloader);
}
......@@ -671,34 +671,16 @@ gth_thumb_loader_load__step2 (GthThumbLoader *tloader)
g_return_if_fail (tloader != NULL);
/*if ((tloader->priv->file == NULL) || ! gth_file_data_is_readable (tloader->priv->file)) {
g_signal_emit (G_OBJECT (tloader),
gth_thumb_loader_signals[READY],
0,
g_error_new_literal (GTHUMB_ERROR, 0, "cannot read the file"));
return;
}*/
if (tloader->priv->use_cache) {
char *uri;
time_t mtime;
uri = g_file_get_uri (tloader->priv->file->file);
mtime = gth_file_data_get_mtime (tloader->priv->file);
cache_path = gnome_desktop_thumbnail_factory_lookup (tloader->priv->thumb_factory, uri, mtime);
/*debug (DEBUG_INFO, "thumbnail for %s: %s\n", uri, cache_path); FIXME: delete when done */
if ((cache_path == NULL)
&& gnome_desktop_thumbnail_factory_has_valid_failed_thumbnail (tloader->priv->thumb_factory, uri, mtime)
&& ((time (NULL) - mtime) > (time_t) 5))
&& gnome_desktop_thumbnail_factory_has_valid_failed_thumbnail (tloader->priv->thumb_factory, uri, mtime))
{
/* Use the existing "failed" thumbnail, if it is over
5 seconds old. Otherwise, try to thumbnail it again.
The minimum age requirement addresses bug 432759,
which occurs when a device like a scanner saves a file
slowly in chunks. */
g_signal_emit (G_OBJECT (tloader),
gth_thumb_loader_signals[READY],
0,
......
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