Я пишу класс, который отслеживает входные события в 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
Может кто-нибудь уточнить это для меня, пожалуйста?