gnome-commander r1654 - in branches/gcmd-1-3: . doc/C src
- From: epiotr svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-commander r1654 - in branches/gcmd-1-3: . doc/C src
- Date: Mon, 17 Mar 2008 16:17:10 +0000 (GMT)
Author: epiotr
Date: Mon Mar 17 16:17:10 2008
New Revision: 1654
URL: http://svn.gnome.org/viewvc/gnome-commander?rev=1654&view=rev
Log:
Fix sorting for sorting of UTF-8 encoded file names
Modified:
branches/gcmd-1-3/ChangeLog
branches/gcmd-1-3/doc/C/gnome-commander.xml
branches/gcmd-1-3/src/gnome-cmd-file-list.cc
branches/gcmd-1-3/src/gnome-cmd-file.cc
branches/gcmd-1-3/src/gnome-cmd-file.h
Modified: branches/gcmd-1-3/doc/C/gnome-commander.xml
==============================================================================
--- branches/gcmd-1-3/doc/C/gnome-commander.xml (original)
+++ branches/gcmd-1-3/doc/C/gnome-commander.xml Mon Mar 17 16:17:10 2008
@@ -5848,6 +5848,9 @@
</listitem>
</itemizedlist>
</listitem>
+ <listitem>
+ <para>Fixed problem with sorting of UTF-8 encoded file names</para>
+ </listitem>
</itemizedlist>
</para>
</entry>
Modified: branches/gcmd-1-3/src/gnome-cmd-file-list.cc
==============================================================================
--- branches/gcmd-1-3/src/gnome-cmd-file-list.cc (original)
+++ branches/gcmd-1-3/src/gnome-cmd-file-list.cc Mon Mar 17 16:17:10 2008
@@ -130,6 +130,12 @@
} FileFormatData;
+inline char *gnome_cmd_get_collation_fname (GnomeCmdFile *f)
+{
+ return f->collate_key ? f->collate_key : f->info->name;
+}
+
+
inline int get_num_files (GnomeCmdFileList *fl)
{
g_return_val_if_fail (GNOME_CMD_IS_FILE_LIST (fl), -1);
@@ -711,8 +717,6 @@
static gint sort_by_name (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
{
- gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
-
if (strcmp (f1->info->name, "..") == 0)
return -1;
@@ -725,15 +729,14 @@
if (f1->info->type < f2->info->type)
return 1;
- return my_strcmp (f1->info->name, f2->info->name, raising);
+ gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
+
+ return my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), raising);
}
-static gint
-sort_by_ext (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
+static gint sort_by_ext (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
{
- gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
-
if (strcmp (f1->info->name, "..") == 0)
return -1;
@@ -746,8 +749,10 @@
if (f1->info->type < f2->info->type)
return 1;
+ gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
+
if (!gnome_cmd_file_get_extension(f1) && !gnome_cmd_file_get_extension (f2))
- return my_strcmp (f1->info->name, f2->info->name, fl->priv->sort_raising[1]);
+ return my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), fl->priv->sort_raising[1]);
if (!gnome_cmd_file_get_extension (f1))
return raising?1:-1;
@@ -756,59 +761,61 @@
gint ret = my_strcmp (gnome_cmd_file_get_extension (f1), gnome_cmd_file_get_extension (f2), raising);
- return ret ? ret : my_strcmp (f1->info->name, f2->info->name, fl->priv->sort_raising[1]);
+ return ret ? ret : my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), fl->priv->sort_raising[1]);
}
static gint sort_by_dir (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
{
- gint ret = 0;
- gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
-
- gchar *t1 = gnome_cmd_file_get_path (f1);
- gchar *t2 = gnome_cmd_file_get_path (f2);
- gchar *d1 = g_path_get_dirname (t1);
- gchar *d2 = g_path_get_dirname (t2);
-
if (strcmp (f1->info->name, "..") == 0)
- ret = -1;
+ return -1;
if (strcmp (f2->info->name, "..") == 0)
- ret = 1;
+ return 1;
if (f1->info->type > f2->info->type)
- ret = -1;
+ return -1;
if (f1->info->type < f2->info->type)
- ret = 1;
+ return 1;
- g_free (t1);
- g_free (t2);
- g_free (d1);
- g_free (d2);
+ // gchar *t1 = gnome_cmd_file_get_path (f1);
+ // gchar *t2 = gnome_cmd_file_get_path (f2);
+ // gchar *d1 = g_path_get_dirname (t1);
+ // gchar *d2 = g_path_get_dirname (t2);
- return ret ? ret : my_strcmp (d1, d2, raising);
+ gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
+ // gint ret = my_strcmp (d1, d2, raising);
+
+ // g_free (t1);
+ // g_free (t2);
+ // g_free (d1);
+ // g_free (d2);
+
+ // return ret;
+
+ return my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), raising);
}
static gint sort_by_size (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
{
- gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
- gboolean file_raising = fl->priv->sort_raising[1];
-
if (strcmp (f1->info->name, "..") == 0)
return -1;
if (strcmp (f2->info->name, "..") == 0)
return 1;
+ gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
+ gboolean file_raising = fl->priv->sort_raising[1];
+
gint ret = my_intcmp (f1->info->type, f2->info->type, TRUE);
if (!ret)
{
ret = my_intcmp (f1->info->size, f2->info->size, raising);
if (!ret)
- ret = my_strcmp (f1->info->name, f2->info->name, file_raising);
+ ret = my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), file_raising);
}
return ret;
}
@@ -816,21 +823,21 @@
static gint sort_by_perm (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
{
- gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
- gboolean file_raising = fl->priv->sort_raising[1];
-
if (strcmp (f1->info->name, "..") == 0)
return -1;
if (strcmp (f2->info->name, "..") == 0)
return 1;
+ gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
+ gboolean file_raising = fl->priv->sort_raising[1];
+
gint ret = my_intcmp (f1->info->type, f2->info->type, TRUE);
if (!ret)
{
ret = my_intcmp (f1->info->permissions, f2->info->permissions, raising);
if (!ret)
- ret = my_strcmp (f1->info->name, f2->info->name, file_raising);
+ ret = my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), file_raising);
}
return ret;
}
@@ -838,21 +845,21 @@
static gint sort_by_date (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
{
- gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
- gboolean file_raising = fl->priv->sort_raising[1];
-
if (strcmp (f1->info->name, "..") == 0)
return -1;
if (strcmp (f2->info->name, "..") == 0)
return 1;
+ gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
+ gboolean file_raising = fl->priv->sort_raising[1];
+
gint ret = my_intcmp (f1->info->type, f2->info->type, TRUE);
if (!ret)
{
ret = my_intcmp (f1->info->mtime, f2->info->mtime, raising);
if (!ret)
- ret = my_strcmp (f1->info->name, f2->info->name, file_raising);
+ ret = my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), file_raising);
}
return ret;
}
@@ -860,21 +867,21 @@
static gint sort_by_owner (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
{
- gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
- gboolean file_raising = fl->priv->sort_raising[1];
-
if (strcmp (f1->info->name, "..") == 0)
return -1;
if (strcmp (f2->info->name, "..") == 0)
return 1;
+ gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
+ gboolean file_raising = fl->priv->sort_raising[1];
+
gint ret = my_intcmp (f1->info->type, f2->info->type, TRUE);
if (!ret)
{
ret = my_intcmp (f1->info->uid, f2->info->uid, raising);
if (!ret)
- ret = my_strcmp (f1->info->name, f2->info->name, file_raising);
+ ret = my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), file_raising);
}
return ret;
}
@@ -882,21 +889,21 @@
static gint sort_by_group (GnomeCmdFile *f1, GnomeCmdFile *f2, GnomeCmdFileList *fl)
{
- gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
- gboolean file_raising = fl->priv->sort_raising[1];
-
if (strcmp (f1->info->name, "..") == 0)
return -1;
if (strcmp (f2->info->name, "..") == 0)
return 1;
+ gboolean raising = fl->priv->sort_raising[fl->priv->current_col];
+ gboolean file_raising = fl->priv->sort_raising[1];
+
gint ret = my_intcmp (f1->info->type, f2->info->type, TRUE);
if (!ret)
{
ret = my_intcmp (f1->info->gid, f2->info->gid, raising);
if (!ret)
- ret = my_strcmp (f1->info->name, f2->info->name, file_raising);
+ ret = my_strcmp (gnome_cmd_get_collation_fname (f1), gnome_cmd_get_collation_fname (f2), file_raising);
}
return ret;
}
Modified: branches/gcmd-1-3/src/gnome-cmd-file.cc
==============================================================================
--- branches/gcmd-1-3/src/gnome-cmd-file.cc (original)
+++ branches/gcmd-1-3/src/gnome-cmd-file.cc Mon Mar 17 16:17:10 2008
@@ -83,6 +83,8 @@
if (file->info->name[0] != '.')
DEBUG ('f', "file destroying 0x%p %s\n", file, file->info->name);
+
+ g_free (file->collate_key);
gnome_vfs_file_info_unref (file->info);
if (file->priv->dir_handle)
handle_unref (file->priv->dir_handle);
@@ -113,6 +115,7 @@
static void init (GnomeCmdFile *file)
{
file->info = NULL;
+ file->collate_key = NULL;
file->priv = g_new0 (GnomeCmdFilePrivate, 1);
file->priv->dir_handle = NULL;
@@ -175,6 +178,7 @@
finfo->info = info;
GNOME_CMD_FILE_INFO (finfo)->info = info;
+ finfo->collate_key = g_utf8_collate_key_for_filename (info->name, -1);
if (dir)
{
@@ -783,9 +787,11 @@
g_return_if_fail (finfo != NULL);
g_return_if_fail (info != NULL);
+ g_free (finfo->collate_key);
gnome_vfs_file_info_unref (finfo->info);
gnome_vfs_file_info_ref (info);
finfo->info = info;
+ finfo->collate_key = g_utf8_collate_key_for_filename (info->name, -1);
}
Modified: branches/gcmd-1-3/src/gnome-cmd-file.h
==============================================================================
--- branches/gcmd-1-3/src/gnome-cmd-file.h (original)
+++ branches/gcmd-1-3/src/gnome-cmd-file.h Mon Mar 17 16:17:10 2008
@@ -39,6 +39,7 @@
GnomeCmdFileInfo parent;
GnomeVFSFileInfo *info;
+ gchar *collate_key; // necessary for proper sorting of UTF-8 encoded file names
GnomeCmdFilePrivate *priv;
GnomeCmdFileMetadata *metadata;
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]