123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /*
- == кеймапы работают как: ==
- клавиша - название
- название вполне может быть 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
|