From 269ace6bf258ae1f88597e8b993034415bd334d0 Mon Sep 17 00:00:00 2001 From: Andrew Borodin Date: Sun, 14 Feb 2021 21:37:23 +0300 Subject: [PATCH] Refactoring of keymap load/save. src/keymap.[ch]: rename from src/keybind-defaults.[ch]. (keymap_load): rename from load_keymap_defs(). (keymap_free): rename from free_keymap_defs(). Move keymap load/save functions from src/setup.c to src/keymap.c. Signed-off-by: Andrew Borodin --- src/Makefile.am | 2 +- src/diffviewer/ydiff.c | 2 +- src/editor/edit.c | 2 +- src/editor/editcmd.c | 2 +- src/editor/editmenu.c | 2 +- src/editor/editwidget.c | 2 +- src/filemanager/chattr.c | 2 +- src/filemanager/filemanager.c | 2 +- src/filemanager/panel.c | 2 +- src/filemanager/tree.c | 2 +- src/help.c | 2 +- src/{keybind-defaults.c => keymap.c} | 332 ++++++++++++++++++++++++++- src/{keybind-defaults.h => keymap.h} | 3 +- src/main.c | 5 +- src/setup.c | 328 +------------------------- src/setup.h | 3 - src/viewer/actions_cmd.c | 2 +- src/viewer/display.c | 2 +- src/viewer/internal.h | 2 +- 19 files changed, 346 insertions(+), 353 deletions(-) rename src/{keybind-defaults.c => keymap.c} (68%) rename src/{keybind-defaults.h => keymap.h} (96%) diff --git a/src/Makefile.am b/src/Makefile.am index 11eb2f2d7..f18a8434a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -82,7 +82,7 @@ libinternal_la_SOURCES = \ file_history.c file_history.h \ help.c help.h \ history.h \ - keybind-defaults.c keybind-defaults.h \ + keymap.c keymap.h \ learn.c learn.h \ setup.c setup.h \ textconf.c textconf.h \ diff --git a/src/diffviewer/ydiff.c b/src/diffviewer/ydiff.c index 2c4e5e0dc..25b9f6aef 100644 --- a/src/diffviewer/ydiff.c +++ b/src/diffviewer/ydiff.c @@ -55,7 +55,7 @@ #include "src/filemanager/layout.h" /* Needed for get_current_index and get_other_panel */ #include "src/execute.h" /* toggle_subshell() */ -#include "src/keybind-defaults.h" +#include "src/keymap.h" #include "src/setup.h" #include "src/history.h" #ifdef HAVE_CHARSET diff --git a/src/editor/edit.c b/src/editor/edit.c index dd2cf1790..c32b1a031 100644 --- a/src/editor/edit.c +++ b/src/editor/edit.c @@ -64,7 +64,7 @@ #include "src/usermenu.h" /* user_menu_cmd() */ #include "src/setup.h" /* option_tab_spacing */ -#include "src/keybind-defaults.h" +#include "src/keymap.h" #include "edit-impl.h" #include "editwidget.h" diff --git a/src/editor/editcmd.c b/src/editor/editcmd.c index d9dc5a616..269de70c4 100644 --- a/src/editor/editcmd.c +++ b/src/editor/editcmd.c @@ -67,7 +67,7 @@ #ifdef HAVE_CHARSET #include "src/selcodepage.h" #endif -#include "src/keybind-defaults.h" +#include "src/keymap.h" #include "src/util.h" /* check_for_default() */ #include "edit-impl.h" diff --git a/src/editor/editmenu.c b/src/editor/editmenu.c index bc5447476..dd0821f0b 100644 --- a/src/editor/editmenu.c +++ b/src/editor/editmenu.c @@ -49,7 +49,7 @@ #include "lib/widget.h" #include "src/setup.h" /* drop_menus */ -#include "src/keybind-defaults.h" +#include "src/keymap.h" #include "edit-impl.h" #include "editwidget.h" diff --git a/src/editor/editwidget.c b/src/editor/editwidget.c index 1385fff1e..787bff672 100644 --- a/src/editor/editwidget.c +++ b/src/editor/editwidget.c @@ -55,7 +55,7 @@ #include "lib/charsets.h" #endif -#include "src/keybind-defaults.h" /* keybind_lookup_keymap_command() */ +#include "src/keymap.h" /* keybind_lookup_keymap_command() */ #include "src/setup.h" /* home_dir */ #include "src/execute.h" /* toggle_subshell() */ #include "src/filemanager/cmd.h" /* save_setup_cmd() */ diff --git a/src/filemanager/chattr.c b/src/filemanager/chattr.c index 51a2ae0f3..6aeaedde3 100644 --- a/src/filemanager/chattr.c +++ b/src/filemanager/chattr.c @@ -46,7 +46,7 @@ #include "lib/vfs/vfs.h" #include "lib/widget.h" -#include "src/keybind-defaults.h" /* chattr_map */ +#include "src/keymap.h" /* chattr_map */ #include "cmd.h" /* chattr_cmd(), chattr_get_as_str() */ diff --git a/src/filemanager/filemanager.c b/src/filemanager/filemanager.c index 7d735429f..815007b27 100644 --- a/src/filemanager/filemanager.c +++ b/src/filemanager/filemanager.c @@ -61,7 +61,7 @@ #include "src/execute.h" /* toggle_subshell */ #include "src/setup.h" /* variables */ #include "src/learn.h" /* learn_keys() */ -#include "src/keybind-defaults.h" +#include "src/keymap.h" #include "lib/fileloc.h" /* MC_FILEPOS_FILE */ #include "lib/keybind.h" #include "lib/event.h" diff --git a/src/filemanager/panel.c b/src/filemanager/panel.c index 700a226c9..1270853db 100644 --- a/src/filemanager/panel.c +++ b/src/filemanager/panel.c @@ -60,7 +60,7 @@ #ifdef HAVE_CHARSET #include "src/selcodepage.h" /* select_charset (), SELECT_CHARSET_NO_TRANSLATE */ #endif -#include "src/keybind-defaults.h" /* global_keymap_t */ +#include "src/keymap.h" /* global_keymap_t */ #ifdef ENABLE_SUBSHELL #include "src/subshell/subshell.h" /* do_subshell_chdir() */ #endif diff --git a/src/filemanager/tree.c b/src/filemanager/tree.c index f1e2d3bc4..661081940 100644 --- a/src/filemanager/tree.c +++ b/src/filemanager/tree.c @@ -56,7 +56,7 @@ #include "lib/event.h" /* mc_event_raise() */ #include "src/setup.h" /* confirm_delete, panels_options */ -#include "src/keybind-defaults.h" +#include "src/keymap.h" #include "src/history.h" #include "dir.h" diff --git a/src/help.c b/src/help.c index 9d86ea0c7..d2bc497a8 100644 --- a/src/help.c +++ b/src/help.c @@ -65,7 +65,7 @@ #include "lib/widget.h" #include "lib/event-types.h" -#include "keybind-defaults.h" +#include "keymap.h" #include "help.h" /*** global variables ****************************************************************************/ diff --git a/src/keybind-defaults.c b/src/keymap.c similarity index 68% rename from src/keybind-defaults.c rename to src/keymap.c index 2a82d44e7..6bc377570 100644 --- a/src/keybind-defaults.c +++ b/src/keymap.c @@ -1,5 +1,5 @@ /* - Default values for keybinding engine + Default values and initialization of keybinding engine Copyright (C) 2009-2021 Free Software Foundation, Inc. @@ -7,7 +7,7 @@ Written by: Vitja Makarov, 2005 Ilia Maslakov , 2009, 2010 - Andrew Borodin , 2010, 2011 + Andrew Borodin , 2010-2021 This file is part of the Midnight Commander. @@ -28,9 +28,16 @@ #include #include "lib/global.h" + +#include "lib/fileloc.h" +#include "lib/keybind.h" +#include "lib/mcconfig.h" /* mc_config_t */ +#include "lib/util.h" #include "lib/widget.h" /* dialog_map, input_map, listbox_map, menu_map, radio_map */ -#include "keybind-defaults.h" +#include "args.h" /* mc_args__keymap_file */ + +#include "keymap.h" /*** global variables ****************************************************************************/ @@ -617,6 +624,7 @@ static const global_keymap_ini_t default_diff_keymap[] = { /*** file scope variables ************************************************************************/ +/* --------------------------------------------------------------------------------------------- */ /*** file scope functions ************************************************************************/ /* --------------------------------------------------------------------------------------------- */ @@ -630,11 +638,9 @@ create_default_keymap_section (mc_config_t * keymap, const char *section, mc_config_set_string_raw (keymap, section, k[i].key, k[i].value); } -/* --------------------------------------------------------------------------------------------- */ -/*** public functions ****************************************************************************/ /* --------------------------------------------------------------------------------------------- */ -mc_config_t * +static mc_config_t * create_default_keymap (void) { mc_config_t *keymap; @@ -667,3 +673,317 @@ create_default_keymap (void) return keymap; } + +/* --------------------------------------------------------------------------------------------- */ + +static void +load_keymap_from_section (const char *section_name, GArray * keymap, mc_config_t * cfg) +{ + gchar **profile_keys, **keys; + + if (section_name == NULL) + return; + + keys = mc_config_get_keys (cfg, section_name, NULL); + + for (profile_keys = keys; *profile_keys != NULL; profile_keys++) + { + gchar **values; + + values = mc_config_get_string_list (cfg, section_name, *profile_keys, NULL); + if (values != NULL) + { + long action; + + action = keybind_lookup_action (*profile_keys); + if (action > 0) + { + gchar **curr_values; + + for (curr_values = values; *curr_values != NULL; curr_values++) + keybind_cmd_bind (keymap, *curr_values, action); + } + + g_strfreev (values); + } + } + + g_strfreev (keys); +} + +/* --------------------------------------------------------------------------------------------- */ +/** + * Get name of config file. + * + * @param subdir If not NULL, config is also searched in specified subdir. + * @param config_file_name If relative, file if searched in standard paths. + * + * @return newly allocated string with config name or NULL if file is not found. + */ + +static char * +load_setup_get_full_config_name (const char *subdir, const char *config_file_name) +{ + /* + TODO: IMHO, in future, this function shall be placed in mcconfig module. + */ + char *lc_basename, *ret; + char *file_name; + + if (config_file_name == NULL) + return NULL; + + /* check for .keymap suffix */ + if (g_str_has_suffix (config_file_name, ".keymap")) + file_name = g_strdup (config_file_name); + else + file_name = g_strconcat (config_file_name, ".keymap", (char *) NULL); + + canonicalize_pathname (file_name); + + if (g_path_is_absolute (file_name)) + return file_name; + + lc_basename = g_path_get_basename (file_name); + g_free (file_name); + + if (lc_basename == NULL) + return NULL; + + if (subdir != NULL) + ret = g_build_filename (mc_config_get_path (), subdir, lc_basename, (char *) NULL); + else + ret = g_build_filename (mc_config_get_path (), lc_basename, (char *) NULL); + + if (exist_file (ret)) + { + g_free (lc_basename); + canonicalize_pathname (ret); + return ret; + } + g_free (ret); + + if (subdir != NULL) + ret = g_build_filename (mc_global.share_data_dir, subdir, lc_basename, (char *) NULL); + else + ret = g_build_filename (mc_global.share_data_dir, lc_basename, (char *) NULL); + + g_free (lc_basename); + + if (exist_file (ret)) + { + canonicalize_pathname (ret); + return ret; + } + + g_free (ret); + return NULL; +} + +/* --------------------------------------------------------------------------------------------- */ +/** + Create new mc_config object from specified ini-file or + append data to existing mc_config object from ini-file +*/ + +static void +load_setup_init_config_from_file (mc_config_t ** config, const char *fname, gboolean read_only) +{ + /* + TODO: IMHO, in future, this function shall be placed in mcconfig module. + */ + if (exist_file (fname)) + { + if (*config != NULL) + mc_config_read_file (*config, fname, read_only, TRUE); + else + *config = mc_config_init (fname, read_only); + } +} + +/* --------------------------------------------------------------------------------------------- */ + +static mc_config_t * +load_setup_get_keymap_profile_config (gboolean load_from_file) +{ + /* + TODO: IMHO, in future, this function shall be placed in mcconfig module. + */ + mc_config_t *keymap_config; + char *share_keymap, *sysconfig_keymap; + char *fname, *fname2; + + /* 0) Create default keymap */ + keymap_config = create_default_keymap (); + if (!load_from_file) + return keymap_config; + + /* load and merge global keymaps */ + + /* 1) /usr/share/mc (mc_global.share_data_dir) */ + share_keymap = g_build_filename (mc_global.share_data_dir, GLOBAL_KEYMAP_FILE, (char *) NULL); + load_setup_init_config_from_file (&keymap_config, share_keymap, TRUE); + + /* 2) /etc/mc (mc_global.sysconfig_dir) */ + sysconfig_keymap = + g_build_filename (mc_global.sysconfig_dir, GLOBAL_KEYMAP_FILE, (char *) NULL); + load_setup_init_config_from_file (&keymap_config, sysconfig_keymap, TRUE); + + /* then load and merge one of user-defined keymap */ + + /* 3) --keymap= */ + fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file); + if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) + { + load_setup_init_config_from_file (&keymap_config, fname, TRUE); + goto done; + } + g_free (fname); + + /* 4) getenv("MC_KEYMAP") */ + fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP")); + if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) + { + load_setup_init_config_from_file (&keymap_config, fname, TRUE); + goto done; + } + + MC_PTR_FREE (fname); + + /* 5) main config; [Midnight Commander] -> keymap */ + fname2 = mc_config_get_string (mc_global.main_config, CONFIG_APP_SECTION, "keymap", NULL); + if (fname2 != NULL && *fname2 != '\0') + fname = load_setup_get_full_config_name (NULL, fname2); + g_free (fname2); + if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) + { + load_setup_init_config_from_file (&keymap_config, fname, TRUE); + goto done; + } + g_free (fname); + + /* 6) ${XDG_CONFIG_HOME}/mc/mc.keymap */ + fname = mc_config_get_full_path (GLOBAL_KEYMAP_FILE); + load_setup_init_config_from_file (&keymap_config, fname, TRUE); + + done: + g_free (fname); + g_free (sysconfig_keymap); + g_free (share_keymap); + + return keymap_config; +} + +/* --------------------------------------------------------------------------------------------- */ +/*** public functions ****************************************************************************/ +/* --------------------------------------------------------------------------------------------- */ + +void +keymap_load (gboolean load_from_file) +{ + /* + * Load keymap from GLOBAL_KEYMAP_FILE before ${XDG_CONFIG_HOME}/mc/mc.keymap, so that the user + * definitions override global settings. + */ + mc_config_t *mc_global_keymap; + + mc_global_keymap = load_setup_get_keymap_profile_config (load_from_file); + + if (mc_global_keymap != NULL) + { +#define LOAD_KEYMAP(s,km) \ + km##_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t)); \ + load_keymap_from_section (KEYMAP_SECTION_##s, km##_keymap, mc_global_keymap) + + LOAD_KEYMAP (FILEMANAGER, filemanager); + LOAD_KEYMAP (FILEMANAGER_EXT, filemanager_x); + LOAD_KEYMAP (PANEL, panel); + LOAD_KEYMAP (DIALOG, dialog); + LOAD_KEYMAP (MENU, menu); + LOAD_KEYMAP (INPUT, input); + LOAD_KEYMAP (LISTBOX, listbox); + LOAD_KEYMAP (RADIO, radio); + LOAD_KEYMAP (TREE, tree); + LOAD_KEYMAP (HELP, help); +#ifdef ENABLE_EXT2FS_ATTR + LOAD_KEYMAP (CHATTR, chattr); +#endif +#ifdef USE_INTERNAL_EDIT + LOAD_KEYMAP (EDITOR, editor); + LOAD_KEYMAP (EDITOR_EXT, editor_x); +#endif + LOAD_KEYMAP (VIEWER, viewer); + LOAD_KEYMAP (VIEWER_HEX, viewer_hex); +#ifdef USE_DIFF_VIEW + LOAD_KEYMAP (DIFFVIEWER, diff); +#endif + +#undef LOAD_KEYMAP + mc_config_deinit (mc_global_keymap); + } + +#define SET_MAP(m) \ + m##_map = (global_keymap_t *) m##_keymap->data + + SET_MAP (filemanager); + SET_MAP (filemanager_x); + SET_MAP (panel); + SET_MAP (dialog); + SET_MAP (menu); + SET_MAP (input); + SET_MAP (listbox); + SET_MAP (radio); + SET_MAP (tree); + SET_MAP (help); +#ifdef ENABLE_EXT2FS_ATTR + SET_MAP (chattr); +#endif +#ifdef USE_INTERNAL_EDIT + SET_MAP (editor); + SET_MAP (editor_x); +#endif + SET_MAP (viewer); + SET_MAP (viewer_hex); +#ifdef USE_DIFF_VIEW + SET_MAP (diff); +#endif + +#undef SET_MAP +} + +/* --------------------------------------------------------------------------------------------- */ + +void +keymap_free (void) +{ +#define FREE_KEYMAP(km) \ + if (km##_keymap != NULL) \ + g_array_free (km##_keymap, TRUE) + + FREE_KEYMAP (filemanager); + FREE_KEYMAP (filemanager_x); + FREE_KEYMAP (panel); + FREE_KEYMAP (dialog); + FREE_KEYMAP (menu); + FREE_KEYMAP (input); + FREE_KEYMAP (listbox); + FREE_KEYMAP (radio); + FREE_KEYMAP (tree); + FREE_KEYMAP (help); +#ifdef ENABLE_EXT2FS_ATTR + FREE_KEYMAP (chattr); +#endif +#ifdef USE_INTERNAL_EDIT + FREE_KEYMAP (editor); + FREE_KEYMAP (editor_x); +#endif + FREE_KEYMAP (viewer); + FREE_KEYMAP (viewer_hex); +#ifdef USE_DIFF_VIEW + FREE_KEYMAP (diff); +#endif + +#undef FREE_KEYMAP +} + +/* --------------------------------------------------------------------------------------------- */ diff --git a/src/keybind-defaults.h b/src/keymap.h similarity index 96% rename from src/keybind-defaults.h rename to src/keymap.h index 6a86001bc..5737fc598 100644 --- a/src/keybind-defaults.h +++ b/src/keymap.h @@ -56,7 +56,8 @@ extern const global_keymap_t *diff_map; /*** declarations of public functions ************************************************************/ -mc_config_t *create_default_keymap (void); +void keymap_load (gboolean load_from_file); +void keymap_free (void); /*** inline functions ****************************************************************************/ diff --git a/src/main.c b/src/main.c index 4bad86140..c9beb505f 100644 --- a/src/main.c +++ b/src/main.c @@ -70,6 +70,7 @@ #ifdef ENABLE_SUBSHELL #include "subshell/subshell.h" #endif +#include "keymap.h" #include "setup.h" /* load_setup() */ #ifdef HAVE_CHARSET @@ -381,7 +382,7 @@ main (int argc, char *argv[]) /* Removing this from the X code let's us type C-c */ load_key_defs (); - load_keymap_defs (!mc_args__nokeymap); + keymap_load (!mc_args__nokeymap); #ifdef USE_INTERNAL_EDIT macros_list = g_array_new (TRUE, FALSE, sizeof (macros_t)); @@ -460,7 +461,7 @@ main (int argc, char *argv[]) /* Save the tree store */ (void) tree_store_save (); - free_keymap_defs (); + keymap_free (); /* Virtual File System shutdown */ vfs_shut (); diff --git a/src/setup.c b/src/setup.c index a55c3414c..7fdabdc01 100644 --- a/src/setup.c +++ b/src/setup.c @@ -40,7 +40,6 @@ #include "lib/fileloc.h" #include "lib/timefmt.h" #include "lib/util.h" -#include "lib/widget.h" #ifdef ENABLE_VFS_FTP #include "src/vfs/ftpfs/ftpfs.h" @@ -64,7 +63,6 @@ #include "args.h" #include "execute.h" /* pause_after_run */ #include "clipboard.h" -#include "keybind-defaults.h" /* keybind_lookup_action */ #ifdef HAVE_CHARSET #include "selcodepage.h" @@ -440,90 +438,8 @@ static const struct }; /* *INDENT-ON* */ -/*** file scope functions ************************************************************************/ /* --------------------------------------------------------------------------------------------- */ - -/** - * Get name of config file. - * - * @param subdir If not NULL, config is also searched in specified subdir. - * @param config_file_name If relative, file if searched in standard paths. - * - * @return newly allocated string with config name or NULL if file is not found. - */ - -static char * -load_setup_get_full_config_name (const char *subdir, const char *config_file_name) -{ - /* - TODO: IMHO, in future, this function shall be placed in mcconfig module. - */ - char *lc_basename, *ret; - char *file_name; - - if (config_file_name == NULL) - return NULL; - - /* check for .keymap suffix */ - if (g_str_has_suffix (config_file_name, ".keymap")) - file_name = g_strdup (config_file_name); - else - file_name = g_strconcat (config_file_name, ".keymap", (char *) NULL); - - canonicalize_pathname (file_name); - - if (g_path_is_absolute (file_name)) - return file_name; - - lc_basename = g_path_get_basename (file_name); - g_free (file_name); - - if (lc_basename == NULL) - return NULL; - - if (subdir != NULL) - ret = g_build_filename (mc_config_get_path (), subdir, lc_basename, (char *) NULL); - else - ret = g_build_filename (mc_config_get_path (), lc_basename, (char *) NULL); - - if (exist_file (ret)) - { - g_free (lc_basename); - canonicalize_pathname (ret); - return ret; - } - g_free (ret); - - if (subdir != NULL) - ret = g_build_filename (mc_global.sysconfig_dir, subdir, lc_basename, (char *) NULL); - else - ret = g_build_filename (mc_global.sysconfig_dir, lc_basename, (char *) NULL); - - if (exist_file (ret)) - { - g_free (lc_basename); - canonicalize_pathname (ret); - return ret; - } - g_free (ret); - - if (subdir != NULL) - ret = g_build_filename (mc_global.share_data_dir, subdir, lc_basename, (char *) NULL); - else - ret = g_build_filename (mc_global.share_data_dir, lc_basename, (char *) NULL); - - g_free (lc_basename); - - if (exist_file (ret)) - { - canonicalize_pathname (ret); - return ret; - } - - g_free (ret); - return NULL; -} - +/*** file scope functions ************************************************************************/ /* --------------------------------------------------------------------------------------------- */ static const char * @@ -587,27 +503,6 @@ setup__move_panels_config_into_separate_file (const char *profile) mc_config_deinit (tmp_cfg); } -/* --------------------------------------------------------------------------------------------- */ -/** - Create new mc_config object from specified ini-file or - append data to existing mc_config object from ini-file -*/ - -static void -load_setup_init_config_from_file (mc_config_t ** config, const char *fname, gboolean read_only) -{ - /* - TODO: IMHO, in future, this function shall be placed in mcconfig module. - */ - if (exist_file (fname)) - { - if (*config != NULL) - mc_config_read_file (*config, fname, read_only, TRUE); - else - *config = mc_config_init (fname, read_only); - } -} - /* --------------------------------------------------------------------------------------------- */ static void @@ -766,116 +661,6 @@ load_keys_from_section (const char *terminal, mc_config_t * cfg) /* --------------------------------------------------------------------------------------------- */ -static void -load_keymap_from_section (const char *section_name, GArray * keymap, mc_config_t * cfg) -{ - gchar **profile_keys, **keys; - - if (section_name == NULL) - return; - - keys = mc_config_get_keys (cfg, section_name, NULL); - - for (profile_keys = keys; *profile_keys != NULL; profile_keys++) - { - gchar **values; - - values = mc_config_get_string_list (cfg, section_name, *profile_keys, NULL); - if (values != NULL) - { - long action; - - action = keybind_lookup_action (*profile_keys); - if (action > 0) - { - gchar **curr_values; - - for (curr_values = values; *curr_values != NULL; curr_values++) - keybind_cmd_bind (keymap, *curr_values, action); - } - - g_strfreev (values); - } - } - - g_strfreev (keys); -} - -/* --------------------------------------------------------------------------------------------- */ - -static mc_config_t * -load_setup_get_keymap_profile_config (gboolean load_from_file) -{ - /* - TODO: IMHO, in future, this function shall be placed in mcconfig module. - */ - mc_config_t *keymap_config; - char *share_keymap, *sysconfig_keymap; - char *fname, *fname2; - - /* 0) Create default keymap */ - keymap_config = create_default_keymap (); - if (!load_from_file) - return keymap_config; - - /* load and merge global keymaps */ - - /* 1) /usr/share/mc (mc_global.share_data_dir) */ - share_keymap = g_build_filename (mc_global.share_data_dir, GLOBAL_KEYMAP_FILE, (char *) NULL); - load_setup_init_config_from_file (&keymap_config, share_keymap, TRUE); - - /* 2) /etc/mc (mc_global.sysconfig_dir) */ - sysconfig_keymap = - g_build_filename (mc_global.sysconfig_dir, GLOBAL_KEYMAP_FILE, (char *) NULL); - load_setup_init_config_from_file (&keymap_config, sysconfig_keymap, TRUE); - - /* then load and merge one of user-defined keymap */ - - /* 3) --keymap= */ - fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file); - if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) - { - load_setup_init_config_from_file (&keymap_config, fname, TRUE); - goto done; - } - g_free (fname); - - /* 4) getenv("MC_KEYMAP") */ - fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP")); - if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) - { - load_setup_init_config_from_file (&keymap_config, fname, TRUE); - goto done; - } - - MC_PTR_FREE (fname); - - /* 5) main config; [Midnight Commander] -> keymap */ - fname2 = mc_config_get_string (mc_global.main_config, CONFIG_APP_SECTION, "keymap", NULL); - if (fname2 != NULL && *fname2 != '\0') - fname = load_setup_get_full_config_name (NULL, fname2); - g_free (fname2); - if (fname != NULL && strcmp (fname, sysconfig_keymap) != 0 && strcmp (fname, share_keymap) != 0) - { - load_setup_init_config_from_file (&keymap_config, fname, TRUE); - goto done; - } - g_free (fname); - - /* 6) ${XDG_CONFIG_HOME}/mc/mc.keymap */ - fname = mc_config_get_full_path (GLOBAL_KEYMAP_FILE); - load_setup_init_config_from_file (&keymap_config, fname, TRUE); - - done: - g_free (fname); - g_free (sysconfig_keymap); - g_free (share_keymap); - - return keymap_config; -} - -/* --------------------------------------------------------------------------------------------- */ - static void panel_save_type (const char *section, panel_view_mode_t type) { @@ -1295,7 +1080,6 @@ setup_save_config_show_error (const char *filename, GError ** mcerror) } } - /* --------------------------------------------------------------------------------------------- */ void @@ -1340,116 +1124,6 @@ load_anon_passwd (void) /* --------------------------------------------------------------------------------------------- */ -void -load_keymap_defs (gboolean load_from_file) -{ - /* - * Load keymap from GLOBAL_KEYMAP_FILE before ${XDG_CONFIG_HOME}/mc/mc.keymap, so that the user - * definitions override global settings. - */ - mc_config_t *mc_global_keymap; - - mc_global_keymap = load_setup_get_keymap_profile_config (load_from_file); - - if (mc_global_keymap != NULL) - { -#define LOAD_KEYMAP(s,km) \ - km##_keymap = g_array_new (TRUE, FALSE, sizeof (global_keymap_t)); \ - load_keymap_from_section (KEYMAP_SECTION_##s, km##_keymap, mc_global_keymap) - - LOAD_KEYMAP (FILEMANAGER, filemanager); - LOAD_KEYMAP (FILEMANAGER_EXT, filemanager_x); - LOAD_KEYMAP (PANEL, panel); - LOAD_KEYMAP (DIALOG, dialog); - LOAD_KEYMAP (MENU, menu); - LOAD_KEYMAP (INPUT, input); - LOAD_KEYMAP (LISTBOX, listbox); - LOAD_KEYMAP (RADIO, radio); - LOAD_KEYMAP (TREE, tree); - LOAD_KEYMAP (HELP, help); -#ifdef ENABLE_EXT2FS_ATTR - LOAD_KEYMAP (CHATTR, chattr); -#endif -#ifdef USE_INTERNAL_EDIT - LOAD_KEYMAP (EDITOR, editor); - LOAD_KEYMAP (EDITOR_EXT, editor_x); -#endif - LOAD_KEYMAP (VIEWER, viewer); - LOAD_KEYMAP (VIEWER_HEX, viewer_hex); -#ifdef USE_DIFF_VIEW - LOAD_KEYMAP (DIFFVIEWER, diff); -#endif - -#undef LOAD_KEYMAP - mc_config_deinit (mc_global_keymap); - } - -#define SET_MAP(m) \ - m##_map = (global_keymap_t *) m##_keymap->data - - SET_MAP (filemanager); - SET_MAP (filemanager_x); - SET_MAP (panel); - SET_MAP (dialog); - SET_MAP (menu); - SET_MAP (input); - SET_MAP (listbox); - SET_MAP (radio); - SET_MAP (tree); - SET_MAP (help); -#ifdef ENABLE_EXT2FS_ATTR - SET_MAP (chattr); -#endif -#ifdef USE_INTERNAL_EDIT - SET_MAP (editor); - SET_MAP (editor_x); -#endif - SET_MAP (viewer); - SET_MAP (viewer_hex); -#ifdef USE_DIFF_VIEW - SET_MAP (diff); -#endif - -#undef SET_MAP -} - -/* --------------------------------------------------------------------------------------------- */ - -void -free_keymap_defs (void) -{ -#define FREE_KEYMAP(km) \ - if (km##_keymap != NULL) \ - g_array_free (km##_keymap, TRUE) - - FREE_KEYMAP (filemanager); - FREE_KEYMAP (filemanager_x); - FREE_KEYMAP (panel); - FREE_KEYMAP (dialog); - FREE_KEYMAP (menu); - FREE_KEYMAP (input); - FREE_KEYMAP (listbox); - FREE_KEYMAP (radio); - FREE_KEYMAP (tree); - FREE_KEYMAP (help); -#ifdef ENABLE_EXT2FS_ATTR - FREE_KEYMAP (chattr); -#endif -#ifdef USE_INTERNAL_EDIT - FREE_KEYMAP (editor); - FREE_KEYMAP (editor_x); -#endif - FREE_KEYMAP (viewer); - FREE_KEYMAP (viewer_hex); -#ifdef USE_DIFF_VIEW - FREE_KEYMAP (diff); -#endif - -#undef FREE_KEYMAP -} - -/* --------------------------------------------------------------------------------------------- */ - void panel_load_setup (WPanel * panel, const char *section) { diff --git a/src/setup.h b/src/setup.h index 5a430a6c8..b43420f63 100644 --- a/src/setup.h +++ b/src/setup.h @@ -153,9 +153,6 @@ void load_key_defs (void); char *load_anon_passwd (void); #endif /* ENABLE_VFS_FTP */ -void load_keymap_defs (gboolean load_from_file); -void free_keymap_defs (void); - void panel_load_setup (WPanel * panel, const char *section); void panel_save_setup (WPanel * panel, const char *section); diff --git a/src/viewer/actions_cmd.c b/src/viewer/actions_cmd.c index d4a2b9ba7..c2e6b69fb 100644 --- a/src/viewer/actions_cmd.c +++ b/src/viewer/actions_cmd.c @@ -67,7 +67,7 @@ #include "src/history.h" #include "src/file_history.h" /* show_file_history() */ #include "src/execute.h" -#include "src/keybind-defaults.h" +#include "src/keymap.h" #include "internal.h" diff --git a/src/viewer/display.c b/src/viewer/display.c index da25a76a5..c2cdb7c72 100644 --- a/src/viewer/display.c +++ b/src/viewer/display.c @@ -48,7 +48,7 @@ #endif #include "src/setup.h" /* panels_options */ -#include "src/keybind-defaults.h" +#include "src/keymap.h" #include "internal.h" diff --git a/src/viewer/internal.h b/src/viewer/internal.h index d96223f2f..8d277fe55 100644 --- a/src/viewer/internal.h +++ b/src/viewer/internal.h @@ -11,7 +11,7 @@ #include "lib/widget.h" #include "lib/vfs/vfs.h" /* vfs_path_t */ -#include "src/keybind-defaults.h" /* global_keymap_t */ +#include "src/keymap.h" /* global_keymap_t */ #include "src/filemanager/dir.h" /* dir_list */ #include "mcviewer.h"