我返回的键盘修改器映射xmodmap
是:
shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x42) control Control_L (0x25), Control_R (0x69) mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) mod2 Num_Lock (0x4d) mod3 mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
当我运行xev | awk -F'\''[ )]+'\'' '\''/^KeyPress/ { a[NR+2] } NR in a { printf "%-3s %s\n", $5, $8 }'\'
awk 从输出汤中仅取出按键的序列号和名称时,我的数字键盘上的 、 和按键没有得到xev
任何响应。这些键的原始输出看起来与常规输出非常不同,如下所示:<PrintScreen>
<Fn>
<Return>
xev
<PrintScreen>
按下并释放
FocusOut event, serial 32, synthetic NO, window 0x1e00001, mode NotifyGrab, detail NotifyAncestor FocusOut event, serial 32, synthetic NO, window 0x1e00001, mode NotifyUngrab, detail NotifyPointer FocusIn event, serial 32, synthetic NO, window 0x1e00001, mode NotifyUngrab, detail NotifyAncestor KeymapNotify event, serial 32, synthetic NO, window 0x0, keys: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
<PrintScreen>
再次按下并释放
FocusOut event, serial 32, synthetic NO, window 0x1e00001, mode NotifyGrab, detail NotifyAncestor FocusOut event, serial 32, synthetic NO, window 0x1e00001, mode NotifyUngrab, detail NotifyPointer FocusIn event, serial 32, synthetic NO, window 0x1e00001, mode NotifyUngrab, detail NotifyAncestor KeymapNotify event, serial 32, synthetic NO, window 0x0, keys: 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 有时,当我按下并释放时
<PrintScreen>
,输出会显示<serial>
完全不同的内容,例如(此处仅分享一个片段):
KeymapNotify event, serial 28, synthetic NO, window 0x0, keys: 4294967234 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
<Fn>
xev
除非与其他(f1
通过f12
)键结合使用,否则它本身不会返回任何内容。但即便如此,它也没有检测到一些Fn-f5
应该映射到XF86MonBrightnessDown
但不返回任何内容,类似于Fn-f6
(XF86MonBrightnessUp
)。 xev 原始输出类似于<PrintScreen>
:
FocusOut event, serial 32, synthetic NO, window 0x1e00001, mode NotifyGrab, detail NotifyAncestor FocusOut event, serial 32, synthetic NO, window 0x1e00001, mode NotifyUngrab, detail NotifyPointer FocusIn event, serial 32, synthetic NO, window 0x1e00001, mode NotifyUngrab, detail NotifyAncestor KeymapNotify event, serial 32, synthetic NO, window 0x0, keys: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
* `Fn-f7` returns `NoSymbol` when it's supposed to be mapped to `XF86Display`
* `Fn-f8` is mapped to `Super_L` somehow.
我的问题是:
- 我上面分享的奇怪输出是什么意思以及它们何时返回?
- KeySym 是什么
NoSymbol
意思? - 我如何纠正错误的映射——或者一般来说——重新映射一个键,例如带有
NoSymbol
希望通过这些问题建立一个关于键盘映射在类 UNIX 系统上通常如何工作的集中、规范的参考,供其他有类似问题的人参考,所以请在时间允许的情况下尽可能详细。
蒂亚!
答案1
FocusIn
和事件FocusOut
意味着其他应用程序正在对按键做出反应。通常的嫌疑人是您的窗口管理器(“WM”,通常是“桌面”的一部分)和其他应用程序,例如语言输入助手(日语、中文等)
通常Fn被拦截嵌入式控制器(“EC”)您的笔记本电脑。它不会产生正常的按键符号,EC 决定如何处理它,以及当它与其他按键一起按下时生成什么按键事件。这意味着您无法对其进行自定义,因为笔记本电脑的 EC 都是不同的,如果它们是可配置的,制造商会保守秘密。
NoSymbol
意味着 EC 针对该组合键返回的任何内容都不会映射到 X 符号。用于evtest
查看内核输入层产生了哪些关键事件。