gnome-commander r1654 - in branches/gcmd-1-3: . doc/C src



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]