Merge branch '2031_solaris_FISH_fix'
[midnight-commander.git] / src / setup.c
blobded84627e8a96ebef9cba525a6f2747c721c0d05
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 static const char *panels_section = "Panels";
372 /*** file scope functions ************************************************************************/
373 /* --------------------------------------------------------------------------------------------- */
377 Get name of config file.
379 \param subdir
380 if not NULL, then config also search into specified subdir.
382 \param config_file_name
383 If specified filename is relative, then will search in standart patches.
385 \return
386 Newly allocated path to config name or NULL if file not found.
388 If config_file_name is a relative path, then search config in stantart pathes.
390 static char *
391 load_setup_get_full_config_name (const char *subdir, const char *config_file_name)
394 TODO: IMHO, in future this function must be placed into mc_config module.
395 Also, need to rename stupid mc_home and mc_home_alt to mc_sysconfdir and mc_datadir;
396 home_mc => mc_user_homedir
398 char *lc_basename, *ret;
400 if (config_file_name == NULL)
401 return NULL;
403 if (g_path_is_absolute (config_file_name))
404 return g_strdup (config_file_name);
407 lc_basename = g_path_get_basename (config_file_name);
408 if (lc_basename == NULL)
409 return NULL;
411 if (subdir != NULL)
412 ret = g_build_filename (home_dir, MC_USERCONF_DIR, subdir, lc_basename, NULL);
413 else
414 ret = g_build_filename (home_dir, MC_USERCONF_DIR, lc_basename, NULL);
416 if (exist_file (ret))
418 g_free (lc_basename);
419 return ret;
421 g_free (ret);
423 if (subdir != NULL)
424 ret = g_build_filename (mc_home, subdir, lc_basename, NULL);
425 else
426 ret = g_build_filename (mc_home, lc_basename, NULL);
428 if (exist_file (ret))
430 g_free (lc_basename);
431 return ret;
433 g_free (ret);
435 if (subdir != NULL)
436 ret = g_build_filename (mc_home_alt, subdir, lc_basename, NULL);
437 else
438 ret = g_build_filename (mc_home_alt, lc_basename, NULL);
440 g_free (lc_basename);
442 if (exist_file (ret))
443 return ret;
445 g_free (ret);
446 return NULL;
450 /* --------------------------------------------------------------------------------------------- */
452 static const char *
453 setup__is_cfg_group_must_panel_config (const char *grp)
455 return (!strcasecmp ("Dirs", grp) ||
456 !strcasecmp ("Temporal:New Right Panel", grp) ||
457 !strcasecmp ("Temporal:New Left Panel", grp) ||
458 !strcasecmp ("New Left Panel", grp) || !strcasecmp ("New Right Panel", grp))
459 ? grp : NULL;
462 /* --------------------------------------------------------------------------------------------- */
464 static void
465 setup__move_panels_config_into_separate_file (const char *profile)
467 mc_config_t *tmp_cfg;
468 char **groups, **curr_grp;
469 const char *need_grp;
471 if (!exist_file (profile))
472 return;
474 tmp_cfg = mc_config_init (profile);
475 if (!tmp_cfg)
476 return;
478 curr_grp = groups = mc_config_get_groups (tmp_cfg, NULL);
479 if (!groups)
481 mc_config_deinit (tmp_cfg);
482 return;
485 while (*curr_grp)
487 if (setup__is_cfg_group_must_panel_config (*curr_grp) == NULL)
488 mc_config_del_group (tmp_cfg, *curr_grp);
489 curr_grp++;
492 mc_config_save_to_file (tmp_cfg, panels_profile_name, NULL);
493 mc_config_deinit (tmp_cfg);
495 tmp_cfg = mc_config_init (profile);
496 if (!tmp_cfg)
498 g_strfreev (groups);
499 return;
502 curr_grp = groups;
504 while (*curr_grp)
506 need_grp = setup__is_cfg_group_must_panel_config (*curr_grp);
507 if (need_grp != NULL)
509 mc_config_del_group (tmp_cfg, need_grp);
511 curr_grp++;
513 g_strfreev (groups);
515 mc_config_save_file (tmp_cfg, NULL);
516 mc_config_deinit (tmp_cfg);
519 /* --------------------------------------------------------------------------------------------- */
521 Create new mc_config object from specified ini-file or
522 append data to existing mc_config object from ini-file
526 static void
527 load_setup_init_config_from_file (mc_config_t ** config, const char *fname)
530 TODO: IMHO, in future this function must be placed into mc_config module.
532 if (exist_file (fname))
534 if (*config != NULL)
535 mc_config_read_file (*config, fname);
536 else
537 *config = mc_config_init (fname);
541 /* --------------------------------------------------------------------------------------------- */
543 static void
544 load_layout (void)
546 size_t i;
548 for (i = 0; layout[i].opt_name != NULL; i++)
549 *layout[i].opt_addr = mc_config_get_int (mc_main_config, "Layout",
550 layout[i].opt_name, *layout[i].opt_addr);
553 /* --------------------------------------------------------------------------------------------- */
555 static void
556 load_keys_from_section (const char *terminal, mc_config_t * cfg)
558 char *section_name;
559 gchar **profile_keys, **keys;
560 gchar **values, **curr_values;
561 char *valcopy, *value;
562 long key_code;
563 gsize len, values_len;
565 if (terminal == NULL)
566 return;
568 section_name = g_strconcat ("terminal:", terminal, (char *) NULL);
569 profile_keys = keys = mc_config_get_keys (cfg, section_name, &len);
571 while (*profile_keys != NULL)
573 /* copy=other causes all keys from [terminal:other] to be loaded. */
574 if (g_ascii_strcasecmp (*profile_keys, "copy") == 0)
576 valcopy = mc_config_get_string (cfg, section_name, *profile_keys, "");
577 load_keys_from_section (valcopy, cfg);
578 g_free (valcopy);
579 profile_keys++;
580 continue;
583 curr_values = values =
584 mc_config_get_string_list (cfg, section_name, *profile_keys, &values_len);
586 key_code = lookup_key (*profile_keys, NULL);
588 if (key_code != 0)
590 if (curr_values != NULL)
592 while (*curr_values != NULL)
594 valcopy = convert_controls (*curr_values);
595 define_sequence (key_code, valcopy, MCKEY_NOACTION);
596 g_free (valcopy);
597 curr_values++;
600 else
602 value = mc_config_get_string (cfg, section_name, *profile_keys, "");
603 valcopy = convert_controls (value);
604 define_sequence (key_code, valcopy, MCKEY_NOACTION);
605 g_free (valcopy);
606 g_free (value);
610 profile_keys++;
612 if (values != NULL)
613 g_strfreev (values);
615 g_strfreev (keys);
616 g_free (section_name);
619 /* --------------------------------------------------------------------------------------------- */
621 static void
622 load_keymap_from_section (const char *section_name, GArray * keymap, mc_config_t * cfg)
624 gchar **profile_keys, **keys;
625 gchar **values, **curr_values;
626 char *valcopy, *value;
627 int action;
628 gsize len, values_len;
630 if (section_name == NULL)
631 return;
633 profile_keys = keys = mc_config_get_keys (cfg, section_name, &len);
635 while (*profile_keys != NULL)
637 curr_values = values =
638 mc_config_get_string_list (cfg, section_name, *profile_keys, &values_len);
640 action = keybind_lookup_action (*profile_keys);
642 if (action > 0)
644 if (curr_values != NULL)
646 while (*curr_values != NULL)
648 valcopy = convert_controls (*curr_values);
649 keybind_cmd_bind (keymap, valcopy, action);
650 g_free (valcopy);
651 curr_values++;
654 else
656 value = mc_config_get_string (cfg, section_name, *profile_keys, "");
657 valcopy = convert_controls (value);
658 /* define_sequence (key_code, valcopy, MCKEY_NOACTION); */
659 g_free (valcopy);
660 g_free (value);
664 profile_keys++;
666 if (values != NULL)
667 g_strfreev (values);
669 g_strfreev (keys);
672 /* --------------------------------------------------------------------------------------------- */
674 static mc_config_t *
675 load_setup_get_keymap_profile_config (void)
678 TODO: IMHO, in future this function must be placed into mc_config module.
680 mc_config_t *keymap_config = NULL;
681 char *fname, *fname2;
683 /* 1) /usr/share/mc (mc_home_alt) */
684 fname = g_build_filename (mc_home_alt, GLOBAL_KEYMAP_FILE, NULL);
685 load_setup_init_config_from_file (&keymap_config, fname);
686 g_free (fname);
688 /* 2) /etc/mc (mc_home) */
689 fname = g_build_filename (mc_home, GLOBAL_KEYMAP_FILE, NULL);
690 load_setup_init_config_from_file (&keymap_config, fname);
691 g_free (fname);
693 /* 3) ~/.mc (home_dir?) */
694 fname = g_build_filename (home_dir, MC_USERCONF_DIR, GLOBAL_KEYMAP_FILE, NULL);
695 load_setup_init_config_from_file (&keymap_config, fname);
696 g_free (fname);
698 /* 4) main config; [Midnight Commander] -> keymap */
700 fname2 =
701 mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, "keymap", GLOBAL_KEYMAP_FILE);
702 fname = load_setup_get_full_config_name (NULL, fname2);
703 if (fname != NULL)
705 load_setup_init_config_from_file (&keymap_config, fname);
706 g_free (fname);
708 g_free (fname2);
710 /* 5) getenv("MC_KEYMAP") */
711 fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP"));
712 if (fname != NULL)
714 load_setup_init_config_from_file (&keymap_config, fname);
715 g_free (fname);
718 /* 6) --keymap=<keymap> */
719 fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file);
720 if (fname != NULL)
722 load_setup_init_config_from_file (&keymap_config, fname);
723 g_free (fname);
726 return keymap_config;
729 /* --------------------------------------------------------------------------------------------- */
731 static panel_view_mode_t
732 setup__load_panel_state (const char *section)
734 char *buffer;
735 size_t i;
736 panel_view_mode_t mode = view_listing;
738 /* Load the display mode */
739 buffer = mc_config_get_string (mc_panels_config, section, "display", "listing");
741 for (i = 0; panel_types[i].opt_name != NULL; i++)
742 if (g_ascii_strcasecmp (panel_types[i].opt_name, buffer) == 0)
744 mode = panel_types[i].opt_type;
745 break;
748 g_free (buffer);
750 return mode;
753 /* --------------------------------------------------------------------------------------------- */
755 static void
756 panel_save_type (const char *section, panel_view_mode_t type)
758 size_t i;
760 for (i = 0; panel_types[i].opt_name != NULL; i++)
761 if (panel_types[i].opt_type == type)
763 mc_config_set_string (mc_panels_config, section, "display", panel_types[i].opt_name);
764 break;
768 /* --------------------------------------------------------------------------------------------- */
770 /* save panels.ini */
771 static void
772 save_panel_types (void)
774 panel_view_mode_t type;
776 if (mc_run_mode != MC_RUN_FULL)
777 return;
779 type = get_display_type (0);
780 panel_save_type ("New Left Panel", type);
781 if (type == view_listing)
782 panel_save_setup (left_panel, left_panel->panel_name);
783 type = get_display_type (1);
784 panel_save_type ("New Right Panel", type);
785 if (type == view_listing)
786 panel_save_setup (right_panel, right_panel->panel_name);
788 mc_config_set_string (mc_panels_config, "Dirs", "other_dir", get_panel_dir_for (other_panel));
790 if (current_panel != NULL)
791 mc_config_set_string (mc_panels_config, "Dirs", "current_is_left",
792 get_current_index () == 0 ? "1" : "0");
794 if (mc_panels_config->ini_path == NULL)
795 mc_panels_config->ini_path = g_strdup (panels_profile_name);
797 mc_config_del_group (mc_panels_config, "Temporal:New Left Panel");
798 mc_config_del_group (mc_panels_config, "Temporal:New Right Panel");
800 mc_config_save_file (mc_panels_config, NULL);
803 /* --------------------------------------------------------------------------------------------- */
804 /*** public functions ****************************************************************************/
805 /* --------------------------------------------------------------------------------------------- */
807 char *
808 setup_init (void)
810 char *profile;
811 char *inifile;
813 if (profile_name != NULL)
814 return profile_name;
816 profile = g_build_filename (home_dir, MC_USERCONF_DIR, MC_CONFIG_FILE, NULL);
817 if (!exist_file (profile))
819 inifile = concat_dir_and_file (mc_home, "mc.ini");
820 if (exist_file (inifile))
822 g_free (profile);
823 profile = inifile;
825 else
827 g_free (inifile);
828 inifile = concat_dir_and_file (mc_home_alt, "mc.ini");
829 if (exist_file (inifile))
831 g_free (profile);
832 profile = inifile;
834 else
835 g_free (inifile);
839 profile_name = profile;
841 return profile;
844 /* --------------------------------------------------------------------------------------------- */
846 void
847 load_setup (void)
849 char *profile;
850 size_t i;
851 char *buffer;
852 const char *kt;
854 #ifdef HAVE_CHARSET
855 load_codepages_list ();
856 #endif /* HAVE_CHARSET */
858 profile = setup_init ();
860 /* mc.lib is common for all users, but has priority lower than
861 ~/.mc/ini. FIXME: it's only used for keys and treestore now */
862 global_profile_name = g_build_filename (mc_home, MC_GLOBAL_CONFIG_FILE, (char *) NULL);
863 if (!exist_file (global_profile_name))
865 g_free (global_profile_name);
866 global_profile_name = g_build_filename (mc_home_alt, MC_GLOBAL_CONFIG_FILE, (char *) NULL);
869 panels_profile_name = g_build_filename (home_dir, MC_USERCONF_DIR, MC_PANELS_FILE, NULL);
871 mc_main_config = mc_config_init (profile);
873 if (!exist_file (panels_profile_name))
874 setup__move_panels_config_into_separate_file (profile);
876 mc_panels_config = mc_config_init (panels_profile_name);
878 /* Load integer boolean options */
879 for (i = 0; int_options[i].opt_name != NULL; i++)
880 *int_options[i].opt_addr =
881 mc_config_get_int (mc_main_config, CONFIG_APP_SECTION, int_options[i].opt_name,
882 *int_options[i].opt_addr);
884 if (option_tab_spacing <= 0)
885 option_tab_spacing = DEFAULT_TAB_SPACING;
887 #ifdef USE_INTERNAL_EDIT
888 if (option_word_wrap_line_length <= 0)
889 option_word_wrap_line_length = DEFAULT_WRAP_LINE_LENGTH;
890 #endif /* USE_INTERNAL_EDIT */
892 /* overwrite old_esc_mode_timeout */
893 kt = getenv ("KEYBOARD_KEY_TIMEOUT_US");
894 if ((kt != NULL) && (kt[0] != '\0'))
895 old_esc_mode_timeout = atoi (kt);
897 /* Load string options */
898 for (i = 0; str_options[i].opt_name != NULL; i++)
899 *str_options[i].opt_addr =
900 mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, str_options[i].opt_name,
901 str_options[i].opt_defval);
903 load_layout ();
904 panels_load_options ();
905 load_panelize ();
907 startup_left_mode = setup__load_panel_state ("New Left Panel");
908 startup_right_mode = setup__load_panel_state ("New Right Panel");
910 /* At least one of the panels is a listing panel */
911 if (startup_left_mode != view_listing && startup_right_mode != view_listing)
912 startup_left_mode = view_listing;
914 if (mc_run_param1 == NULL)
916 buffer = mc_config_get_string (mc_panels_config, "Dirs", "other_dir", ".");
917 if (vfs_file_is_local (buffer))
918 mc_run_param1 = buffer;
919 else
920 g_free (buffer);
923 boot_current_is_left = mc_config_get_bool (mc_panels_config, "Dirs", "current_is_left", TRUE);
925 /* Load time formats */
926 user_recent_timeformat =
927 mc_config_get_string (mc_main_config, "Misc", "timeformat_recent", FMTTIME);
928 user_old_timeformat = mc_config_get_string (mc_main_config, "Misc", "timeformat_old", FMTYEAR);
930 #ifdef ENABLE_VFS_FTP
931 ftpfs_proxy_host = mc_config_get_string (mc_main_config, "Misc", "ftp_proxy_host", "gate");
932 ftpfs_ignore_chattr_errors = mc_config_get_bool (mc_main_config, CONFIG_APP_SECTION,
933 "ignore_ftp_chattr_errors", TRUE);
934 ftpfs_init_passwd ();
935 #endif /* ENABLE_VFS_FTP */
937 /* The default color and the terminal dependent color */
938 setup_color_string = mc_config_get_string (mc_main_config, "Colors", "base_color", "");
939 term_color_string = mc_config_get_string (mc_main_config, "Colors", getenv ("TERM"), "");
940 color_terminal_string = mc_config_get_string (mc_main_config, "Colors", "color_terminals", "");
942 /* Load the directory history */
943 /* directory_history_load (); */
944 /* Remove the temporal entries */
946 #ifdef HAVE_CHARSET
947 if (codepages->len > 1)
949 buffer = mc_config_get_string (mc_main_config, "Misc", "display_codepage", "");
950 if (buffer[0] != '\0')
952 display_codepage = get_codepage_index (buffer);
953 cp_display = get_codepage_id (display_codepage);
955 g_free (buffer);
956 buffer = mc_config_get_string (mc_main_config, "Misc", "source_codepage", "");
957 if (buffer[0] != '\0')
959 default_source_codepage = get_codepage_index (buffer);
960 source_codepage = default_source_codepage; /* May be source_codepage doesn't need this */
961 cp_source = get_codepage_id (source_codepage);
963 g_free (buffer);
966 autodetect_codeset = mc_config_get_string (mc_main_config, "Misc", "autodetect_codeset", "");
967 if ((autodetect_codeset[0] != '\0') && (strcmp (autodetect_codeset, "off") != 0))
968 is_autodetect_codeset_enabled = TRUE;
970 g_free (init_translation_table (source_codepage, display_codepage));
971 buffer = (char *) get_codepage_id (display_codepage);
972 if (buffer != NULL)
973 utf8_display = str_isutf8 (buffer);
974 #endif /* HAVE_CHARSET */
976 clipboard_store_path = mc_config_get_string (mc_main_config, "Misc", "clipboard_store", "");
977 clipboard_paste_path = mc_config_get_string (mc_main_config, "Misc", "clipboard_paste", "");
980 /* --------------------------------------------------------------------------------------------- */
982 gboolean
983 save_setup (gboolean save_options, gboolean save_panel_options)
985 gboolean ret = TRUE;
987 saving_setup = 1;
989 save_hotlist ();
991 if (save_panel_options)
992 save_panel_types ();
994 if (save_options)
996 char *tmp_profile;
998 save_config ();
999 save_layout ();
1000 panels_save_options ();
1001 save_panelize ();
1002 /* directory_history_save (); */
1004 #ifdef ENABLE_VFS_FTP
1005 mc_config_set_string (mc_main_config, "Misc", "ftpfs_password", ftpfs_anonymous_passwd);
1006 if (ftpfs_proxy_host)
1007 mc_config_set_string (mc_main_config, "Misc", "ftp_proxy_host", ftpfs_proxy_host);
1008 #endif /* ENABLE_VFS_FTP */
1010 #ifdef HAVE_CHARSET
1011 mc_config_set_string (mc_main_config, "Misc", "display_codepage",
1012 get_codepage_id (display_codepage));
1013 mc_config_set_string (mc_main_config, "Misc", "source_codepage",
1014 get_codepage_id (default_source_codepage));
1015 mc_config_set_string (mc_main_config, "Misc", "autodetect_codeset", autodetect_codeset);
1016 #endif /* HAVE_CHARSET */
1017 mc_config_set_string (mc_main_config, "Misc", "clipboard_store", clipboard_store_path);
1018 mc_config_set_string (mc_main_config, "Misc", "clipboard_paste", clipboard_paste_path);
1020 tmp_profile = g_build_filename (home_dir, MC_USERCONF_DIR, MC_CONFIG_FILE, NULL);
1021 ret = mc_config_save_to_file (mc_main_config, tmp_profile, NULL);
1023 g_free (tmp_profile);
1026 saving_setup = 0;
1028 return ret;
1031 /* --------------------------------------------------------------------------------------------- */
1033 void
1034 done_setup (void)
1036 size_t i;
1038 g_free (clipboard_store_path);
1039 g_free (clipboard_paste_path);
1040 g_free (profile_name);
1041 g_free (global_profile_name);
1042 g_free (color_terminal_string);
1043 g_free (term_color_string);
1044 g_free (setup_color_string);
1045 g_free (panels_profile_name);
1046 mc_config_deinit (mc_main_config);
1047 mc_config_deinit (mc_panels_config);
1049 g_free (user_recent_timeformat);
1050 g_free (user_old_timeformat);
1052 for (i = 0; str_options[i].opt_name != NULL; i++)
1053 g_free (*str_options[i].opt_addr);
1055 done_hotlist ();
1056 done_panelize ();
1057 /* directory_history_free (); */
1059 #ifdef HAVE_CHARSET
1060 g_free (autodetect_codeset);
1061 free_codepages_list ();
1062 #endif
1065 /* --------------------------------------------------------------------------------------------- */
1067 void
1068 save_config (void)
1070 char *profile;
1071 GError *error = NULL;
1072 size_t i;
1074 profile = g_build_filename (home_dir, MC_USERCONF_DIR, MC_CONFIG_FILE, NULL);
1076 /* Save integer options */
1077 for (i = 0; int_options[i].opt_name != NULL; i++)
1078 mc_config_set_int (mc_main_config, CONFIG_APP_SECTION, int_options[i].opt_name,
1079 *int_options[i].opt_addr);
1081 /* Save string options */
1082 for (i = 0; str_options[i].opt_name != NULL; i++)
1083 mc_config_set_string (mc_main_config, CONFIG_APP_SECTION, str_options[i].opt_name,
1084 *str_options[i].opt_addr);
1086 if (!mc_config_save_to_file (mc_main_config, profile, &error))
1087 setup_save_config_show_error (profile, &error);
1089 g_free (profile);
1092 /* --------------------------------------------------------------------------------------------- */
1094 void
1095 setup_save_config_show_error (const char *filename, GError ** error)
1097 if (error != NULL && *error != NULL)
1099 message (D_ERROR, MSG_ERROR, _("Cannot save file %s:\n%s"), filename, (*error)->message);
1100 g_error_free (*error);
1101 *error = NULL;
1105 /* --------------------------------------------------------------------------------------------- */
1107 void
1108 save_layout (void)
1110 char *profile;
1111 size_t i;
1113 profile = g_build_filename (home_dir, MC_USERCONF_DIR, MC_CONFIG_FILE, NULL);
1114 /* Save integer options */
1115 for (i = 0; layout[i].opt_name != NULL; i++)
1116 mc_config_set_int (mc_main_config, "Layout", layout[i].opt_name, *layout[i].opt_addr);
1117 mc_config_save_to_file (mc_main_config, profile, NULL);
1118 g_free (profile);
1121 /* --------------------------------------------------------------------------------------------- */
1123 void
1124 load_key_defs (void)
1127 * Load keys from mc.lib before ~/.mc/ini, so that the user
1128 * definitions override global settings.
1130 mc_config_t *mc_global_config;
1132 mc_global_config = mc_config_init (global_profile_name);
1133 if (mc_global_config != NULL)
1135 load_keys_from_section ("general", mc_global_config);
1136 load_keys_from_section (getenv ("TERM"), mc_global_config);
1137 mc_config_deinit (mc_global_config);
1140 load_keys_from_section ("general", mc_main_config);
1141 load_keys_from_section (getenv ("TERM"), mc_main_config);
1144 /* --------------------------------------------------------------------------------------------- */
1146 #ifdef ENABLE_VFS_FTP
1147 char *
1148 load_anon_passwd (void)
1150 char *buffer;
1152 buffer = mc_config_get_string (mc_main_config, "Misc", "ftpfs_password", "");
1154 if ((buffer != NULL) && (buffer[0] != '\0'))
1155 return buffer;
1157 g_free (buffer);
1158 return NULL;
1160 #endif /* ENABLE_VFS_FTP */
1162 /* --------------------------------------------------------------------------------------------- */
1164 void
1165 load_keymap_defs (void)
1168 * Load keymap from GLOBAL_KEYMAP_FILE before ~/.mc/keymap, so that the user
1169 * definitions override global settings.
1171 mc_config_t *mc_global_keymap;
1173 mc_global_keymap = load_setup_get_keymap_profile_config ();
1175 if (mc_global_keymap != NULL)
1177 #ifdef USE_INTERNAL_EDIT
1178 editor_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1179 load_keymap_from_section ("editor", editor_keymap, mc_global_keymap);
1180 editor_x_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1181 load_keymap_from_section ("editor:xmap", editor_x_keymap, mc_global_keymap);
1182 #endif
1184 viewer_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1185 load_keymap_from_section ("viewer", viewer_keymap, mc_global_keymap);
1186 viewer_hex_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1187 load_keymap_from_section ("viewer:hex", viewer_hex_keymap, mc_global_keymap);
1189 main_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1190 load_keymap_from_section ("main", main_keymap, mc_global_keymap);
1191 main_x_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1192 load_keymap_from_section ("main:xmap", main_x_keymap, mc_global_keymap);
1194 panel_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1195 load_keymap_from_section ("panel", panel_keymap, mc_global_keymap);
1197 input_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1198 load_keymap_from_section ("input", input_keymap, mc_global_keymap);
1200 listbox_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1201 load_keymap_from_section ("listbox", listbox_keymap, mc_global_keymap);
1203 tree_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1204 load_keymap_from_section ("tree", tree_keymap, mc_global_keymap);
1206 help_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1207 load_keymap_from_section ("help", help_keymap, mc_global_keymap);
1209 dialog_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1210 load_keymap_from_section ("dialog", dialog_keymap, mc_global_keymap);
1212 #ifdef USE_DIFF_VIEW
1213 diff_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t));
1214 load_keymap_from_section ("diffviewer", diff_keymap, mc_global_keymap);
1215 #endif
1216 mc_config_deinit (mc_global_keymap);
1219 main_map = default_main_map;
1220 if (main_keymap && main_keymap->len > 0)
1221 main_map = (global_keymap_t *) main_keymap->data;
1223 main_x_map = default_main_x_map;
1224 if (main_x_keymap && main_x_keymap->len > 0)
1225 main_x_map = (global_keymap_t *) main_x_keymap->data;
1227 panel_map = default_panel_keymap;
1228 if (panel_keymap && panel_keymap->len > 0)
1229 panel_map = (global_keymap_t *) panel_keymap->data;
1231 input_map = default_input_keymap;
1232 if (input_keymap && input_keymap->len > 0)
1233 input_map = (global_keymap_t *) input_keymap->data;
1235 listbox_map = default_listbox_keymap;
1236 if (listbox_keymap && listbox_keymap->len > 0)
1237 listbox_map = (global_keymap_t *) listbox_keymap->data;
1239 tree_map = default_tree_keymap;
1240 if (tree_keymap && tree_keymap->len > 0)
1241 tree_map = (global_keymap_t *) tree_keymap->data;
1243 help_map = default_help_keymap;
1244 if (help_keymap && help_keymap->len > 0)
1245 help_map = (global_keymap_t *) help_keymap->data;
1247 dialog_map = default_dialog_keymap;
1248 if (dialog_keymap && dialog_keymap->len > 0)
1249 dialog_map = (global_keymap_t *) dialog_keymap->data;
1251 #ifdef USE_DIFF_VIEW
1252 diff_map = default_diff_keymap;
1253 if (diff_keymap && diff_keymap->len > 0)
1254 diff_map = (global_keymap_t *) diff_keymap->data;
1255 #endif
1259 /* --------------------------------------------------------------------------------------------- */
1261 void
1262 free_keymap_defs (void)
1264 #ifdef USE_INTERNAL_EDIT
1265 if (editor_keymap != NULL)
1266 g_array_free (editor_keymap, TRUE);
1267 if (editor_x_keymap != NULL)
1268 g_array_free (editor_x_keymap, TRUE);
1269 #endif
1270 if (viewer_keymap != NULL)
1271 g_array_free (viewer_keymap, TRUE);
1272 if (viewer_hex_keymap != NULL)
1273 g_array_free (viewer_hex_keymap, TRUE);
1274 if (main_keymap != NULL)
1275 g_array_free (main_keymap, TRUE);
1276 if (main_x_keymap != NULL)
1277 g_array_free (main_x_keymap, TRUE);
1278 if (panel_keymap != NULL)
1279 g_array_free (panel_keymap, TRUE);
1280 if (input_keymap != NULL)
1281 g_array_free (input_keymap, TRUE);
1282 if (listbox_keymap != NULL)
1283 g_array_free (listbox_keymap, TRUE);
1284 if (tree_keymap != NULL)
1285 g_array_free (tree_keymap, TRUE);
1286 if (help_keymap != NULL)
1287 g_array_free (help_keymap, TRUE);
1288 if (dialog_keymap != NULL)
1289 g_array_free (dialog_keymap, TRUE);
1290 #ifdef USE_DIFF_VIEW
1291 if (diff_keymap != NULL)
1292 g_array_free (diff_keymap, TRUE);
1293 #endif
1296 /* --------------------------------------------------------------------------------------------- */
1298 void
1299 panel_load_setup (WPanel * panel, const char *section)
1301 size_t i;
1302 char *buffer, buffer2[BUF_TINY];
1304 panel->reverse = mc_config_get_int (mc_panels_config, section, "reverse", 0);
1305 panel->case_sensitive =
1306 mc_config_get_int (mc_panels_config, section, "case_sensitive",
1307 OS_SORT_CASE_SENSITIVE_DEFAULT);
1308 panel->exec_first = mc_config_get_int (mc_panels_config, section, "exec_first", 0);
1310 /* Load sort order */
1311 buffer = mc_config_get_string (mc_panels_config, section, "sort_order", "name");
1312 panel->current_sort_field = panel_get_field_by_id (buffer);
1313 if (panel->current_sort_field == NULL)
1314 panel->current_sort_field = panel_get_field_by_id ("name");
1316 g_free (buffer);
1318 /* Load the listing mode */
1319 buffer = mc_config_get_string (mc_panels_config, section, "list_mode", "full");
1320 panel->list_type = list_full;
1321 for (i = 0; list_types[i].key != NULL; i++)
1322 if (g_ascii_strcasecmp (list_types[i].key, buffer) == 0)
1324 panel->list_type = list_types[i].list_type;
1325 break;
1327 g_free (buffer);
1329 /* User formats */
1330 g_free (panel->user_format);
1331 panel->user_format =
1332 mc_config_get_string (mc_panels_config, section, "user_format", DEFAULT_USER_FORMAT);
1334 for (i = 0; i < LIST_TYPES; i++)
1336 g_free (panel->user_status_format[i]);
1337 g_snprintf (buffer2, BUF_TINY, "user_status%lld", (long long) i);
1338 panel->user_status_format[i] =
1339 mc_config_get_string (mc_panels_config, section, buffer2, DEFAULT_USER_FORMAT);
1342 panel->user_mini_status = mc_config_get_int (mc_panels_config, section, "user_mini_status", 0);
1345 /* --------------------------------------------------------------------------------------------- */
1347 void
1348 panel_save_setup (struct WPanel *panel, const char *section)
1350 char buffer[BUF_TINY];
1351 size_t i;
1353 mc_config_set_int (mc_panels_config, section, "reverse", panel->reverse);
1354 mc_config_set_int (mc_panels_config, section, "case_sensitive", panel->case_sensitive);
1355 mc_config_set_int (mc_panels_config, section, "exec_first", panel->exec_first);
1357 mc_config_set_string (mc_panels_config, section, "sort_order", panel->current_sort_field->id);
1359 for (i = 0; list_types[i].key != NULL; i++)
1360 if (list_types[i].list_type == panel->list_type)
1362 mc_config_set_string (mc_panels_config, section, "list_mode", list_types[i].key);
1363 break;
1366 mc_config_set_string (mc_panels_config, section, "user_format", panel->user_format);
1368 for (i = 0; i < LIST_TYPES; i++)
1370 g_snprintf (buffer, BUF_TINY, "user_status%lld", (long long) i);
1371 mc_config_set_string (mc_panels_config, section, buffer, panel->user_status_format[i]);
1374 mc_config_set_int (mc_panels_config, section, "user_mini_status", panel->user_mini_status);
1377 /* --------------------------------------------------------------------------------------------- */
1380 Load panels options from [Panels] section.
1382 void
1383 panels_load_options (void)
1385 size_t i;
1386 int qmode;
1388 /* Backward compatibility: load old parameters */
1389 for (i = 0; panels_ini_options[i].opt_name != NULL; i++)
1390 *panels_ini_options[i].opt_addr =
1391 mc_config_get_int (mc_main_config, CONFIG_APP_SECTION,
1392 panels_ini_options[i].opt_old_name != NULL
1393 ? panels_ini_options[i].opt_old_name : panels_ini_options[i].
1394 opt_name, *panels_ini_options[i].opt_addr);
1396 qmode = mc_config_get_int (mc_main_config, CONFIG_APP_SECTION,
1397 "quick_search_case_sensitive", (int) panels_options.qsearch_mode);
1398 if (qmode < 0)
1399 panels_options.qsearch_mode = QSEARCH_CASE_INSENSITIVE;
1400 else if (qmode >= QSEARCH_NUM)
1401 panels_options.qsearch_mode = QSEARCH_PANEL_CASE;
1402 else
1403 panels_options.qsearch_mode = (qsearch_mode_t) qmode;
1405 /* overwrite by new parameters */
1406 if (mc_config_has_group (mc_main_config, panels_section))
1408 for (i = 0; panels_ini_options[i].opt_name != NULL; i++)
1409 *panels_ini_options[i].opt_addr =
1410 mc_config_get_bool (mc_main_config, panels_section,
1411 panels_ini_options[i].opt_name,
1412 *panels_ini_options[i].opt_addr);
1414 qmode = mc_config_get_int (mc_main_config, panels_section,
1415 "quick_search_mode", (int) panels_options.qsearch_mode);
1416 if (qmode < 0)
1417 panels_options.qsearch_mode = QSEARCH_CASE_INSENSITIVE;
1418 else if (qmode >= QSEARCH_NUM)
1419 panels_options.qsearch_mode = QSEARCH_PANEL_CASE;
1420 else
1421 panels_options.qsearch_mode = (qsearch_mode_t) qmode;
1425 /* --------------------------------------------------------------------------------------------- */
1428 Save panels options in [Panels] section.
1430 void
1431 panels_save_options (void)
1433 size_t i;
1435 for (i = 0; panels_ini_options[i].opt_name != NULL; i++)
1436 mc_config_set_bool (mc_main_config, panels_section,
1437 panels_ini_options[i].opt_name, *panels_ini_options[i].opt_addr);
1439 mc_config_set_int (mc_main_config, panels_section,
1440 "quick_search_mode", (int) panels_options.qsearch_mode);
1443 /* --------------------------------------------------------------------------------------------- */