mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 04:46:55 +03:00
62f3c368c9
* lookup_action -> keybind_lookup_action * lookup_keymap_shortcut -> keybind_lookup_keymap_shortcut * lookup_keymap_command -> keybind_lookup_keymap_command Signed-off-by: Slava Zanko <slavazanko@gmail.com>
151 lines
5.6 KiB
Plaintext
151 lines
5.6 KiB
Plaintext
/*
|
||
|
||
== кеймапы работают как: ==
|
||
|
||
клавиша - название
|
||
|
||
название вполне может быть Event!
|
||
|
||
|
||
mc.hotkeys
|
||
|
||
[Группа]
|
||
действие=клавиша
|
||
|
||
|
||
Это должно быть преобразовано в Event как:
|
||
mcevent_add_cb ("Группа.действие", ...)
|
||
|
||
при этом спец. группа 'mc.*'(и дочерние) должны быть проигнорированы в файле привязок
|
||
|
||
главная группа [core]
|
||
|
||
Инициализируется по дефолту. остальные группы описывают дополнительные назначения клавиш.
|
||
|
||
Спец.случаи. Панель и командная строка.
|
||
[panel]
|
||
- тут кейбиндинги панели.
|
||
[panel-commandline]
|
||
- тут кейбиндинги комстроки.
|
||
|
||
признак того, что необходимо включить или выключить "panel-commandline.*" - не пустая или пустая комстрока.
|
||
При непустой комстроке делаем просто mckeybind_push ("panel-commandline"), а как только строка очищается -
|
||
делаем mckeybind_pop();
|
||
|
||
То есть. выглядит всё так:
|
||
mckeybind_init("core"); // инициализируем некие базовые(одинаковые для всех) хоткеи.
|
||
|
||
switch (args)
|
||
{
|
||
case 'editor':
|
||
mckeybind_push("editor");
|
||
case 'viewer'
|
||
mckeybind_push("viewer");
|
||
default:
|
||
mckeybind_push("panel");
|
||
}
|
||
...
|
||
if (cmd_active())
|
||
mckeybind_push("panel-commandline");
|
||
|
||
...
|
||
if (cmd_inactive())
|
||
mckeybind_pop();
|
||
|
||
|
||
== КЕЙБИНДИНГИ ПО УМОЛЧАНИЮ ==
|
||
Должны содержать минимально необходимый для работы минимум. Если действие доступно через меню,
|
||
hardcoded-кейбиндинга быть не должно.
|
||
|
||
=== как инициальзировать ===
|
||
Ну... mckeybind_push("editor", g_hash_array *default(or NULL)) ?
|
||
|
||
|
||
== Хранение в памяти ==
|
||
храним в памяти в виде "хоткей" -> "event". Чтобы после чтения с клавы был быстрый доступ к mcevent_raise('action')
|
||
|
||
== Дубликаты хоткеев ==
|
||
наверное, надо предупреждать. что в конфиге есть конфликт...
|
||
[group]
|
||
action1 = ctrl-v
|
||
action2 = ctrl-v
|
||
|
||
в момент... гм. наверное. в момент mckeybind_push
|
||
ибо конфиг читаем целиком, но весь сразу не парсим...
|
||
|
||
== "Многоэтажные" хоткеи ==
|
||
|
||
=== Дубликаты: ===
|
||
action1 = ctrl-v
|
||
action2 = ctrl-v, w
|
||
Это ошибка. Выдать алерт.
|
||
|
||
=== Нормальная обработка ===
|
||
action1 = ctrl-v, q
|
||
action2 = ctrl-v, w
|
||
action3 = ctrl-v, e, 1
|
||
action4 = ctrl-v, e, 2
|
||
|
||
|
||
варианты использования.
|
||
mckeybind_push() должна добавить новые хоткеи к уже существующим (заменить существующие привязки клавиш).
|
||
mckeybind_pop() должна воостановить на предыдущее значение!
|
||
|
||
При этом должна быть возможность как бы временно "скрыть" существующие привязки. Для многоэтажных хоткеев.
|
||
|
||
|
||
//При парсинге видим многоэтажный хоткей и сразу создаём Event вида "mc.hotkey.<hotkey>".
|
||
// где <hotkey> - это <modificator>-<key> или просто <key>.
|
||
//mc_event_add_cb ("mc.hotkey.ctrl-v", );
|
||
нет. Надо предусмотреть временное замещение всех действующих хоткеев на только хоткеи "второго эшелона".
|
||
то есть, из примера надо после нажатия ctrl-v задейтвовать:
|
||
{
|
||
q -> action1
|
||
w -> action2
|
||
e -> !!!!!!! (ещё раз очищаем хоткеи и ждём 1 или 2 !!!)
|
||
}
|
||
После всего этого возвращаемся в обычный режим работы.
|
||
|
||
делаем это созданием псевдогруппы привязок вида "mc.hotkey.<hotkey>".
|
||
где <hotkey> - это <modificator>-<key> или просто <key>.
|
||
затем привязываем "ctrl-v" к спецкейбиндингу:
|
||
|
||
ctrl-v -> "mc.hotkey.processMulti('ctrl-v')"
|
||
|
||
привязывать к именам хоткеев нужно структуру вида:
|
||
{
|
||
char *action;
|
||
char *param; /* для всех равен NULL, для многоэтажных равен названию группы хоткеев второго эшелона*/
|
||
}
|
||
|
||
при вызове этого Event начинаем искать группу хоткеев "mc.hotkey.ctrl-v"
|
||
находим и заменяем активные привязки на таблицу:
|
||
|
||
{
|
||
q -> action1
|
||
w -> action2
|
||
e -> mc.hotkey.processMulti('ctrl-v,e')
|
||
}
|
||
|
||
NB: При парсинге файла привязок если встречаем мультихоткей, то ищем в списке групп - есть уже или нету.
|
||
"ctrl-v, e, 1" = ищем по группе "mc.hotkey.ctrl-v,e"
|
||
нашли - гуд. Добавляем.
|
||
|
||
|
||
== Порядок обработки файлов привязок ==
|
||
традиционно:
|
||
1) комстрока
|
||
2) переменная окружения
|
||
3) конфиг в дом.каталоге
|
||
4) конфиг в /etc/mc
|
||
|
||
*/
|
||
|
||
|
||
|
||
|
||
init
|
||
deinit
|
||
|
||
push
|
||
pop |