我试图弄清楚哪些键由以下人员处理:
- 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(我是正确的?),但对于其他按钮,我无法在任何地方找到映射(我在发布之前尝试用谷歌搜索它们,但没有成功)。
那么与这些面具相关的常用键是什么?
通常 Mask1 是 Alt 或 Meta,Mask2 是 Num lock,Mask3 是 AltGr,Mask4 是 Win,Mask5 是 Scroll lock,但这在 X 实现和/或键盘模型之间有所不同。
资料来源:我自己的运行 X11 的计算机,以及网络上散布的各种代码片段。并非所有这些都是一致的,例如有人说 Mod1 是 Alt 而 Mod4 是 Meta。
X11 程序通常让用户配置对应于 Mask1 ... Mask5 的动作,并让他们整理哪些键设置哪些掩码。
您实际上可以使用诸如xmodmap
. 在X Window System中有八个修饰符。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
。
mod1
现在通过mod5
with进行更改xmodmap
,打开~/.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
是另一个挑战。
例如。100
要生成要生成的密钥代码ISO_Level3_Shift
(现在是mod3
),请将以下内容添加到您的~/.Xmodmap
文件中并运行xmodmap ~/.Xmodmap
.
keycode 100 = ISO_Level3_Shift
例如,带有 value 的键码100
应该由udev
. 当您按下键盘上的物理键时,微控制器/固件将该物理键映射到扫描码并通过 USB 接口发送该扫描码。然后udev
将该扫描码映射到 Linux kernel keycode
。然后 X11 将该内核键码映射到X11 keycode
. 然后 X11 将该 X11 键码映射到X11 keysym
. 不用说,这种映射是不必要的复杂。(特别是,我几乎总是忽略X11 keysyms
并使用 raw X11 keycodes
。)
你可能听说它xmodmap
已被弃用,你应该弄乱 XKB 配置文件和其他东西,但使用 XKB 的情况要糟糕得多。
(键盘真的很简单(只是一个扫描物理键矩阵的电路+微控制器,知道 USB HID 的键盘端固件,然后是一个将依赖于固件的扫描码映射到标准化键码的内核端驱动程序),但人们已经制作了它们真的很复杂。此外,扫描码/键码从一开始就应该是 32 位的。)
在 X 协议中,8 个修饰符 ( 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 服务器向您发送一个XCB_KEY_PRESS
事件时,该事件是一个 32 字节的结构,它的一个字段是一个位掩码,其中的位是根据在该按键事件期间按下的修饰符设置的。例如。如果设置了位 0,则表示XCB_MOD_MASK_SHIFT
已设置,表示Shift
修饰符被帮助关闭。