mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 12:56:51 +03:00
Merge branch '3212_panel_columns'
* 3212_panel_columns: Set number of brief columns in the "Listing mode" dialog box. (quick_dialog_skip): fix location of labeled input. Save/load brief columns to/from panels.ini. WPanel: support up to 9 columns in brief mode. Refactoring: use panel_lines() function instead of llines macro. (format_file): fix potential out-of-range and NULL dereference. Minor refactoring of file panel draw. Ticket #3212: support more than 2 columns in the file panel.
This commit is contained in:
commit
2641b2cc11
@ -826,8 +826,8 @@ and
|
|||||||
The full directory view shows the file name, the size of the file and
|
The full directory view shows the file name, the size of the file and
|
||||||
the modification time.
|
the modification time.
|
||||||
.PP
|
.PP
|
||||||
The brief view shows only the file name and it has two columns
|
The brief view shows only the file name and it has from 1 up to 9 columns
|
||||||
(therefore showing twice as many files as other views). The long view
|
(therefore showing more files unlike other views). The long view
|
||||||
is similar to the output of
|
is similar to the output of
|
||||||
.B "ls \-l"
|
.B "ls \-l"
|
||||||
command. The long view takes the whole screen width.
|
command. The long view takes the whole screen width.
|
||||||
|
@ -828,8 +828,9 @@ Commander\-ом (например, символ '+').
|
|||||||
В стандартном формате отображаются имя файла, его размер и время
|
В стандартном формате отображаются имя файла, его размер и время
|
||||||
последней модификации.
|
последней модификации.
|
||||||
.PP
|
.PP
|
||||||
В укороченном (brief) формате отображаются только имена файлов, за счет
|
В укороченном (brief) формате отображаются только имена файлов,
|
||||||
чего на панели умещаются две колонки (и видно вдвое больше имен).
|
расположенные в несколько колонок (от 1 до 9), за счет чего на панели
|
||||||
|
видно в несколько раз больше имен.
|
||||||
.PP
|
.PP
|
||||||
В расширенном (long) формате содержимое каталога представляется так, как
|
В расширенном (long) формате содержимое каталога представляется так, как
|
||||||
это делает команда
|
это делает команда
|
||||||
|
@ -477,9 +477,12 @@ quick_dialog_skip (quick_dialog_t * quick_dlg, int nskip)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case input_label_right:
|
case input_label_right:
|
||||||
label->x =
|
if (item->widget->x != x1)
|
||||||
item->widget->x + item->widget->cols + 1 - WIDGET (item->widget->owner)->x;
|
item->widget->x = x2;
|
||||||
|
if (g != NULL)
|
||||||
|
item->widget->x += 2;
|
||||||
item->widget->cols = width - label->cols - 1;
|
item->widget->cols = width - label->cols - 1;
|
||||||
|
label->x = item->widget->x + item->widget->cols + 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
Written by:
|
Written by:
|
||||||
Miguel de Icaza, 1994, 1995
|
Miguel de Icaza, 1994, 1995
|
||||||
Jakub Jelinek, 1995
|
Jakub Jelinek, 1995
|
||||||
Andrew Borodin <aborodin@vmail.ru>, 2009, 2010, 2011, 2012, 2013
|
Andrew Borodin <aborodin@vmail.ru>, 2009-2015
|
||||||
|
|
||||||
This file is part of the Midnight Commander.
|
This file is part of the Midnight Commander.
|
||||||
|
|
||||||
@ -95,12 +95,14 @@
|
|||||||
|
|
||||||
unsigned long configure_old_esc_mode_id, configure_time_out_id;
|
unsigned long configure_old_esc_mode_id, configure_time_out_id;
|
||||||
|
|
||||||
|
/* Index in list_types[] for "brief" */
|
||||||
|
static const int panel_listing_brief_idx = 1;
|
||||||
/* Index in list_types[] for "user defined" */
|
/* Index in list_types[] for "user defined" */
|
||||||
static const int panel_listing_user_idx = 3;
|
static const int panel_listing_user_idx = 3;
|
||||||
|
|
||||||
static char **status_format;
|
static char **status_format;
|
||||||
static int listing_user_hotkey = 'u';
|
static int listing_user_hotkey = 'u';
|
||||||
static unsigned long panel_listing_types_id, panel_user_format_id;
|
static unsigned long panel_listing_types_id, panel_user_format_id, panel_brief_cols_id;
|
||||||
static unsigned long mini_user_status_id, mini_user_format_id;
|
static unsigned long mini_user_status_id, mini_user_format_id;
|
||||||
|
|
||||||
#ifdef HAVE_CHARSET
|
#ifdef HAVE_CHARSET
|
||||||
@ -308,17 +310,20 @@ panel_listing_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
|
|||||||
if (sender != NULL && sender->id == panel_listing_types_id)
|
if (sender != NULL && sender->id == panel_listing_types_id)
|
||||||
{
|
{
|
||||||
WCheck *ch;
|
WCheck *ch;
|
||||||
WInput *in1, *in2;
|
WInput *in1, *in2, *in3;
|
||||||
|
|
||||||
in1 = INPUT (dlg_find_by_id (h, panel_user_format_id));
|
in1 = INPUT (dlg_find_by_id (h, panel_user_format_id));
|
||||||
|
in2 = INPUT (dlg_find_by_id (h, panel_brief_cols_id));
|
||||||
ch = CHECK (dlg_find_by_id (h, mini_user_status_id));
|
ch = CHECK (dlg_find_by_id (h, mini_user_status_id));
|
||||||
in2 = INPUT (dlg_find_by_id (h, mini_user_format_id));
|
in3 = INPUT (dlg_find_by_id (h, mini_user_format_id));
|
||||||
|
|
||||||
if (!(ch->state & C_BOOL))
|
if (!(ch->state & C_BOOL))
|
||||||
input_assign_text (in2, status_format[RADIO (sender)->sel]);
|
input_assign_text (in3, status_format[RADIO (sender)->sel]);
|
||||||
input_update (in2, FALSE);
|
|
||||||
input_update (in1, FALSE);
|
input_update (in1, FALSE);
|
||||||
|
input_update (in2, FALSE);
|
||||||
|
input_update (in3, FALSE);
|
||||||
widget_disable (WIDGET (in1), RADIO (sender)->sel != panel_listing_user_idx);
|
widget_disable (WIDGET (in1), RADIO (sender)->sel != panel_listing_user_idx);
|
||||||
|
widget_disable (WIDGET (in2), RADIO (sender)->sel != panel_listing_brief_idx);
|
||||||
return MSG_HANDLED;
|
return MSG_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -732,7 +737,8 @@ panel_options_box (void)
|
|||||||
|
|
||||||
/* return list type */
|
/* return list type */
|
||||||
int
|
int
|
||||||
panel_listing_box (WPanel * panel, char **userp, char **minip, int *use_msformat, int num)
|
panel_listing_box (WPanel * panel, int num, char **userp, char **minip, int *use_msformat,
|
||||||
|
int *brief_cols)
|
||||||
{
|
{
|
||||||
int result = -1;
|
int result = -1;
|
||||||
char *section = NULL;
|
char *section = NULL;
|
||||||
@ -761,6 +767,8 @@ panel_listing_box (WPanel * panel, char **userp, char **minip, int *use_msformat
|
|||||||
|
|
||||||
{
|
{
|
||||||
int mini_user_status;
|
int mini_user_status;
|
||||||
|
char panel_brief_cols_in[BUF_TINY];
|
||||||
|
char *panel_brief_cols_out = NULL;
|
||||||
char *panel_user_format = NULL;
|
char *panel_user_format = NULL;
|
||||||
char *mini_user_format = NULL;
|
char *mini_user_format = NULL;
|
||||||
const char *cp;
|
const char *cp;
|
||||||
@ -768,14 +776,21 @@ panel_listing_box (WPanel * panel, char **userp, char **minip, int *use_msformat
|
|||||||
/* Controls whether the array strings have been translated */
|
/* Controls whether the array strings have been translated */
|
||||||
const char *list_types[LIST_TYPES] = {
|
const char *list_types[LIST_TYPES] = {
|
||||||
N_("&Full file list"),
|
N_("&Full file list"),
|
||||||
N_("&Brief file list"),
|
N_("&Brief file list:"),
|
||||||
N_("&Long file list"),
|
N_("&Long file list"),
|
||||||
N_("&User defined:")
|
N_("&User defined:")
|
||||||
};
|
};
|
||||||
|
|
||||||
quick_widget_t quick_widgets[] = {
|
quick_widget_t quick_widgets[] = {
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
QUICK_RADIO (LIST_TYPES, list_types, &result, &panel_listing_types_id),
|
QUICK_START_COLUMNS,
|
||||||
|
QUICK_RADIO (LIST_TYPES, list_types, &result, &panel_listing_types_id),
|
||||||
|
QUICK_NEXT_COLUMN,
|
||||||
|
QUICK_SEPARATOR (FALSE),
|
||||||
|
QUICK_LABELED_INPUT (_ ("columns"), input_label_right, panel_brief_cols_in,
|
||||||
|
"panel-brief-cols-input", &panel_brief_cols_out,
|
||||||
|
&panel_brief_cols_id, FALSE, FALSE, INPUT_COMPLETE_NONE),
|
||||||
|
QUICK_STOP_COLUMNS,
|
||||||
QUICK_INPUT (panel->user_format, "user-fmt-input", &panel_user_format,
|
QUICK_INPUT (panel->user_format, "user-fmt-input", &panel_user_format,
|
||||||
&panel_user_format_id, FALSE, FALSE, INPUT_COMPLETE_NONE),
|
&panel_user_format_id, FALSE, FALSE, INPUT_COMPLETE_NONE),
|
||||||
QUICK_SEPARATOR (TRUE),
|
QUICK_SEPARATOR (TRUE),
|
||||||
@ -802,19 +817,35 @@ panel_listing_box (WPanel * panel, char **userp, char **minip, int *use_msformat
|
|||||||
result = panel->list_type;
|
result = panel->list_type;
|
||||||
status_format = panel->user_status_format;
|
status_format = panel->user_status_format;
|
||||||
|
|
||||||
|
g_snprintf (panel_brief_cols_in, sizeof (panel_brief_cols_in), "%d", panel->brief_cols);
|
||||||
|
|
||||||
|
if (panel->list_type != panel_listing_brief_idx)
|
||||||
|
quick_widgets[4].options = W_DISABLED;
|
||||||
|
|
||||||
if (panel->list_type != panel_listing_user_idx)
|
if (panel->list_type != panel_listing_user_idx)
|
||||||
quick_widgets[1].options = W_DISABLED;
|
quick_widgets[6].options = W_DISABLED;
|
||||||
|
|
||||||
if (!mini_user_status)
|
if (!mini_user_status)
|
||||||
quick_widgets[4].options = W_DISABLED;
|
quick_widgets[9].options = W_DISABLED;
|
||||||
|
|
||||||
if (quick_dialog (&qdlg) == B_CANCEL)
|
if (quick_dialog (&qdlg) == B_CANCEL)
|
||||||
result = -1;
|
result = -1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
int cols;
|
||||||
|
char *error = NULL;
|
||||||
|
|
||||||
*userp = panel_user_format;
|
*userp = panel_user_format;
|
||||||
*minip = mini_user_format;
|
*minip = mini_user_format;
|
||||||
*use_msformat = mini_user_status;
|
*use_msformat = mini_user_status;
|
||||||
|
|
||||||
|
cols = strtol (panel_brief_cols_out, &error, 10);
|
||||||
|
if (*error == '\0')
|
||||||
|
*brief_cols = cols;
|
||||||
|
else
|
||||||
|
*brief_cols = panel->brief_cols;
|
||||||
|
|
||||||
|
g_free (panel_brief_cols_out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@
|
|||||||
void configure_box (void);
|
void configure_box (void);
|
||||||
void appearance_box (void);
|
void appearance_box (void);
|
||||||
void panel_options_box (void);
|
void panel_options_box (void);
|
||||||
int panel_listing_box (WPanel * p, char **user, char **mini, int *use_msformat, int num);
|
int panel_listing_box (WPanel * p, int num, char **user, char **mini, int *use_msformat,
|
||||||
|
int *brief_cols);
|
||||||
const panel_field_t *sort_box (dir_sort_options_t * op, const panel_field_t * sort_field);
|
const panel_field_t *sort_box (dir_sort_options_t * op, const panel_field_t * sort_field);
|
||||||
void confirm_box (void);
|
void confirm_box (void);
|
||||||
void display_bits_box (void);
|
void display_bits_box (void);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
Written by:
|
Written by:
|
||||||
Andrew Borodin <aborodin@vmail.ru>, 2013
|
Andrew Borodin <aborodin@vmail.ru>, 2013-2015
|
||||||
|
|
||||||
This file is part of the Midnight Commander.
|
This file is part of the Midnight Commander.
|
||||||
|
|
||||||
@ -466,12 +466,15 @@ nice_cd (const char *text, const char *xtext, const char *help,
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
configure_panel_listing (WPanel * p, int list_type, int use_msformat, char *user, char *status)
|
configure_panel_listing (WPanel * p, int list_type, int brief_cols, int use_msformat, char *user,
|
||||||
|
char *status)
|
||||||
{
|
{
|
||||||
p->user_mini_status = use_msformat;
|
p->user_mini_status = use_msformat;
|
||||||
p->list_type = list_type;
|
p->list_type = list_type;
|
||||||
|
|
||||||
if (list_type == list_user || use_msformat)
|
if (list_type == list_brief)
|
||||||
|
p->brief_cols = brief_cols;
|
||||||
|
else if (list_type == list_user || use_msformat)
|
||||||
{
|
{
|
||||||
g_free (p->user_format);
|
g_free (p->user_format);
|
||||||
p->user_format = user;
|
p->user_format = user;
|
||||||
@ -1642,19 +1645,19 @@ void
|
|||||||
change_listing_cmd (void)
|
change_listing_cmd (void)
|
||||||
{
|
{
|
||||||
int list_type;
|
int list_type;
|
||||||
int use_msformat;
|
int use_msformat, brief_cols;
|
||||||
char *user, *status;
|
char *user, *status;
|
||||||
WPanel *p = NULL;
|
WPanel *p = NULL;
|
||||||
|
|
||||||
if (SELECTED_IS_PANEL)
|
if (SELECTED_IS_PANEL)
|
||||||
p = MENU_PANEL_IDX == 0 ? left_panel : right_panel;
|
p = MENU_PANEL_IDX == 0 ? left_panel : right_panel;
|
||||||
|
|
||||||
list_type = panel_listing_box (p, &user, &status, &use_msformat, MENU_PANEL_IDX);
|
list_type = panel_listing_box (p, MENU_PANEL_IDX, &user, &status, &use_msformat, &brief_cols);
|
||||||
if (list_type != -1)
|
if (list_type != -1)
|
||||||
{
|
{
|
||||||
switch_to_listing (MENU_PANEL_IDX);
|
switch_to_listing (MENU_PANEL_IDX);
|
||||||
p = MENU_PANEL_IDX == 0 ? left_panel : right_panel;
|
p = MENU_PANEL_IDX == 0 ? left_panel : right_panel;
|
||||||
configure_panel_listing (p, list_type, use_msformat, user, status);
|
configure_panel_listing (p, list_type, brief_cols, use_msformat, user, status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
Miguel de Icaza, 1995
|
Miguel de Icaza, 1995
|
||||||
Timur Bakeyev, 1997, 1999
|
Timur Bakeyev, 1997, 1999
|
||||||
Slava Zanko <slavazanko@gmail.com>, 2013
|
Slava Zanko <slavazanko@gmail.com>, 2013
|
||||||
Andrew Borodin <aborodin@vmail.ru>, 2013
|
Andrew Borodin <aborodin@vmail.ru>, 2013-2015
|
||||||
|
|
||||||
This file is part of the Midnight Commander.
|
This file is part of the Midnight Commander.
|
||||||
|
|
||||||
@ -320,9 +320,6 @@ extern int saving_setup;
|
|||||||
#define MARKED_SELECTED 3
|
#define MARKED_SELECTED 3
|
||||||
#define STATUS 5
|
#define STATUS 5
|
||||||
|
|
||||||
/* This macro extracts the number of available lines in a panel */
|
|
||||||
#define llines(p) (WIDGET (p)->lines - 3 - (panels_options.show_mini_info ? 2 : 0))
|
|
||||||
|
|
||||||
/*** file scope type declarations ****************************************************************/
|
/*** file scope type declarations ****************************************************************/
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
@ -375,11 +372,13 @@ static WPanel *mouse_mark_panel = NULL;
|
|||||||
|
|
||||||
static int mouse_marking = 0;
|
static int mouse_marking = 0;
|
||||||
static int state_mark = 0;
|
static int state_mark = 0;
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/*** file scope functions ************************************************************************/
|
/*** file scope functions ************************************************************************/
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_colors (WPanel * panel)
|
set_colors (const WPanel * panel)
|
||||||
{
|
{
|
||||||
(void) panel;
|
(void) panel;
|
||||||
|
|
||||||
@ -402,12 +401,22 @@ delete_format (format_e * format)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
/** Extract the number of available lines in a panel */
|
||||||
|
|
||||||
|
static int
|
||||||
|
panel_lines (const WPanel * p)
|
||||||
|
{
|
||||||
|
/* 3 lines are: top frame, column header, botton frame */
|
||||||
|
return (WIDGET (p)->lines - 3 - (panels_options.show_mini_info ? 2 : 0));
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/** This code relies on the default justification!!! */
|
/** This code relies on the default justification!!! */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_permission_string (const char *dest, int width, file_entry_t * fe, int attr, int color,
|
add_permission_string (const char *dest, int width, file_entry_t * fe, int attr, int color,
|
||||||
int is_octal)
|
gboolean is_octal)
|
||||||
{
|
{
|
||||||
int i, r, l;
|
int i, r, l;
|
||||||
|
|
||||||
@ -767,6 +776,15 @@ file_compute_color (int attr, file_entry_t * fe)
|
|||||||
return mc_fhl_get_color (mc_filehighlight, fe);
|
return mc_fhl_get_color (mc_filehighlight, fe);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
/** Returns the number of items in the given panel */
|
||||||
|
|
||||||
|
static int
|
||||||
|
panel_items (const WPanel * p)
|
||||||
|
{
|
||||||
|
return panel_lines (p) * p->list_cols;
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/** Formats the file number file_index of panel in the buffer dest */
|
/** Formats the file number file_index of panel in the buffer dest */
|
||||||
|
|
||||||
@ -774,32 +792,33 @@ static filename_scroll_flag_t
|
|||||||
format_file (WPanel * panel, int file_index, int width, int attr, gboolean isstatus,
|
format_file (WPanel * panel, int file_index, int width, int attr, gboolean isstatus,
|
||||||
int *field_length)
|
int *field_length)
|
||||||
{
|
{
|
||||||
int color, length = 0, empty_line;
|
int color = NORMAL_COLOR;
|
||||||
|
int length = 0;
|
||||||
format_e *format, *home;
|
format_e *format, *home;
|
||||||
file_entry_t *fe;
|
file_entry_t *fe = NULL;
|
||||||
filename_scroll_flag_t res = FILENAME_NOSCROLL;
|
filename_scroll_flag_t res = FILENAME_NOSCROLL;
|
||||||
|
|
||||||
empty_line = (file_index >= panel->dir.len);
|
|
||||||
home = isstatus ? panel->status_format : panel->format;
|
|
||||||
fe = &panel->dir.list[file_index];
|
|
||||||
*field_length = 0;
|
*field_length = 0;
|
||||||
|
|
||||||
if (!empty_line)
|
if (file_index < panel->dir.len)
|
||||||
|
{
|
||||||
|
fe = &panel->dir.list[file_index];
|
||||||
color = file_compute_color (attr, fe);
|
color = file_compute_color (attr, fe);
|
||||||
else
|
}
|
||||||
color = NORMAL_COLOR;
|
|
||||||
|
home = isstatus ? panel->status_format : panel->format;
|
||||||
|
|
||||||
for (format = home; format != NULL && length != width; format = format->next)
|
for (format = home; format != NULL && length != width; format = format->next)
|
||||||
{
|
{
|
||||||
if (format->string_fn)
|
if (format->string_fn != NULL)
|
||||||
{
|
{
|
||||||
const char *txt = " ";
|
const char *txt = " ";
|
||||||
int len, perm;
|
int len, perm = 0;
|
||||||
const char *prepared_text;
|
const char *prepared_text;
|
||||||
int name_offset = 0;
|
int name_offset = 0;
|
||||||
|
|
||||||
if (!empty_line)
|
if (fe != NULL)
|
||||||
txt = (*format->string_fn) (fe, format->field_len);
|
txt = format->string_fn (fe, format->field_len);
|
||||||
|
|
||||||
len = format->field_len;
|
len = format->field_len;
|
||||||
if (len + length > width)
|
if (len + length > width)
|
||||||
@ -831,12 +850,11 @@ format_file (WPanel * panel, int file_index, int width, int attr, gboolean issta
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
perm = 0;
|
|
||||||
if (panels_options.permission_mode)
|
if (panels_options.permission_mode)
|
||||||
{
|
{
|
||||||
if (!strcmp (format->id, "perm"))
|
if (strcmp (format->id, "perm") == 0)
|
||||||
perm = 1;
|
perm = 1;
|
||||||
else if (!strcmp (format->id, "mode"))
|
else if (strcmp (format->id, "mode") == 0)
|
||||||
perm = 2;
|
perm = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -851,8 +869,9 @@ format_file (WPanel * panel, int file_index, int width, int attr, gboolean issta
|
|||||||
else
|
else
|
||||||
prepared_text = str_fit_to_term (txt, len, format->just_mode);
|
prepared_text = str_fit_to_term (txt, len, format->just_mode);
|
||||||
|
|
||||||
if (perm)
|
if (perm != 0 && fe != NULL)
|
||||||
add_permission_string (prepared_text, format->field_len, fe, attr, color, perm - 1);
|
add_permission_string (prepared_text, format->field_len, fe, attr, color,
|
||||||
|
perm != 1);
|
||||||
else
|
else
|
||||||
tty_print_string (prepared_text);
|
tty_print_string (prepared_text);
|
||||||
|
|
||||||
@ -887,26 +906,26 @@ repaint_file (WPanel * panel, int file_index, gboolean mv, int attr, gboolean is
|
|||||||
{
|
{
|
||||||
Widget *w = WIDGET (panel);
|
Widget *w = WIDGET (panel);
|
||||||
|
|
||||||
int second_column = 0;
|
int nth_column = 0;
|
||||||
int width;
|
int width;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
filename_scroll_flag_t ret_frm;
|
filename_scroll_flag_t ret_frm;
|
||||||
int ypos = 0;
|
int ypos = 0;
|
||||||
gboolean panel_is_split = !isstatus && panel->split;
|
gboolean panel_is_split;
|
||||||
int fln = 0;
|
int fln = 0;
|
||||||
|
|
||||||
|
panel_is_split = !isstatus && panel->list_cols > 1;
|
||||||
width = w->cols - 2;
|
width = w->cols - 2;
|
||||||
|
|
||||||
if (panel_is_split)
|
if (panel_is_split)
|
||||||
{
|
{
|
||||||
second_column = (file_index - panel->top_file) / llines (panel);
|
nth_column = (file_index - panel->top_file) / panel_lines (panel);
|
||||||
width = width / 2 - 1;
|
width /= panel->list_cols;
|
||||||
|
|
||||||
if (second_column != 0)
|
offset = width * nth_column;
|
||||||
{
|
|
||||||
offset = 1 + width;
|
if (nth_column + 1 >= panel->list_cols)
|
||||||
width = w->cols - offset - 2;
|
width = w->cols - offset - 2;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Nothing to paint */
|
/* Nothing to paint */
|
||||||
@ -915,41 +934,34 @@ repaint_file (WPanel * panel, int file_index, gboolean mv, int attr, gboolean is
|
|||||||
|
|
||||||
if (mv)
|
if (mv)
|
||||||
{
|
{
|
||||||
int pos = file_index - panel->top_file;
|
ypos = file_index - panel->top_file;
|
||||||
|
|
||||||
if (panel_is_split)
|
if (panel_is_split)
|
||||||
ypos = pos % llines (panel);
|
ypos %= panel_lines (panel);
|
||||||
else
|
|
||||||
ypos = pos;
|
|
||||||
|
|
||||||
ypos += 2;
|
ypos += 2; /* top frame and header */
|
||||||
widget_move (w, ypos, offset + 1);
|
widget_move (w, ypos, offset + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret_frm = format_file (panel, file_index, width, attr, isstatus, &fln);
|
ret_frm = format_file (panel, file_index, width, attr, isstatus, &fln);
|
||||||
|
|
||||||
if (panel_is_split)
|
if (panel_is_split && nth_column + 1 < panel->list_cols)
|
||||||
{
|
{
|
||||||
if (second_column)
|
tty_setcolor (NORMAL_COLOR);
|
||||||
tty_print_char (' ');
|
tty_print_one_vline (TRUE);
|
||||||
else
|
|
||||||
{
|
|
||||||
tty_setcolor (NORMAL_COLOR);
|
|
||||||
tty_print_one_vline (TRUE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret_frm != FILENAME_NOSCROLL && mv)
|
if (ret_frm != FILENAME_NOSCROLL && mv)
|
||||||
{
|
{
|
||||||
if (!panel_is_split && fln > 0)
|
if (!panel_is_split && fln > 0)
|
||||||
{
|
{
|
||||||
if (panel->list_type == list_long)
|
if (panel->list_type != list_long)
|
||||||
|
width = fln;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
offset = width - fln + 1;
|
offset = width - fln + 1;
|
||||||
width = fln - 1;
|
width = fln - 1;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
width = fln;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
widget_move (w, ypos, offset);
|
widget_move (w, ypos, offset);
|
||||||
@ -958,7 +970,11 @@ repaint_file (WPanel * panel, int file_index, gboolean mv, int attr, gboolean is
|
|||||||
|
|
||||||
if ((ret_frm & FILENAME_SCROLL_RIGHT) != 0)
|
if ((ret_frm & FILENAME_SCROLL_RIGHT) != 0)
|
||||||
{
|
{
|
||||||
widget_move (w, ypos, offset + 1 + width);
|
offset += width;
|
||||||
|
if (nth_column + 1 >= panel->list_cols)
|
||||||
|
offset++;
|
||||||
|
|
||||||
|
widget_move (w, ypos, offset);
|
||||||
tty_setcolor (NORMAL_COLOR);
|
tty_setcolor (NORMAL_COLOR);
|
||||||
tty_print_string (panel_filename_scroll_right_char);
|
tty_print_string (panel_filename_scroll_right_char);
|
||||||
}
|
}
|
||||||
@ -975,7 +991,7 @@ display_mini_info (WPanel * panel)
|
|||||||
if (!panels_options.show_mini_info)
|
if (!panels_options.show_mini_info)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
widget_move (w, llines (panel) + 3, 1);
|
widget_move (w, panel_lines (panel) + 3, 1);
|
||||||
|
|
||||||
if (panel->searching)
|
if (panel->searching)
|
||||||
{
|
{
|
||||||
@ -1028,7 +1044,7 @@ paint_dir (WPanel * panel)
|
|||||||
int i;
|
int i;
|
||||||
int items; /* Number of items */
|
int items; /* Number of items */
|
||||||
|
|
||||||
items = llines (panel) * (panel->split ? 2 : 1);
|
items = panel_items (panel);
|
||||||
/* reset max len of filename because we have the new max length for the new file list */
|
/* reset max len of filename because we have the new max length for the new file list */
|
||||||
panel->max_shift = -1;
|
panel->max_shift = -1;
|
||||||
|
|
||||||
@ -1051,7 +1067,7 @@ paint_dir (WPanel * panel)
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
display_total_marked_size (WPanel * panel, int y, int x, gboolean size_only)
|
display_total_marked_size (const WPanel * panel, int y, int x, gboolean size_only)
|
||||||
{
|
{
|
||||||
Widget *w = WIDGET (panel);
|
Widget *w = WIDGET (panel);
|
||||||
|
|
||||||
@ -1084,8 +1100,8 @@ display_total_marked_size (WPanel * panel, int y, int x, gboolean size_only)
|
|||||||
x = (w->cols - str_term_width1 (buf)) / 2 - 1;
|
x = (w->cols - str_term_width1 (buf)) / 2 - 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* y == llines (panel) + 2 for mini_info_separator
|
* y == panel_lines (panel) + 2 for mini_info_separator
|
||||||
* y == w->lines - 1 for panel bottom frame
|
* y == w->lines - 1 for panel bottom frame
|
||||||
*/
|
*/
|
||||||
widget_move (w, y, x);
|
widget_move (w, y, x);
|
||||||
tty_setcolor (MARKED_COLOR);
|
tty_setcolor (MARKED_COLOR);
|
||||||
@ -1095,12 +1111,14 @@ display_total_marked_size (WPanel * panel, int y, int x, gboolean size_only)
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mini_info_separator (WPanel * panel)
|
mini_info_separator (const WPanel * panel)
|
||||||
{
|
{
|
||||||
if (panels_options.show_mini_info)
|
if (panels_options.show_mini_info)
|
||||||
{
|
{
|
||||||
Widget *w = WIDGET (panel);
|
Widget *w = WIDGET (panel);
|
||||||
const int y = llines (panel) + 2;
|
int y;
|
||||||
|
|
||||||
|
y = panel_lines (panel) + 2;
|
||||||
|
|
||||||
tty_setcolor (NORMAL_COLOR);
|
tty_setcolor (NORMAL_COLOR);
|
||||||
tty_draw_hline (w->y + y, w->x + 1, ACS_HLINE, w->cols - 2);
|
tty_draw_hline (w->y + y, w->x + 1, ACS_HLINE, w->cols - 2);
|
||||||
@ -1113,7 +1131,7 @@ mini_info_separator (WPanel * panel)
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_free_space (WPanel * panel)
|
show_free_space (const WPanel * panel)
|
||||||
{
|
{
|
||||||
/* Used to figure out how many free space we have */
|
/* Used to figure out how many free space we have */
|
||||||
static struct my_statfs myfs_stats;
|
static struct my_statfs myfs_stats;
|
||||||
@ -1167,7 +1185,7 @@ show_free_space (WPanel * panel)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
panel_correct_path_to_show (WPanel * panel)
|
panel_correct_path_to_show (const WPanel * panel)
|
||||||
{
|
{
|
||||||
vfs_path_t *last_vpath;
|
vfs_path_t *last_vpath;
|
||||||
const vfs_path_element_t *path_element;
|
const vfs_path_element_t *path_element;
|
||||||
@ -1179,7 +1197,6 @@ panel_correct_path_to_show (WPanel * panel)
|
|||||||
/* get last path element */
|
/* get last path element */
|
||||||
path_element = vfs_path_element_clone (vfs_path_get_by_index (panel->cwd_vpath, -1));
|
path_element = vfs_path_element_clone (vfs_path_get_by_index (panel->cwd_vpath, -1));
|
||||||
|
|
||||||
|
|
||||||
if (elements_count > 1 && (strcmp (path_element->class->name, "cpiofs") == 0 ||
|
if (elements_count > 1 && (strcmp (path_element->class->name, "cpiofs") == 0 ||
|
||||||
strcmp (path_element->class->name, "extfs") == 0 ||
|
strcmp (path_element->class->name, "extfs") == 0 ||
|
||||||
strcmp (path_element->class->name, "tarfs") == 0))
|
strcmp (path_element->class->name, "tarfs") == 0))
|
||||||
@ -1224,7 +1241,7 @@ panel_correct_path_to_show (WPanel * panel)
|
|||||||
|
|
||||||
#ifdef HAVE_CHARSET
|
#ifdef HAVE_CHARSET
|
||||||
static char *
|
static char *
|
||||||
panel_get_encoding_info_str (WPanel * panel)
|
panel_get_encoding_info_str (const WPanel * panel)
|
||||||
{
|
{
|
||||||
char *ret_str = NULL;
|
char *ret_str = NULL;
|
||||||
const vfs_path_element_t *path_element;
|
const vfs_path_element_t *path_element;
|
||||||
@ -1240,7 +1257,7 @@ panel_get_encoding_info_str (WPanel * panel)
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_dir (WPanel * panel)
|
show_dir (const WPanel * panel)
|
||||||
{
|
{
|
||||||
Widget *w = WIDGET (panel);
|
Widget *w = WIDGET (panel);
|
||||||
|
|
||||||
@ -1251,9 +1268,13 @@ show_dir (WPanel * panel)
|
|||||||
|
|
||||||
if (panels_options.show_mini_info)
|
if (panels_options.show_mini_info)
|
||||||
{
|
{
|
||||||
widget_move (w, llines (panel) + 2, 0);
|
int y;
|
||||||
|
|
||||||
|
y = panel_lines (panel) + 2;
|
||||||
|
|
||||||
|
widget_move (w, y, 0);
|
||||||
tty_print_alt_char (ACS_LTEE, FALSE);
|
tty_print_alt_char (ACS_LTEE, FALSE);
|
||||||
widget_move (w, llines (panel) + 2, w->cols - 1);
|
widget_move (w, y, w->cols - 1);
|
||||||
tty_print_alt_char (ACS_RTEE, FALSE);
|
tty_print_alt_char (ACS_RTEE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1326,22 +1347,12 @@ show_dir (WPanel * panel)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
/* Returns the number of items in the given panel */
|
|
||||||
static int
|
|
||||||
ITEMS (WPanel * p)
|
|
||||||
{
|
|
||||||
if (p->split)
|
|
||||||
return llines (p) * 2;
|
|
||||||
|
|
||||||
return llines (p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
adjust_top_file (WPanel * panel)
|
adjust_top_file (WPanel * panel)
|
||||||
{
|
{
|
||||||
int items = ITEMS (panel);
|
int items;
|
||||||
|
|
||||||
|
items = panel_items (panel);
|
||||||
|
|
||||||
if (panel->dir.len <= items)
|
if (panel->dir.len <= items)
|
||||||
{
|
{
|
||||||
@ -1503,7 +1514,7 @@ panel_format_modified (WPanel * panel)
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
panel_paint_sort_info (WPanel * panel)
|
panel_paint_sort_info (const WPanel * panel)
|
||||||
{
|
{
|
||||||
if (*panel->sort_field->hotkey != '\0')
|
if (*panel->sort_field->hotkey != '\0')
|
||||||
{
|
{
|
||||||
@ -1544,40 +1555,28 @@ panel_get_title_without_hotkey (const char *title)
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
paint_frame (WPanel * panel)
|
panel_print_header (const WPanel * panel)
|
||||||
{
|
{
|
||||||
Widget *w = WIDGET (panel);
|
Widget *w = WIDGET (panel);
|
||||||
|
|
||||||
int side, width;
|
int y, x;
|
||||||
|
int i;
|
||||||
adjust_top_file (panel);
|
GString *format_txt;
|
||||||
|
|
||||||
widget_erase (w);
|
|
||||||
show_dir (panel);
|
|
||||||
|
|
||||||
widget_move (w, 1, 1);
|
widget_move (w, 1, 1);
|
||||||
|
tty_getyx (&y, &x);
|
||||||
|
tty_setcolor (NORMAL_COLOR);
|
||||||
|
tty_draw_hline (y, x, ' ', w->cols - 2);
|
||||||
|
|
||||||
for (side = 0; side <= panel->split; side++)
|
format_txt = g_string_new ("");
|
||||||
|
|
||||||
|
for (i = 0; i < panel->list_cols; i++)
|
||||||
{
|
{
|
||||||
GString *format_txt;
|
|
||||||
format_e *format;
|
format_e *format;
|
||||||
|
|
||||||
if (side)
|
for (format = panel->format; format != NULL; format = format->next)
|
||||||
{
|
{
|
||||||
tty_setcolor (NORMAL_COLOR);
|
if (format->string_fn != NULL)
|
||||||
tty_print_one_vline (TRUE);
|
|
||||||
width = w->cols - w->cols / 2 - 1;
|
|
||||||
}
|
|
||||||
else if (panel->split)
|
|
||||||
width = w->cols / 2 - 3;
|
|
||||||
else
|
|
||||||
width = w->cols - 2;
|
|
||||||
|
|
||||||
format_txt = g_string_new ("");
|
|
||||||
|
|
||||||
for (format = panel->format; format; format = format->next)
|
|
||||||
{
|
|
||||||
if (format->string_fn)
|
|
||||||
{
|
{
|
||||||
g_string_set_size (format_txt, 0);
|
g_string_set_size (format_txt, 0);
|
||||||
|
|
||||||
@ -1589,7 +1588,8 @@ paint_frame (WPanel * panel)
|
|||||||
|
|
||||||
g_string_append (format_txt, format->title);
|
g_string_append (format_txt, format->title);
|
||||||
|
|
||||||
if (strcmp (format->id, "name") == 0 && panel->filter && *panel->filter)
|
if (panel->filter != NULL && *panel->filter != '\0'
|
||||||
|
&& strcmp (format->id, "name") == 0)
|
||||||
{
|
{
|
||||||
g_string_append (format_txt, " [");
|
g_string_append (format_txt, " [");
|
||||||
g_string_append (format_txt, panel->filter);
|
g_string_append (format_txt, panel->filter);
|
||||||
@ -1599,26 +1599,23 @@ paint_frame (WPanel * panel)
|
|||||||
tty_setcolor (HEADER_COLOR);
|
tty_setcolor (HEADER_COLOR);
|
||||||
tty_print_string (str_fit_to_term (format_txt->str, format->field_len,
|
tty_print_string (str_fit_to_term (format_txt->str, format->field_len,
|
||||||
J_CENTER_LEFT));
|
J_CENTER_LEFT));
|
||||||
width -= format->field_len;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tty_setcolor (NORMAL_COLOR);
|
tty_setcolor (NORMAL_COLOR);
|
||||||
tty_print_one_vline (TRUE);
|
tty_print_one_vline (TRUE);
|
||||||
width--;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_string_free (format_txt, TRUE);
|
|
||||||
|
|
||||||
if (width > 0)
|
if (i < panel->list_cols - 1)
|
||||||
{
|
{
|
||||||
int y, x;
|
tty_setcolor (NORMAL_COLOR);
|
||||||
|
tty_print_one_vline (TRUE);
|
||||||
tty_getyx (&y, &x);
|
|
||||||
tty_draw_hline (y, x, ' ', width);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_string_free (format_txt, TRUE);
|
||||||
|
|
||||||
if (panel->list_type != list_long)
|
if (panel->list_type != list_long)
|
||||||
panel_paint_sort_info (panel);
|
panel_paint_sort_info (panel);
|
||||||
}
|
}
|
||||||
@ -1631,12 +1628,12 @@ parse_panel_size (WPanel * panel, const char *format, gboolean isstatus)
|
|||||||
panel_display_t frame = frame_half;
|
panel_display_t frame = frame_half;
|
||||||
format = skip_separators (format);
|
format = skip_separators (format);
|
||||||
|
|
||||||
if (!strncmp (format, "full", 4))
|
if (strncmp (format, "full", 4) == 0)
|
||||||
{
|
{
|
||||||
frame = frame_full;
|
frame = frame_full;
|
||||||
format += 4;
|
format += 4;
|
||||||
}
|
}
|
||||||
else if (!strncmp (format, "half", 4))
|
else if (strncmp (format, "half", 4) == 0)
|
||||||
{
|
{
|
||||||
frame = frame_half;
|
frame = frame_half;
|
||||||
format += 4;
|
format += 4;
|
||||||
@ -1645,16 +1642,23 @@ parse_panel_size (WPanel * panel, const char *format, gboolean isstatus)
|
|||||||
if (!isstatus)
|
if (!isstatus)
|
||||||
{
|
{
|
||||||
panel->frame_size = frame;
|
panel->frame_size = frame;
|
||||||
panel->split = 0;
|
panel->list_cols = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now, the optional column specifier */
|
/* Now, the optional column specifier */
|
||||||
format = skip_separators (format);
|
format = skip_separators (format);
|
||||||
|
|
||||||
if (*format == '1' || *format == '2')
|
if (g_ascii_isdigit (*format))
|
||||||
{
|
{
|
||||||
if (!isstatus)
|
if (!isstatus && panel->list_type == list_brief)
|
||||||
panel->split = *format == '2';
|
{
|
||||||
|
panel->brief_cols = g_ascii_digit_value (*format);
|
||||||
|
if (panel->brief_cols < 1)
|
||||||
|
panel->brief_cols = 1;
|
||||||
|
|
||||||
|
panel->list_cols = panel->brief_cols;
|
||||||
|
}
|
||||||
|
|
||||||
format++;
|
format++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1667,7 +1671,7 @@ parse_panel_size (WPanel * panel, const char *format, gboolean isstatus)
|
|||||||
/* Format is:
|
/* Format is:
|
||||||
|
|
||||||
all := panel_format? format
|
all := panel_format? format
|
||||||
panel_format := [full|half] [1|2]
|
panel_format := [full|half] [1-9]
|
||||||
format := one_format_e
|
format := one_format_e
|
||||||
| format , one_format_e
|
| format , one_format_e
|
||||||
|
|
||||||
@ -1685,13 +1689,13 @@ static format_e *
|
|||||||
parse_display_format (WPanel * panel, const char *format, char **error, gboolean isstatus,
|
parse_display_format (WPanel * panel, const char *format, char **error, gboolean isstatus,
|
||||||
int *res_total_cols)
|
int *res_total_cols)
|
||||||
{
|
{
|
||||||
format_e *darr, *old = 0, *home = 0; /* The formats we return */
|
format_e *darr, *old = NULL, *home = NULL; /* The formats we return */
|
||||||
int total_cols = 0; /* Used columns by the format */
|
int total_cols = 0; /* Used columns by the format */
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
static size_t i18n_timelength = 0; /* flag: check ?Time length at startup */
|
static size_t i18n_timelength = 0; /* flag: check ?Time length at startup */
|
||||||
|
|
||||||
*error = 0;
|
*error = NULL;
|
||||||
|
|
||||||
if (i18n_timelength == 0)
|
if (i18n_timelength == 0)
|
||||||
{
|
{
|
||||||
@ -1708,7 +1712,7 @@ parse_display_format (WPanel * panel, const char *format, char **error, gboolean
|
|||||||
*/
|
*/
|
||||||
format = parse_panel_size (panel, format, isstatus);
|
format = parse_panel_size (panel, format, isstatus);
|
||||||
|
|
||||||
while (*format)
|
while (*format != '\0')
|
||||||
{ /* format can be an empty string */
|
{ /* format can be an empty string */
|
||||||
align_crt_t justify; /* Which mode. */
|
align_crt_t justify; /* Which mode. */
|
||||||
gboolean set_justify = TRUE; /* flag: set justification mode? */
|
gboolean set_justify = TRUE; /* flag: set justification mode? */
|
||||||
@ -1717,11 +1721,11 @@ parse_display_format (WPanel * panel, const char *format, char **error, gboolean
|
|||||||
darr = g_new0 (format_e, 1);
|
darr = g_new0 (format_e, 1);
|
||||||
|
|
||||||
/* I'm so ugly, don't look at me :-) */
|
/* I'm so ugly, don't look at me :-) */
|
||||||
if (!home)
|
if (home == NULL)
|
||||||
home = old = darr;
|
home = old = darr;
|
||||||
|
|
||||||
old->next = darr;
|
old->next = darr;
|
||||||
darr->next = 0;
|
darr->next = NULL;
|
||||||
old = darr;
|
old = darr;
|
||||||
|
|
||||||
format = skip_separators (format);
|
format = skip_separators (format);
|
||||||
@ -1748,7 +1752,9 @@ parse_display_format (WPanel * panel, const char *format, char **error, gboolean
|
|||||||
|
|
||||||
for (i = 0; panel_fields[i].id != NULL; i++)
|
for (i = 0; panel_fields[i].id != NULL; i++)
|
||||||
{
|
{
|
||||||
size_t klen = strlen (panel_fields[i].id);
|
size_t klen;
|
||||||
|
|
||||||
|
klen = strlen (panel_fields[i].id);
|
||||||
|
|
||||||
if (strncmp (format, panel_fields[i].id, klen) != 0)
|
if (strncmp (format, panel_fields[i].id, klen) != 0)
|
||||||
continue;
|
continue;
|
||||||
@ -1803,16 +1809,20 @@ parse_display_format (WPanel * panel, const char *format, char **error, gboolean
|
|||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
char *tmp_format = g_strdup (format);
|
size_t pos;
|
||||||
|
char *tmp_format;
|
||||||
|
|
||||||
int pos = min (8, strlen (format));
|
pos = strlen (format);
|
||||||
|
if (pos > 8)
|
||||||
|
pos = 8;
|
||||||
|
|
||||||
|
tmp_format = g_strndup (format, pos);
|
||||||
delete_format (home);
|
delete_format (home);
|
||||||
tmp_format[pos] = 0;
|
|
||||||
*error =
|
*error =
|
||||||
g_strconcat (_("Unknown tag on display format:"), " ", tmp_format, (char *) NULL);
|
g_strconcat (_("Unknown tag on display format:"), " ", tmp_format, (char *) NULL);
|
||||||
g_free (tmp_format);
|
g_free (tmp_format);
|
||||||
|
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
total_cols += darr->requested_field_len;
|
total_cols += darr->requested_field_len;
|
||||||
@ -1833,28 +1843,27 @@ use_display_format (WPanel * panel, const char *format, char **error, gboolean i
|
|||||||
int total_cols = 0;
|
int total_cols = 0;
|
||||||
format_e *darr, *home;
|
format_e *darr, *home;
|
||||||
|
|
||||||
if (!format)
|
if (format == NULL)
|
||||||
format = DEFAULT_USER_FORMAT;
|
format = DEFAULT_USER_FORMAT;
|
||||||
|
|
||||||
home = parse_display_format (panel, format, error, isstatus, &total_cols);
|
home = parse_display_format (panel, format, error, isstatus, &total_cols);
|
||||||
|
|
||||||
if (*error)
|
if (*error != NULL)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
panel->dirty = 1;
|
panel->dirty = 1;
|
||||||
|
|
||||||
usable_columns = WIDGET (panel)->cols - 2;
|
usable_columns = WIDGET (panel)->cols - 2;
|
||||||
|
|
||||||
/* Status needn't to be split */
|
/* Status needn't to be split */
|
||||||
if (!isstatus)
|
if (!isstatus)
|
||||||
{
|
{
|
||||||
usable_columns /= panel->split + 1;
|
usable_columns /= panel->list_cols;
|
||||||
if (panel->split != 0)
|
if (panel->list_cols > 1)
|
||||||
usable_columns--;
|
usable_columns--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look for the expandable fields and set field_len based on the requested field len */
|
/* Look for the expandable fields and set field_len based on the requested field len */
|
||||||
for (darr = home; darr && expand_top < MAX_EXPAND; darr = darr->next)
|
for (darr = home; darr != NULL && expand_top < MAX_EXPAND; darr = darr->next)
|
||||||
{
|
{
|
||||||
darr->field_len = darr->requested_field_len;
|
darr->field_len = darr->requested_field_len;
|
||||||
if (darr->expand)
|
if (darr->expand)
|
||||||
@ -1908,13 +1917,26 @@ use_display_format (WPanel * panel, const char *format, char **error, gboolean i
|
|||||||
static const char *
|
static const char *
|
||||||
panel_format (WPanel * panel)
|
panel_format (WPanel * panel)
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (panel->list_type)
|
switch (panel->list_type)
|
||||||
{
|
{
|
||||||
case list_long:
|
case list_long:
|
||||||
return "full perm space nlink space owner space group space size space mtime space name";
|
return "full perm space nlink space owner space group space size space mtime space name";
|
||||||
|
|
||||||
case list_brief:
|
case list_brief:
|
||||||
return "half 2 type name";
|
{
|
||||||
|
static char format[BUF_TINY];
|
||||||
|
int brief_cols = panel->brief_cols;
|
||||||
|
|
||||||
|
if (brief_cols < 1)
|
||||||
|
brief_cols = 2;
|
||||||
|
|
||||||
|
if (brief_cols > 9)
|
||||||
|
brief_cols = 9;
|
||||||
|
|
||||||
|
g_snprintf (format, sizeof (format), "half %d type name", brief_cols);
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
case list_user:
|
case list_user:
|
||||||
return panel->user_format;
|
return panel->user_format;
|
||||||
@ -2063,18 +2085,22 @@ panel_select_ext_cmd (void)
|
|||||||
static void
|
static void
|
||||||
move_down (WPanel * panel)
|
move_down (WPanel * panel)
|
||||||
{
|
{
|
||||||
|
int items;
|
||||||
|
|
||||||
if (panel->selected + 1 == panel->dir.len)
|
if (panel->selected + 1 == panel->dir.len)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unselect_item (panel);
|
unselect_item (panel);
|
||||||
panel->selected++;
|
panel->selected++;
|
||||||
|
|
||||||
if (panels_options.scroll_pages && panel->selected - panel->top_file == ITEMS (panel))
|
items = panel_items (panel);
|
||||||
|
|
||||||
|
if (panels_options.scroll_pages && panel->selected - panel->top_file == items)
|
||||||
{
|
{
|
||||||
/* Scroll window half screen */
|
/* Scroll window half screen */
|
||||||
panel->top_file += ITEMS (panel) / 2;
|
panel->top_file += items / 2;
|
||||||
if (panel->top_file > panel->dir.len - ITEMS (panel))
|
if (panel->top_file > panel->dir.len - items)
|
||||||
panel->top_file = panel->dir.len - ITEMS (panel);
|
panel->top_file = panel->dir.len - items;
|
||||||
paint_dir (panel);
|
paint_dir (panel);
|
||||||
}
|
}
|
||||||
select_item (panel);
|
select_item (panel);
|
||||||
@ -2094,7 +2120,7 @@ move_up (WPanel * panel)
|
|||||||
if (panels_options.scroll_pages && panel->selected < panel->top_file)
|
if (panels_options.scroll_pages && panel->selected < panel->top_file)
|
||||||
{
|
{
|
||||||
/* Scroll window half screen */
|
/* Scroll window half screen */
|
||||||
panel->top_file -= ITEMS (panel) / 2;
|
panel->top_file -= panel_items (panel) / 2;
|
||||||
if (panel->top_file < 0)
|
if (panel->top_file < 0)
|
||||||
panel->top_file = 0;
|
panel->top_file = 0;
|
||||||
paint_dir (panel);
|
paint_dir (panel);
|
||||||
@ -2121,7 +2147,7 @@ move_selection (WPanel * panel, int lines)
|
|||||||
unselect_item (panel);
|
unselect_item (panel);
|
||||||
panel->selected = new_pos;
|
panel->selected = new_pos;
|
||||||
|
|
||||||
if (panel->selected - panel->top_file >= ITEMS (panel))
|
if (panel->selected - panel->top_file >= panel_items (panel))
|
||||||
{
|
{
|
||||||
panel->top_file += lines;
|
panel->top_file += lines;
|
||||||
adjust = TRUE;
|
adjust = TRUE;
|
||||||
@ -2149,9 +2175,9 @@ move_selection (WPanel * panel, int lines)
|
|||||||
static cb_ret_t
|
static cb_ret_t
|
||||||
move_left (WPanel * panel)
|
move_left (WPanel * panel)
|
||||||
{
|
{
|
||||||
if (panel->split)
|
if (panel->list_cols > 1)
|
||||||
{
|
{
|
||||||
move_selection (panel, -llines (panel));
|
move_selection (panel, -panel_lines (panel));
|
||||||
return MSG_HANDLED;
|
return MSG_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2163,9 +2189,9 @@ move_left (WPanel * panel)
|
|||||||
static cb_ret_t
|
static cb_ret_t
|
||||||
move_right (WPanel * panel)
|
move_right (WPanel * panel)
|
||||||
{
|
{
|
||||||
if (panel->split)
|
if (panel->list_cols > 1)
|
||||||
{
|
{
|
||||||
move_selection (panel, llines (panel));
|
move_selection (panel, panel_lines (panel));
|
||||||
return MSG_HANDLED;
|
return MSG_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2183,10 +2209,10 @@ prev_page (WPanel * panel)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unselect_item (panel);
|
unselect_item (panel);
|
||||||
items = ITEMS (panel);
|
items = panel_items (panel);
|
||||||
if (panel->top_file < items)
|
if (panel->top_file < items)
|
||||||
items = panel->top_file;
|
items = panel->top_file;
|
||||||
if (!items)
|
if (items == 0)
|
||||||
panel->selected = 0;
|
panel->selected = 0;
|
||||||
else
|
else
|
||||||
panel->selected -= items;
|
panel->selected -= items;
|
||||||
@ -2254,12 +2280,12 @@ next_page (WPanel * panel)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
unselect_item (panel);
|
unselect_item (panel);
|
||||||
items = ITEMS (panel);
|
items = panel_items (panel);
|
||||||
if (panel->top_file > panel->dir.len - 2 * items)
|
if (panel->top_file > panel->dir.len - 2 * items)
|
||||||
items = panel->dir.len - items - panel->top_file;
|
items = panel->dir.len - items - panel->top_file;
|
||||||
if (panel->top_file + items < 0)
|
if (panel->top_file + items < 0)
|
||||||
items = -panel->top_file;
|
items = -panel->top_file;
|
||||||
if (!items)
|
if (items == 0)
|
||||||
panel->selected = panel->dir.len - 1;
|
panel->selected = panel->dir.len - 1;
|
||||||
else
|
else
|
||||||
panel->selected += items;
|
panel->selected += items;
|
||||||
@ -2300,7 +2326,7 @@ static void
|
|||||||
goto_middle_file (WPanel * panel)
|
goto_middle_file (WPanel * panel)
|
||||||
{
|
{
|
||||||
unselect_item (panel);
|
unselect_item (panel);
|
||||||
panel->selected = panel->top_file + (ITEMS (panel) / 2);
|
panel->selected = panel->top_file + panel_items (panel) / 2;
|
||||||
select_item (panel);
|
select_item (panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2310,7 +2336,7 @@ static void
|
|||||||
goto_bottom_file (WPanel * panel)
|
goto_bottom_file (WPanel * panel)
|
||||||
{
|
{
|
||||||
unselect_item (panel);
|
unselect_item (panel);
|
||||||
panel->selected = panel->top_file + ITEMS (panel) - 1;
|
panel->selected = panel->top_file + panel_items (panel) - 1;
|
||||||
select_item (panel);
|
select_item (panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2326,7 +2352,7 @@ move_home (WPanel * panel)
|
|||||||
|
|
||||||
if (panels_options.torben_fj_mode)
|
if (panels_options.torben_fj_mode)
|
||||||
{
|
{
|
||||||
int middle_pos = panel->top_file + (ITEMS (panel) / 2);
|
int middle_pos = panel->top_file + panel_items (panel) / 2;
|
||||||
|
|
||||||
if (panel->selected > middle_pos)
|
if (panel->selected > middle_pos)
|
||||||
{
|
{
|
||||||
@ -2359,14 +2385,17 @@ move_end (WPanel * panel)
|
|||||||
|
|
||||||
if (panels_options.torben_fj_mode)
|
if (panels_options.torben_fj_mode)
|
||||||
{
|
{
|
||||||
int middle_pos = panel->top_file + (ITEMS (panel) / 2);
|
int items, middle_pos;
|
||||||
|
|
||||||
|
items = panel_items (panel);
|
||||||
|
middle_pos = panel->top_file + items / 2;
|
||||||
|
|
||||||
if (panel->selected < middle_pos)
|
if (panel->selected < middle_pos)
|
||||||
{
|
{
|
||||||
goto_middle_file (panel);
|
goto_middle_file (panel);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (panel->selected != (panel->top_file + ITEMS (panel) - 1))
|
if (panel->selected != panel->top_file + items - 1)
|
||||||
{
|
{
|
||||||
goto_bottom_file (panel);
|
goto_bottom_file (panel);
|
||||||
return;
|
return;
|
||||||
@ -2419,11 +2448,12 @@ mark_file_down (WPanel * panel)
|
|||||||
static void
|
static void
|
||||||
mark_file_right (WPanel * panel)
|
mark_file_right (WPanel * panel)
|
||||||
{
|
{
|
||||||
int lines = llines (panel);
|
int lines;
|
||||||
|
|
||||||
if (state_mark < 0)
|
if (state_mark < 0)
|
||||||
state_mark = selection (panel)->f.marked ? 0 : 1;
|
state_mark = selection (panel)->f.marked ? 0 : 1;
|
||||||
|
|
||||||
|
lines = panel_lines (panel);
|
||||||
lines = min (lines, panel->dir.len - panel->selected - 1);
|
lines = min (lines, panel->dir.len - panel->selected - 1);
|
||||||
for (; lines != 0; lines--)
|
for (; lines != 0; lines--)
|
||||||
{
|
{
|
||||||
@ -2438,11 +2468,12 @@ mark_file_right (WPanel * panel)
|
|||||||
static void
|
static void
|
||||||
mark_file_left (WPanel * panel)
|
mark_file_left (WPanel * panel)
|
||||||
{
|
{
|
||||||
int lines = llines (panel);
|
int lines;
|
||||||
|
|
||||||
if (state_mark < 0)
|
if (state_mark < 0)
|
||||||
state_mark = selection (panel)->f.marked ? 0 : 1;
|
state_mark = selection (panel)->f.marked ? 0 : 1;
|
||||||
|
|
||||||
|
lines = panel_lines (panel);
|
||||||
lines = min (lines, panel->selected + 1);
|
lines = min (lines, panel->selected + 1);
|
||||||
for (; lines != 0; lines--)
|
for (; lines != 0; lines--)
|
||||||
{
|
{
|
||||||
@ -3593,7 +3624,10 @@ panel_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *d
|
|||||||
|
|
||||||
case MSG_DRAW:
|
case MSG_DRAW:
|
||||||
/* Repaint everything, including frame and separator */
|
/* Repaint everything, including frame and separator */
|
||||||
paint_frame (panel); /* including show_dir */
|
widget_erase (w);
|
||||||
|
show_dir (panel);
|
||||||
|
panel_print_header (panel);
|
||||||
|
adjust_top_file (panel);
|
||||||
paint_dir (panel);
|
paint_dir (panel);
|
||||||
mini_info_separator (panel);
|
mini_info_separator (panel);
|
||||||
display_mini_info (panel);
|
display_mini_info (panel);
|
||||||
@ -3767,7 +3801,7 @@ panel_event (Gpm_Event * event, void *data)
|
|||||||
WPanel *panel = PANEL (data);
|
WPanel *panel = PANEL (data);
|
||||||
Widget *w = WIDGET (data);
|
Widget *w = WIDGET (data);
|
||||||
|
|
||||||
const int lines = llines (panel);
|
int lines;
|
||||||
const gboolean is_active = widget_is_active (panel);
|
const gboolean is_active = widget_is_active (panel);
|
||||||
const gboolean mouse_down = (event->type & GPM_DOWN) != 0;
|
const gboolean mouse_down = (event->type & GPM_DOWN) != 0;
|
||||||
Gpm_Event local;
|
Gpm_Event local;
|
||||||
@ -3837,7 +3871,7 @@ panel_event (Gpm_Event * event, void *data)
|
|||||||
if (is_active)
|
if (is_active)
|
||||||
{
|
{
|
||||||
if (panels_options.mouse_move_pages
|
if (panels_options.mouse_move_pages
|
||||||
&& (panel->top_file + ITEMS (panel) < panel->dir.len))
|
&& (panel->top_file + panel_items (panel) < panel->dir.len))
|
||||||
next_page (panel);
|
next_page (panel);
|
||||||
else /* We are in last page */
|
else /* We are in last page */
|
||||||
move_down (panel);
|
move_down (panel);
|
||||||
@ -3845,6 +3879,8 @@ panel_event (Gpm_Event * event, void *data)
|
|||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lines = panel_lines (panel);
|
||||||
|
|
||||||
local.y -= 2;
|
local.y -= 2;
|
||||||
if ((local.type & (GPM_DOWN | GPM_DRAG)) != 0)
|
if ((local.type & (GPM_DOWN | GPM_DRAG)) != 0)
|
||||||
{
|
{
|
||||||
@ -3858,8 +3894,14 @@ panel_event (Gpm_Event * event, void *data)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
my_index = panel->top_file + local.y - 1;
|
my_index = panel->top_file + local.y - 1;
|
||||||
if (panel->split && (local.x > (w->cols - 2) / 2))
|
|
||||||
my_index += llines (panel);
|
if (panel->list_type == list_brief && panel->list_cols > 1)
|
||||||
|
{
|
||||||
|
int width;
|
||||||
|
|
||||||
|
width = (w->cols - 2) / panel->list_cols;
|
||||||
|
my_index += lines * ((local.x - 1) / width);
|
||||||
|
}
|
||||||
|
|
||||||
if (my_index >= panel->dir.len)
|
if (my_index >= panel->dir.len)
|
||||||
my_index = panel->dir.len - 1;
|
my_index = panel->dir.len - 1;
|
||||||
@ -4245,8 +4287,9 @@ panel_new_with_dir (const char *panel_name, const vfs_path_t * vpath)
|
|||||||
panel->dir.list = g_new (file_entry_t, panel->dir.size);
|
panel->dir.list = g_new (file_entry_t, panel->dir.size);
|
||||||
panel->dir.len = 0;
|
panel->dir.len = 0;
|
||||||
panel->active = 0;
|
panel->active = 0;
|
||||||
panel->filter = 0;
|
panel->filter = NULL;
|
||||||
panel->split = 0;
|
panel->list_cols = 1;
|
||||||
|
panel->brief_cols = 2;
|
||||||
panel->top_file = 0;
|
panel->top_file = 0;
|
||||||
panel->selected = 0;
|
panel->selected = 0;
|
||||||
panel->marked = 0;
|
panel->marked = 0;
|
||||||
@ -4255,8 +4298,8 @@ panel_new_with_dir (const char *panel_name, const vfs_path_t * vpath)
|
|||||||
panel->searching = FALSE;
|
panel->searching = FALSE;
|
||||||
panel->dirs_marked = 0;
|
panel->dirs_marked = 0;
|
||||||
panel->is_panelized = FALSE;
|
panel->is_panelized = FALSE;
|
||||||
panel->format = 0;
|
panel->format = NULL;
|
||||||
panel->status_format = 0;
|
panel->status_format = NULL;
|
||||||
panel->format_modified = 1;
|
panel->format_modified = 1;
|
||||||
panel->content_shift = -1;
|
panel->content_shift = -1;
|
||||||
panel->max_shift = -1;
|
panel->max_shift = -1;
|
||||||
@ -4626,7 +4669,7 @@ panel_re_sort (WPanel * panel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_free (filename);
|
g_free (filename);
|
||||||
panel->top_file = panel->selected - ITEMS (panel) / 2;
|
panel->top_file = panel->selected - panel_items (panel) / 2;
|
||||||
select_item (panel);
|
select_item (panel);
|
||||||
panel->dirty = 1;
|
panel->dirty = 1;
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ typedef struct
|
|||||||
Widget widget;
|
Widget widget;
|
||||||
dir_list dir; /* Directory contents */
|
dir_list dir; /* Directory contents */
|
||||||
|
|
||||||
int list_type; /* listing type (was view_type) */
|
enum list_types list_type; /* listing type */
|
||||||
int active; /* If panel is currently selected */
|
int active; /* If panel is currently selected */
|
||||||
vfs_path_t *cwd_vpath; /* Current Working Directory */
|
vfs_path_t *cwd_vpath; /* Current Working Directory */
|
||||||
vfs_path_t *lwd_vpath; /* Last Working Directory */
|
vfs_path_t *lwd_vpath; /* Last Working Directory */
|
||||||
@ -105,7 +105,8 @@ typedef struct
|
|||||||
uintmax_t total; /* Bytes in marked files */
|
uintmax_t total; /* Bytes in marked files */
|
||||||
int top_file; /* The file showed on the top of the panel */
|
int top_file; /* The file showed on the top of the panel */
|
||||||
int selected; /* Index to the selected file */
|
int selected; /* Index to the selected file */
|
||||||
int split; /* Split panel to allow two columns */
|
int list_cols; /* Number of file list columns */
|
||||||
|
int brief_cols; /* Number of columns in case of list_brief format */
|
||||||
gboolean is_panelized; /* Flag: special filelisting, can't reload */
|
gboolean is_panelized; /* Flag: special filelisting, can't reload */
|
||||||
panel_display_t frame_size; /* half or full frame */
|
panel_display_t frame_size; /* half or full frame */
|
||||||
char *filter; /* File name filter */
|
char *filter; /* File name filter */
|
||||||
|
@ -1378,6 +1378,8 @@ panel_load_setup (WPanel * panel, const char *section)
|
|||||||
}
|
}
|
||||||
g_free (buffer);
|
g_free (buffer);
|
||||||
|
|
||||||
|
panel->brief_cols = mc_config_get_int (mc_panels_config, section, "brief_cols", 2);
|
||||||
|
|
||||||
/* User formats */
|
/* User formats */
|
||||||
g_free (panel->user_format);
|
g_free (panel->user_format);
|
||||||
panel->user_format =
|
panel->user_format =
|
||||||
@ -1416,6 +1418,8 @@ panel_save_setup (WPanel * panel, const char *section)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mc_config_set_int (mc_panels_config, section, "brief_cols", panel->brief_cols);
|
||||||
|
|
||||||
mc_config_set_string (mc_panels_config, section, "user_format", panel->user_format);
|
mc_config_set_string (mc_panels_config, section, "user_format", panel->user_format);
|
||||||
|
|
||||||
for (i = 0; i < LIST_TYPES; i++)
|
for (i = 0; i < LIST_TYPES; i++)
|
||||||
|
Loading…
Reference in New Issue
Block a user