Ticket #2848: fixup of user-defined keymap load.

Modify algorithm of keymap files load:
1) Unconditionally load /usr/share/mc/mc.keymap
2) Unconditionally load /etc/mc/mc.keymap
Then load one of following user-defined keymaps, stop on success:
3) set via --keymap command line option
4) set via MC_KEYMAP environment variable
5) set via keymap key in config file
6) ~/.config/mc/mc.keymap

Fix of double load of keymap file if name is same as name of
system-wide keymap file.

Update man pages.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
Andrew Borodin 2012-07-28 13:20:12 +04:00
parent 23ad3ecda1
commit 99ead577f7
3 changed files with 76 additions and 65 deletions

View File

@ -66,7 +66,7 @@ Display configure options.
Reset softkeys to their default from the termcap/terminfo
database. Only useful on HP terminals when the function keys don't work.
.TP
.I \-K file
.I \-K file, \-\-keymap=file
Specify a name of keymap file in the command line.
.TP
.I \-\-nokeymap
@ -325,7 +325,13 @@ the input lines in the query dialogs.
.\"NODE " Keys_redefine"
.SH " Redefine hotkey bindings"
Hotkey bindings may be read from external file (keymap\-file).
A keymap\-file is searched on the following algorithm (to the first one found):
Initially, Mignight Commander creates key bindings using keymap defined
in the source code. Then, two files
.B %prefix%/share/mc/mc.keymap
and
.B %sysconfdir%/mc/mc.keymap
are loaded always, sequentially reassigned key bindings defined earlier.
User\-defined keymap\-file is searched on the following algorithm (to the first one found):
.IP
.br
1) command line option
@ -345,11 +351,6 @@ of config file.
4) File
.B ~/.config/mc/mc.keymap
.br
5) File
.B %sysconfdir%/mc/mc.keymap
.br
6) File
.B %prefix%/share/mc/mc.keymap
.PP
Command line option, environment variable and parameter in config file may
contain the absolute path to the keymap\-file (with the extension \.keymap

View File

@ -79,7 +79,7 @@ UNIX\-подобных операционных системах.
termcap/terminfo. Этот ключ используется только на терминалах HP, где
функциональные клавиши не работают.
.TP
.I \-K файл
.I \-K файл, \-\-keymap=файл
Задаёт файл клавиатурных команд для переопределения привязки клавиатурных
комбинаций к действиям.
.TP
@ -320,8 +320,14 @@ S\-<символ> означает, что нужно держать в нажа
.\"NODE " Keys_redefine"
.SH " Переопределение клавиатурных команд"
Клавиатурные команды могут быть прочитаны из внешнего файла.
Поиск файла клавиатурных команд производится по следующему алгоритму
(до первого нахождения файла):
Сначала Midnight Commander создаёт карту клавиатурных команд из списка,
определённого в исходном коде. Затем всегда загружаются два файла
.B %sysconfdir%/mc/mc.keymap
и
.B %prefix%/share/mc/mc.keymap ,
последовательно переопределяя ранее загруженные команды.
Поиск файла клавиатурных команд, определённого пользователем, производится
по следующему алгоритму (до первого нахождения файла):
.IP
.br
1) параметр командной строки
@ -341,12 +347,6 @@ S\-<символ> означает, что нужно держать в нажа
4) файл
.B ~/.config/mc/mc.keymap
.br
5) файл
.B %sysconfdir%/mc/mc.keymap
.br
6) файл
.B %prefix%/share/mc/mc.keymap
.PP
Параметры в трёх первых случаях могут содержать абсолютный путь к файлу
клавиатурных команд либо просто название схемы привязки (с расширением

View File

@ -371,22 +371,15 @@ static const struct
/**
Get name of config file.
\param subdir
if not NULL, then config also search into specified subdir.
\param config_file_name
If specified filename is relative, then will search in standart patches.
\return
Newly allocated path to config name or NULL if file not found.
If config_file_name is a relative path, then search config in stantart paths.
@param subdir If not NULL, config is also searched in specified subdir.
@param config_file_name If relative, file if searched in standard paths.
@returns 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 must be placed into mc_config module.
TODO: IMHO, in future, this function shall be placed in mcconfig module.
*/
char *lc_basename, *ret;
@ -394,8 +387,11 @@ load_setup_get_full_config_name (const char *subdir, const char *config_file_nam
return NULL;
if (g_path_is_absolute (config_file_name))
return g_strdup (config_file_name);
{
ret = g_strdup (config_file_name);
canonicalize_pathname (ret);
return ret;
}
lc_basename = g_path_get_basename (config_file_name);
if (lc_basename == NULL)
@ -409,6 +405,7 @@ load_setup_get_full_config_name (const char *subdir, const char *config_file_nam
if (exist_file (ret))
{
g_free (lc_basename);
canonicalize_pathname (ret);
return ret;
}
g_free (ret);
@ -421,6 +418,7 @@ load_setup_get_full_config_name (const char *subdir, const char *config_file_nam
if (exist_file (ret))
{
g_free (lc_basename);
canonicalize_pathname (ret);
return ret;
}
g_free (ret);
@ -433,11 +431,13 @@ load_setup_get_full_config_name (const char *subdir, const char *config_file_nam
g_free (lc_basename);
if (exist_file (ret))
{
canonicalize_pathname (ret);
return ret;
}
g_free (ret);
return NULL;
}
/* --------------------------------------------------------------------------------------------- */
@ -519,7 +519,7 @@ static void
load_setup_init_config_from_file (mc_config_t ** config, const char *fname)
{
/*
TODO: IMHO, in future this function must be placed into mc_config module.
TODO: IMHO, in future, this function shall be placed in mcconfig module.
*/
if (exist_file (fname))
{
@ -676,9 +676,10 @@ static mc_config_t *
load_setup_get_keymap_profile_config (gboolean load_from_file)
{
/*
TODO: IMHO, in future this function must be placed into mc_config module.
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 */
@ -686,47 +687,56 @@ load_setup_get_keymap_profile_config (gboolean load_from_file)
if (!load_from_file)
return keymap_config;
/* load and merge global keymaps */
/* 1) /usr/share/mc (mc_global.share_data_dir) */
fname = g_build_filename (mc_global.share_data_dir, GLOBAL_KEYMAP_FILE, NULL);
load_setup_init_config_from_file (&keymap_config, fname);
g_free (fname);
share_keymap = g_build_filename (mc_global.share_data_dir, GLOBAL_KEYMAP_FILE, NULL);
load_setup_init_config_from_file (&keymap_config, share_keymap);
/* 2) /etc/mc (mc_global.sysconfig_dir) */
fname = g_build_filename (mc_global.sysconfig_dir, GLOBAL_KEYMAP_FILE, NULL);
load_setup_init_config_from_file (&keymap_config, fname);
sysconfig_keymap = g_build_filename (mc_global.sysconfig_dir, GLOBAL_KEYMAP_FILE, NULL);
load_setup_init_config_from_file (&keymap_config, sysconfig_keymap);
/* then load and merge one of user-defined keymap */
/* 3) --keymap=<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);
goto done;
}
g_free (fname);
/* 3) ${XDG_CONFIG_HOME}/mc */
/* 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);
goto done;
}
g_free (fname);
/* 5) main config; [Midnight Commander] -> keymap */
fname2 = mc_config_get_string (mc_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);
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);
done:
g_free (fname);
/* 4) main config; [Midnight Commander] -> keymap */
fname2 =
mc_config_get_string (mc_main_config, CONFIG_APP_SECTION, "keymap", GLOBAL_KEYMAP_FILE);
fname = load_setup_get_full_config_name (NULL, fname2);
if (fname != NULL)
{
load_setup_init_config_from_file (&keymap_config, fname);
g_free (fname);
}
g_free (fname2);
/* 5) getenv("MC_KEYMAP") */
fname = load_setup_get_full_config_name (NULL, g_getenv ("MC_KEYMAP"));
if (fname != NULL)
{
load_setup_init_config_from_file (&keymap_config, fname);
g_free (fname);
}
/* 6) --keymap=<keymap> */
fname = load_setup_get_full_config_name (NULL, mc_args__keymap_file);
if (fname != NULL)
{
load_setup_init_config_from_file (&keymap_config, fname);
g_free (fname);
}
g_free (sysconfig_keymap);
g_free (share_keymap);
return keymap_config;
}