xev 无法识别某些键,并且某些键的映射不正确?

xev 无法识别某些键,并且某些键的映射不正确?

我返回的键盘修改器映射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.

我的问题是:

  1. 我上面分享的奇怪输出是什么意思以及它们何时返回?
  2. KeySym 是什么NoSymbol意思?
  3. 我如何纠正错误的映射——或者一般来说——重新映射一个键,例如带有NoSymbol

希望通过这些问题建立一个关于键盘映射在类 UNIX 系统上通常如何工作的集中、规范的参考,供其他有类似问题的人参考,所以请在时间允许的情况下尽可能详细。

蒂亚!

答案1

FocusIn和事件FocusOut意味着其他应用程序正在对按键做出反应。通常的嫌疑人是您的窗口管理器(“WM”,通常是“桌面”的一部分)和其他应用程序,例如语言输入助手(日语、中文等)

通常Fn被拦截嵌入式控制器(“EC”)您的笔记本电脑。它不会产生正常的按键符号,EC 决定如何处理它,以及当它与其他按键一起按下时生成什么按键事件。这意味着您无法对其进行自定义,因为笔记本电脑的 EC 都是不同的,如果它们是可配置的,制造商会保守秘密。

NoSymbol意味着 EC 针对该组合键返回的任何内容都不会映射到 X 符号。用于evtest查看内核输入层产生了哪些关键事件。

相关内容