diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-private.h | 3 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory.c | 1 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file.c | 66 |
4 files changed, 66 insertions, 12 deletions
@@ -1,5 +1,13 @@ 2009-04-01 Alexander Larsson <alexl@redhat.com> + * libnautilus-private/nautilus-directory-private.h: + * libnautilus-private/nautilus-directory.c: + * libnautilus-private/nautilus-file.c: + Call query_filesystem_info asynchronously. + Also, avoid calling it to often + +2009-04-01 Alexander Larsson <alexl@redhat.com> + Bug 518481 – URL shortcuts do not open query part * libnautilus-private/nautilus-file-private.h: diff --git a/libnautilus-private/nautilus-directory-private.h b/libnautilus-private/nautilus-directory-private.h index f93447555..f8a26e3dd 100644 --- a/libnautilus-private/nautilus-directory-private.h +++ b/libnautilus-private/nautilus-directory-private.h @@ -143,6 +143,9 @@ struct NautilusDirectoryDetails GList *file_operations_in_progress; /* list of FileOperation * */ GHashTable *hidden_file_hash; + + guint64 free_space; /* (guint)-1 for unknown */ + time_t free_space_read; /* The time free_space was updated, or 0 for never */ }; NautilusDirectory *nautilus_directory_get_existing (GFile *location); diff --git a/libnautilus-private/nautilus-directory.c b/libnautilus-private/nautilus-directory.c index c7dd7c87d..111169878 100644 --- a/libnautilus-private/nautilus-directory.c +++ b/libnautilus-private/nautilus-directory.c @@ -140,6 +140,7 @@ nautilus_directory_init (gpointer object, gpointer klass) directory->details->low_priority_queue = nautilus_file_queue_new (); directory->details->extension_queue = nautilus_file_queue_new (); directory->details->idle_queue = nautilus_idle_queue_new (); + directory->details->free_space = (guint64)-1; } NautilusDirectory * diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c index ed0dc8230..fb6d92bdd 100644 --- a/libnautilus-private/nautilus-file.c +++ b/libnautilus-private/nautilus-file.c @@ -5977,6 +5977,39 @@ nautilus_file_is_broken_symbolic_link (NautilusFile *file) return nautilus_file_get_file_type (file) == G_FILE_TYPE_SYMBOLIC_LINK; } +static void +get_fs_free_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + NautilusDirectory *directory; + NautilusFile *file; + guint64 free_space; + GFileInfo *info; + + directory = NAUTILUS_DIRECTORY (user_data); + + free_space = (guint64)-1; + info = g_file_query_filesystem_info_finish (G_FILE (source_object), + res, NULL); + if (info) { + if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE)) { + free_space = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); + } + g_object_unref (info); + } + + if (directory->details->free_space != free_space) { + directory->details->free_space = free_space; + file = nautilus_directory_get_existing_corresponding_file (directory); + if (file) { + nautilus_file_emit_changed (file); + nautilus_file_unref (file); + } + } + nautilus_directory_unref (directory); +} + /** * nautilus_file_get_volume_free_space * Get a nicely formatted char with free space on the file's volume @@ -5987,24 +6020,33 @@ nautilus_file_is_broken_symbolic_link (NautilusFile *file) char * nautilus_file_get_volume_free_space (NautilusFile *file) { - goffset free_space; - GFileInfo *info; + NautilusDirectory *directory; GFile *location; char *res; + time_t now; - res = NULL; + directory = nautilus_directory_get_for_file (file); - location = nautilus_file_get_location (file); - info = g_file_query_filesystem_info (location, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, NULL, NULL); - if (info) { - if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE)) { - free_space = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); - res = g_format_size_for_display (free_space); - } - g_object_unref (info); + now = time (NULL); + /* Update first time and then every 2 seconds */ + if (directory->details->free_space_read == 0 || + (now - directory->details->free_space_read) > 2) { + directory->details->free_space_read = now; + location = nautilus_file_get_location (file); + g_file_query_filesystem_info_async (location, + G_FILE_ATTRIBUTE_FILESYSTEM_FREE, + 0, NULL, + get_fs_free_cb, + directory); /* Inherits ref */ + g_object_unref (location); } - g_object_unref (location); + + res = NULL; + if (directory->details->free_space != (guint64)-1) { + res = g_format_size_for_display (directory->details->free_space); + } + return res; } |