Копаемся в клавиатуре

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Копаемся в клавиатуре

Сообщение БудДен » 05.11.19 20:15

Копательства в версии конца 2012 года с некоторыми пометками для яос0, сделанной на базе версии A2 2016-12-05.

1. В туториале приведены некоторые общесистемные сочетания клавиш. Не все из них действительно работают. В частности, написано, что Alt-Shift заменяет Meta. На самом же деле кнопка Windows зачастую работает как Meta, но её действие может перешибаться самой ОС Windows в случае WinAos, поэтому поведение Meta не слишком уж регулярное.

2. Есть HotKeys.Mod и файл примеров для него HotKeys.XML. В яос0 этот файл задействован. Его можно пытаться настроить. Сразу заметил, что сочетания Meta-буква, Meta-цифра, CTRL+Alt+буква(или цифра) не работают. В исходных текстах написано, что они и не должны работать. Вероятно, они должны быть задействованы для ввода дополнительной латиницы, но как это работает - я не увидел.
Сочетания с функ.клавишами, стрелками и Return работают.
Судя по тексту процедуры HandleKey в Windows.Display.Mod , подразумевается, что Ctrl-1 ... Ctrl9, Ctrl-0 работают как просто 1..9..0, при этом назначить сочетания на Ctrl+Shift+1 в WinAos удаётся, а в нативной A2 - нет. Сочетание Ctrl-1 может быть назначено и работает.

3. В приложениях есть собственные сочетания клавиш, но их нельзя посмотреть с помощью штатных средств интроспекции. Можно лишь пытаться их найти с помощью поиска по файлам. Например, можно искать WMMessages.MsgKey или PROCEDURE Handle. Поскольку я ни разу не проводил глубокого поиска, я пока что не знаю.

В частности:
  • в TFPET обработка клавиатуры находится по поиску WMMessages.MsgKey
  • в WMDebugger нужно искать WMMessages.MsgKey в BtDbgPanel, поиск приводит в BtDbgPanel.MemPanel.HandleShortcut. Кроме того, магически знаем, что нужно читать WMDebugger.XML - там некие сочетания, берущиеся из меню.


4. Процедура InstallMessagePreview позволяет установить обработчик сообщения, к-рый срабатывает до приложения. Этим механизмом пользуются несколько клиентов, см. в исходниках.

5. WMKeyCode.StartLog / StopLog запускает / останавливает вывод всех нажатий в KernelLog, правда, те самые сочетания Ctrl-Alt-что-то выводятся криво
(видимо, как раз по той причине, что они не предназначаются для назначаемых горячих клавиш).
Поле для обработчиков событий - это KeySym - из него берётся код, который нужно сравнивать. Он 16-ричный. НапримеР, 0FF1BH = Escape, 06H = Ctrl-F.
Последний раз редактировалось БудДен 16.04.20 22:43, всего редактировалось 3 раза.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 16.04.20 22:11

В случае Windows, сначала обработка происходит в файле Windows.Display.Mod, там см. события HandleChar и HandleKey. При этом происходит сотрудничество, с позволения сказать, между Windows и A2. Результатом этого сотрудничества является неработающий ввод, если включена русская раскладка. Исправлено где-то тут - https://gitlab.com/budden/jaos/-/commit ... 3454cb8e13

Далее событие отправляется куда-то в недра системы через динамическую отправлялку, но попадает оно в итоге в объект типа WindowManager.KeyboardObj. Этот объект преобразует обероновские коды в коды юникода, особенно буквы с кодами 128..155, которые мапятся в WindowManager.InitCharMaps .

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 16.04.20 23:54

Кнопка Ctrl-` по-разному обрабатывается в WinAos и нативной A2, делаем в WinAos Ctrl-` = 060H = ` (и дальше см. флаги).

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 17.04.20 00:07

Самые сложные кнопки - это кнопки, на которых кириллица соседствует со знаками препинания.

Мы здесь назначаем такое поведение
- без модификаторов - основное значение в станд клавиатуре (англ)
- с shift - основное значение в станд. клавиатуре (англ) с shift

- с caps - основное значение в станд. клавиатуре (англ) с shift - это плохо для ввода латиницы, но хорошо для ввода кириллицы.
К сожалению, здесь мы упёрлись в то, что взаимодействие shift и caps lock зависит от раскладки. Для русской буквы shift+caps = нормальный регистр,
а для английской при применении знака препинания shift+caps = shift. Но раскладку клавиатуры мы в этот момент не знаем. Возможно, что русский IME учитывает эту ситуацию - узнаем об этом позже и тогда исправим. Во всяком случае, в сообщении клваиатуры нет флага нажатия Caps.

- caps + shift = основное значение
- ctrl + (любое положение caps и shift) = основное значение в станд. англ клавиатуре.

Последнее соглашение не соответствует Native A2 и мы должны будем подправить Native A2.

И похоже, что вся наша затея - это костыль и нам нужно внедрять именно расклакдки клавиатуры, в т.ч. есть такая гипотетическая проблема, что вирт.коды клавиш могут быть перемещены из-за нестандартной английской раскладки в хостовой ОС.

Есть процедура BIOS.Keyboard.Mod:SetLayout, к-рая может нам помочь.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 17.04.20 00:55

Поскольку в играх нужно отслеживать даже Ctrl-Shift-цифра оставим их в WinAos, но нужно написать, что они не работают в нативе и, допустим, не позволять назначать на эти сочетания горячие клавиши.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 17.04.20 01:30

Вроде работает клавиатура независимо от включённой в Windows раскладки.

https://gitlab.com/budden/jaos/-/commit ... 21aaadc959

Случайно нажал в A2 какую-то из F клавиш, оказывается, по F1...F4 рабочие столы переключаются 🙂

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 08.05.20 13:41

Тема на ЛОРе про подобный вопрос для Linux, может пригодиться, если будет решено сделать независимость от линуксовой раскладки, как уже сделано под Windows: https://www.linux.org.ru/forum/developm ... 8928669805

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 23.06.20 01:36

Починил яроклаву под Linux - где-то рядом и раскладку нужно чинить.

https://gitlab.com/budden/jaos/-/commit ... baedc83164

См. также

https://www.linux.org.ru/forum/development/1661122

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 06.12.20 22:36

Может, я это уже находил, но сейчас опять пришлось искать. За нажатие Ctrl-Enter в текстовых окошках (вызов команды, на которой стоит курсор) отвечает процедура WMEditors...Enter, к-рая вызывает процедуру *.StartCommand.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: Копаемся в клавиатуре

Сообщение БудДен » 21.06.21 17:42

В случае Ctrl-Shift-3 и Linux проблема в том, что Linux возвращает keysym от #, а не от 3, а A2 проверяет именно keysym. Проблему решило бы, если бы передавался keycode, но он не передаётся. В итоге решил задачу такой костыль, как добавление второго варианта:

Код: Выделить всё

если (keysym = 33H) и Inputs.ControlShiftKeyDown(l30flags) или
	(keysym = 23H) и Inputs.ControlShiftKeyDown(l30flags) то (* CTRL-SHIFT-3 *) 

Ответить