我正在写一个类来监视Linux上的输入事件。 它将在守护程序中使用,该守护程序将在gui程序中作用于用户的按键,以在USB led设备上提供视觉反馈。
我使用从/ 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”映射到我的键盘布局,在这种情况下,它应该记录为“ a”。 为此,我使用dumpkeys程序获取内核的当前转换表。
就此特定示例而言,输出的缩短数据(仅显示4列)为:
keycode 16 = +a +A at VoidSymbol
或更合适的格式:
keycode 16 = +0x0b61 +0x0b41 0x0040 0x0200
默认情况下,+表示可移动。在此阶段,我不确定是否需要考虑这一点,因此我将其删除。
据我了解,dumpkeys程序将0xb00添加到正确的数字,因此,我将+从0x0b61减去0x0b00以获得0x0061。
0x0061是'a'的Unicode编号U + 0061,我将该QString存储在位置0的向量中,因此,与dumpkeys有关的第一列。
现在解决问题:
某些键还可以。如果我解释具有字符“ 1”,“&”,“ |”的物理密钥的数据在我的键盘上,所有这些都可以通过修改键来检出。
但是对于此示例(物理密钥仅带有大写字母'A'),这是不正确的。
根据keymaps(5)-Linux手册页中解释的修饰符规则,应发生以下情况:
我按下键码16却没有任何修饰键,然后得到U + 0061或'a'->好的-动作编号为零(从第一列开始)
我用换档修饰键按下键代码16,然后我得到U + 0041或'A'->好的,因为换档修饰符的权重为1,所以动作编号为1(来自第二列)
我用AltGr修饰键按下键码16,然后得到U + 0040或'@'->好的,AltGr的重量为2-所以第二个动作(从第三列开始)
现在,如果我将Shift和AltGr一起按下键码16,则权重加起来为3,因此动作编号3(来自第4列)又称为VoidSymbol,因此不会发生任何响声。我得到的是大写的欧米茄“Ω”。为什么?
对于那个VoidSymbol,U + 0200实际上是Ȁ(带有Double Grave的拉丁大写字母a)。如果将其字符的unicode值用作VoidSymbol,则如何打印该字符?
还有其他问题。
另一个示例是上面带有'§','6','^'的物理密钥。键盘映射转储键使我无法找到'§'字符(U + 00A7)的踪迹。但是,我可以输入...
默认情况下,shiftable是怎么回事?
编辑:其他问题
#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
有人可以帮我澄清一下吗?