torben_fj_mode options was moved from [Midnight-Commander] section to [Panels] one.
[pantumic.git] / src / setup.c
blob932f7b8d62050fd1ed5b6d67ac0fc03a9cf098f4
1 /* Setup loading/saving.
2 Copyright (C) 1994, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
19 /** \file setup.c
20 * \brief Source: setup loading/saving
23 #include <config.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <stdio.h>
28 #include <sys/types.h>
29 #include <sys/stat.h>
31 #include "lib/global.h"
33 #include "lib/tty/tty.h"
34 #include "lib/tty/key.h"
35 #include "lib/mcconfig.h"
36 #include "lib/fileloc.h"
37 #include "lib/timefmt.h"
39 #include "lib/vfs/mc-vfs/vfs.h"
41 #ifdef ENABLE_VFS_FTP
42 #include "lib/vfs/mc-vfs/ftpfs.h"
43 #endif
44 #ifdef ENABLE_VFS_FISH
45 #include "lib/vfs/mc-vfs/fish.h"
46 #endif
48 #include "lib/util.h"
49 #include "lib/widget.h"
50 #ifdef HAVE_CHARSET
51 #include "lib/charsets.h"
52 #endif
54 #include "filemanager/dir.h"
55 #include "filemanager/midnight.h"
56 #include "filemanager/tree.h" /* xtree_mode */
57 #include "filemanager/hotlist.h" /* load/save/done hotlist */
58 #include "filemanager/panelize.h" /* load/save/done panelize */
59 #include "filemanager/layout.h"
60 #include "filemanager/cmd.h"
62 #include "args.h"
63 #include "execute.h" /* pause_after_run */
64 #include "clipboard.h"
65 #include "keybind-defaults.h" /* keybind_lookup_action */
67 #ifdef HAVE_CHARSET
68 #include "selcodepage.h"
69 #endif
71 #ifdef USE_INTERNAL_EDIT
72 #include "src/editor/edit.h"
73 #endif
75 #include "src/viewer/mcviewer.h" /* For the externs */
77 #include "setup.h"
79 /*** global variables ****************************************************************************/
81 char *profile_name; /* ${XDG_CONFIG_HOME}/mc/ini */
82 char *global_profile_name; /* mc.lib */
84 /* Only used at program boot */
85 gboolean boot_current_is_left = TRUE;
87 char *setup_color_string;
88 char *term_color_string;
89 char *color_terminal_string;
91 /* If on, default for "No" in delete operations */
92 int safe_delete = 0;
94 /* Controls screen clearing before an exec */
95 int clear_before_exec = 1;
97 /* Asks for confirmation before deleting a file */
98 int confirm_delete = 1;
99 /* Asks for confirmation before deleting a hotlist entry */
100 int confirm_directory_hotlist_delete = 1;
101 /* Asks for confirmation before overwriting a file */
102 int confirm_overwrite = 1;
103 /* Asks for confirmation before executing a program by pressing enter */
104 int confirm_execute = 0;
105 /* Asks for confirmation before leaving the program */
106 int confirm_exit = 1;
107 /* Asks for confirmation before clean up of history */
108 int confirm_history_cleanup = 1;
110 /* If true, at startup the user-menu is invoked */
111 int auto_menu = 0;
112 /* This flag indicates if the pull down menus by default drop down */
113 int drop_menus = 0;
115 /* Asks for confirmation when using F3 to view a directory and there
116 are tagged files */
117 int confirm_view_dir = 0;
119 panel_view_mode_t startup_left_mode;
120 panel_view_mode_t startup_right_mode;
122 int setup_copymove_persistent_attr = 1;
124 /* Tab size */
125 int option_tab_spacing = DEFAULT_TAB_SPACING;
127 /* Ugly hack to allow panel_save_setup to work as a place holder for */
128 /* default panel values */
129 int saving_setup;
131 panels_options_t panels_options = {
132 .kilobyte_si = FALSE,
133 .mix_all_files = FALSE,
134 .show_backups = TRUE,
135 .show_dot_files = TRUE,
136 .fast_reload = FALSE,
137 .fast_reload_msg_shown = FALSE,
138 .mark_moves_down = TRUE,
139 .reverse_files_only = TRUE,
140 .auto_save_setup = FALSE,
141 .navigate_with_arrows = FALSE,
142 .scroll_pages = TRUE,
143 .mouse_move_pages = TRUE,
144 .filetype_mode = TRUE,
145 .permission_mode = FALSE,
146 .qsearch_mode = QSEARCH_PANEL_CASE,
147 .torben_fj_mode = FALSE
150 int easy_patterns = 1;
152 /* It true saves the setup when quitting */
153 int auto_save_setup = 1;
155 /* If true, then the +, - and \ keys have their special meaning only if the
156 * command line is emtpy, otherwise they behave like regular letters
158 int only_leading_plus_minus = 1;
160 /* Set when cd symlink following is desirable (bash mode) */
161 int cd_symlinks = 1;
163 /* Set if you want the possible completions dialog for the first time */
164 int show_all_if_ambiguous = 0;
166 /* Automatically fills name with current selected item name on mkdir */
167 int auto_fill_mkdir_name = 1;
169 /* If set and you don't have subshell support,then C-o will give you a shell */
170 int output_starts_shell = 0;
172 /* If set, we execute the file command to check the file type */
173 int use_file_to_check_type = 1;
175 int verbose = 1;
178 * Whether the Midnight Commander tries to provide more
179 * information about copy/move sizes and bytes transfered
180 * at the expense of some speed
182 int file_op_compute_totals = 1;
184 /*** file scope macro definitions ****************************************************************/
186 /* In order to use everywhere the same setup for the locale we use defines */
187 #define FMTYEAR _("%b %e %Y")
188 #define FMTTIME _("%b %e %H:%M")
190 /*** file scope type declarations ****************************************************************/
192 /*** file scope variables ************************************************************************/
194 static char *panels_profile_name = NULL; /* ${XDG_CACHE_HOME}/mc/panels.ini */
196 /* *INDENT-OFF* */
197 static const struct
199 const char *key;
200 int list_type;
201 } list_types [] = {
202 { "full", list_full },
203 { "brief", list_brief },
204 { "long", list_long },
205 { "user", list_user },
206 { NULL, 0 }
209 static const struct
211 const char *opt_name;
212 panel_view_mode_t opt_type;
213 } panel_types [] = {
214 { "listing", view_listing },
215 { "quickview", view_quick },
216 { "info", view_info },
217 { "tree", view_tree },
218 { NULL, view_listing }
221 static const struct
223 const char *opt_name;
224 int *opt_addr;
225 } layout [] = {
226 { "equal_split", &equal_split },
227 { "first_panel_size", &first_panel_size },
228 { "message_visible", &message_visible },
229 { "keybar_visible", &keybar_visible },
230 { "xterm_title", &xterm_title },
231 { "output_lines", &output_lines },
232 { "command_prompt", &command_prompt },
233 { "menubar_visible", &menubar_visible },
234 { "show_mini_info", &show_mini_info },
235 { "free_space", &free_space },
236 { NULL, NULL }
239 static const struct
241 const char *opt_name;
242 int *opt_addr;
243 } int_options [] = {
244 { "verbose", &verbose },
245 { "pause_after_run", &pause_after_run },
246 { "shell_patterns", &easy_patterns },
247 { "auto_save_setup", &auto_save_setup },
248 { "auto_menu", &auto_menu },
249 { "use_internal_view", &use_internal_view },
250 { "use_internal_edit", &use_internal_edit },
251 { "clear_before_exec", &clear_before_exec },
252 { "confirm_delete", &confirm_delete },
253 { "confirm_overwrite", &confirm_overwrite },
254 { "confirm_execute", &confirm_execute },
255 { "confirm_history_cleanup", &confirm_history_cleanup },
256 { "confirm_exit", &confirm_exit },
257 { "confirm_directory_hotlist_delete", &confirm_directory_hotlist_delete },
258 { "safe_delete", &safe_delete },
259 { "mouse_repeat_rate", &mou_auto_repeat },
260 { "double_click_speed", &double_click_speed },
261 #ifndef HAVE_CHARSET
262 { "eight_bit_clean", &eight_bit_clean },
263 { "full_eight_bits", &full_eight_bits },
264 #endif /* !HAVE_CHARSET */
265 { "use_8th_bit_as_meta", &use_8th_bit_as_meta },
266 { "confirm_view_dir", &confirm_view_dir },
267 { "mouse_move_pages_viewer", &mcview_mouse_move_pages },
268 { "mouse_close_dialog", &mouse_close_dialog},
269 { "fast_refresh", &fast_refresh },
270 { "drop_menus", &drop_menus },
271 { "wrap_mode", &mcview_global_wrap_mode},
272 { "old_esc_mode", &old_esc_mode },
273 { "old_esc_mode_timeout", &old_esc_mode_timeout },
274 { "cd_symlinks", &cd_symlinks },
275 { "show_all_if_ambiguous", &show_all_if_ambiguous },
276 { "max_dirt_limit", &mcview_max_dirt_limit },
277 { "use_file_to_guess_type", &use_file_to_check_type },
278 { "alternate_plus_minus", &alternate_plus_minus },
279 { "only_leading_plus_minus", &only_leading_plus_minus },
280 { "show_output_starts_shell", &output_starts_shell },
281 { "xtree_mode", &xtree_mode },
282 { "num_history_items_recorded", &num_history_items_recorded },
283 { "file_op_compute_totals", &file_op_compute_totals },
284 { "classic_progressbar", &classic_progressbar},
285 #ifdef ENABLE_VFS
286 { "vfs_timeout", &vfs_timeout },
287 #ifdef ENABLE_VFS_FTP
288 { "ftpfs_directory_timeout", &ftpfs_directory_timeout },
289 { "use_netrc", &ftpfs_use_netrc },
290 { "ftpfs_retry_seconds", &ftpfs_retry_seconds },
291 { "ftpfs_always_use_proxy", &ftpfs_always_use_proxy },
292 { "ftpfs_use_passive_connections", &ftpfs_use_passive_connections },
293 { "ftpfs_use_passive_connections_over_proxy", &ftpfs_use_passive_connections_over_proxy },
294 { "ftpfs_use_unix_list_options", &ftpfs_use_unix_list_options },
295 { "ftpfs_first_cd_then_ls", &ftpfs_first_cd_then_ls },
296 #endif /* ENABLE_VFS_FTP */
297 #ifdef ENABLE_VFS_FISH
298 { "fish_directory_timeout", &fish_directory_timeout },
299 #endif /* ENABLE_VFS_FISH */
300 #endif /* ENABLE_VFS */
301 /* option_tab_spacing is used in internal viewer */
302 { "editor_tab_spacing", &option_tab_spacing },
303 #ifdef USE_INTERNAL_EDIT
304 { "editor_word_wrap_line_length", &option_word_wrap_line_length },
305 { "editor_fill_tabs_with_spaces", &option_fill_tabs_with_spaces },
306 { "editor_return_does_auto_indent", &option_return_does_auto_indent },
307 { "editor_backspace_through_tabs", &option_backspace_through_tabs },
308 { "editor_fake_half_tabs", &option_fake_half_tabs },
309 { "editor_option_save_mode", &option_save_mode },
310 { "editor_option_save_position", &option_save_position },
311 { "editor_option_auto_para_formatting", &option_auto_para_formatting },
312 { "editor_option_typewriter_wrap", &option_typewriter_wrap },
313 { "editor_edit_confirm_save", &edit_confirm_save },
314 { "editor_syntax_highlighting", &option_syntax_highlighting },
315 { "editor_persistent_selections", &option_persistent_selections },
316 { "editor_cursor_beyond_eol", &option_cursor_beyond_eol },
317 { "editor_visible_tabs", &visible_tabs },
318 { "editor_visible_spaces", &visible_tws },
319 { "editor_line_state", &option_line_state },
320 { "editor_simple_statusbar", &simple_statusbar },
321 { "editor_check_new_line", &option_check_nl_at_eof },
322 { "editor_show_right_margin", &show_right_margin },
323 { "editor_group_undo", &option_group_undo },
324 #endif /* USE_INTERNAL_EDIT */
325 { "nice_rotating_dash", &nice_rotating_dash },
326 { "horizontal_split", &horizontal_split },
327 { "mcview_remember_file_position", &mcview_remember_file_position },
328 { "auto_fill_mkdir_name", &auto_fill_mkdir_name },
329 { "copymove_persistent_attr", &setup_copymove_persistent_attr },
330 { "select_flags", &select_flags },
331 { NULL, NULL }
334 static const struct
336 const char *opt_name;
337 char **opt_addr;
338 const char *opt_defval;
339 } str_options[] = {
340 #ifdef USE_INTERNAL_EDIT
341 { "editor_backup_extension", &option_backup_ext, "~" },
342 #endif
343 { "mcview_eof", &mcview_show_eof, "" },
344 { NULL, NULL, NULL }
347 static const struct
349 const char *opt_name;
350 gboolean *opt_addr;
351 } panels_ini_options[] = {
352 { "kilobyte_si", &panels_options.kilobyte_si },
353 { "mix_all_files", &panels_options.mix_all_files },
354 { "show_backups", &panels_options.show_backups },
355 { "show_dot_files", &panels_options.show_dot_files },
356 { "fast_reload", &panels_options.fast_reload },
357 { "fast_reload_msg_shown", &panels_options.fast_reload_msg_shown },
358 { "mark_moves_down", &panels_options.mark_moves_down },
359 { "reverse_files_only", &panels_options.reverse_files_only },
360 { "auto_save_setup_panels", &panels_options.auto_save_setup },
361 { "navigate_with_arrows", &panels_options.navigate_with_arrows },
362 { "panel_scroll_pages", &panels_options.scroll_pages },
363 { "mouse_move_pages", &panels_options.mouse_move_pages },
364 { "filetype_mode", &panels_options.filetype_mode },
365 { "permission_mode", &panels_options.permission_mode },
366 { "torben_fj_mode", &panels_options.torben_fj_mode },
367 { NULL, NULL }
369 /* *INDENT-ON* */
371 /*** file scope functions ************************************************************************/
372 /* --------------------------------------------------------------------------------------------- */
375 Get name of config file.
377 \param subdir
378 if not NULL, then config also search into specified subdir.
380 \param config_file_name
381 If specified filename is relative, then will search in standart patches.
383 \return
384 Newly allocated path to config name or NULL if file not found.
386 If config_file_name is a relative path, then search config in stantart paths.
388 static char *
389 load_setup_get_full_config_name (const char *subdir, const char *config_file_name)
392 TODO: IMHO, in future this function must be placed into mc_config module.
394 char *lc_basename, *ret;
396 if (config_file_name == NULL)
397 return NULL;
399 if (g_path_is_absolute (config_file_name))
400 return g_strdup (config_file_name);
403 lc_basename = g_path_get_basename (config_file_name);
404 if (lc_basename == NULL)
405 return NULL;
407 if (subdir != NULL)
408 ret = g_build_filename (mc_config_get_path (), subdir, lc_basename, NULL);
409 else
410 ret = g_build_filename (mc_config_get_path (), lc_basename, NULL);
412 if (exist_file (ret))
414 g_free (lc_basename);
415 return ret;
417 g_free (ret);
419 if (subdir != NULL)
420 ret = g_build_filename (mc_sysconfig_dir, subdir, lc_basename, NULL);
421 else
422 ret = g_build_filename (mc_sysconfig_dir, lc_basename, NULL);
424 if (exist_file (ret))
426 g_free (lc_basename);
427 return ret;
429 g_free (ret);
431 if (subdir != NULL)
432 ret = g_build_filename (mc_share_data_dir, subdir, lc_basename, NULL);
433 else
434 ret = g_build_filename (mc_share_data_dir, lc_basename, NULL);
436 g_free (lc_basename);
438 if (exist_file (ret))
439 return ret;
441 g_free (ret);
442 return NULL;
446 /* --------------------------------------------------------------------------------------------- */
448 static const char *
449 setup__is_cfg_group_must_panel_config (const char *grp)
451 return (!strcasecmp ("Dirs", grp) ||
452 !strcasecmp ("Temporal:New Right Panel", grp) ||
453 !strcasecmp ("Temporal:New Left Panel", grp) ||
454 !strcasecmp ("New Left Panel", grp) || !strcasecmp ("New Right Panel", grp))
455 ? grp : NULL;
458 /* --------------------------------------------------------------------------------------------- */
460 static void
461 setup__move_panels_config_into_separate_file (const char *profile)
463 mc_config_t *tmp_cfg;
464 char **groups, **curr_grp;
465 const char *need_grp;
467 if (!exist_file (profile))
468 return;
470 tmp_cfg = mc_config_init (profile);
471 if (!tmp_cfg)
472 return;
474 curr_grp = groups = mc_config_get_groups (tmp_cfg, NULL);
475 if (!groups)
477 mc_config_deinit (tmp_cfg);
478 return;
481 while (*curr_grp)
483 if (setup__is_cfg_group_must_panel_config (*curr_grp) == NULL)
484 mc_config_del_group (tmp_cfg, *curr_grp);
485 curr_grp++;
488 mc_config_save_to_file (tmp_cfg, panels_profile_name, NULL);
489 mc_config_deinit (tmp_cfg);
491 tmp_cfg = mc_config_init (profile);
492 if (!tmp_cfg)
494 g_strfreev (groups);
495 return;
498 curr_grp = groups;
500 while (*curr_grp)
502 need_grp = setup__is_cfg_group_must_panel_config (*curr_grp);
503 if (need_grp != NULL)
505 mc_config_del_group (tmp_cfg, need_grp);
507 curr_grp++;
509 g_strfreev (groups);
511 mc_config_save_file (tmp_cfg, NULL);
512 mc_config_deinit (tmp_cfg);
515 /* --------------------------------------------------------------------------------------------- */
517 Create new mc_config object from specified ini-file or
518 append data to existing mc_config object from ini-file
522 static void
523 load_setup_init_config_from_file (mc_config_t ** config, const char *fname)
526 TODO: IMHO, in future this function must be placed into mc_config module.
528 if (exist_file (fname))
530 if (*config != NULL)
531 mc_config_read_file (*config, fname);
532 else
533 *config = mc_config_init (fname);
537 /* --------------------------------------------------------------------------------------------- */
539 static void
540 load_layout (void)
542 size_t i;
544 for (i = 0; layout[i].opt_name != NULL; i++)
545 *layout[i].opt_addr = mc_config_get_int (mc_main_config, "Layout",
546 layout[i].opt_name, *layout[i].opt_addr);
549 /* --------------------------------------------------------------------------------------------- */
551 static void
552 load_keys_from_section (const char *terminal, mc_config_t * cfg)
554 char *section_name;
555 gchar **profile_keys, **keys;
556 gchar **values, **curr_values;
557 char *valcopy, *value;
558 long key_code;
559 gsize len, values_len;
561 if (terminal == NULL)
562 return;
564 section_name = g_strconcat ("terminal:", terminal, (char *) NULL);
565 profile_keys = keys = mc_config_get_keys (cfg, section_name, &len);
567 while (*profile_keys != NULL)
569 /* copy=other causes all keys from [terminal:other] to be loaded. */
570 if (g_ascii_strcasecmp (*profile_keys, "copy") == 0)
572 valcopy = mc_config_get_string (cfg, section_name, *profile_keys, "");
573 load_keys_from_section (valcopy, cfg);
574 g_free (valcopy);
575 profile_keys++;
576 continue;
579 curr_values = values =
580 mc_config_get_string_list (cfg, section_name, *profile_keys, &values_len);
582 key_code = lookup_key (*profile_keys, NULL);
584 if (key_code != 0)
586 if (curr_values != NULL)
588 while (*curr_values != NULL)
590 valcopy = convert_controls (*curr_values);
591 define_sequence (key_code, valcopy, MCKEY_NOACTION);
592 g_free (valcopy);
593 curr_values++;
596 else
598 value = mc_config_get_string (cfg, section_name, *profile_keys, "");
599 valcopy = convert_controls (value);
600 define_sequence (key_code, valcopy, MCKEY_NOACTION);
601 g_free (valcopy);
602 g_free (value);
606 profile_keys++;
608 if (values != NULL)
609 g_strfreev (values);
611 g_strfreev (keys);
612 g_free (section_name);
615 /* --------------------------------------------------------------------------------------------- */
617 static void
618 load_keymap_from_section (const char *section_name, GArray * keymap, mc_config_t * cfg)
620 gchar **profile_keys, **keys;
621 gchar **values, **curr_values;
622 char *valcopy, *value;
623 int action;
624 gsize len, values_len;
626 if (section_name == NULL)
627 return;
629 profile_keys = keys = mc_config_get_keys (cfg, section_name, &len);
631 while (*profile_keys != NULL)
633 curr_values = values =
634 mc_config_get_string_list (cfg, section_name, *profile_keys, &values_len);
636 action = keybind_lookup_action (*profile_keys);
638 if (action > 0)
640 if (curr_values != NULL)
642 while (*curr_values != NULL)
644 valcopy = convert_controls (*curr_values);
645 keybind_cmd_bind (keymap, valcopy, action);
646 g_free (valcopy);
647 curr_values++;
650 else
652 value = mc_config_get_string (cfg, section_name, *profile_keys, "");
653 valcopy = convert_controls (value);
654 /* define_sequence (key_code, valcopy, MCKEY_NOACTION); */
655 g_free (valcopy);
656 g_free (value);
660 profile_keys++;
662 if (values != NULL)
663 g_strfreev (values);
665 g_strfreev (keys);
668 /* --------------------------------------------------------------------------------------------- */
670 static mc_config_t *
671 load_setup_get_keymap_profile_config (void)
674 TODO: IMHO, in future this function must be placed into mc_config module.
676 mc_config_t *keymap_config = NULL;
677 char *fname, *fname2;
679 /* 1) /usr/share/mc (mc_share_data_dir) */
680 fname = g_build_filename (mc_share_data_dir, GLOBAL_KEYMAP_FILE, NULL);
681 load_setup_init_config_from_file (&keymap_config, fname);
682 g_free (fname);
684 /* 2) /etc/mc (mc_sysconfig_dir) */
685 fname = g_build_filename (mc_sysconfig_dir, GLOBAL_KEYMAP_FILE, NULL);
686 load_setup_init_config_from_file (&keymap_config, fname);
687 g_free (fname);
689 /* 3) ${XDG_CONFIG_HOME}/mc */
690 fname = g_build_filename (mc_config_get_path (), GLOBAL_KEYMAP_FILE, NULL);
691 load_setup_init_config_from_file (&keymap_config, fname);
692 g_free (fname);
694 /* 4) main config; [Midnight Commander] -> keymap */
696 fname2 =
697 mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, "keymap", GLOBAL_KEYMAP_FILE);
698 fname = load_setup_get_full_config_name (NULL, fname2);
699 if (fname != NULL)
701 load_setup_init_config_from_file (&keymap_config, fname);
702 g_free (fname);
704 g_free (fname2);
706 /* 5) getenv("MC_KEYMAP") */
707 fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP"));
708 if (fname != NULL)
710 load_setup_init_config_from_file (&keymap_config, fname);
711 g_free (fname);
714 /* 6) --keymap=<keymap> */
715 fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file);
716 if (fname != NULL)
718 load_setup_init_config_from_file (&keymap_config, fname);
719 g_free (fname);
722 return keymap_config;
725 /* --------------------------------------------------------------------------------------------- */
727 static panel_view_mode_t
728 setup__load_panel_state (const char *section)
730 char *buffer;
731 size_t i;
732 panel_view_mode_t mode = view_listing;
734 /* Load the display mode */
735 buffer = mc_config_get_string (mc_panels_config, section, "display", "listing");
737 for (i = 0; panel_types[i].opt_name != NULL; i++)
738 if (g_ascii_strcasecmp (panel_types[i].opt_name, buffer) == 0)
740 mode = panel_types[i].opt_type;
741 break;
744 g_free (buffer);
746 return mode;
749 /* --------------------------------------------------------------------------------------------- */
751 static void
752 panel_save_type (const char *section, panel_view_mode_t type)
754 size_t i;
756 for (i = 0; panel_types[i].opt_name != NULL; i++)
757 if (panel_types[i].opt_type == type)
759 mc_config_set_string (mc_panels_config, section, "display", panel_types[i].opt_name);
760 break;
764 /* --------------------------------------------------------------------------------------------- */
766 /* save panels.ini */
767 static void
768 save_panel_types (void)
770 panel_view_mode_t type;
772 if (mc_run_mode != MC_RUN_FULL)
773 return;
775 type = get_display_type (0);
776 panel_save_type ("New Left Panel", type);
777 if (type == view_listing)
778 panel_save_setup (left_panel, left_panel->panel_name);
779 type = get_display_type (1);
780 panel_save_type ("New Right Panel", type);
781 if (type == view_listing)
782 panel_save_setup (right_panel, right_panel->panel_name);
784 mc_config_set_string (mc_panels_config, "Dirs", "other_dir", get_panel_dir_for (other_panel));
786 if (current_panel != NULL)
787 mc_config_set_string (mc_panels_config, "Dirs", "current_is_left",
788 get_current_index () == 0 ? "1" : "0");
790 if (mc_panels_config->ini_path == NULL)
791 mc_panels_config->ini_path = g_strdup (panels_profile_name);
793 mc_config_del_group (mc_panels_config, "Temporal:New Left Panel");
794 mc_config_del_group (mc_panels_config, "Temporal:New Right Panel");
796 mc_config_save_file (mc_panels_config, NULL);
799 /* --------------------------------------------------------------------------------------------- */
800 /*** public functions ****************************************************************************/
801 /* --------------------------------------------------------------------------------------------- */
803 char *
804 setup_init (void)
806 char *profile;
807 char *inifile;
809 if (profile_name != NULL)
810 return profile_name;
812 profile = g_build_filename (mc_config_get_path (), MC_CONFIG_FILE, NULL);
813 if (!exist_file (profile))
815 inifile = concat_dir_and_file (mc_sysconfig_dir, "mc.ini");
816 if (exist_file (inifile))
818 g_free (profile);
819 profile = inifile;
821 else
823 g_free (inifile);
824 inifile = concat_dir_and_file (mc_share_data_dir, "mc.ini");
825 if (exist_file (inifile))
827 g_free (profile);
828 profile = inifile;
830 else
831 g_free (inifile);
835 profile_name = profile;
837 return profile;
840 /* --------------------------------------------------------------------------------------------- */
842 void
843 load_setup (void)
845 char *profile;
846 size_t i;
847 char *buffer;
848 const char *kt;
850 #ifdef HAVE_CHARSET
851 load_codepages_list ();
852 #endif /* HAVE_CHARSET */
854 profile = setup_init ();
856 /* mc.lib is common for all users, but has priority lower than
857 ${XDG_CONFIG_HOME}/mc/ini. FIXME: it's only used for keys and treestore now */
858 global_profile_name = g_build_filename (mc_sysconfig_dir, MC_GLOBAL_CONFIG_FILE, (char *) NULL);
859 if (!exist_file (global_profile_name))
861 g_free (global_profile_name);
862 global_profile_name = g_build_filename (mc_share_data_dir, MC_GLOBAL_CONFIG_FILE, (char *) NULL);
865 panels_profile_name = g_build_filename (mc_config_get_cache_path (), MC_PANELS_FILE, NULL);
867 mc_main_config = mc_config_init (profile);
869 if (!exist_file (panels_profile_name))
870 setup__move_panels_config_into_separate_file (profile);
872 mc_panels_config = mc_config_init (panels_profile_name);
874 /* Load integer boolean options */
875 for (i = 0; int_options[i].opt_name != NULL; i++)
876 *int_options[i].opt_addr =
877 mc_config_get_int (mc_main_config, CONFIG_APP_SECTION, int_options[i].opt_name,
878 *int_options[i].opt_addr);
880 if (option_tab_spacing <= 0)
881 option_tab_spacing = DEFAULT_TAB_SPACING;
883 #ifdef USE_INTERNAL_EDIT
884 if (option_word_wrap_line_length <= 0)
885 option_word_wrap_line_length = DEFAULT_WRAP_LINE_LENGTH;
886 #endif /* USE_INTERNAL_EDIT */
888 /* overwrite old_esc_mode_timeout */
889 kt = getenv ("KEYBOARD_KEY_TIMEOUT_US");
890 if ((kt != NULL) && (kt[0] != '\0'))
891 old_esc_mode_timeout = atoi (kt);
893 /* Load string options */
894 for (i = 0; str_options[i].opt_name != NULL; i++)
895 *str_options[i].opt_addr =
896 mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, str_options[i].opt_name,
897 str_options[i].opt_defval);
899 load_layout ();
900 panels_load_options ();
901 load_panelize ();
903 startup_left_mode = setup__load_panel_state ("New Left Panel");
904 startup_right_mode = setup__load_panel_state ("New Right Panel");
906 /* At least one of the panels is a listing panel */
907 if (startup_left_mode != view_listing && startup_right_mode != view_listing)
908 startup_left_mode = view_listing;
910 if (mc_run_param1 == NULL)
912 buffer = mc_config_get_string (mc_panels_config, "Dirs", "other_dir", ".");
913 if (vfs_file_is_local (buffer))
914 mc_run_param1 = buffer;
915 else
916 g_free (buffer);
919 boot_current_is_left = mc_config_get_bool (mc_panels_config, "Dirs", "current_is_left", TRUE);
921 /* Load time formats */
922 user_recent_timeformat =
923 mc_config_get_string (mc_main_config, "Misc", "timeformat_recent", FMTTIME);
924 user_old_timeformat = mc_config_get_string (mc_main_config, "Misc", "timeformat_old", FMTYEAR);
926 #ifdef ENABLE_VFS_FTP
927 ftpfs_proxy_host = mc_config_get_string (mc_main_config, "Misc", "ftp_proxy_host", "gate");
928 ftpfs_ignore_chattr_errors = mc_config_get_bool (mc_main_config, CONFIG_APP_SECTION,
929 "ignore_ftp_chattr_errors", TRUE);
930 ftpfs_init_passwd ();
931 #endif /* ENABLE_VFS_FTP */
933 /* The default color and the terminal dependent color */
934 setup_color_string = mc_config_get_string (mc_main_config, "Colors", "base_color", "");
935 term_color_string = mc_config_get_string (mc_main_config, "Colors", getenv ("TERM"), "");
936 color_terminal_string = mc_config_get_string (mc_main_config, "Colors", "color_terminals", "");
938 /* Load the directory history */
939 /* directory_history_load (); */
940 /* Remove the temporal entries */
942 #ifdef HAVE_CHARSET
943 if (codepages->len > 1)
945 buffer = mc_config_get_string (mc_main_config, "Misc", "display_codepage", "");
946 if (buffer[0] != '\0')
948 display_codepage = get_codepage_index (buffer);
949 cp_display = get_codepage_id (display_codepage);
951 g_free (buffer);
952 buffer = mc_config_get_string (mc_main_config, "Misc", "source_codepage", "");
953 if (buffer[0] != '\0')
955 default_source_codepage = get_codepage_index (buffer);
956 source_codepage = default_source_codepage; /* May be source_codepage doesn't need this */
957 cp_source = get_codepage_id (source_codepage);
959 g_free (buffer);
962 autodetect_codeset = mc_config_get_string (mc_main_config, "Misc", "autodetect_codeset", "");
963 if ((autodetect_codeset[0] != '\0') && (strcmp (autodetect_codeset, "off") != 0))
964 is_autodetect_codeset_enabled = TRUE;
966 g_free (init_translation_table (source_codepage, display_codepage));
967 buffer = (char *) get_codepage_id (display_codepage);
968 if (buffer != NULL)
969 utf8_display = str_isutf8 (buffer);
970 #endif /* HAVE_CHARSET */
972 clipboard_store_path = mc_config_get_string (mc_main_config, "Misc", "clipboard_store", "");
973 clipboard_paste_path = mc_config_get_string (mc_main_config, "Misc", "clipboard_paste", "");
976 /* --------------------------------------------------------------------------------------------- */
978 gboolean
979 save_setup (gboolean save_options, gboolean save_panel_options)
981 gboolean ret = TRUE;
983 saving_setup = 1;
985 save_hotlist ();
987 if (save_panel_options)
988 save_panel_types ();
990 if (save_options)
992 char *tmp_profile;
994 save_config ();
995 save_layout ();
996 panels_save_options ();
997 save_panelize ();
998 /* directory_history_save (); */
1000 #ifdef ENABLE_VFS_FTP
1001 mc_config_set_string (mc_main_config, "Misc", "ftpfs_password", ftpfs_anonymous_passwd);
1002 if (ftpfs_proxy_host)
1003 mc_config_set_string (mc_main_config, "Misc", "ftp_proxy_host", ftpfs_proxy_host);
1004 #endif /* ENABLE_VFS_FTP */
1006 #ifdef HAVE_CHARSET
1007 mc_config_set_string (mc_main_config, "Misc", "display_codepage",
1008 get_codepage_id (display_codepage));
1009 mc_config_set_string (mc_main_config, "Misc", "source_codepage",
1010 get_codepage_id (default_source_codepage));
1011 mc_config_set_string (mc_main_config, "Misc", "autodetect_codeset", autodetect_codeset);
1012 #endif /* HAVE_CHARSET */
1013 mc_config_set_string (mc_main_config, "Misc", "clipboard_store", clipboard_store_path);
1014 mc_config_set_string (mc_main_config, "Misc", "clipboard_paste", clipboard_paste_path);
1016 tmp_profile = g_build_filename (mc_config_get_path (), MC_CONFIG_FILE, NULL);
1017 ret = mc_config_save_to_file (mc_main_config, tmp_profile, NULL);
1019 g_free (tmp_profile);
1022 saving_setup = 0;
1024 return ret;
1027 /* --------------------------------------------------------------------------------------------- */
1029 void
1030 done_setup (void)
1032 size_t i;
1034 g_free (clipboard_store_path);
1035 g_free (clipboard_paste_path);
1036 g_free (profile_name);
1037 g_free (global_profile_name);
1038 g_free (color_terminal_string);
1039 g_free (term_color_string);
1040 g_free (setup_color_string);
1041 g_free (panels_profile_name);
1042 mc_config_deinit (mc_main_config);
1043 mc_config_deinit (mc_panels_config);
1045 g_free (user_recent_timeformat);
1046 g_free (user_old_timeformat);
1048 for (i = 0; str_options[i].opt_name != NULL; i++)
1049 g_free (*str_options[i].opt_addr);
1051 done_hotlist ();
1052 done_panelize ();
1053 /* directory_history_free (); */
1055 #ifdef HAVE_CHARSET
1056 g_free (autodetect_codeset);
1057 free_codepages_list ();
1058 #endif
1061 /* --------------------------------------------------------------------------------------------- */
1063 void
1064 save_config (void)
1066 char *profile;
1067 GError *error = NULL;
1068 size_t i;
1070 profile = g_build_filename (mc_config_get_path (), MC_CONFIG_FILE, NULL);
1072 /* Save integer options */
1073 for (i = 0; int_options[i].opt_name != NULL; i++)
1074 mc_config_set_int (mc_main_config, CONFIG_APP_SECTION, int_options[i].opt_name,
1075 *int_options[i].opt_addr);
1077 /* Save string options */
1078 for (i = 0; str_options[i].opt_name != NULL; i++)
1079 mc_config_set_string (mc_main_config, CONFIG_APP_SECTION, str_options[i].opt_name,
1080 *str_options[i].opt_addr);
1082 if (!mc_config_save_to_file (mc_main_config, profile, &error))
1083 setup_save_config_show_error (profile, &error);
1085 g_free (profile);
1088 /* --------------------------------------------------------------------------------------------- */
1090 void
1091 setup_save_config_show_error (const char *filename, GError ** error)
1093 if (error != NULL && *error != NULL)
1095 message (D_ERROR, MSG_ERROR, _("Cannot save file %s:\n%s"), filename, (*error)->message);
1096 g_error_free (*error);
1097 *error = NULL;
1101 /* --------------------------------------------------------------------------------------------- */
1103 void
1104 save_layout (void)
1106 char *profile;
1107 size_t i;
1109 profile = g_build_filename (mc_config_get_path (), MC_CONFIG_FILE, NULL);
1110 /* Save integer options */
1111 for (i = 0; layout[i].opt_name != NULL; i++)
1112 mc_config_set_int (mc_main_config, "Layout", layout[i].opt_name, *layout[i].opt_addr);
1113 mc_config_save_to_file (mc_main_config, profile, NULL);
1114 g_free (profile);
1117 /* --------------------------------------------------------------------------------------------- */
1119 void
1120 load_key_defs (void)
1123 * Load keys from mc.lib before ${XDG_CONFIG_HOME}/mc/ini, so that the user
1124 * definitions override global settings.
1126 mc_config_t *mc_global_config;
1128 mc_global_config = mc_config_init (global_profile_name);
1129 if (mc_global_config != NULL)
1131 load_keys_from_section ("general", mc_global_config);
1132 load_keys_from_section (getenv ("TERM"), mc_global_config);
1133 mc_config_deinit (mc_global_config);
1136 load_keys_from_section ("general", mc_main_config);
1137 load_keys_from_section (getenv ("TERM"), mc_main_config);
1140 /* --------------------------------------------------------------------------------------------- */
1142 #ifdef ENABLE_VFS_FTP
1143 char *
1144 load_anon_passwd (void)
1146 char *buffer;
1148 buffer = mc_config_get_string (mc_main_config, "Misc", "ftpfs_password", "");
1150 if ((buffer != NULL) && (buffer[0] != '\0'))
1151 return buffer;
1153 g_free (buffer);
1154 return NULL;
1156 #endif /* ENABLE_VFS_FTP */
1158 /* --------------------------------------------------------------------------------------------- */
1160 void
1161 load_keymap_defs (void)
1164 * Load keymap from GLOBAL_KEYMAP_FILE before ${XDG_DATA_HOME}/mc/keymap, so that the user
1165 * definitions override global settings.
1167 mc_config_t *mc_global_keymap;
1169 mc_global_keymap = load_setup_get_keymap_profile_config ();
1171 if (mc_global_keymap != NULL)
1173 #ifdef USE_INTERNAL_EDIT
1174 editor_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1175 load_keymap_from_section ("editor", editor_keymap, mc_global_keymap);
1176 editor_x_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1177 load_keymap_from_section ("editor:xmap", editor_x_keymap, mc_global_keymap);
1178 #endif
1180 viewer_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1181 load_keymap_from_section ("viewer", viewer_keymap, mc_global_keymap);
1182 viewer_hex_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1183 load_keymap_from_section ("viewer:hex", viewer_hex_keymap, mc_global_keymap);
1185 main_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1186 load_keymap_from_section ("main", main_keymap, mc_global_keymap);
1187 main_x_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1188 load_keymap_from_section ("main:xmap", main_x_keymap, mc_global_keymap);
1190 panel_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1191 load_keymap_from_section ("panel", panel_keymap, mc_global_keymap);
1193 input_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1194 load_keymap_from_section ("input", input_keymap, mc_global_keymap);
1196 listbox_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1197 load_keymap_from_section ("listbox", listbox_keymap, mc_global_keymap);
1199 tree_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1200 load_keymap_from_section ("tree", tree_keymap, mc_global_keymap);
1202 help_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1203 load_keymap_from_section ("help", help_keymap, mc_global_keymap);
1205 dialog_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1206 load_keymap_from_section ("dialog", dialog_keymap, mc_global_keymap);
1208 #ifdef USE_DIFF_VIEW
1209 diff_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1210 load_keymap_from_section ("diffviewer", diff_keymap, mc_global_keymap);
1211 #endif
1212 mc_config_deinit (mc_global_keymap);
1215 main_map = default_main_map;
1216 if (main_keymap && main_keymap->len > 0)
1217 main_map = (global_keymap_t *) main_keymap->data;
1219 main_x_map = default_main_x_map;
1220 if (main_x_keymap && main_x_keymap->len > 0)
1221 main_x_map = (global_keymap_t *) main_x_keymap->data;
1223 panel_map = default_panel_keymap;
1224 if (panel_keymap && panel_keymap->len > 0)
1225 panel_map = (global_keymap_t *) panel_keymap->data;
1227 input_map = default_input_keymap;
1228 if (input_keymap && input_keymap->len > 0)
1229 input_map = (global_keymap_t *) input_keymap->data;
1231 listbox_map = default_listbox_keymap;
1232 if (listbox_keymap && listbox_keymap->len > 0)
1233 listbox_map = (global_keymap_t *) listbox_keymap->data;
1235 tree_map = default_tree_keymap;
1236 if (tree_keymap && tree_keymap->len > 0)
1237 tree_map = (global_keymap_t *) tree_keymap->data;
1239 help_map = default_help_keymap;
1240 if (help_keymap && help_keymap->len > 0)
1241 help_map = (global_keymap_t *) help_keymap->data;
1243 dialog_map = default_dialog_keymap;
1244 if (dialog_keymap && dialog_keymap->len > 0)
1245 dialog_map = (global_keymap_t *) dialog_keymap->data;
1247 #ifdef USE_DIFF_VIEW
1248 diff_map = default_diff_keymap;
1249 if (diff_keymap && diff_keymap->len > 0)
1250 diff_map = (global_keymap_t *) diff_keymap->data;
1251 #endif
1255 /* --------------------------------------------------------------------------------------------- */
1257 void
1258 free_keymap_defs (void)
1260 #ifdef USE_INTERNAL_EDIT
1261 if (editor_keymap != NULL)
1262 g_array_free (editor_keymap, TRUE);
1263 if (editor_x_keymap != NULL)
1264 g_array_free (editor_x_keymap, TRUE);
1265 #endif
1266 if (viewer_keymap != NULL)
1267 g_array_free (viewer_keymap, TRUE);
1268 if (viewer_hex_keymap != NULL)
1269 g_array_free (viewer_hex_keymap, TRUE);
1270 if (main_keymap != NULL)
1271 g_array_free (main_keymap, TRUE);
1272 if (main_x_keymap != NULL)
1273 g_array_free (main_x_keymap, TRUE);
1274 if (panel_keymap != NULL)
1275 g_array_free (panel_keymap, TRUE);
1276 if (input_keymap != NULL)
1277 g_array_free (input_keymap, TRUE);
1278 if (listbox_keymap != NULL)
1279 g_array_free (listbox_keymap, TRUE);
1280 if (tree_keymap != NULL)
1281 g_array_free (tree_keymap, TRUE);
1282 if (help_keymap != NULL)
1283 g_array_free (help_keymap, TRUE);
1284 if (dialog_keymap != NULL)
1285 g_array_free (dialog_keymap, TRUE);
1286 #ifdef USE_DIFF_VIEW
1287 if (diff_keymap != NULL)
1288 g_array_free (diff_keymap, TRUE);
1289 #endif
1292 /* --------------------------------------------------------------------------------------------- */
1294 void
1295 panel_load_setup (WPanel * panel, const char *section)
1297 size_t i;
1298 char *buffer, buffer2[BUF_TINY];
1300 panel->sort_info.reverse = mc_config_get_int (mc_panels_config, section, "reverse", 0);
1301 panel->sort_info.case_sensitive =
1302 mc_config_get_int (mc_panels_config, section, "case_sensitive",
1303 OS_SORT_CASE_SENSITIVE_DEFAULT);
1304 panel->sort_info.exec_first = mc_config_get_int (mc_panels_config, section, "exec_first", 0);
1306 /* Load sort order */
1307 buffer = mc_config_get_string (mc_panels_config, section, "sort_order", "name");
1308 panel->sort_info.sort_field = panel_get_field_by_id (buffer);
1309 if (panel->sort_info.sort_field == NULL)
1310 panel->sort_info.sort_field = panel_get_field_by_id ("name");
1312 g_free (buffer);
1314 /* Load the listing mode */
1315 buffer = mc_config_get_string (mc_panels_config, section, "list_mode", "full");
1316 panel->list_type = list_full;
1317 for (i = 0; list_types[i].key != NULL; i++)
1318 if (g_ascii_strcasecmp (list_types[i].key, buffer) == 0)
1320 panel->list_type = list_types[i].list_type;
1321 break;
1323 g_free (buffer);
1325 /* User formats */
1326 g_free (panel->user_format);
1327 panel->user_format =
1328 mc_config_get_string (mc_panels_config, section, "user_format", DEFAULT_USER_FORMAT);
1330 for (i = 0; i < LIST_TYPES; i++)
1332 g_free (panel->user_status_format[i]);
1333 g_snprintf (buffer2, BUF_TINY, "user_status%lld", (long long) i);
1334 panel->user_status_format[i] =
1335 mc_config_get_string (mc_panels_config, section, buffer2, DEFAULT_USER_FORMAT);
1338 panel->user_mini_status = mc_config_get_int (mc_panels_config, section, "user_mini_status", 0);
1341 /* --------------------------------------------------------------------------------------------- */
1343 void
1344 panel_save_setup (struct WPanel *panel, const char *section)
1346 char buffer[BUF_TINY];
1347 size_t i;
1349 mc_config_set_int (mc_panels_config, section, "reverse", panel->sort_info.reverse);
1350 mc_config_set_int (mc_panels_config, section, "case_sensitive", panel->sort_info.case_sensitive);
1351 mc_config_set_int (mc_panels_config, section, "exec_first", panel->sort_info.exec_first);
1353 mc_config_set_string (mc_panels_config, section, "sort_order", panel->sort_info.sort_field->id);
1355 for (i = 0; list_types[i].key != NULL; i++)
1356 if (list_types[i].list_type == panel->list_type)
1358 mc_config_set_string (mc_panels_config, section, "list_mode", list_types[i].key);
1359 break;
1362 mc_config_set_string (mc_panels_config, section, "user_format", panel->user_format);
1364 for (i = 0; i < LIST_TYPES; i++)
1366 g_snprintf (buffer, BUF_TINY, "user_status%lld", (long long) i);
1367 mc_config_set_string (mc_panels_config, section, buffer, panel->user_status_format[i]);
1370 mc_config_set_int (mc_panels_config, section, "user_mini_status", panel->user_mini_status);
1373 /* --------------------------------------------------------------------------------------------- */
1376 Load panels options from [Panels] section.
1378 void
1379 panels_load_options (void)
1381 if (mc_config_has_group (mc_main_config, CONFIG_PANELS_SECTION))
1383 size_t i;
1384 int qmode;
1386 for (i = 0; panels_ini_options[i].opt_name != NULL; i++)
1387 *panels_ini_options[i].opt_addr =
1388 mc_config_get_bool (mc_main_config, CONFIG_PANELS_SECTION,
1389 panels_ini_options[i].opt_name,
1390 *panels_ini_options[i].opt_addr);
1392 qmode = mc_config_get_int (mc_main_config, CONFIG_PANELS_SECTION,
1393 "quick_search_mode", (int) panels_options.qsearch_mode);
1394 if (qmode < 0)
1395 panels_options.qsearch_mode = QSEARCH_CASE_INSENSITIVE;
1396 else if (qmode >= QSEARCH_NUM)
1397 panels_options.qsearch_mode = QSEARCH_PANEL_CASE;
1398 else
1399 panels_options.qsearch_mode = (qsearch_mode_t) qmode;
1403 /* --------------------------------------------------------------------------------------------- */
1406 Save panels options in [Panels] section.
1408 void
1409 panels_save_options (void)
1411 size_t i;
1413 for (i = 0; panels_ini_options[i].opt_name != NULL; i++)
1414 mc_config_set_bool (mc_main_config, CONFIG_PANELS_SECTION,
1415 panels_ini_options[i].opt_name, *panels_ini_options[i].opt_addr);
1417 mc_config_set_int (mc_main_config, CONFIG_PANELS_SECTION,
1418 "quick_search_mode", (int) panels_options.qsearch_mode);
1421 /* --------------------------------------------------------------------------------------------- */