Update translations from transifex.net
[midnight-commander.git] / src / setup.c
blob17631972e212e5fcb483ff722b5eabd53694023f
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; /* .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
149 int easy_patterns = 1;
151 /* It true saves the setup when quitting */
152 int auto_save_setup = 1;
154 /* If true, then the +, - and \ keys have their special meaning only if the
155 * command line is emtpy, otherwise they behave like regular letters
157 int only_leading_plus_minus = 1;
159 /* Set when cd symlink following is desirable (bash mode) */
160 int cd_symlinks = 1;
162 /* Set if you want the possible completions dialog for the first time */
163 int show_all_if_ambiguous = 0;
165 /* Automatically fills name with current selected item name on mkdir */
166 int auto_fill_mkdir_name = 1;
168 /* If set and you don't have subshell support,then C-o will give you a shell */
169 int output_starts_shell = 0;
171 /* If set, we execute the file command to check the file type */
172 int use_file_to_check_type = 1;
174 int verbose = 1;
177 * Whether the Midnight Commander tries to provide more
178 * information about copy/move sizes and bytes transfered
179 * at the expense of some speed
181 int file_op_compute_totals = 1;
183 /*** file scope macro definitions ****************************************************************/
185 /* In order to use everywhere the same setup for the locale we use defines */
186 #define FMTYEAR _("%b %e %Y")
187 #define FMTTIME _("%b %e %H:%M")
189 /*** file scope type declarations ****************************************************************/
191 /*** file scope variables ************************************************************************/
193 static char *panels_profile_name = NULL; /* .mc/panels.ini */
195 /* *INDENT-OFF* */
196 static const struct
198 const char *key;
199 int list_type;
200 } list_types [] = {
201 { "full", list_full },
202 { "brief", list_brief },
203 { "long", list_long },
204 { "user", list_user },
205 { NULL, 0 }
208 static const struct
210 const char *opt_name;
211 panel_view_mode_t opt_type;
212 } panel_types [] = {
213 { "listing", view_listing },
214 { "quickview", view_quick },
215 { "info", view_info },
216 { "tree", view_tree },
217 { NULL, view_listing }
220 static const struct
222 const char *opt_name;
223 int *opt_addr;
224 } layout [] = {
225 { "equal_split", &equal_split },
226 { "first_panel_size", &first_panel_size },
227 { "message_visible", &message_visible },
228 { "keybar_visible", &keybar_visible },
229 { "xterm_title", &xterm_title },
230 { "output_lines", &output_lines },
231 { "command_prompt", &command_prompt },
232 { "menubar_visible", &menubar_visible },
233 { "show_mini_info", &show_mini_info },
234 { "free_space", &free_space },
235 { NULL, NULL }
238 static const struct
240 const char *opt_name;
241 int *opt_addr;
242 } int_options [] = {
243 { "verbose", &verbose },
244 { "pause_after_run", &pause_after_run },
245 { "shell_patterns", &easy_patterns },
246 { "auto_save_setup", &auto_save_setup },
247 { "auto_menu", &auto_menu },
248 { "use_internal_view", &use_internal_view },
249 { "use_internal_edit", &use_internal_edit },
250 { "clear_before_exec", &clear_before_exec },
251 { "confirm_delete", &confirm_delete },
252 { "confirm_overwrite", &confirm_overwrite },
253 { "confirm_execute", &confirm_execute },
254 { "confirm_history_cleanup", &confirm_history_cleanup },
255 { "confirm_exit", &confirm_exit },
256 { "confirm_directory_hotlist_delete", &confirm_directory_hotlist_delete },
257 { "safe_delete", &safe_delete },
258 { "mouse_repeat_rate", &mou_auto_repeat },
259 { "double_click_speed", &double_click_speed },
260 #ifndef HAVE_CHARSET
261 { "eight_bit_clean", &eight_bit_clean },
262 { "full_eight_bits", &full_eight_bits },
263 #endif /* !HAVE_CHARSET */
264 { "use_8th_bit_as_meta", &use_8th_bit_as_meta },
265 { "confirm_view_dir", &confirm_view_dir },
266 { "mouse_move_pages_viewer", &mcview_mouse_move_pages },
267 { "mouse_close_dialog", &mouse_close_dialog},
268 { "fast_refresh", &fast_refresh },
269 { "drop_menus", &drop_menus },
270 { "wrap_mode", &mcview_global_wrap_mode},
271 { "old_esc_mode", &old_esc_mode },
272 { "old_esc_mode_timeout", &old_esc_mode_timeout },
273 { "cd_symlinks", &cd_symlinks },
274 { "show_all_if_ambiguous", &show_all_if_ambiguous },
275 { "max_dirt_limit", &mcview_max_dirt_limit },
276 { "torben_fj_mode", &torben_fj_mode },
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 #endif /* USE_INTERNAL_EDIT */
324 { "nice_rotating_dash", &nice_rotating_dash },
325 { "horizontal_split", &horizontal_split },
326 { "mcview_remember_file_position", &mcview_remember_file_position },
327 { "auto_fill_mkdir_name", &auto_fill_mkdir_name },
328 { "copymove_persistent_attr", &setup_copymove_persistent_attr },
329 { "select_flags", &select_flags },
330 { NULL, NULL }
333 static const struct
335 const char *opt_name;
336 char **opt_addr;
337 const char *opt_defval;
338 } str_options[] = {
339 #ifdef USE_INTERNAL_EDIT
340 { "editor_backup_extension", &option_backup_ext, "~" },
341 #endif
342 { "mcview_eof", &mcview_show_eof, "" },
343 { NULL, NULL, NULL }
346 static const struct
348 const char *opt_name;
349 const char *opt_old_name;
350 gboolean *opt_addr;
351 } panels_ini_options[] = {
352 { "kilobyte_si", NULL, &panels_options.kilobyte_si },
353 { "mix_all_files", NULL, &panels_options.mix_all_files },
354 { "show_backups", NULL, &panels_options.show_backups },
355 { "show_dot_files", NULL, &panels_options.show_dot_files },
356 { "fast_reload", NULL, &panels_options.fast_reload },
357 { "fast_reload_msg_shown", NULL, &panels_options.fast_reload_msg_shown },
358 { "mark_moves_down", NULL, &panels_options.mark_moves_down },
359 { "reverse_files_only", NULL, &panels_options.reverse_files_only },
360 { "auto_save_setup_panels", "auto_save_setup", &panels_options.auto_save_setup },
361 { "navigate_with_arrows", NULL, &panels_options.navigate_with_arrows },
362 { "panel_scroll_pages", "scroll_pages", &panels_options.scroll_pages },
363 { "mouse_move_pages", NULL, &panels_options.mouse_move_pages },
364 { "filetype_mode", NULL, &panels_options.filetype_mode },
365 { "permission_mode", NULL, &panels_options.permission_mode },
366 { NULL, NULL, NULL }
368 /* *INDENT-ON* */
370 /*** file scope functions ************************************************************************/
371 /* --------------------------------------------------------------------------------------------- */
374 Get name of config file.
376 \param subdir
377 if not NULL, then config also search into specified subdir.
379 \param config_file_name
380 If specified filename is relative, then will search in standart patches.
382 \return
383 Newly allocated path to config name or NULL if file not found.
385 If config_file_name is a relative path, then search config in stantart pathes.
387 static char *
388 load_setup_get_full_config_name (const char *subdir, const char *config_file_name)
391 TODO: IMHO, in future this function must be placed into mc_config module.
392 Also, need to rename stupid mc_home and mc_home_alt to mc_sysconfdir and mc_datadir;
393 home_mc => mc_user_homedir
395 char *lc_basename, *ret;
397 if (config_file_name == NULL)
398 return NULL;
400 if (g_path_is_absolute (config_file_name))
401 return g_strdup (config_file_name);
404 lc_basename = g_path_get_basename (config_file_name);
405 if (lc_basename == NULL)
406 return NULL;
408 if (subdir != NULL)
409 ret = g_build_filename (home_dir, MC_USERCONF_DIR, subdir, lc_basename, NULL);
410 else
411 ret = g_build_filename (home_dir, MC_USERCONF_DIR, lc_basename, NULL);
413 if (exist_file (ret))
415 g_free (lc_basename);
416 return ret;
418 g_free (ret);
420 if (subdir != NULL)
421 ret = g_build_filename (mc_home, subdir, lc_basename, NULL);
422 else
423 ret = g_build_filename (mc_home, lc_basename, NULL);
425 if (exist_file (ret))
427 g_free (lc_basename);
428 return ret;
430 g_free (ret);
432 if (subdir != NULL)
433 ret = g_build_filename (mc_home_alt, subdir, lc_basename, NULL);
434 else
435 ret = g_build_filename (mc_home_alt, lc_basename, NULL);
437 g_free (lc_basename);
439 if (exist_file (ret))
440 return ret;
442 g_free (ret);
443 return NULL;
447 /* --------------------------------------------------------------------------------------------- */
449 static const char *
450 setup__is_cfg_group_must_panel_config (const char *grp)
452 return (!strcasecmp ("Dirs", grp) ||
453 !strcasecmp ("Temporal:New Right Panel", grp) ||
454 !strcasecmp ("Temporal:New Left Panel", grp) ||
455 !strcasecmp ("New Left Panel", grp) || !strcasecmp ("New Right Panel", grp))
456 ? grp : NULL;
459 /* --------------------------------------------------------------------------------------------- */
461 static void
462 setup__move_panels_config_into_separate_file (const char *profile)
464 mc_config_t *tmp_cfg;
465 char **groups, **curr_grp;
466 const char *need_grp;
468 if (!exist_file (profile))
469 return;
471 tmp_cfg = mc_config_init (profile);
472 if (!tmp_cfg)
473 return;
475 curr_grp = groups = mc_config_get_groups (tmp_cfg, NULL);
476 if (!groups)
478 mc_config_deinit (tmp_cfg);
479 return;
482 while (*curr_grp)
484 if (setup__is_cfg_group_must_panel_config (*curr_grp) == NULL)
485 mc_config_del_group (tmp_cfg, *curr_grp);
486 curr_grp++;
489 mc_config_save_to_file (tmp_cfg, panels_profile_name, NULL);
490 mc_config_deinit (tmp_cfg);
492 tmp_cfg = mc_config_init (profile);
493 if (!tmp_cfg)
495 g_strfreev (groups);
496 return;
499 curr_grp = groups;
501 while (*curr_grp)
503 need_grp = setup__is_cfg_group_must_panel_config (*curr_grp);
504 if (need_grp != NULL)
506 mc_config_del_group (tmp_cfg, need_grp);
508 curr_grp++;
510 g_strfreev (groups);
512 mc_config_save_file (tmp_cfg, NULL);
513 mc_config_deinit (tmp_cfg);
516 /* --------------------------------------------------------------------------------------------- */
518 Create new mc_config object from specified ini-file or
519 append data to existing mc_config object from ini-file
523 static void
524 load_setup_init_config_from_file (mc_config_t ** config, const char *fname)
527 TODO: IMHO, in future this function must be placed into mc_config module.
529 if (exist_file (fname))
531 if (*config != NULL)
532 mc_config_read_file (*config, fname);
533 else
534 *config = mc_config_init (fname);
538 /* --------------------------------------------------------------------------------------------- */
540 static void
541 load_layout (void)
543 size_t i;
545 for (i = 0; layout[i].opt_name != NULL; i++)
546 *layout[i].opt_addr = mc_config_get_int (mc_main_config, "Layout",
547 layout[i].opt_name, *layout[i].opt_addr);
550 /* --------------------------------------------------------------------------------------------- */
552 static void
553 load_keys_from_section (const char *terminal, mc_config_t * cfg)
555 char *section_name;
556 gchar **profile_keys, **keys;
557 gchar **values, **curr_values;
558 char *valcopy, *value;
559 long key_code;
560 gsize len, values_len;
562 if (terminal == NULL)
563 return;
565 section_name = g_strconcat ("terminal:", terminal, (char *) NULL);
566 profile_keys = keys = mc_config_get_keys (cfg, section_name, &len);
568 while (*profile_keys != NULL)
570 /* copy=other causes all keys from [terminal:other] to be loaded. */
571 if (g_ascii_strcasecmp (*profile_keys, "copy") == 0)
573 valcopy = mc_config_get_string (cfg, section_name, *profile_keys, "");
574 load_keys_from_section (valcopy, cfg);
575 g_free (valcopy);
576 profile_keys++;
577 continue;
580 curr_values = values =
581 mc_config_get_string_list (cfg, section_name, *profile_keys, &values_len);
583 key_code = lookup_key (*profile_keys, NULL);
585 if (key_code != 0)
587 if (curr_values != NULL)
589 while (*curr_values != NULL)
591 valcopy = convert_controls (*curr_values);
592 define_sequence (key_code, valcopy, MCKEY_NOACTION);
593 g_free (valcopy);
594 curr_values++;
597 else
599 value = mc_config_get_string (cfg, section_name, *profile_keys, "");
600 valcopy = convert_controls (value);
601 define_sequence (key_code, valcopy, MCKEY_NOACTION);
602 g_free (valcopy);
603 g_free (value);
607 profile_keys++;
608 g_strfreev (values);
610 g_strfreev (keys);
611 g_free (section_name);
614 /* --------------------------------------------------------------------------------------------- */
616 static void
617 load_keymap_from_section (const char *section_name, GArray * keymap, mc_config_t * cfg)
619 gchar **profile_keys, **keys;
620 gchar **values, **curr_values;
621 char *valcopy, *value;
622 int action;
623 gsize len, values_len;
625 if (section_name == NULL)
626 return;
628 profile_keys = keys = mc_config_get_keys (cfg, section_name, &len);
630 while (*profile_keys != NULL)
632 curr_values = values =
633 mc_config_get_string_list (cfg, section_name, *profile_keys, &values_len);
635 action = keybind_lookup_action (*profile_keys);
637 if (action > 0)
639 if (curr_values != NULL)
641 while (*curr_values != NULL)
643 valcopy = convert_controls (*curr_values);
644 keybind_cmd_bind (keymap, valcopy, action);
645 g_free (valcopy);
646 curr_values++;
649 else
651 value = mc_config_get_string (cfg, section_name, *profile_keys, "");
652 valcopy = convert_controls (value);
653 /* define_sequence (key_code, valcopy, MCKEY_NOACTION); */
654 g_free (valcopy);
655 g_free (value);
659 profile_keys++;
660 g_strfreev (values);
662 g_strfreev (keys);
665 /* --------------------------------------------------------------------------------------------- */
667 static mc_config_t *
668 load_setup_get_keymap_profile_config (void)
671 TODO: IMHO, in future this function must be placed into mc_config module.
673 mc_config_t *keymap_config = NULL;
674 char *fname, *fname2;
676 /* 1) /usr/share/mc (mc_home_alt) */
677 fname = g_build_filename (mc_home_alt, GLOBAL_KEYMAP_FILE, NULL);
678 load_setup_init_config_from_file (&keymap_config, fname);
679 g_free (fname);
681 /* 2) /etc/mc (mc_home) */
682 fname = g_build_filename (mc_home, GLOBAL_KEYMAP_FILE, NULL);
683 load_setup_init_config_from_file (&keymap_config, fname);
684 g_free (fname);
686 /* 3) ~/.mc (home_dir?) */
687 fname = g_build_filename (home_dir, MC_USERCONF_DIR, GLOBAL_KEYMAP_FILE, NULL);
688 load_setup_init_config_from_file (&keymap_config, fname);
689 g_free (fname);
691 /* 4) main config; [Midnight Commander] -> keymap */
693 fname2 =
694 mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, "keymap", GLOBAL_KEYMAP_FILE);
695 fname = load_setup_get_full_config_name (NULL, fname2);
696 if (fname != NULL)
698 load_setup_init_config_from_file (&keymap_config, fname);
699 g_free (fname);
701 g_free (fname2);
703 /* 5) getenv("MC_KEYMAP") */
704 fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP"));
705 if (fname != NULL)
707 load_setup_init_config_from_file (&keymap_config, fname);
708 g_free (fname);
711 /* 6) --keymap=<keymap> */
712 fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file);
713 if (fname != NULL)
715 load_setup_init_config_from_file (&keymap_config, fname);
716 g_free (fname);
719 return keymap_config;
722 /* --------------------------------------------------------------------------------------------- */
724 static panel_view_mode_t
725 setup__load_panel_state (const char *section)
727 char *buffer;
728 size_t i;
729 panel_view_mode_t mode = view_listing;
731 /* Load the display mode */
732 buffer = mc_config_get_string (mc_panels_config, section, "display", "listing");
734 for (i = 0; panel_types[i].opt_name != NULL; i++)
735 if (g_ascii_strcasecmp (panel_types[i].opt_name, buffer) == 0)
737 mode = panel_types[i].opt_type;
738 break;
741 g_free (buffer);
743 return mode;
746 /* --------------------------------------------------------------------------------------------- */
748 static void
749 panel_save_type (const char *section, panel_view_mode_t type)
751 size_t i;
753 for (i = 0; panel_types[i].opt_name != NULL; i++)
754 if (panel_types[i].opt_type == type)
756 mc_config_set_string (mc_panels_config, section, "display", panel_types[i].opt_name);
757 break;
761 /* --------------------------------------------------------------------------------------------- */
763 /* save panels.ini */
764 static void
765 save_panel_types (void)
767 panel_view_mode_t type;
769 if (mc_run_mode != MC_RUN_FULL)
770 return;
772 type = get_display_type (0);
773 panel_save_type ("New Left Panel", type);
774 if (type == view_listing)
775 panel_save_setup (left_panel, left_panel->panel_name);
776 type = get_display_type (1);
777 panel_save_type ("New Right Panel", type);
778 if (type == view_listing)
779 panel_save_setup (right_panel, right_panel->panel_name);
781 mc_config_set_string (mc_panels_config, "Dirs", "other_dir", get_panel_dir_for (other_panel));
783 if (current_panel != NULL)
784 mc_config_set_string (mc_panels_config, "Dirs", "current_is_left",
785 get_current_index () == 0 ? "1" : "0");
787 if (mc_panels_config->ini_path == NULL)
788 mc_panels_config->ini_path = g_strdup (panels_profile_name);
790 mc_config_del_group (mc_panels_config, "Temporal:New Left Panel");
791 mc_config_del_group (mc_panels_config, "Temporal:New Right Panel");
793 mc_config_save_file (mc_panels_config, NULL);
796 /* --------------------------------------------------------------------------------------------- */
797 /*** public functions ****************************************************************************/
798 /* --------------------------------------------------------------------------------------------- */
800 char *
801 setup_init (void)
803 char *profile;
804 char *inifile;
806 if (profile_name != NULL)
807 return profile_name;
809 profile = g_build_filename (home_dir, MC_USERCONF_DIR, MC_CONFIG_FILE, NULL);
810 if (!exist_file (profile))
812 inifile = concat_dir_and_file (mc_home, "mc.ini");
813 if (exist_file (inifile))
815 g_free (profile);
816 profile = inifile;
818 else
820 g_free (inifile);
821 inifile = concat_dir_and_file (mc_home_alt, "mc.ini");
822 if (exist_file (inifile))
824 g_free (profile);
825 profile = inifile;
827 else
828 g_free (inifile);
832 profile_name = profile;
834 return profile;
837 /* --------------------------------------------------------------------------------------------- */
839 void
840 load_setup (void)
842 char *profile;
843 size_t i;
844 char *buffer;
845 const char *kt;
847 #ifdef HAVE_CHARSET
848 load_codepages_list ();
849 #endif /* HAVE_CHARSET */
851 profile = setup_init ();
853 /* mc.lib is common for all users, but has priority lower than
854 ~/.mc/ini. FIXME: it's only used for keys and treestore now */
855 global_profile_name = g_build_filename (mc_home, MC_GLOBAL_CONFIG_FILE, (char *) NULL);
856 if (!exist_file (global_profile_name))
858 g_free (global_profile_name);
859 global_profile_name = g_build_filename (mc_home_alt, MC_GLOBAL_CONFIG_FILE, (char *) NULL);
862 panels_profile_name = g_build_filename (home_dir, MC_USERCONF_DIR, MC_PANELS_FILE, NULL);
864 mc_main_config = mc_config_init (profile);
866 if (!exist_file (panels_profile_name))
867 setup__move_panels_config_into_separate_file (profile);
869 mc_panels_config = mc_config_init (panels_profile_name);
871 /* Load integer boolean options */
872 for (i = 0; int_options[i].opt_name != NULL; i++)
873 *int_options[i].opt_addr =
874 mc_config_get_int (mc_main_config, CONFIG_APP_SECTION, int_options[i].opt_name,
875 *int_options[i].opt_addr);
877 if (option_tab_spacing <= 0)
878 option_tab_spacing = DEFAULT_TAB_SPACING;
880 #ifdef USE_INTERNAL_EDIT
881 if (option_word_wrap_line_length <= 0)
882 option_word_wrap_line_length = DEFAULT_WRAP_LINE_LENGTH;
883 #endif /* USE_INTERNAL_EDIT */
885 /* overwrite old_esc_mode_timeout */
886 kt = getenv ("KEYBOARD_KEY_TIMEOUT_US");
887 if ((kt != NULL) && (kt[0] != '\0'))
888 old_esc_mode_timeout = atoi (kt);
890 /* Load string options */
891 for (i = 0; str_options[i].opt_name != NULL; i++)
892 *str_options[i].opt_addr =
893 mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, str_options[i].opt_name,
894 str_options[i].opt_defval);
896 load_layout ();
897 panels_load_options ();
898 load_panelize ();
900 startup_left_mode = setup__load_panel_state ("New Left Panel");
901 startup_right_mode = setup__load_panel_state ("New Right Panel");
903 /* At least one of the panels is a listing panel */
904 if (startup_left_mode != view_listing && startup_right_mode != view_listing)
905 startup_left_mode = view_listing;
907 if (mc_run_param1 == NULL)
909 buffer = mc_config_get_string (mc_panels_config, "Dirs", "other_dir", ".");
910 if (vfs_file_is_local (buffer))
911 mc_run_param1 = buffer;
912 else
913 g_free (buffer);
916 boot_current_is_left = mc_config_get_bool (mc_panels_config, "Dirs", "current_is_left", TRUE);
918 /* Load time formats */
919 user_recent_timeformat =
920 mc_config_get_string (mc_main_config, "Misc", "timeformat_recent", FMTTIME);
921 user_old_timeformat = mc_config_get_string (mc_main_config, "Misc", "timeformat_old", FMTYEAR);
923 #ifdef ENABLE_VFS_FTP
924 ftpfs_proxy_host = mc_config_get_string (mc_main_config, "Misc", "ftp_proxy_host", "gate");
925 ftpfs_ignore_chattr_errors = mc_config_get_bool (mc_main_config, CONFIG_APP_SECTION,
926 "ignore_ftp_chattr_errors", TRUE);
927 ftpfs_init_passwd ();
928 #endif /* ENABLE_VFS_FTP */
930 /* The default color and the terminal dependent color */
931 setup_color_string = mc_config_get_string (mc_main_config, "Colors", "base_color", "");
932 term_color_string = mc_config_get_string (mc_main_config, "Colors", getenv ("TERM"), "");
933 color_terminal_string = mc_config_get_string (mc_main_config, "Colors", "color_terminals", "");
935 /* Load the directory history */
936 /* directory_history_load (); */
937 /* Remove the temporal entries */
939 #ifdef HAVE_CHARSET
940 if (codepages->len > 1)
942 buffer = mc_config_get_string (mc_main_config, "Misc", "display_codepage", "");
943 if (buffer[0] != '\0')
945 display_codepage = get_codepage_index (buffer);
946 cp_display = get_codepage_id (display_codepage);
948 g_free (buffer);
949 buffer = mc_config_get_string (mc_main_config, "Misc", "source_codepage", "");
950 if (buffer[0] != '\0')
952 default_source_codepage = get_codepage_index (buffer);
953 source_codepage = default_source_codepage; /* May be source_codepage doesn't need this */
954 cp_source = get_codepage_id (source_codepage);
956 g_free (buffer);
959 autodetect_codeset = mc_config_get_string (mc_main_config, "Misc", "autodetect_codeset", "");
960 if ((autodetect_codeset[0] != '\0') && (strcmp (autodetect_codeset, "off") != 0))
961 is_autodetect_codeset_enabled = TRUE;
963 g_free (init_translation_table (source_codepage, display_codepage));
964 buffer = (char *) get_codepage_id (display_codepage);
965 if (buffer != NULL)
966 utf8_display = str_isutf8 (buffer);
967 #endif /* HAVE_CHARSET */
969 clipboard_store_path = mc_config_get_string (mc_main_config, "Misc", "clipboard_store", "");
970 clipboard_paste_path = mc_config_get_string (mc_main_config, "Misc", "clipboard_paste", "");
973 /* --------------------------------------------------------------------------------------------- */
975 gboolean
976 save_setup (gboolean save_options, gboolean save_panel_options)
978 gboolean ret = TRUE;
980 saving_setup = 1;
982 save_hotlist ();
984 if (save_panel_options)
985 save_panel_types ();
987 if (save_options)
989 char *tmp_profile;
991 save_config ();
992 save_layout ();
993 panels_save_options ();
994 save_panelize ();
995 /* directory_history_save (); */
997 #ifdef ENABLE_VFS_FTP
998 mc_config_set_string (mc_main_config, "Misc", "ftpfs_password", ftpfs_anonymous_passwd);
999 if (ftpfs_proxy_host)
1000 mc_config_set_string (mc_main_config, "Misc", "ftp_proxy_host", ftpfs_proxy_host);
1001 #endif /* ENABLE_VFS_FTP */
1003 #ifdef HAVE_CHARSET
1004 mc_config_set_string (mc_main_config, "Misc", "display_codepage",
1005 get_codepage_id (display_codepage));
1006 mc_config_set_string (mc_main_config, "Misc", "source_codepage",
1007 get_codepage_id (default_source_codepage));
1008 mc_config_set_string (mc_main_config, "Misc", "autodetect_codeset", autodetect_codeset);
1009 #endif /* HAVE_CHARSET */
1010 mc_config_set_string (mc_main_config, "Misc", "clipboard_store", clipboard_store_path);
1011 mc_config_set_string (mc_main_config, "Misc", "clipboard_paste", clipboard_paste_path);
1013 tmp_profile = g_build_filename (home_dir, MC_USERCONF_DIR, MC_CONFIG_FILE, NULL);
1014 ret = mc_config_save_to_file (mc_main_config, tmp_profile, NULL);
1015 g_free (tmp_profile);
1018 saving_setup = 0;
1020 return ret;
1023 /* --------------------------------------------------------------------------------------------- */
1025 void
1026 done_setup (void)
1028 size_t i;
1030 g_free (clipboard_store_path);
1031 g_free (clipboard_paste_path);
1032 g_free (profile_name);
1033 g_free (global_profile_name);
1034 g_free (color_terminal_string);
1035 g_free (term_color_string);
1036 g_free (setup_color_string);
1037 g_free (panels_profile_name);
1038 mc_config_deinit (mc_main_config);
1039 mc_config_deinit (mc_panels_config);
1041 g_free (user_recent_timeformat);
1042 g_free (user_old_timeformat);
1044 for (i = 0; str_options[i].opt_name != NULL; i++)
1045 g_free (*str_options[i].opt_addr);
1047 done_hotlist ();
1048 done_panelize ();
1049 /* directory_history_free (); */
1051 #ifdef HAVE_CHARSET
1052 g_free (autodetect_codeset);
1053 free_codepages_list ();
1054 #endif
1057 /* --------------------------------------------------------------------------------------------- */
1059 void
1060 save_config (void)
1062 size_t i;
1064 /* Save integer options */
1065 for (i = 0; int_options[i].opt_name != NULL; i++)
1066 mc_config_set_int (mc_main_config, CONFIG_APP_SECTION, int_options[i].opt_name,
1067 *int_options[i].opt_addr);
1069 /* Save string options */
1070 for (i = 0; str_options[i].opt_name != NULL; i++)
1071 mc_config_set_string (mc_main_config, CONFIG_APP_SECTION, str_options[i].opt_name,
1072 *str_options[i].opt_addr);
1075 /* --------------------------------------------------------------------------------------------- */
1077 void
1078 setup_save_config_show_error (const char *filename, GError ** error)
1080 if (error != NULL && *error != NULL)
1082 message (D_ERROR, MSG_ERROR, _("Cannot save file %s:\n%s"), filename, (*error)->message);
1083 g_error_free (*error);
1084 *error = NULL;
1088 /* --------------------------------------------------------------------------------------------- */
1090 void
1091 save_layout (void)
1093 size_t i;
1095 /* Save integer options */
1096 for (i = 0; layout[i].opt_name != NULL; i++)
1097 mc_config_set_int (mc_main_config, "Layout", layout[i].opt_name, *layout[i].opt_addr);
1100 /* --------------------------------------------------------------------------------------------- */
1102 void
1103 load_key_defs (void)
1106 * Load keys from mc.lib before ~/.mc/ini, so that the user
1107 * definitions override global settings.
1109 mc_config_t *mc_global_config;
1111 mc_global_config = mc_config_init (global_profile_name);
1112 if (mc_global_config != NULL)
1114 load_keys_from_section ("general", mc_global_config);
1115 load_keys_from_section (getenv ("TERM"), mc_global_config);
1116 mc_config_deinit (mc_global_config);
1119 load_keys_from_section ("general", mc_main_config);
1120 load_keys_from_section (getenv ("TERM"), mc_main_config);
1123 /* --------------------------------------------------------------------------------------------- */
1125 #ifdef ENABLE_VFS_FTP
1126 char *
1127 load_anon_passwd (void)
1129 char *buffer;
1131 buffer = mc_config_get_string (mc_main_config, "Misc", "ftpfs_password", "");
1133 if ((buffer != NULL) && (buffer[0] != '\0'))
1134 return buffer;
1136 g_free (buffer);
1137 return NULL;
1139 #endif /* ENABLE_VFS_FTP */
1141 /* --------------------------------------------------------------------------------------------- */
1143 void
1144 load_keymap_defs (void)
1147 * Load keymap from GLOBAL_KEYMAP_FILE before ~/.mc/keymap, so that the user
1148 * definitions override global settings.
1150 mc_config_t *mc_global_keymap;
1152 mc_global_keymap = load_setup_get_keymap_profile_config ();
1154 if (mc_global_keymap != NULL)
1156 #ifdef USE_INTERNAL_EDIT
1157 editor_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1158 load_keymap_from_section ("editor", editor_keymap, mc_global_keymap);
1159 editor_x_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1160 load_keymap_from_section ("editor:xmap", editor_x_keymap, mc_global_keymap);
1161 #endif
1163 viewer_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1164 load_keymap_from_section ("viewer", viewer_keymap, mc_global_keymap);
1165 viewer_hex_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1166 load_keymap_from_section ("viewer:hex", viewer_hex_keymap, mc_global_keymap);
1168 main_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1169 load_keymap_from_section ("main", main_keymap, mc_global_keymap);
1170 main_x_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1171 load_keymap_from_section ("main:xmap", main_x_keymap, mc_global_keymap);
1173 panel_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1174 load_keymap_from_section ("panel", panel_keymap, mc_global_keymap);
1176 input_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1177 load_keymap_from_section ("input", input_keymap, mc_global_keymap);
1179 listbox_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1180 load_keymap_from_section ("listbox", listbox_keymap, mc_global_keymap);
1182 tree_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1183 load_keymap_from_section ("tree", tree_keymap, mc_global_keymap);
1185 help_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1186 load_keymap_from_section ("help", help_keymap, mc_global_keymap);
1188 dialog_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1189 load_keymap_from_section ("dialog", dialog_keymap, mc_global_keymap);
1191 #ifdef USE_DIFF_VIEW
1192 diff_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1193 load_keymap_from_section ("diffviewer", diff_keymap, mc_global_keymap);
1194 #endif
1195 mc_config_deinit (mc_global_keymap);
1198 main_map = default_main_map;
1199 if (main_keymap && main_keymap->len > 0)
1200 main_map = (global_keymap_t *) main_keymap->data;
1202 main_x_map = default_main_x_map;
1203 if (main_x_keymap && main_x_keymap->len > 0)
1204 main_x_map = (global_keymap_t *) main_x_keymap->data;
1206 panel_map = default_panel_keymap;
1207 if (panel_keymap && panel_keymap->len > 0)
1208 panel_map = (global_keymap_t *) panel_keymap->data;
1210 input_map = default_input_keymap;
1211 if (input_keymap && input_keymap->len > 0)
1212 input_map = (global_keymap_t *) input_keymap->data;
1214 listbox_map = default_listbox_keymap;
1215 if (listbox_keymap && listbox_keymap->len > 0)
1216 listbox_map = (global_keymap_t *) listbox_keymap->data;
1218 tree_map = default_tree_keymap;
1219 if (tree_keymap && tree_keymap->len > 0)
1220 tree_map = (global_keymap_t *) tree_keymap->data;
1222 help_map = default_help_keymap;
1223 if (help_keymap && help_keymap->len > 0)
1224 help_map = (global_keymap_t *) help_keymap->data;
1226 dialog_map = default_dialog_keymap;
1227 if (dialog_keymap && dialog_keymap->len > 0)
1228 dialog_map = (global_keymap_t *) dialog_keymap->data;
1230 #ifdef USE_DIFF_VIEW
1231 diff_map = default_diff_keymap;
1232 if (diff_keymap && diff_keymap->len > 0)
1233 diff_map = (global_keymap_t *) diff_keymap->data;
1234 #endif
1238 /* --------------------------------------------------------------------------------------------- */
1240 void
1241 free_keymap_defs (void)
1243 #ifdef USE_INTERNAL_EDIT
1244 if (editor_keymap != NULL)
1245 g_array_free (editor_keymap, TRUE);
1246 if (editor_x_keymap != NULL)
1247 g_array_free (editor_x_keymap, TRUE);
1248 #endif
1249 if (viewer_keymap != NULL)
1250 g_array_free (viewer_keymap, TRUE);
1251 if (viewer_hex_keymap != NULL)
1252 g_array_free (viewer_hex_keymap, TRUE);
1253 if (main_keymap != NULL)
1254 g_array_free (main_keymap, TRUE);
1255 if (main_x_keymap != NULL)
1256 g_array_free (main_x_keymap, TRUE);
1257 if (panel_keymap != NULL)
1258 g_array_free (panel_keymap, TRUE);
1259 if (input_keymap != NULL)
1260 g_array_free (input_keymap, TRUE);
1261 if (listbox_keymap != NULL)
1262 g_array_free (listbox_keymap, TRUE);
1263 if (tree_keymap != NULL)
1264 g_array_free (tree_keymap, TRUE);
1265 if (help_keymap != NULL)
1266 g_array_free (help_keymap, TRUE);
1267 if (dialog_keymap != NULL)
1268 g_array_free (dialog_keymap, TRUE);
1269 #ifdef USE_DIFF_VIEW
1270 if (diff_keymap != NULL)
1271 g_array_free (diff_keymap, TRUE);
1272 #endif
1275 /* --------------------------------------------------------------------------------------------- */
1277 void
1278 panel_load_setup (WPanel * panel, const char *section)
1280 size_t i;
1281 char *buffer, buffer2[BUF_TINY];
1283 panel->sort_info.reverse = mc_config_get_int (mc_panels_config, section, "reverse", 0);
1284 panel->sort_info.case_sensitive =
1285 mc_config_get_int (mc_panels_config, section, "case_sensitive",
1286 OS_SORT_CASE_SENSITIVE_DEFAULT);
1287 panel->sort_info.exec_first = mc_config_get_int (mc_panels_config, section, "exec_first", 0);
1289 /* Load sort order */
1290 buffer = mc_config_get_string (mc_panels_config, section, "sort_order", "name");
1291 panel->sort_info.sort_field = panel_get_field_by_id (buffer);
1292 if (panel->sort_info.sort_field == NULL)
1293 panel->sort_info.sort_field = panel_get_field_by_id ("name");
1295 g_free (buffer);
1297 /* Load the listing mode */
1298 buffer = mc_config_get_string (mc_panels_config, section, "list_mode", "full");
1299 panel->list_type = list_full;
1300 for (i = 0; list_types[i].key != NULL; i++)
1301 if (g_ascii_strcasecmp (list_types[i].key, buffer) == 0)
1303 panel->list_type = list_types[i].list_type;
1304 break;
1306 g_free (buffer);
1308 /* User formats */
1309 g_free (panel->user_format);
1310 panel->user_format =
1311 mc_config_get_string (mc_panels_config, section, "user_format", DEFAULT_USER_FORMAT);
1313 for (i = 0; i < LIST_TYPES; i++)
1315 g_free (panel->user_status_format[i]);
1316 g_snprintf (buffer2, BUF_TINY, "user_status%lld", (long long) i);
1317 panel->user_status_format[i] =
1318 mc_config_get_string (mc_panels_config, section, buffer2, DEFAULT_USER_FORMAT);
1321 panel->user_mini_status = mc_config_get_int (mc_panels_config, section, "user_mini_status", 0);
1324 /* --------------------------------------------------------------------------------------------- */
1326 void
1327 panel_save_setup (struct WPanel *panel, const char *section)
1329 char buffer[BUF_TINY];
1330 size_t i;
1332 mc_config_set_int (mc_panels_config, section, "reverse", panel->sort_info.reverse);
1333 mc_config_set_int (mc_panels_config, section, "case_sensitive", panel->sort_info.case_sensitive);
1334 mc_config_set_int (mc_panels_config, section, "exec_first", panel->sort_info.exec_first);
1336 mc_config_set_string (mc_panels_config, section, "sort_order", panel->sort_info.sort_field->id);
1338 for (i = 0; list_types[i].key != NULL; i++)
1339 if (list_types[i].list_type == panel->list_type)
1341 mc_config_set_string (mc_panels_config, section, "list_mode", list_types[i].key);
1342 break;
1345 mc_config_set_string (mc_panels_config, section, "user_format", panel->user_format);
1347 for (i = 0; i < LIST_TYPES; i++)
1349 g_snprintf (buffer, BUF_TINY, "user_status%lld", (long long) i);
1350 mc_config_set_string (mc_panels_config, section, buffer, panel->user_status_format[i]);
1353 mc_config_set_int (mc_panels_config, section, "user_mini_status", panel->user_mini_status);
1356 /* --------------------------------------------------------------------------------------------- */
1359 Load panels options from [Panels] section.
1361 void
1362 panels_load_options (void)
1364 size_t i;
1365 int qmode;
1367 /* Backward compatibility: load old parameters */
1368 for (i = 0; panels_ini_options[i].opt_name != NULL; i++)
1369 *panels_ini_options[i].opt_addr =
1370 mc_config_get_int (mc_main_config, CONFIG_APP_SECTION,
1371 panels_ini_options[i].opt_old_name != NULL
1372 ? panels_ini_options[i].opt_old_name : panels_ini_options[i].
1373 opt_name, *panels_ini_options[i].opt_addr);
1375 qmode = mc_config_get_int (mc_main_config, CONFIG_APP_SECTION,
1376 "quick_search_case_sensitive", (int) panels_options.qsearch_mode);
1377 if (qmode < 0)
1378 panels_options.qsearch_mode = QSEARCH_CASE_INSENSITIVE;
1379 else if (qmode >= QSEARCH_NUM)
1380 panels_options.qsearch_mode = QSEARCH_PANEL_CASE;
1381 else
1382 panels_options.qsearch_mode = (qsearch_mode_t) qmode;
1384 /* overwrite by new parameters */
1385 if (mc_config_has_group (mc_main_config, CONFIG_PANELS_SECTION))
1387 for (i = 0; panels_ini_options[i].opt_name != NULL; i++)
1388 *panels_ini_options[i].opt_addr =
1389 mc_config_get_bool (mc_main_config, CONFIG_PANELS_SECTION,
1390 panels_ini_options[i].opt_name,
1391 *panels_ini_options[i].opt_addr);
1393 qmode = mc_config_get_int (mc_main_config, CONFIG_PANELS_SECTION,
1394 "quick_search_mode", (int) panels_options.qsearch_mode);
1395 if (qmode < 0)
1396 panels_options.qsearch_mode = QSEARCH_CASE_INSENSITIVE;
1397 else if (qmode >= QSEARCH_NUM)
1398 panels_options.qsearch_mode = QSEARCH_PANEL_CASE;
1399 else
1400 panels_options.qsearch_mode = (qsearch_mode_t) qmode;
1404 /* --------------------------------------------------------------------------------------------- */
1407 Save panels options in [Panels] section.
1409 void
1410 panels_save_options (void)
1412 size_t i;
1414 for (i = 0; panels_ini_options[i].opt_name != NULL; i++)
1415 mc_config_set_bool (mc_main_config, CONFIG_PANELS_SECTION,
1416 panels_ini_options[i].opt_name, *panels_ini_options[i].opt_addr);
1418 mc_config_set_int (mc_main_config, CONFIG_PANELS_SECTION,
1419 "quick_search_mode", (int) panels_options.qsearch_mode);
1422 /* --------------------------------------------------------------------------------------------- */