summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nautilus-directory-async.c47
1 files changed, 35 insertions, 12 deletions
diff --git a/src/nautilus-directory-async.c b/src/nautilus-directory-async.c
index d5b93b5ac..e9fe732e3 100644
--- a/src/nautilus-directory-async.c
+++ b/src/nautilus-directory-async.c
@@ -114,7 +114,9 @@ struct DeepCountState
GCancellable *cancellable;
GFileEnumerator *enumerator;
GFile *deep_count_location;
+ gboolean deep_size_only;
GList *deep_count_subdirectories;
+ GList *deep_size_only_subdirectories;
GArray *seen_deep_count_inodes;
char *fs_id;
};
@@ -2808,45 +2810,54 @@ deep_count_one (DeepCountState *state,
GFileInfo *info)
{
NautilusFile *file;
- GFile *subdir;
gboolean is_seen_inode;
- const char *fs_id;
-
- if (should_skip_file (NULL, info))
- {
- return;
- }
+ gboolean skip_count;
is_seen_inode = seen_inode (state, info);
if (!is_seen_inode)
{
mark_inode_as_seen (state, info);
}
+ /* Count item only if not skipped (because it's not user-visible) */
+ skip_count = should_skip_file (NULL, info) || state->deep_size_only;
file = state->directory->details->deep_count_file;
if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
{
+ const char *fs_id;
+
/* Count the directory. */
- file->details->deep_directory_count += 1;
+ file->details->deep_directory_count += skip_count ? 0 : 1;
/* Record the fact that we have to descend into this directory. */
fs_id = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_ID_FILESYSTEM);
if (g_strcmp0 (fs_id, state->fs_id) == 0)
{
+ GFile *subdir;
+
/* only if it is on the same filesystem */
subdir = g_file_get_child (state->deep_count_location, g_file_info_get_name (info));
- state->deep_count_subdirectories = g_list_prepend
- (state->deep_count_subdirectories, subdir);
+ if (skip_count)
+ {
+ /* Count the size, even if skipped (because it still takes space). */
+ state->deep_size_only_subdirectories = g_list_prepend
+ (state->deep_size_only_subdirectories, subdir);
+ }
+ else
+ {
+ state->deep_count_subdirectories = g_list_prepend
+ (state->deep_count_subdirectories, subdir);
+ }
}
}
else
{
/* Even non-regular files count as files. */
- file->details->deep_file_count += 1;
+ file->details->deep_file_count += skip_count ? 0 : 1;
}
- /* Count the size. */
+ /* Count the size, even if skipped (because it still takes space). */
if (!is_seen_inode && g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SIZE))
{
file->details->deep_size += g_file_info_get_size (info);
@@ -2871,6 +2882,7 @@ deep_count_state_free (DeepCountState *state)
g_object_unref (state->deep_count_location);
}
g_list_free_full (state->deep_count_subdirectories, g_object_unref);
+ g_list_free_full (state->deep_size_only_subdirectories, g_object_unref);
g_array_free (state->seen_deep_count_inodes, TRUE);
g_free (state->fs_id);
g_free (state);
@@ -2898,6 +2910,16 @@ deep_count_next_dir (DeepCountState *state)
location = state->deep_count_subdirectories->data;
state->deep_count_subdirectories = g_list_remove
(state->deep_count_subdirectories, location);
+ state->deep_size_only = FALSE;
+ deep_count_load (state, location);
+ g_object_unref (location);
+ }
+ else if (state->deep_size_only_subdirectories != NULL)
+ {
+ location = state->deep_size_only_subdirectories->data;
+ state->deep_size_only_subdirectories = g_list_remove
+ (state->deep_size_only_subdirectories, location);
+ state->deep_size_only = TRUE;
deep_count_load (state, location);
g_object_unref (location);
}
@@ -3131,6 +3153,7 @@ deep_count_start (NautilusDirectory *directory,
state = g_new0 (DeepCountState, 1);
state->directory = directory;
state->cancellable = g_cancellable_new ();
+ state->deep_size_only = FALSE;
state->seen_deep_count_inodes = g_array_new (FALSE, TRUE, sizeof (guint64));
state->fs_id = NULL;