TODO.txt 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. == кеймапы работают как: ==
  3. клавиша - название
  4. название вполне может быть Event!
  5. mc.hotkeys
  6. [Группа]
  7. действие=клавиша
  8. Это должно быть преобразовано в Event как:
  9. mcevent_add_cb ("Группа.действие", ...)
  10. при этом спец. группа 'mc.*'(и дочерние) должны быть проигнорированы в файле привязок
  11. главная группа [core]
  12. Инициализируется по дефолту. остальные группы описывают дополнительные назначения клавиш.
  13. Спец.случаи. Панель и командная строка.
  14. [panel]
  15. - тут кейбиндинги панели.
  16. [panel-commandline]
  17. - тут кейбиндинги комстроки.
  18. признак того, что необходимо включить или выключить "panel-commandline.*" - не пустая или пустая комстрока.
  19. При непустой комстроке делаем просто mckeybind_push ("panel-commandline"), а как только строка очищается -
  20. делаем mckeybind_pop();
  21. То есть. выглядит всё так:
  22. mckeybind_init("core"); // инициализируем некие базовые(одинаковые для всех) хоткеи.
  23. switch (args)
  24. {
  25. case 'editor':
  26. mckeybind_push("editor");
  27. case 'viewer'
  28. mckeybind_push("viewer");
  29. default:
  30. mckeybind_push("panel");
  31. }
  32. ...
  33. if (cmd_active())
  34. mckeybind_push("panel-commandline");
  35. ...
  36. if (cmd_inactive())
  37. mckeybind_pop();
  38. == КЕЙБИНДИНГИ ПО УМОЛЧАНИЮ ==
  39. Должны содержать минимально необходимый для работы минимум. Если действие доступно через меню,
  40. hardcoded-кейбиндинга быть не должно.
  41. === как инициальзировать ===
  42. Ну... mckeybind_push("editor", g_hash_array *default(or NULL)) ?
  43. == Хранение в памяти ==
  44. храним в памяти в виде "хоткей" -> "event". Чтобы после чтения с клавы был быстрый доступ к mcevent_raise('action')
  45. == Дубликаты хоткеев ==
  46. наверное, надо предупреждать. что в конфиге есть конфликт...
  47. [group]
  48. action1 = ctrl-v
  49. action2 = ctrl-v
  50. в момент... гм. наверное. в момент mckeybind_push
  51. ибо конфиг читаем целиком, но весь сразу не парсим...
  52. == "Многоэтажные" хоткеи ==
  53. === Дубликаты: ===
  54. action1 = ctrl-v
  55. action2 = ctrl-v, w
  56. Это ошибка. Выдать алерт.
  57. === Нормальная обработка ===
  58. action1 = ctrl-v, q
  59. action2 = ctrl-v, w
  60. action3 = ctrl-v, e, 1
  61. action4 = ctrl-v, e, 2
  62. варианты использования.
  63. mckeybind_push() должна добавить новые хоткеи к уже существующим (заменить существующие привязки клавиш).
  64. mckeybind_pop() должна воостановить на предыдущее значение!
  65. При этом должна быть возможность как бы временно "скрыть" существующие привязки. Для многоэтажных хоткеев.
  66. //При парсинге видим многоэтажный хоткей и сразу создаём Event вида "mc.hotkey.<hotkey>".
  67. // где <hotkey> - это <modificator>-<key> или просто <key>.
  68. //mc_event_add_cb ("mc.hotkey.ctrl-v", );
  69. нет. Надо предусмотреть временное замещение всех действующих хоткеев на только хоткеи "второго эшелона".
  70. то есть, из примера надо после нажатия ctrl-v задейтвовать:
  71. {
  72. q -> action1
  73. w -> action2
  74. e -> !!!!!!! (ещё раз очищаем хоткеи и ждём 1 или 2 !!!)
  75. }
  76. После всего этого возвращаемся в обычный режим работы.
  77. делаем это созданием псевдогруппы привязок вида "mc.hotkey.<hotkey>".
  78. где <hotkey> - это <modificator>-<key> или просто <key>.
  79. затем привязываем "ctrl-v" к спецкейбиндингу:
  80. ctrl-v -> "mc.hotkey.processMulti('ctrl-v')"
  81. привязывать к именам хоткеев нужно структуру вида:
  82. {
  83. char *action;
  84. char *param; /* для всех равен NULL, для многоэтажных равен названию группы хоткеев второго эшелона*/
  85. }
  86. при вызове этого Event начинаем искать группу хоткеев "mc.hotkey.ctrl-v"
  87. находим и заменяем активные привязки на таблицу:
  88. {
  89. q -> action1
  90. w -> action2
  91. e -> mc.hotkey.processMulti('ctrl-v,e')
  92. }
  93. NB: При парсинге файла привязок если встречаем мультихоткей, то ищем в списке групп - есть уже или нету.
  94. "ctrl-v, e, 1" = ищем по группе "mc.hotkey.ctrl-v,e"
  95. нашли - гуд. Добавляем.
  96. == Порядок обработки файлов привязок ==
  97. традиционно:
  98. 1) комстрока
  99. 2) переменная окружения
  100. 3) конфиг в дом.каталоге
  101. 4) конфиг в /etc/mc
  102. */
  103. init
  104. deinit
  105. push
  106. pop