我正在尝试弄清楚以下按键的处理方式:
- XCB_MOD_MASK_1
- XCB_MOD_MASK_2
- XCB_MOD_MASK_3
- XCB_MOD_MASK_4
- XCB_MOD_MASK_5
在xcb中,对于XCB_MOD_MASK_1似乎是Alt键(我的理解正确吗?),但是对于其他按钮,我无法找到任何映射(我在发布之前尝试通过Google搜索它们,但没有成功)。
那么这些掩码通常关联哪些按键呢?
我正在尝试弄清楚以下按键的处理方式:
在xcb中,对于XCB_MOD_MASK_1似乎是Alt键(我的理解正确吗?),但是对于其他按钮,我无法找到任何映射(我在发布之前尝试通过Google搜索它们,但没有成功)。
那么这些掩码通常关联哪些按键呢?
xmodmap
的工具实际配置这些按键(或任何按键)的映射。在 X Window 系统 中,有 8 种修饰键。这 8 种修饰键是:
shift
lock
control
mod1
mod2
mod3
mod4
mod5
xmodmap -pm
命令,该命令会打印 修饰键映射表。例如,对我来说输出如下:xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
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)
比如说,Alt
会生成 mod1
。
现在,如果你想通过 xmodmap
更改 mod1
到 mod5
,可以打开 ~/.Xmodmap
文件,并写入以下内容:
clear mod1
clear mod2
clear mod3
clear mod4
clear mod5
add mod1 = Alt_L Alt_R Meta_L
add mod2 = Num_Lock
add mod3 = ISO_Level3_Shift
add mod4 = Super_L Super_R Super_L Hyper_L
add mod5 = ISO_Level5_Shift
然后运行xmodmap ~/.Xmodmap
。
例如,ISO_Level3_Shift
是给你mod3
的。
如何让键盘生成与ISO_Level3_Shift
对应的keycode是另一个挑战。
例如,要让keycode 100
生成ISO_Level3_Shift
(现在是mod3
),请将以下内容添加到您的~/.Xmodmap
文件中,并运行xmodmap ~/.Xmodmap
。
keycode 100 = ISO_Level3_Shift
100
的键码应由udev
生成。当您按下键盘上的物理键时,微控制器/固件将该物理键映射到一个扫描码,并通过USB接口发送该扫描码。然后udev
将该扫描码映射到Linux 内核键码
。然后X11将内核键码映射到一个X11键码
。然后X11将该X11键码映射到一个X11键符号
。不用说,这个映射过程非常复杂。(特别是我几乎总是忽略X11键符号
并使用原始X11键码
。)xmodmap
已经过时了,应该使用XKB配置文件之类的东西,但使用XKB要糟糕得多。shift
,...,mod1
,...,mod5
)与之相关联的是一个比特掩码。这是XCB使用C 枚举实现的比特掩码,其精确值为:enum xcb_mod_mask_t{
XCB_MOD_MASK_SHIFT = 1<<0,
XCB_MOD_MASK_LOCK = 1<<1,
XCB_MOD_MASK_CONTROL = 1<<2,
XCB_MOD_MASK_1 = 1<<3,
XCB_MOD_MASK_2 = 1<<4,
XCB_MOD_MASK_3 = 1<<5,
XCB_MOD_MASK_4 = 1<<6,
XCB_MOD_MASK_5 = 1<<7,
XCB_MOD_MASK_ANY = 1<<15,
};
这些值并非XCB自己选择的,而是由X协议规范指定的。在通过X协议与X服务器通信时,您可以使用它们。例如,当X服务器向您发送事件时,该事件是一个32字节的结构体,其中一个字段是位掩码,位按照在按键事件期间按下的修饰键设置。例如,如果设置了位0,则表示设置了,这意味着修改键已按下。