PATCH changes sot order of hidden files
- From: valter pohjola welho com
- To: mc-devel gnome org
- Subject: PATCH changes sot order of hidden files
- Date: Fri, 15 Jun 2007 14:10:21 +0300
Hi,
I rewrote the patch, so that the option will appear in the "Sort order" dialogs.
I added a variable dot_files_last to the panel struct. (One thing that I noticed
is that the variable reverse in the panel struct, seems to be initialized twice,
once in the body of panel_new and once in panel_load_setup, which is called from
panel_new?)
Valter Pohjola
--- ../../org/mc/src/boxes.c 2007-06-14 17:10:35.000000000 +0300
+++ boxes.c 2007-06-14 20:35:20.000000000 +0300
@@ -270,16 +270,17 @@
static const char *sort_orders_names [SORT_TYPES];
sortfn *
-sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive)
+sort_box (sortfn *sort_fn, int *reverse, int *case_sensitive, int *dot_files_last)
{
- int i, r, l;
+ int i, r, l, d;
sortfn *result;
- WCheck *c, *case_sense;
+ WCheck *c, *case_sense, *df_last;
const char *ok_button = _("&OK");
const char *cancel_button = _("&Cancel");
const char *reverse_label = _("&Reverse");
const char *case_label = _("case sensi&tive");
+ const char *dot_files_last_label = _("hidden files &last");
const char *sort_title = _("Sort order");
static int i18n_sort_flag = 0, check_pos = 0, button_pos = 0;
@@ -304,6 +305,10 @@
i = strlen (cancel_button) + 4;
if (i > l)
l = i;
+
+ d = strlen(dot_files_last_label) + 4;
+ if(d > l)
+ l = d;
i = check_pos + max (r, l) + 2;
@@ -338,6 +343,8 @@
button_new (9, button_pos, B_ENTER, DEFPUSH_BUTTON,
ok_button, 0));
+ df_last = check_new (5, check_pos, *dot_files_last, dot_files_last_label);
+ add_widget (dd, df_last);
case_sense = check_new (4, check_pos, *case_sensitive, case_label);
add_widget (dd, case_sense);
c = check_new (3, check_pos, *reverse, reverse_label);
@@ -354,6 +361,7 @@
result = (sortfn *) sort_orders[my_radio->sel].sort_fn;
*reverse = c->state & C_BOOL;
*case_sensitive = case_sense->state & C_BOOL;
+ *dot_files_last = df_last->state & C_BOOL;
} else
result = sort_fn;
destroy_dlg (dd);
--- ../../org/mc/src/boxes.h 2007-06-14 17:10:35.000000000 +0300
+++ boxes.h 2007-06-14 19:48:45.000000000 +0300
@@ -7,7 +7,7 @@
int display_box (WPanel *p, char **user, char **mini,
int *use_msformat, int num);
sortfn *sort_box (sortfn *sort_fn, int *reverse,
- int *case_sensitive);
+ int *case_sensitive, int *dot_files_last);
void confirm_box (void);
void display_bits_box (void);
void configure_vfs (void);
--- ../../org/mc/src/dir.c 2007-06-14 17:10:35.000000000 +0300
+++ dir.c 2007-06-14 19:33:25.000000000 +0300
@@ -45,6 +45,9 @@
/* Are the files sorted case sensitively? */
static int case_sensitive = OS_SORT_CASE_SENSITIVE_DEFAULT;
+/* If true show all dotfiles at bottom of dir listing */
+static int dot_files_last = 0;
+
#define MY_ISDIR(x) ( (S_ISDIR (x->st.st_mode) || x->f.link_to_dir) ? 1 : 0)
sort_orders_t sort_orders [SORT_TYPES_TOTAL] = {
@@ -100,6 +103,20 @@
#define string_sortcomp(a,b) (case_sensitive ? strcmp (a,b) : g_strcasecmp (a,b))
#endif
+inline static int
+dot_file_order (const file_entry *a, const file_entry *b)
+{
+ if(dot_files_last)
+ {
+ if(a->fname[0] == '.' && b->fname[0] != '.')
+ return 1;
+
+ if( b->fname[0] == '.' && a->fname[0] != '.')
+ return -1;
+ }
+ return 0;
+}
+
int
unsorted (const file_entry *a, const file_entry *b)
{
@@ -113,6 +130,10 @@
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
+ int df_order;
+
+ if(df_order = dot_file_order(a,b))
+ return df_order;
if (ad == bd || mix_all_files)
return string_sortcomp (a->fname, b->fname) * reverse;
@@ -126,6 +147,10 @@
int r;
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
+ int df_order;
+
+ if(df_order = dot_file_order(a,b))
+ return df_order;
if (ad == bd || mix_all_files){
exta = extension (a->fname);
@@ -144,6 +169,10 @@
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
+ int df_order;
+
+ if(df_order = dot_file_order(a,b))
+ return df_order;
if (ad == bd || mix_all_files) {
int result = a->st.st_mtime < b->st.st_mtime ? -1 :
@@ -162,6 +191,10 @@
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
+ int df_order;
+
+ if(df_order = dot_file_order(a,b))
+ return df_order;
if (ad == bd || mix_all_files) {
int result = a->st.st_ctime < b->st.st_ctime ? -1 :
@@ -180,6 +213,10 @@
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
+ int df_order;
+
+ if(df_order = dot_file_order(a,b))
+ return df_order;
if (ad == bd || mix_all_files) {
int result = a->st.st_atime < b->st.st_atime ? -1 :
@@ -198,6 +235,10 @@
{
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
+ int df_order;
+
+ if(df_order = dot_file_order(a,b))
+ return df_order;
if (ad == bd || mix_all_files)
return (a->st.st_ino - b->st.st_ino) * reverse;
@@ -211,6 +252,10 @@
int ad = MY_ISDIR (a);
int bd = MY_ISDIR (b);
int result = 0;
+ int df_order;
+
+ if(df_order = dot_file_order(a,b))
+ return df_order;
if (ad != bd && !mix_all_files)
return bd - ad;
@@ -225,7 +270,7 @@
void
-do_sort (dir_list *list, sortfn *sort, int top, int reverse_f, int case_sensitive_f)
+do_sort (dir_list *list, sortfn *sort, int top, int reverse_f, int case_sensitive_f, int dot_files_last_f)
{
int dot_dot_found = 0;
@@ -239,6 +284,7 @@
reverse = reverse_f ? -1 : 1;
case_sensitive = case_sensitive_f;
+ dot_files_last = dot_files_last_f;
qsort (&(list->list) [dot_dot_found],
top + 1 - dot_dot_found, sizeof (file_entry), sort);
}
@@ -381,7 +427,7 @@
int
do_load_dir (const char *path, dir_list *list, sortfn *sort, int reverse,
- int case_sensitive, const char *filter)
+ int case_sensitive, int dot_files_last, const char *filter)
{
DIR *dirp;
struct dirent *dp;
@@ -427,7 +473,7 @@
}
if (next_free) {
- do_sort (list, sort, next_free - 1, reverse, case_sensitive);
+ do_sort (list, sort, next_free - 1, reverse, case_sensitive, dot_files_last);
}
mc_closedir (dirp);
@@ -483,7 +529,7 @@
/* If filter is null, then it is a match */
int
do_reload_dir (const char *path, dir_list *list, sortfn *sort, int count,
- int rev, int case_sensitive, const char *filter)
+ int rev, int case_sensitive, int dot_files_last, const char *filter)
{
DIR *dirp;
struct dirent *dp;
@@ -580,7 +626,7 @@
tree_store_end_check ();
g_hash_table_destroy (marked_files);
if (next_free) {
- do_sort (list, sort, next_free - 1, rev, case_sensitive);
+ do_sort (list, sort, next_free - 1, rev, case_sensitive, dot_files_last);
}
clean_dir (&dir_copy, count);
return next_free;
--- ../../org/mc/src/dir.h 2007-06-14 17:10:35.000000000 +0300
+++ dir.h 2007-06-14 19:21:55.000000000 +0300
@@ -31,11 +31,11 @@
typedef int sortfn (const void *, const void *);
int do_load_dir (const char *path, dir_list * list, sortfn * sort, int reverse,
- int case_sensitive, const char *filter);
+ int case_sensitive, int dot_files_last, const char *filter);
void do_sort (dir_list * list, sortfn * sort, int top, int reverse,
- int case_sensitive);
+ int case_sensitive, int dot_files_last_f);
int do_reload_dir (const char *path, dir_list * list, sortfn * sort, int count,
- int reverse, int case_sensitive, const char *filter);
+ int reverse, int case_sensitive, int dot_files_last, const char *filter);
void clean_dir (dir_list * list, int count);
int set_zero_dir (dir_list * list);
int handle_path (dir_list *list, const char *path, struct stat *buf1,
--- ../../org/mc/src/main.c 2007-06-14 17:10:35.000000000 +0300
+++ main.c 2007-06-14 19:50:34.000000000 +0300
@@ -608,7 +608,7 @@
panel_clean_dir (panel);
panel->count =
do_load_dir (panel->cwd, &panel->dir, panel->sort_type,
- panel->reverse, panel->case_sensitive, panel->filter);
+ panel->reverse, panel->case_sensitive, panel->dot_files_last, panel->filter);
try_to_select (panel, get_parent_dir_name (panel->cwd, olddir));
load_hint (0);
panel->dirty = 1;
@@ -758,7 +758,7 @@
return;
p = MENU_PANEL;
- sort_order = sort_box (p->sort_type, &p->reverse, &p->case_sensitive);
+ sort_order = sort_box (p->sort_type, &p->reverse, &p->case_sensitive, &p->dot_files_last);
panel_set_sort_order (p, sort_order);
--- ../../org/mc/src/panel.h 2007-06-14 17:10:35.000000000 +0300
+++ panel.h 2007-06-14 19:11:38.000000000 +0300
@@ -49,6 +49,7 @@
int selected; /* Index to the selected file */
int reverse; /* Show listing in reverse? */
int case_sensitive; /* Listing is case sensitive? */
+ int dot_files_last; /* Put hidden files at bottom of listing */
int split; /* Split panel to allow two columns */
int is_panelized; /* Flag: special filelisting, can't reload */
int frame_size; /* half or full frame */
--- ../../org/mc/src/screen.c 2007-06-14 17:10:35.000000000 +0300
+++ screen.c 2007-06-14 19:37:10.000000000 +0300
@@ -1050,7 +1050,7 @@
/* Load the default format */
panel->count =
do_load_dir (panel->cwd, &panel->dir, panel->sort_type,
- panel->reverse, panel->case_sensitive, panel->filter);
+ panel->reverse, panel->case_sensitive, panel->dot_files_last, panel->filter);
return panel;
}
@@ -1084,7 +1084,7 @@
panel->count =
do_reload_dir (panel->cwd, &panel->dir, panel->sort_type,
panel->count, panel->reverse, panel->case_sensitive,
- panel->filter);
+ panel->dot_files_last, panel->filter);
panel->dirty = 1;
if (panel->selected >= panel->count)
@@ -2460,7 +2460,7 @@
filename = g_strdup (selection (panel)->fname);
unselect_item (panel);
- do_sort (&panel->dir, panel->sort_type, panel->count-1, panel->reverse, panel->case_sensitive);
+ do_sort (&panel->dir, panel->sort_type, panel->count-1, panel->reverse, panel->case_sensitive, panel->dot_files_last);
panel->selected = -1;
for (i = panel->count; i; i--){
if (!strcmp (panel->dir.list [i-1].fname, filename)){
--- ../../org/mc/src/setup.c 2007-06-14 17:10:35.000000000 +0300
+++ setup.c 2007-06-14 20:26:37.000000000 +0300
@@ -244,6 +244,9 @@
save_string (section, "reverse", buffer, profile_name);
g_snprintf (buffer, sizeof (buffer), "%d", panel->case_sensitive);
save_string (section, "case_sensitive", buffer, profile_name);
+ g_snprintf (buffer, sizeof (buffer), "%d", panel->dot_files_last);
+ save_string (section, "dot_files_last", buffer, profile_name);
+
for (i = 0; sort_names [i].key; i++)
if (sort_names [i].sort_type == (sortfn *) panel->sort_type){
save_string (section, "sort_order",
@@ -385,6 +388,7 @@
panel->reverse = load_int (section, "reverse", 0);
panel->case_sensitive = load_int (section, "case_sensitive", OS_SORT_CASE_SENSITIVE_DEFAULT);
+ panel->dot_files_last = load_int (section, "dot_files_last", 0);
/* Load sort order */
load_string (section, "sort_order", "name", buffer, sizeof (buffer));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]