您可以使用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 为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
例如,值为100 的键码应由udev 生成。当您按下键盘上的物理键时,微控制器/固件会将该物理键映射到 扫描码,并通过 USB 接口发送该扫描码。然后 udev 将该扫描码映射到 Linux kernel keycode。然后 X11 将该内核键码映射到X11 keycode。然后 X11 将该 X11 键码映射到 X11 keysym。不用说,这种映射是不必要的复杂。 (特别是,我几乎总是忽略X11 keysyms 并使用原始X11 keycodes。)
你可能听说xmodmap 已被弃用,你应该弄乱 XKB 配置文件和其他东西,但使用 XKB 会差很多很多很多。
(键盘真的很简单(只是一个扫描物理键矩阵的电路+微控制器,知道 USB HID 的键盘端固件,然后是一个内核端驱动程序,它将依赖于固件的扫描码映射到标准化的键码),但是人们使它们变得非常复杂。此外,扫描码/键码从一开始就应该是 32 位的。)
在 X 协议中,8 个修饰符(shift、...、mod1、...、mod5)都有一个与之关联的位掩码。这是 XCB 使用 C enum 实现的位掩码,其精确值为:
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 修饰符被帮助关闭。