From 52d960542b4d5fdf2bd06735d0dbf7934cf2ec12 Mon Sep 17 00:00:00 2001 From: Carlos Soriano Date: Mon, 29 Aug 2016 18:24:05 +0200 Subject: general: run uncrustify And make the style of Nautilus the same for all files. Hopefully we can fix all the style issues we can find in the next days, so expect a little of movement on this. https://bugzilla.gnome.org/show_bug.cgi?id=770564 --- src/nautilus-thumbnails.c | 760 ++++++++++++++++++++++++---------------------- 1 file changed, 395 insertions(+), 365 deletions(-) (limited to 'src/nautilus-thumbnails.c') diff --git a/src/nautilus-thumbnails.c b/src/nautilus-thumbnails.c index 5295df47e..040faeb5b 100644 --- a/src/nautilus-thumbnails.c +++ b/src/nautilus-thumbnails.c @@ -1,24 +1,24 @@ /* - nautilus-thumbnails.h: Thumbnail code for icon factory. - - Copyright (C) 2000, 2001 Eazel, Inc. - Copyright (C) 2002, 2003 Red Hat, Inc. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public - License along with this program; if not, see . - - Author: Andy Hertzfeld -*/ + * nautilus-thumbnails.h: Thumbnail code for icon factory. + * + * Copyright (C) 2000, 2001 Eazel, Inc. + * Copyright (C) 2002, 2003 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, see . + * + * Author: Andy Hertzfeld + */ #include #include "nautilus-thumbnails.h" @@ -62,10 +62,11 @@ static void thumbnail_thread_func (GTask *task, /* structure used for making thumbnails, associating a uri with where the thumbnail is to be stored */ -typedef struct { - char *image_uri; - char *mime_type; - time_t original_file_mtime; +typedef struct +{ + char *image_uri; + char *mime_type; + time_t original_file_mtime; } NautilusThumbnailInfo; /* @@ -73,20 +74,20 @@ typedef struct { */ /* The id of the idle handler used to start the thumbnail thread, or 0 if no - idle handler is currently registered. */ + * idle handler is currently registered. */ static guint thumbnail_thread_starter_id = 0; /* Our mutex used when accessing data shared between the main thread and the - thumbnail thread, i.e. the thumbnail_thread_is_running flag and the - thumbnails_to_make list. */ + * thumbnail thread, i.e. the thumbnail_thread_is_running flag and the + * thumbnails_to_make list. */ static GMutex thumbnails_mutex; /* A flag to indicate whether a thumbnail thread is running, so we don't - start more than one. Lock thumbnails_mutex when accessing this. */ + * start more than one. Lock thumbnails_mutex when accessing this. */ static volatile gboolean thumbnail_thread_is_running = FALSE; /* The list of NautilusThumbnailInfo structs containing information about the - thumbnails we are making. Lock thumbnails_mutex when accessing this. */ + * thumbnails we are making. Lock thumbnails_mutex when accessing this. */ static volatile GQueue thumbnails_to_make = G_QUEUE_INIT; /* Quickly check if uri is in thumbnails_to_make list */ @@ -99,350 +100,372 @@ static NautilusThumbnailInfo *currently_thumbnailing = NULL; static GnomeDesktopThumbnailFactory *thumbnail_factory = NULL; static gboolean -get_file_mtime (const char *file_uri, time_t* mtime) +get_file_mtime (const char *file_uri, + time_t *mtime) { - GFile *file; - GFileInfo *info; - gboolean ret; - - ret = FALSE; - *mtime = INVALID_MTIME; - - file = g_file_new_for_uri (file_uri); - info = g_file_query_info (file, G_FILE_ATTRIBUTE_TIME_MODIFIED, 0, NULL, NULL); - if (info) { - if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED)) { - *mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); - ret = TRUE; - } - - g_object_unref (info); - } - g_object_unref (file); - - return ret; + GFile *file; + GFileInfo *info; + gboolean ret; + + ret = FALSE; + *mtime = INVALID_MTIME; + + file = g_file_new_for_uri (file_uri); + info = g_file_query_info (file, G_FILE_ATTRIBUTE_TIME_MODIFIED, 0, NULL, NULL); + if (info) + { + if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED)) + { + *mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); + ret = TRUE; + } + + g_object_unref (info); + } + g_object_unref (file); + + return ret; } static void free_thumbnail_info (NautilusThumbnailInfo *info) { - g_free (info->image_uri); - g_free (info->mime_type); - g_free (info); + g_free (info->image_uri); + g_free (info->mime_type); + g_free (info); } static GnomeDesktopThumbnailFactory * get_thumbnail_factory (void) { - static GnomeDesktopThumbnailFactory *thumbnail_factory = NULL; + static GnomeDesktopThumbnailFactory *thumbnail_factory = NULL; - if (thumbnail_factory == NULL) { - thumbnail_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE); - } + if (thumbnail_factory == NULL) + { + thumbnail_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE); + } - return thumbnail_factory; + return thumbnail_factory; } /* This function is added as a very low priority idle function to start the - thread to create any needed thumbnails. It is added with a very low priority - so that it doesn't delay showing the directory in the icon/list views. - We want to show the files in the directory as quickly as possible. */ + * thread to create any needed thumbnails. It is added with a very low priority + * so that it doesn't delay showing the directory in the icon/list views. + * We want to show the files in the directory as quickly as possible. */ static gboolean thumbnail_thread_starter_cb (gpointer data) { - GTask *task; + GTask *task; - /* Don't do this in thread, since g_object_ref is not threadsafe */ - if (thumbnail_factory == NULL) { - thumbnail_factory = get_thumbnail_factory (); - } + /* Don't do this in thread, since g_object_ref is not threadsafe */ + if (thumbnail_factory == NULL) + { + thumbnail_factory = get_thumbnail_factory (); + } #ifdef DEBUG_THUMBNAILS - g_message ("(Main Thread) Creating thumbnails thread\n"); + g_message ("(Main Thread) Creating thumbnails thread\n"); #endif - /* We set a flag to indicate the thread is running, so we don't create - a new one. We don't need to lock a mutex here, as the thumbnail - thread isn't running yet. And we know we won't create the thread - twice, as we also check thumbnail_thread_starter_id before - scheduling this idle function. */ - thumbnail_thread_is_running = TRUE; - task = g_task_new (NULL, NULL, NULL, NULL); - g_task_run_in_thread (task, thumbnail_thread_func); - thumbnail_thread_starter_id = 0; - - g_object_unref (task); - - return FALSE; + /* We set a flag to indicate the thread is running, so we don't create + * a new one. We don't need to lock a mutex here, as the thumbnail + * thread isn't running yet. And we know we won't create the thread + * twice, as we also check thumbnail_thread_starter_id before + * scheduling this idle function. */ + thumbnail_thread_is_running = TRUE; + task = g_task_new (NULL, NULL, NULL, NULL); + g_task_run_in_thread (task, thumbnail_thread_func); + thumbnail_thread_starter_id = 0; + + g_object_unref (task); + + return FALSE; } void nautilus_thumbnail_remove_from_queue (const char *file_uri) { - GList *node; - + GList *node; + #ifdef DEBUG_THUMBNAILS - g_message ("(Remove from queue) Locking mutex\n"); + g_message ("(Remove from queue) Locking mutex\n"); #endif - g_mutex_lock (&thumbnails_mutex); - - /********************************* - * MUTEX LOCKED - *********************************/ - - if (thumbnails_to_make_hash) { - node = g_hash_table_lookup (thumbnails_to_make_hash, file_uri); - - if (node && node->data != currently_thumbnailing) { - g_hash_table_remove (thumbnails_to_make_hash, file_uri); - free_thumbnail_info (node->data); - g_queue_delete_link ((GQueue *)&thumbnails_to_make, node); - } - } - - /********************************* - * MUTEX UNLOCKED - *********************************/ - + g_mutex_lock (&thumbnails_mutex); + + /********************************* + * MUTEX LOCKED + *********************************/ + + if (thumbnails_to_make_hash) + { + node = g_hash_table_lookup (thumbnails_to_make_hash, file_uri); + + if (node && node->data != currently_thumbnailing) + { + g_hash_table_remove (thumbnails_to_make_hash, file_uri); + free_thumbnail_info (node->data); + g_queue_delete_link ((GQueue *) &thumbnails_to_make, node); + } + } + + /********************************* + * MUTEX UNLOCKED + *********************************/ + #ifdef DEBUG_THUMBNAILS - g_message ("(Remove from queue) Unlocking mutex\n"); + g_message ("(Remove from queue) Unlocking mutex\n"); #endif - g_mutex_unlock (&thumbnails_mutex); + g_mutex_unlock (&thumbnails_mutex); } void nautilus_thumbnail_prioritize (const char *file_uri) { - GList *node; + GList *node; #ifdef DEBUG_THUMBNAILS - g_message ("(Prioritize) Locking mutex\n"); + g_message ("(Prioritize) Locking mutex\n"); #endif - g_mutex_lock (&thumbnails_mutex); - - /********************************* - * MUTEX LOCKED - *********************************/ - - if (thumbnails_to_make_hash) { - node = g_hash_table_lookup (thumbnails_to_make_hash, file_uri); - - if (node && node->data != currently_thumbnailing) { - g_queue_unlink ((GQueue *)&thumbnails_to_make, node); - g_queue_push_head_link ((GQueue *)&thumbnails_to_make, node); - } - } - - /********************************* - * MUTEX UNLOCKED - *********************************/ - + g_mutex_lock (&thumbnails_mutex); + + /********************************* + * MUTEX LOCKED + *********************************/ + + if (thumbnails_to_make_hash) + { + node = g_hash_table_lookup (thumbnails_to_make_hash, file_uri); + + if (node && node->data != currently_thumbnailing) + { + g_queue_unlink ((GQueue *) &thumbnails_to_make, node); + g_queue_push_head_link ((GQueue *) &thumbnails_to_make, node); + } + } + + /********************************* + * MUTEX UNLOCKED + *********************************/ + #ifdef DEBUG_THUMBNAILS - g_message ("(Prioritize) Unlocking mutex\n"); + g_message ("(Prioritize) Unlocking mutex\n"); #endif - g_mutex_unlock (&thumbnails_mutex); + g_mutex_unlock (&thumbnails_mutex); } /*************************************************************************** - * Thumbnail Thread Functions. - ***************************************************************************/ +* Thumbnail Thread Functions. +***************************************************************************/ /* This is a one-shot idle callback called from the main loop to call - notify_file_changed() for a thumbnail. It frees the uri afterwards. - We do this in an idle callback as I don't think nautilus_file_changed() is - thread-safe. */ + * notify_file_changed() for a thumbnail. It frees the uri afterwards. + * We do this in an idle callback as I don't think nautilus_file_changed() is + * thread-safe. */ static gboolean thumbnail_thread_notify_file_changed (gpointer image_uri) { - NautilusFile *file; + NautilusFile *file; - file = nautilus_file_get_by_uri ((char *) image_uri); + file = nautilus_file_get_by_uri ((char *) image_uri); #ifdef DEBUG_THUMBNAILS - g_message ("(Thumbnail Thread) Notifying file changed file:%p uri: %s\n", file, (char*) image_uri); + g_message ("(Thumbnail Thread) Notifying file changed file:%p uri: %s\n", file, (char *) image_uri); #endif - if (file != NULL) { - nautilus_file_set_is_thumbnailing (file, FALSE); - nautilus_file_invalidate_attributes (file, - NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL | - NAUTILUS_FILE_ATTRIBUTE_INFO); - nautilus_file_unref (file); - } - g_free (image_uri); - - return FALSE; + if (file != NULL) + { + nautilus_file_set_is_thumbnailing (file, FALSE); + nautilus_file_invalidate_attributes (file, + NAUTILUS_FILE_ATTRIBUTE_THUMBNAIL | + NAUTILUS_FILE_ATTRIBUTE_INFO); + nautilus_file_unref (file); + } + g_free (image_uri); + + return FALSE; } static GHashTable * get_types_table (void) { - static GHashTable *image_mime_types = NULL; - GSList *format_list, *l; - char **types; - int i; - - if (image_mime_types == NULL) { - image_mime_types = - g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, NULL); - - format_list = gdk_pixbuf_get_formats (); - for (l = format_list; l; l = l->next) { - types = gdk_pixbuf_format_get_mime_types (l->data); - - for (i = 0; types[i] != NULL; i++) { - g_hash_table_insert (image_mime_types, - types [i], - GUINT_TO_POINTER (1)); - } - - g_free (types); - } - - g_slist_free (format_list); - } - - return image_mime_types; + static GHashTable *image_mime_types = NULL; + GSList *format_list, *l; + char **types; + int i; + + if (image_mime_types == NULL) + { + image_mime_types = + g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + + format_list = gdk_pixbuf_get_formats (); + for (l = format_list; l; l = l->next) + { + types = gdk_pixbuf_format_get_mime_types (l->data); + + for (i = 0; types[i] != NULL; i++) + { + g_hash_table_insert (image_mime_types, + types [i], + GUINT_TO_POINTER (1)); + } + + g_free (types); + } + + g_slist_free (format_list); + } + + return image_mime_types; } static gboolean pixbuf_can_load_type (const char *mime_type) { - GHashTable *image_mime_types; + GHashTable *image_mime_types; - image_mime_types = get_types_table (); - if (g_hash_table_lookup (image_mime_types, mime_type)) { - return TRUE; - } + image_mime_types = get_types_table (); + if (g_hash_table_lookup (image_mime_types, mime_type)) + { + return TRUE; + } - return FALSE; + return FALSE; } gboolean nautilus_can_thumbnail_internally (NautilusFile *file) { - char *mime_type; - gboolean res; + char *mime_type; + gboolean res; - mime_type = nautilus_file_get_mime_type (file); - res = pixbuf_can_load_type (mime_type); - g_free (mime_type); - return res; + mime_type = nautilus_file_get_mime_type (file); + res = pixbuf_can_load_type (mime_type); + g_free (mime_type); + return res; } gboolean nautilus_thumbnail_is_mimetype_limited_by_size (const char *mime_type) { - return pixbuf_can_load_type (mime_type); + return pixbuf_can_load_type (mime_type); } gboolean nautilus_can_thumbnail (NautilusFile *file) { - GnomeDesktopThumbnailFactory *factory; - gboolean res; - char *uri; - time_t mtime; - char *mime_type; - - uri = nautilus_file_get_uri (file); - mime_type = nautilus_file_get_mime_type (file); - mtime = nautilus_file_get_mtime (file); - - factory = get_thumbnail_factory (); - res = gnome_desktop_thumbnail_factory_can_thumbnail (factory, - uri, - mime_type, - mtime); - g_free (mime_type); - g_free (uri); - - return res; + GnomeDesktopThumbnailFactory *factory; + gboolean res; + char *uri; + time_t mtime; + char *mime_type; + + uri = nautilus_file_get_uri (file); + mime_type = nautilus_file_get_mime_type (file); + mtime = nautilus_file_get_mtime (file); + + factory = get_thumbnail_factory (); + res = gnome_desktop_thumbnail_factory_can_thumbnail (factory, + uri, + mime_type, + mtime); + g_free (mime_type); + g_free (uri); + + return res; } void nautilus_create_thumbnail (NautilusFile *file) { - time_t file_mtime = 0; - NautilusThumbnailInfo *info; - NautilusThumbnailInfo *existing_info; - GList *existing, *node; - - nautilus_file_set_is_thumbnailing (file, TRUE); - - info = g_new0 (NautilusThumbnailInfo, 1); - info->image_uri = nautilus_file_get_uri (file); - info->mime_type = nautilus_file_get_mime_type (file); - - /* Hopefully the NautilusFile will already have the image file mtime, - so we can just use that. Otherwise we have to get it ourselves. */ - if (file->details->got_file_info && - file->details->file_info_is_up_to_date && - file->details->mtime != 0) { - file_mtime = file->details->mtime; - } else { - get_file_mtime (info->image_uri, &file_mtime); - } - - info->original_file_mtime = file_mtime; + time_t file_mtime = 0; + NautilusThumbnailInfo *info; + NautilusThumbnailInfo *existing_info; + GList *existing, *node; + + nautilus_file_set_is_thumbnailing (file, TRUE); + + info = g_new0 (NautilusThumbnailInfo, 1); + info->image_uri = nautilus_file_get_uri (file); + info->mime_type = nautilus_file_get_mime_type (file); + + /* Hopefully the NautilusFile will already have the image file mtime, + * so we can just use that. Otherwise we have to get it ourselves. */ + if (file->details->got_file_info && + file->details->file_info_is_up_to_date && + file->details->mtime != 0) + { + file_mtime = file->details->mtime; + } + else + { + get_file_mtime (info->image_uri, &file_mtime); + } + + info->original_file_mtime = file_mtime; #ifdef DEBUG_THUMBNAILS - g_message ("(Main Thread) Locking mutex\n"); + g_message ("(Main Thread) Locking mutex\n"); #endif - g_mutex_lock (&thumbnails_mutex); - - /********************************* - * MUTEX LOCKED - *********************************/ - - if (thumbnails_to_make_hash == NULL) { - thumbnails_to_make_hash = g_hash_table_new (g_str_hash, - g_str_equal); - } - - /* Check if it is already in the list of thumbnails to make. */ - existing = g_hash_table_lookup (thumbnails_to_make_hash, info->image_uri); - if (existing == NULL) { - /* Add the thumbnail to the list. */ + g_mutex_lock (&thumbnails_mutex); + + /********************************* + * MUTEX LOCKED + *********************************/ + + if (thumbnails_to_make_hash == NULL) + { + thumbnails_to_make_hash = g_hash_table_new (g_str_hash, + g_str_equal); + } + + /* Check if it is already in the list of thumbnails to make. */ + existing = g_hash_table_lookup (thumbnails_to_make_hash, info->image_uri); + if (existing == NULL) + { + /* Add the thumbnail to the list. */ #ifdef DEBUG_THUMBNAILS - g_message ("(Main Thread) Adding thumbnail: %s\n", - info->image_uri); + g_message ("(Main Thread) Adding thumbnail: %s\n", + info->image_uri); #endif - g_queue_push_tail ((GQueue *)&thumbnails_to_make, info); - node = g_queue_peek_tail_link ((GQueue *)&thumbnails_to_make); - g_hash_table_insert (thumbnails_to_make_hash, - info->image_uri, - node); - /* If the thumbnail thread isn't running, and we haven't - scheduled an idle function to start it up, do that now. - We don't want to start it until all the other work is done, - so the GUI will be updated as quickly as possible.*/ - if (thumbnail_thread_is_running == FALSE && - thumbnail_thread_starter_id == 0) { - thumbnail_thread_starter_id = g_idle_add_full (G_PRIORITY_LOW, thumbnail_thread_starter_cb, NULL, NULL); - } - } else { + g_queue_push_tail ((GQueue *) &thumbnails_to_make, info); + node = g_queue_peek_tail_link ((GQueue *) &thumbnails_to_make); + g_hash_table_insert (thumbnails_to_make_hash, + info->image_uri, + node); + /* If the thumbnail thread isn't running, and we haven't + * scheduled an idle function to start it up, do that now. + * We don't want to start it until all the other work is done, + * so the GUI will be updated as quickly as possible.*/ + if (thumbnail_thread_is_running == FALSE && + thumbnail_thread_starter_id == 0) + { + thumbnail_thread_starter_id = g_idle_add_full (G_PRIORITY_LOW, thumbnail_thread_starter_cb, NULL, NULL); + } + } + else + { #ifdef DEBUG_THUMBNAILS - g_message ("(Main Thread) Updating non-current mtime: %s\n", - info->image_uri); + g_message ("(Main Thread) Updating non-current mtime: %s\n", + info->image_uri); #endif - /* The file in the queue might need a new original mtime */ - existing_info = existing->data; - existing_info->original_file_mtime = info->original_file_mtime; - free_thumbnail_info (info); - } + /* The file in the queue might need a new original mtime */ + existing_info = existing->data; + existing_info->original_file_mtime = info->original_file_mtime; + free_thumbnail_info (info); + } - /********************************* - * MUTEX UNLOCKED - *********************************/ + /********************************* + * MUTEX UNLOCKED + *********************************/ #ifdef DEBUG_THUMBNAILS - g_message ("(Main Thread) Unlocking mutex\n"); + g_message ("(Main Thread) Unlocking mutex\n"); #endif - g_mutex_unlock (&thumbnails_mutex); + g_mutex_unlock (&thumbnails_mutex); } /* thumbnail_thread is invoked as a separate thread to to make thumbnails. */ @@ -452,118 +475,125 @@ thumbnail_thread_func (GTask *task, gpointer task_data, GCancellable *cancellable) { - NautilusThumbnailInfo *info = NULL; - GdkPixbuf *pixbuf; - time_t current_orig_mtime = 0; - time_t current_time; - GList *node; - - /* We loop until there are no more thumbails to make, at which point - we exit the thread. */ - for (;;) { + NautilusThumbnailInfo *info = NULL; + GdkPixbuf *pixbuf; + time_t current_orig_mtime = 0; + time_t current_time; + GList *node; + + /* We loop until there are no more thumbails to make, at which point + * we exit the thread. */ + for (;; ) + { #ifdef DEBUG_THUMBNAILS - g_message ("(Thumbnail Thread) Locking mutex\n"); + g_message ("(Thumbnail Thread) Locking mutex\n"); #endif - g_mutex_lock (&thumbnails_mutex); - - /********************************* - * MUTEX LOCKED - *********************************/ - - /* Pop the last thumbnail we just made off the head of the - list and free it. I did this here so we only have to lock - the mutex once per thumbnail, rather than once before - creating it and once after. - Don't pop the thumbnail off the queue if the original file - mtime of the request changed. Then we need to redo the thumbnail. - */ - if (currently_thumbnailing && - currently_thumbnailing->original_file_mtime == current_orig_mtime) { - g_assert (info == currently_thumbnailing); - node = g_hash_table_lookup (thumbnails_to_make_hash, info->image_uri); - g_assert (node != NULL); - g_hash_table_remove (thumbnails_to_make_hash, info->image_uri); - free_thumbnail_info (info); - g_queue_delete_link ((GQueue *)&thumbnails_to_make, node); - } - currently_thumbnailing = NULL; - - /* If there are no more thumbnails to make, reset the - thumbnail_thread_is_running flag, unlock the mutex, and - exit the thread. */ - if (g_queue_is_empty ((GQueue *)&thumbnails_to_make)) { + g_mutex_lock (&thumbnails_mutex); + + /********************************* + * MUTEX LOCKED + *********************************/ + + /* Pop the last thumbnail we just made off the head of the + * list and free it. I did this here so we only have to lock + * the mutex once per thumbnail, rather than once before + * creating it and once after. + * Don't pop the thumbnail off the queue if the original file + * mtime of the request changed. Then we need to redo the thumbnail. + */ + if (currently_thumbnailing && + currently_thumbnailing->original_file_mtime == current_orig_mtime) + { + g_assert (info == currently_thumbnailing); + node = g_hash_table_lookup (thumbnails_to_make_hash, info->image_uri); + g_assert (node != NULL); + g_hash_table_remove (thumbnails_to_make_hash, info->image_uri); + free_thumbnail_info (info); + g_queue_delete_link ((GQueue *) &thumbnails_to_make, node); + } + currently_thumbnailing = NULL; + + /* If there are no more thumbnails to make, reset the + * thumbnail_thread_is_running flag, unlock the mutex, and + * exit the thread. */ + if (g_queue_is_empty ((GQueue *) &thumbnails_to_make)) + { #ifdef DEBUG_THUMBNAILS - g_message ("(Thumbnail Thread) Exiting\n"); + g_message ("(Thumbnail Thread) Exiting\n"); #endif - thumbnail_thread_is_running = FALSE; - g_mutex_unlock (&thumbnails_mutex); - return; - } - - /* Get the next one to make. We leave it on the list until it - is created so the main thread doesn't add it again while we - are creating it. */ - info = g_queue_peek_head ((GQueue *)&thumbnails_to_make); - currently_thumbnailing = info; - current_orig_mtime = info->original_file_mtime; - /********************************* - * MUTEX UNLOCKED - *********************************/ + thumbnail_thread_is_running = FALSE; + g_mutex_unlock (&thumbnails_mutex); + return; + } + + /* Get the next one to make. We leave it on the list until it + * is created so the main thread doesn't add it again while we + * are creating it. */ + info = g_queue_peek_head ((GQueue *) &thumbnails_to_make); + currently_thumbnailing = info; + current_orig_mtime = info->original_file_mtime; + /********************************* + * MUTEX UNLOCKED + *********************************/ #ifdef DEBUG_THUMBNAILS - g_message ("(Thumbnail Thread) Unlocking mutex\n"); + g_message ("(Thumbnail Thread) Unlocking mutex\n"); #endif - g_mutex_unlock (&thumbnails_mutex); + g_mutex_unlock (&thumbnails_mutex); - time (¤t_time); + time (¤t_time); - /* Don't try to create a thumbnail if the file was modified recently. - This prevents constant re-thumbnailing of changing files. */ - if (current_time < current_orig_mtime + THUMBNAIL_CREATION_DELAY_SECS && - current_time >= current_orig_mtime) { + /* Don't try to create a thumbnail if the file was modified recently. + * This prevents constant re-thumbnailing of changing files. */ + if (current_time < current_orig_mtime + THUMBNAIL_CREATION_DELAY_SECS && + current_time >= current_orig_mtime) + { #ifdef DEBUG_THUMBNAILS - g_message ("(Thumbnail Thread) Skipping: %s\n", - info->image_uri); + g_message ("(Thumbnail Thread) Skipping: %s\n", + info->image_uri); #endif - /* Reschedule thumbnailing via a change notification */ - g_timeout_add_seconds (1, thumbnail_thread_notify_file_changed, - g_strdup (info->image_uri)); - continue; - } + /* Reschedule thumbnailing via a change notification */ + g_timeout_add_seconds (1, thumbnail_thread_notify_file_changed, + g_strdup (info->image_uri)); + continue; + } - /* Create the thumbnail. */ + /* Create the thumbnail. */ #ifdef DEBUG_THUMBNAILS - g_message ("(Thumbnail Thread) Creating thumbnail: %s\n", - info->image_uri); + g_message ("(Thumbnail Thread) Creating thumbnail: %s\n", + info->image_uri); #endif - pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (thumbnail_factory, - info->image_uri, - info->mime_type); + pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (thumbnail_factory, + info->image_uri, + info->mime_type); - if (pixbuf) { + if (pixbuf) + { #ifdef DEBUG_THUMBNAILS - g_message ("(Thumbnail Thread) Saving thumbnail: %s\n", - info->image_uri); + g_message ("(Thumbnail Thread) Saving thumbnail: %s\n", + info->image_uri); #endif - gnome_desktop_thumbnail_factory_save_thumbnail (thumbnail_factory, - pixbuf, - info->image_uri, - current_orig_mtime); - g_object_unref (pixbuf); - } else { + gnome_desktop_thumbnail_factory_save_thumbnail (thumbnail_factory, + pixbuf, + info->image_uri, + current_orig_mtime); + g_object_unref (pixbuf); + } + else + { #ifdef DEBUG_THUMBNAILS - g_message ("(Thumbnail Thread) Thumbnail failed: %s\n", - info->image_uri); + g_message ("(Thumbnail Thread) Thumbnail failed: %s\n", + info->image_uri); #endif - gnome_desktop_thumbnail_factory_create_failed_thumbnail (thumbnail_factory, - info->image_uri, - current_orig_mtime); - } - /* We need to call nautilus_file_changed(), but I don't think that is - thread safe. So add an idle handler and do it from the main loop. */ - g_idle_add_full (G_PRIORITY_HIGH_IDLE, - thumbnail_thread_notify_file_changed, - g_strdup (info->image_uri), NULL); - } + gnome_desktop_thumbnail_factory_create_failed_thumbnail (thumbnail_factory, + info->image_uri, + current_orig_mtime); + } + /* We need to call nautilus_file_changed(), but I don't think that is + * thread safe. So add an idle handler and do it from the main loop. */ + g_idle_add_full (G_PRIORITY_HIGH_IDLE, + thumbnail_thread_notify_file_changed, + g_strdup (info->image_uri), NULL); + } } -- cgit v1.2.1