summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2014-09-01 11:46:00 -0700
committerCosimo Cecchi <cosimoc@gnome.org>2014-09-01 15:31:18 -0700
commitc3807ba49056014c90c36ed317753e1d9b38c6aa (patch)
tree4bc47581ab90638fbde6b960e72774deaf5b4469
parenta332b89eeba00447d6fafca816fae1f30a13952f (diff)
downloadnautilus-c3807ba49056014c90c36ed317753e1d9b38c6aa.tar.gz
file: use a collation key for comparing directory names
Or we'll have to redo utf8 validation/normalization every time we add a file into the directory, when we sort files that way.
-rw-r--r--libnautilus-private/nautilus-file-private.h1
-rw-r--r--libnautilus-private/nautilus-file.c27
2 files changed, 12 insertions, 16 deletions
diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h
index 1beaa60fb..47c25dffb 100644
--- a/libnautilus-private/nautilus-file-private.h
+++ b/libnautilus-private/nautilus-file-private.h
@@ -53,6 +53,7 @@ struct NautilusFileDetails
eel_ref_str display_name;
char *display_name_collation_key;
+ char *directory_name_collation_key;
eel_ref_str edit_name;
goffset size; /* -1 is unknown */
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 1c27edd13..1052dbac4 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -504,8 +504,16 @@ void
nautilus_file_set_directory (NautilusFile *file,
NautilusDirectory *directory)
{
+ char *parent_uri;
+
g_clear_object (&file->details->directory);
+ g_free (file->details->directory_name_collation_key);
+
file->details->directory = nautilus_directory_ref (directory);
+
+ parent_uri = nautilus_file_get_parent_uri (file);
+ file->details->directory_name_collation_key = g_utf8_collate_key_for_filename (parent_uri, -1);
+ g_free (parent_uri);
}
static NautilusFile *
@@ -793,6 +801,7 @@ finalize (GObject *object)
eel_ref_str_unref (file->details->name);
eel_ref_str_unref (file->details->display_name);
g_free (file->details->display_name_collation_key);
+ g_free (file->details->directory_name_collation_key);
eel_ref_str_unref (file->details->edit_name);
if (file->details->icon) {
g_object_unref (file->details->icon);
@@ -2888,22 +2897,8 @@ compare_by_display_name (NautilusFile *file_1, NautilusFile *file_2)
static int
compare_by_directory_name (NautilusFile *file_1, NautilusFile *file_2)
{
- char *directory_1, *directory_2;
- int compare;
-
- if (file_1->details->directory == file_2->details->directory) {
- return 0;
- }
-
- directory_1 = nautilus_file_get_parent_uri_for_display (file_1);
- directory_2 = nautilus_file_get_parent_uri_for_display (file_2);
-
- compare = g_utf8_collate (directory_1, directory_2);
-
- g_free (directory_1);
- g_free (directory_2);
-
- return compare;
+ return strcmp (file_1->details->directory_name_collation_key,
+ file_2->details->directory_name_collation_key);
}
static GList *