禁用 Caps Lock 不起作用:仍然导致 0x2 状态(在 VMware 中运行)

禁用 Caps Lock 不起作用:仍然导致 0x2 状态(在 VMware 中运行)

我在 VMware 中运行 Ubuntu 21.10 客户机,主机是 Windows 11。

我想禁用所有 Caps Lock 功能,并将键用作 Meta_R。我尝试使用xmodmap -e "clear Lock"、 和禁用它setxkbmap -option caps:none

但是,当我按下 Caps Lock 时,键盘上的灯会亮起,并且当我打字时,按键会导致打印大写字符。

这可能是由 VMware 引起的?VMware 根据主机上处于活动状态的窗口更改键盘状态,并可能通过内核或类似方式设置 Caps Lock 状态。

我在想,解决方案可能是禁用 0x2 状态对键盘符号映射的影响?

结果:xmodmap 正确显示 Caps Lock 为已禁用...

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock      
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 显示状态为 0x2

按‘a’键结果为‘a’。

KeyPress event, serial 34, synthetic NO, window 0x1400001,
    root 0x1b8, subw 0x0, time 678615, (118,123), root:(368,501),
    state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XmbLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

正确按下 Caps Lock 键会导致“VoidSymbol”

KeyPress event, serial 37, synthetic NO, window 0x1400001,
    root 0x1b8, subw 0x0, time 680515, (118,123), root:(368,501),
    state 0x0, keycode 66 (keysym 0xffffff, VoidSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

释放 Caps Lock 会错误地将状态更改为 0x2。

KeyRelease event, serial 37, synthetic NO, window 0x1400001,
    root 0x1b8, subw 0x0, time 680655, (118,123), root:(368,501),
    state 0x2, keycode 66 (keysym 0xffffff, VoidSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

在状态 0x2 下按下‘a’将得到符号‘A’。

KeyPress event, serial 37, synthetic NO, window 0x1400001,
    root 0x1b8, subw 0x0, time 682240, (118,123), root:(368,501),
    state 0x2, keycode 38 (keysym 0x41, A), same_screen YES,
    XLookupString gives 1 bytes: (41) "A"
    XmbLookupString gives 1 bytes: (41) "A"
    XFilterEvent returns: False

相关内容