summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/file-data.c38
-rw-r--r--src/file-data.h22
-rw-r--r--src/fr-window.c13
3 files changed, 46 insertions, 27 deletions
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;
}
diff --git a/src/file-data.h b/src/file-data.h
index 60d81b6..84adcd6 100644
--- a/src/file-data.h
+++ b/src/file-data.h
@@ -40,13 +40,14 @@ typedef struct {
gboolean dir; /* Whether this is a directory listed in the archive */
goffset dir_size;
const char *content_type;
-
+
/* Additional data. */
gboolean list_dir; /* Whether this entry is used to show
* a directory. */
char *list_name; /* The string visualized in the list
* view. */
+ char *sort_key;
/* Private data */
@@ -57,14 +58,15 @@ typedef struct {
GType file_data_get_type (void);
FileData * file_data_new (void);
-FileData * file_data_copy (FileData *src);
-void file_data_free (FileData *fdata);
-void file_data_update_content_type (FileData *fdata);
-gboolean file_data_is_dir (FileData *fdata);
-
-int file_data_compare_by_path (gconstpointer a,
- gconstpointer b);
-int find_path_in_file_data_array (GPtrArray *array,
- const char *path);
+FileData * file_data_copy (FileData *src);
+void file_data_free (FileData *fdata);
+void file_data_update_content_type (FileData *fdata);
+gboolean file_data_is_dir (FileData *fdata);
+void file_data_set_list_name (FileData *fdata,
+ const char *value);
+int file_data_compare_by_path (gconstpointer a,
+ gconstpointer b);
+int find_path_in_file_data_array (GPtrArray *array,
+ const char *path);
#endif /* FILE_DATA_H */
diff --git a/src/fr-window.c b/src/fr-window.c
index 522b194..c57f453 100644
--- a/src/fr-window.c
+++ b/src/fr-window.c
@@ -944,7 +944,7 @@ sort_by_name (gconstpointer ptr1,
return 1;
}
- return strcasecmp (fdata1->list_name, fdata2->list_name);
+ return strcmp (fdata1->sort_key, fdata2->sort_key);
}
@@ -1118,7 +1118,7 @@ compute_file_list_name (FrWindow *window,
return FALSE;
if (window->priv->list_mode == FR_WINDOW_LIST_MODE_FLAT) {
- fdata->list_name = g_strdup (fdata->name);
+ file_data_set_list_name (fdata, fdata->name);
if (fdata->dir)
fdata->dir_size = 0;
return FALSE;
@@ -1135,7 +1135,7 @@ compute_file_list_name (FrWindow *window,
scan = fdata->full_path + current_dir_len;
end = strchr (scan, '/');
if ((end == NULL) && ! fdata->dir) { /* file */
- fdata->list_name = g_strdup (scan);
+ file_data_set_list_name (fdata, scan);
}
else { /* folder */
char *dir_name;
@@ -1154,8 +1154,10 @@ compute_file_list_name (FrWindow *window,
if ((end != NULL) && (*(end + 1) != '\0'))
fdata->list_dir = TRUE;
- fdata->list_name = dir_name;
+ file_data_set_list_name (fdata, dir_name);
fdata->dir_size = get_dir_size (window, current_dir, dir_name);
+
+ g_free (dir_name);
}
return TRUE;
@@ -1181,8 +1183,7 @@ fr_window_compute_list_names (FrWindow *window,
for (i = 0; i < files->len; i++) {
FileData *fdata = g_ptr_array_index (files, i);
- g_free (fdata->list_name);
- fdata->list_name = NULL;
+ file_data_set_list_name (fdata, NULL);
fdata->list_dir = FALSE;
/* the files array is sorted by path, when the visible list