логирование ввода с клавиатуры linux - перевод раскладки клавиатуры - PullRequest
0 голосов
/ 29 сентября 2019

Я пишу класс, который отслеживает входные события в Linux.Он будет использоваться в демоне, который воздействует на нажатия клавиш пользователя в программах графического интерфейса для визуальной обратной связи на USB-устройстве.

Я использую события ввода, которые я читаю из / dev / input / event *.Я использую <linux/input.h> и получаю коды клавиш.

Я на бельгийской клавиатуре.Я нажимаю и отпускаю клавишу «A» на моей клавиатуре, и мой журнал в настоящее время показывает:

29/09/2019 - 14:14:48.751 [Info] Event: time 1569759288.751445, type 4 (Misc), code 4 (ScanCode), value 0x10
29/09/2019 - 14:14:48.751 [Info] Event: time 1569759288.751445, type 1 (Key), code 16 (Q), value 1
29/09/2019 - 14:14:48.751 [Info] Event: time 1569759288.751445, -------------- Report Sync ------------
29/09/2019 - 14:14:48.792 [Info] Event: time 1569759288.792115, type 4 (Misc), code 4 (ScanCode), value 0x10
29/09/2019 - 14:14:48.792 [Info] Event: time 1569759288.792115, type 1 (Key), code 16 (Q), value 0
29/09/2019 - 14:14:48.792 [Info] Event: time 1569759288.792115, -------------- Report Sync ------------

то, что на самом деле печатается на экране без каких-либо клавиш-модификаторов, - это маленькая «a»

обратите внимание на «код 16 (Q)» - номер 16 является основным кодом 10.

Теперь мне нужно сопоставить это «Q» с моей раскладкой клавиатуры, и в этом случае должно отображаться «а».Для этого я использую программу dumpkeys для получения текущих таблиц перевода моего ядра.

Что касается этого конкретного примера, сокращенные данные (показаны только 4 столбца), которые он выводит:

keycode  16 = +a               +A               at               VoidSymbol

или в более подходящем формате:

keycode  16 = +0x0b61          +0x0b41          0x0040           0x0200 

+ означает сдвиг по умолчанию.На данном этапе я не уверен, что это то, что мне нужно принимать во внимание, поэтому я убираю это.

Насколько я понимаю, программа dumpkeys добавляет 0xb00 к правильному числу, поэтому я отбрасываю +, вычесть 0x0b00от 0x0b61 до получения 0x0061.

0x0061 - это номер Unicode U + 0061 для 'a', и я сохраняю эту QString в векторе на месте 0, поэтому первый столбец, что касается dumpkeys.

Теперь о проблемах:

Некоторые ключи в порядке.Если я интерпретирую данные для физического ключа, который имеет символы '1' '&' '|'на моей клавиатуре все проверяется с помощью клавиш-модификаторов.

Но для этого примера (физическая клавиша имеет только заглавную букву 'A') все не так.

В соответствии с объясненными правилами модификаторовв таблицах ключей (5) - страница руководства Linux должно произойти следующее:

Я нажимаю код 16 без какой-либо клавиши-модификатора и получаю U + 0061 или 'a' -> ok - номер действия ноль (с 1-го числастолбец)

Я нажимаю код 16 с клавишей-модификатором сдвига и получаю U + 0041 или 'A' -> ok, поскольку модификатор сдвига имеет вес 1, поэтому действие номер один (из 2-го столбца)

Я нажимаю код 16 с помощью клавиши-модификатора AltGr и получаю U + 0040 или '@' -> ок, вес AltGr 2 - так что действие номер два (из 3-го столбца)

Теперь, если я нажмуkeycode 16 вместе с Shift и AltGr вес добавляет до 3, так что действие номер три (из 4-го столбца) aka VoidSymbol, так что ничего не произойдет.Что я получаю, хотя это заглавная омега "Ω".Почему?

Что касается VoidSymbol, то U + 0200 на самом деле Ȁ (латинская заглавная буква а с двойной могилой).Как можно распечатать этот символ, если его значение в Юникоде используется как VoidSymbol?

Есть и другие проблемы.

Другим примером является физический ключ, на котором есть «§», «6», «^».Ключевая карта dumpkeys дает мне никаких следов символа '§' (U + 00A7).Тем не менее, я могу набрать его ...

Что случилось с shifttable по умолчанию?

РЕДАКТИРОВАТЬ: дополнительный вопрос

#define modifierShift 1;    //why the difference between ShiftL and ShiftR -> there is no 'shift' key
#define modifierControl 4;  //why the difference between ControlL and ControlR -> there is no 'control' key
#define modifierShiftL 16;  //code 42
#define modifierShiftR 32;  //code 54
#define modifierCtrlL 64;   //code 29
#define modifierCtrlR 128;  //code 97

Может кто-нибудь уточнить это для меня, пожалуйста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...