From af154fdd494b90adae5be5783bb725194fcf1d6b Mon Sep 17 00:00:00 2001 From: ZenWalker Date: Fri, 10 Jun 2016 10:41:11 +0200 Subject: use natural order when sorting by filename file-roller commit: https://git.gnome.org/browse/file-roller/commit/?id=8703609e95dcee3abbec39dea567137c7fff23e9 Fixes #143 --- src/file-data.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) (limited to 'src/file-data.c') diff --git a/src/file-data.c b/src/file-data.c index 8905b96..d7a39a2 100644 --- a/src/file-data.c +++ b/src/file-data.c @@ -37,7 +37,7 @@ file_data_new (void) fdata->content_type = NULL; fdata->free_original_path = FALSE; fdata->dir_size = 0; - + return fdata; } @@ -54,6 +54,7 @@ file_data_free (FileData *fdata) g_free (fdata->path); g_free (fdata->link); g_free (fdata->list_name); + g_free (fdata->sort_key); g_free (fdata); } @@ -67,7 +68,7 @@ file_data_copy (FileData *src) fdata->original_path = g_strdup (src->original_path); fdata->free_original_path = TRUE; - + fdata->full_path = g_strdup (src->full_path); fdata->link = g_strdup (src->link); fdata->size = src->size; @@ -81,6 +82,7 @@ file_data_copy (FileData *src) fdata->list_dir = src->list_dir; fdata->list_name = g_strdup (src->list_name); + fdata->sort_key = g_strdup (src->sort_key); return fdata; } @@ -90,10 +92,10 @@ GType file_data_get_type (void) { static GType type = 0; - + if (type == 0) type = g_boxed_type_register_static ("FRFileData", (GBoxedCopyFunc) file_data_copy, (GBoxedFreeFunc) file_data_free); - + return type; } @@ -101,10 +103,9 @@ file_data_get_type (void) void file_data_update_content_type (FileData *fdata) { - - if (fdata->dir) + if (fdata->dir) fdata->content_type = MIME_TYPE_DIRECTORY; - else + else fdata->content_type = get_static_string (g_content_type_guess (fdata->full_path, NULL, 0, NULL)); } @@ -116,13 +117,28 @@ file_data_is_dir (FileData *fdata) } +void +file_data_set_list_name (FileData *fdata, + const char *value) +{ + g_free (fdata->list_name); + fdata->list_name = g_strdup (value); + + g_free (fdata->sort_key); + if (fdata->list_name != NULL) + fdata->sort_key = g_utf8_collate_key_for_filename (fdata->list_name, -1); + else + fdata->sort_key = NULL; +} + + int file_data_compare_by_path (gconstpointer a, gconstpointer b) { FileData *data_a = *((FileData **) a); FileData *data_b = *((FileData **) b); - + return strcmp (data_a->full_path, data_b->full_path); } @@ -158,12 +174,12 @@ find_path_in_file_data_array (GPtrArray *array, } if (cmp == 0) - return p; + return p; else if (cmp < 0) right = p; - else + else left = p + 1; } - + return -1; } -- cgit v1.2.1