diff --git a/src/filemanager/layout.c b/src/filemanager/layout.c index 94cd7482d..bb126a093 100644 --- a/src/filemanager/layout.c +++ b/src/filemanager/layout.c @@ -53,7 +53,7 @@ #include "src/setup.h" #include "src/background.h" #ifdef HAVE_SUBSHELL_SUPPORT -#include "src/main.h" /* do_load_prompt() */ +#include "src/main.h" /* do_load_prompt() */ #include "src/subshell.h" #endif @@ -65,21 +65,24 @@ #include "layout.h" #include "info.h" /* The Info widget */ - /*** global variables ****************************************************************************/ +panels_layout_t panels_layout = { + /* Set if the panels are split horizontally */ + .horizontal_split = 0, + + /* vertical split */ + .vertical_equal = 1, + .left_panel_size = 0, + + /* horizontal split */ + .horizontal_equal = 1, + .top_panel_size = 0 +}; + /* Controls the display of the rotating dash on the verbose mode */ int nice_rotating_dash = 1; -/* Set if the panels are split horizontally */ -int horizontal_split = 0; - -/* Set if the split is the same */ -int equal_split = 1; - -/* First panel size if the panel are not split equally */ -int first_panel_size = 0; - /* The number of output lines shown (if available) */ int output_lines = 0; @@ -139,14 +142,12 @@ static struct /* These variables are used to avoid updating the information unless */ /* we need it */ -static int old_first_panel_size; -static int old_horizontal_split; +static panels_layout_t old_layout; static int old_output_lines; /* Internal variables */ -static int _horizontal_split; -static int _equal_split; -static int _first_panel_size; +panels_layout_t _panels_layout; +static int equal_split; static int _menubar_visible; static int _output_lines; static gboolean _command_prompt; @@ -196,30 +197,27 @@ max (int a, int b) /* --------------------------------------------------------------------------------------------- */ -static inline void -_check_split (void) +static void +check_split (panels_layout_t * layout) { - if (_horizontal_split) + if (layout->horizontal_split) { - if (_equal_split) - _first_panel_size = height / 2; - else if (_first_panel_size < MINHEIGHT) - _first_panel_size = MINHEIGHT; - else if (_first_panel_size > height - MINHEIGHT) - _first_panel_size = height - MINHEIGHT; + if (layout->horizontal_equal) + layout->top_panel_size = height / 2; + else if (layout->top_panel_size < MINHEIGHT) + layout->top_panel_size = MINHEIGHT; + else if (layout->top_panel_size > height - MINHEIGHT) + layout->top_panel_size = height - MINHEIGHT; } else { - if (_equal_split) - _first_panel_size = COLS / 2; - else if (_first_panel_size < MINWIDTH) - _first_panel_size = MINWIDTH; - else if (_first_panel_size > COLS - MINWIDTH) - _first_panel_size = COLS - MINWIDTH; + if (layout->vertical_equal) + layout->left_panel_size = COLS / 2; + else if (layout->left_panel_size < MINWIDTH) + layout->left_panel_size = MINWIDTH; + else if (layout->left_panel_size > COLS - MINWIDTH) + layout->left_panel_size = COLS - MINWIDTH; } - - old_first_panel_size = _first_panel_size; - old_horizontal_split = _horizontal_split; } /* --------------------------------------------------------------------------------------------- */ @@ -228,19 +226,29 @@ static void update_split (const Dlg_head * h) { /* Check split has to be done before testing if it changed, since - it can change due to calling _check_split() as well */ - _check_split (); + it can change due to calling check_split() as well */ + check_split (&_panels_layout); + old_layout = _panels_layout; + + if (_panels_layout.horizontal_split) + check_options[6].widget->state = _panels_layout.horizontal_equal ? 1 : 0; + else + check_options[6].widget->state = _panels_layout.vertical_equal ? 1 : 0; + send_message ((Widget *) check_options[6].widget, WIDGET_DRAW, 0); tty_setcolor (check_options[6].widget->state & C_BOOL ? DISABLED_COLOR : COLOR_NORMAL); dlg_move (h, 6, 5); - tty_printf ("%03d", _first_panel_size); + if (_panels_layout.horizontal_split) + tty_printf ("%03d", _panels_layout.top_panel_size); + else + tty_printf ("%03d", _panels_layout.left_panel_size); dlg_move (h, 6, 17); - if (_horizontal_split) - tty_printf ("%03d", height - _first_panel_size); + if (_panels_layout.horizontal_split) + tty_printf ("%03d", height - _panels_layout.top_panel_size); else - tty_printf ("%03d", COLS - _first_panel_size); + tty_printf ("%03d", COLS - _panels_layout.left_panel_size); dlg_move (h, 6, 12); tty_print_char ('='); @@ -254,9 +262,19 @@ b_left_right_cback (WButton * button, int action) (void) action; if (button == bleft_widget) - _first_panel_size++; + { + if (_panels_layout.horizontal_split) + _panels_layout.top_panel_size++; + else + _panels_layout.left_panel_size++; + } else - _first_panel_size--; + { + if (_panels_layout.horizontal_split) + _panels_layout.top_panel_size--; + else + _panels_layout.left_panel_size--; + } update_split (button->widget.owner); return 0; @@ -296,12 +314,14 @@ layout_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *d switch (msg) { case DLG_DRAW: - /*When repainting the whole dialog (e.g. with C-l) we have to + /* When repainting the whole dialog (e.g. with C-l) we have to update everything */ common_dialog_repaint (h); - old_first_panel_size = -1; - old_horizontal_split = -1; + old_layout.horizontal_split = -1; + old_layout.left_panel_size = -1; + old_layout.top_panel_size = -1; + old_output_lines = -1; update_split (h); @@ -328,11 +348,12 @@ layout_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *d if (mc_global.tty.console_flag != '\0') { int minimum; + if (_output_lines < 0) _output_lines = 0; height = LINES - _keybar_visible - (_command_prompt ? 1 : 0) - _menubar_visible - _output_lines - _message_visible; - minimum = MINHEIGHT * (1 + _horizontal_split); + minimum = MINHEIGHT * (1 + _panels_layout.horizontal_split); if (height < minimum) { _output_lines -= minimum - height; @@ -355,15 +376,19 @@ layout_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *d case DLG_ACTION: if (sender == (Widget *) radio_widget) { - if (_horizontal_split != radio_widget->sel) + if (_panels_layout.horizontal_split != radio_widget->sel) { - _horizontal_split = radio_widget->sel; - if (_equal_split) + _panels_layout.horizontal_split = radio_widget->sel; + + if (_panels_layout.horizontal_split) { - if (_horizontal_split) - _first_panel_size = height / 2; - else - _first_panel_size = COLS / 2; + if (_panels_layout.horizontal_equal) + _panels_layout.top_panel_size = height / 2; + } + else + { + if (_panels_layout.vertical_equal) + _panels_layout.left_panel_size = COLS / 2; } } @@ -374,11 +399,22 @@ layout_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *d if (sender == (Widget *) check_options[6].widget) { - _equal_split = check_options[6].widget->state & C_BOOL; + int eq; - widget_disable (bleft_widget->widget, _equal_split); + if (_panels_layout.horizontal_split) + { + _panels_layout.horizontal_equal = check_options[6].widget->state & C_BOOL; + eq = _panels_layout.horizontal_equal; + } + else + { + _panels_layout.vertical_equal = check_options[6].widget->state & C_BOOL; + eq = _panels_layout.vertical_equal; + } + + widget_disable (bleft_widget->widget, eq); send_message ((Widget *) bleft_widget, WIDGET_DRAW, 0); - widget_disable (bright_widget->widget, _equal_split); + widget_disable (bright_widget->widget, eq); send_message ((Widget *) bright_widget, WIDGET_DRAW, 0); update_split (h); @@ -418,17 +454,19 @@ init_layout (void) output_lines_label = _("Output lines:"); /* save old params */ - _equal_split = equal_split; + _panels_layout = panels_layout; _menubar_visible = menubar_visible; _command_prompt = command_prompt; _keybar_visible = mc_global.keybar_visible; _message_visible = mc_global.message_visible; _xterm_title = xterm_title; _free_space = free_space; - old_first_panel_size = -1; - old_horizontal_split = -1; + + old_layout.horizontal_split = -1; + old_layout.left_panel_size = -1; + old_layout.top_panel_size = -1; + old_output_lines = -1; - _first_panel_size = first_panel_size; _output_lines = output_lines; #ifdef ENABLE_NLS @@ -519,21 +557,23 @@ init_layout (void) add_widget (layout_dlg, w); } + equal_split = panels_layout.horizontal_split ? + panels_layout.horizontal_equal : panels_layout.vertical_equal; /* "Panel split" groupbox */ bright_widget = button_new (6, 14, B_2RIGHT, NARROW_BUTTON, "&>", b_left_right_cback); - widget_disable (bright_widget->widget, _equal_split); + widget_disable (bright_widget->widget, equal_split); add_widget (layout_dlg, bright_widget); bleft_widget = button_new (6, 8, B_2LEFT, NARROW_BUTTON, "&<", b_left_right_cback); - widget_disable (bleft_widget->widget, _equal_split); + widget_disable (bleft_widget->widget, equal_split); add_widget (layout_dlg, bleft_widget); check_options[6].widget = check_new (5, 5, XTRACT (6)); add_widget (layout_dlg, check_options[6].widget); radio_widget = radio_new (3, 5, 2, s_split_direction); - radio_widget->sel = horizontal_split; + radio_widget->sel = panels_layout.horizontal_split; add_widget (layout_dlg, radio_widget); add_widget (layout_dlg, groupbox_new (2, 3, 6, l1, title1)); @@ -545,31 +585,6 @@ init_layout (void) /* --------------------------------------------------------------------------------------------- */ -static void -check_split (void) -{ - if (horizontal_split) - { - if (equal_split) - first_panel_size = height / 2; - else if (first_panel_size < MINHEIGHT) - first_panel_size = MINHEIGHT; - else if (first_panel_size > height - MINHEIGHT) - first_panel_size = height - MINHEIGHT; - } - else - { - if (equal_split) - first_panel_size = COLS / 2; - else if (first_panel_size < MINWIDTH) - first_panel_size = MINWIDTH; - else if (first_panel_size > COLS - MINWIDTH) - first_panel_size = COLS - MINWIDTH; - } -} - -/* --------------------------------------------------------------------------------------------- */ - static void panel_do_cols (int idx) { @@ -626,11 +641,22 @@ layout_box (void) if (run_dlg (layout_dlg) == B_ENTER) { size_t i; + for (i = 0; i < (size_t) LAYOUT_OPTIONS_COUNT; i++) if (check_options[i].widget != NULL) *check_options[i].variable = check_options[i].widget->state & C_BOOL; - horizontal_split = radio_widget->sel; - first_panel_size = _first_panel_size; + + panels_layout.horizontal_split = radio_widget->sel; + if (panels_layout.horizontal_split) + { + panels_layout.horizontal_equal = *check_options[6].variable; + panels_layout.top_panel_size = _panels_layout.top_panel_size; + } + else + { + panels_layout.vertical_equal = *check_options[6].variable; + panels_layout.left_panel_size = _panels_layout.left_panel_size; + } output_lines = _output_lines; layout_do_change = TRUE; } @@ -650,12 +676,13 @@ setup_panels (void) if (mc_global.tty.console_flag != '\0') { int minimum; + if (output_lines < 0) output_lines = 0; height = LINES - mc_global.keybar_visible - (command_prompt ? 1 : 0) - menubar_visible - output_lines - mc_global.message_visible; - minimum = MINHEIGHT * (1 + horizontal_split); + minimum = MINHEIGHT * (1 + panels_layout.horizontal_split); if (height < minimum) { output_lines -= minimum - height; @@ -668,26 +695,23 @@ setup_panels (void) LINES - menubar_visible - (command_prompt ? 1 : 0) - mc_global.keybar_visible - mc_global.message_visible; } - check_split (); + + check_split (&panels_layout); start_y = menubar_visible; /* The column computing is defered until panel_do_cols */ - if (horizontal_split) + if (panels_layout.horizontal_split) { - widget_set_size (panels[0].widget, start_y, 0, first_panel_size, 0); - - widget_set_size (panels[1].widget, start_y + first_panel_size, 0, - height - first_panel_size, 0); + widget_set_size (panels[0].widget, start_y, 0, panels_layout.top_panel_size, 0); + widget_set_size (panels[1].widget, start_y + panels_layout.top_panel_size, 0, + height - panels_layout.top_panel_size, 0); } else { - int first_x = first_panel_size; - widget_set_size (panels[0].widget, start_y, 0, height, 0); - - widget_set_size (panels[1].widget, start_y, first_x, height, 0); - + widget_set_size (panels[1].widget, start_y, panels_layout.left_panel_size, height, 0); } + panel_do_cols (0); panel_do_cols (1); @@ -872,9 +896,17 @@ set_display_type (int num, panel_view_mode_t type) if (old_type == view_listing && panel->frame_size == frame_full && type != view_listing) { - cols = COLS - first_panel_size; - if (num == 1) - x = first_panel_size; + if (panels_layout.horizontal_split) + { + cols = COLS; + x = 0; + } + else + { + cols = COLS - panels_layout.left_panel_size; + if (num == 1) + x = panels_layout.left_panel_size; + } } } @@ -883,6 +915,7 @@ set_display_type (int num, panel_view_mode_t type) if (old_widget == NULL && type != view_listing) { char panel_dir[MC_MAXPATHLEN]; + mc_get_current_wd (panel_dir, sizeof (panel_dir)); panels[num].last_saved_dir = g_strdup (panel_dir); } diff --git a/src/filemanager/layout.h b/src/filemanager/layout.h index 79f638e5f..3467b3dcd 100644 --- a/src/filemanager/layout.h +++ b/src/filemanager/layout.h @@ -25,20 +25,31 @@ typedef enum struct WPanel; +typedef struct +{ + int horizontal_split; + + /* vertical split */ + int vertical_equal; + int left_panel_size; + + /* horizontal split */ + int horizontal_equal; + int top_panel_size; +} panels_layout_t; + /*** global variables defined in .c file *********************************************************/ -extern int equal_split; -extern int first_panel_size; extern int output_lines; extern gboolean command_prompt; extern int menubar_visible; extern int output_start_y; extern gboolean xterm_title; extern int free_space; - -extern int horizontal_split; extern int nice_rotating_dash; +extern panels_layout_t panels_layout; + /*** declarations of public functions ************************************************************/ void layout_change (void); diff --git a/src/filemanager/midnight.c b/src/filemanager/midnight.c index 108443f8d..3734e73af 100644 --- a/src/filemanager/midnight.c +++ b/src/filemanager/midnight.c @@ -462,7 +462,7 @@ midnight_get_title (const Dlg_head * h, size_t len) static void toggle_panels_split (void) { - horizontal_split = !horizontal_split; + panels_layout.horizontal_split = !panels_layout.horizontal_split; layout_change (); do_refresh (); } @@ -1534,8 +1534,8 @@ midnight_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void void update_menu (void) { - menu_set_name (left_menu, horizontal_split ? _("&Above") : _("&Left")); - menu_set_name (right_menu, horizontal_split ? _("&Below") : _("&Right")); + menu_set_name (left_menu, panels_layout.horizontal_split ? _("&Above") : _("&Left")); + menu_set_name (right_menu, panels_layout.horizontal_split ? _("&Below") : _("&Right")); menubar_arrange (the_menubar); menubar_set_visible (the_menubar, menubar_visible); } diff --git a/src/filemanager/panel.c b/src/filemanager/panel.c index 93c9362e1..5c3fa0332 100644 --- a/src/filemanager/panel.c +++ b/src/filemanager/panel.c @@ -3882,7 +3882,7 @@ panel_update_cols (Widget * widget, panel_display_t frame_size) if (widget->owner == NULL) return; - if (horizontal_split) + if (panels_layout.horizontal_split) { widget->cols = COLS; return; @@ -3895,13 +3895,13 @@ panel_update_cols (Widget * widget, panel_display_t frame_size) } else if (widget == get_panel_widget (0)) { - cols = first_panel_size; + cols = panels_layout.left_panel_size; origin = 0; } else { - cols = COLS - first_panel_size; - origin = first_panel_size; + cols = COLS - panels_layout.left_panel_size; + origin = panels_layout.left_panel_size; } widget->cols = cols; diff --git a/src/setup.c b/src/setup.c index f97f4d438..c3e045d70 100644 --- a/src/setup.c +++ b/src/setup.c @@ -217,8 +217,6 @@ static const struct const char *opt_name; int *opt_addr; } layout [] = { - { "equal_split", &equal_split }, - { "first_panel_size", &first_panel_size }, { "message_visible", &mc_global.message_visible }, { "keybar_visible", &mc_global.keybar_visible }, { "xterm_title", &xterm_title }, @@ -226,6 +224,11 @@ static const struct { "command_prompt", &command_prompt }, { "menubar_visible", &menubar_visible }, { "free_space", &free_space }, + { "horizontal_split", &panels_layout.horizontal_split }, + { "vertical_equal", &panels_layout.vertical_equal }, + { "left_panel_size", &panels_layout.left_panel_size }, + { "horizontal_equal", &panels_layout.horizontal_equal }, + { "top_panel_size", &panels_layout.top_panel_size }, { NULL, NULL } }; @@ -317,7 +320,6 @@ static const struct { "editor_group_undo", &option_group_undo }, #endif /* USE_INTERNAL_EDIT */ { "nice_rotating_dash", &nice_rotating_dash }, - { "horizontal_split", &horizontal_split }, { "mcview_remember_file_position", &mcview_remember_file_position }, { "auto_fill_mkdir_name", &auto_fill_mkdir_name }, { "copymove_persistent_attr", &setup_copymove_persistent_attr }, @@ -534,10 +536,34 @@ static void load_layout (void) { size_t i; + int equal_split; + int first_panel_size; + /* legacy options */ + panels_layout.horizontal_split = mc_config_get_int (mc_main_config, CONFIG_APP_SECTION, + "horizontal_split", 0); + equal_split = mc_config_get_int (mc_main_config, "Layout", "equal_split", 1); + first_panel_size = mc_config_get_int (mc_main_config, "Layout", "first_panel_size", 1); + if (panels_layout.horizontal_split) + { + panels_layout.horizontal_equal = equal_split; + panels_layout.left_panel_size = first_panel_size; + } + else + { + panels_layout.vertical_equal = equal_split; + panels_layout.top_panel_size = first_panel_size; + } + + /* actual options override legacy ones */ for (i = 0; layout[i].opt_name != NULL; i++) *layout[i].opt_addr = mc_config_get_int (mc_main_config, "Layout", layout[i].opt_name, *layout[i].opt_addr); + + /* remove legacy options */ + mc_config_del_key (mc_main_config, CONFIG_APP_SECTION, "horizontal_split"); + mc_config_del_key (mc_main_config, "Layout", "equal_split"); + mc_config_del_key (mc_main_config, "Layout", "first_panel_size"); } /* --------------------------------------------------------------------------------------------- */