summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2009-04-01 13:50:55 +0000
committerAlexander Larsson <alexl@src.gnome.org>2009-04-01 13:50:55 +0000
commitda6bb4daf5be789d6a2faf773c9f756fa6ed4315 (patch)
treed0cd384f7a13c55d5aba1dc58451387cac8da840
parentfa0146bc9b02bb4c2b9423e74ccfb33215b93b85 (diff)
downloadnautilus-da6bb4daf5be789d6a2faf773c9f756fa6ed4315.tar.gz
Call query_filesystem_info asynchronously. Also, avoid calling it to often
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 svn path=/trunk/; revision=15158
-rw-r--r--ChangeLog8
-rw-r--r--libnautilus-private/nautilus-directory-private.h3
-rw-r--r--libnautilus-private/nautilus-directory.c1
-rw-r--r--libnautilus-private/nautilus-file.c66
4 files changed, 66 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 32fbbf597..a0b24ae65 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}