From c3807ba49056014c90c36ed317753e1d9b38c6aa Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Mon, 1 Sep 2014 11:46:00 -0700 Subject: 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. --- libnautilus-private/nautilus-file-private.h | 1 + libnautilus-private/nautilus-file.c | 27 +++++++++++---------------- 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 * -- cgit v1.2.1