6

我试图弄清楚哪些键由以下人员处理:

  • 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(我是正确的?),但对于其他按钮,我无法在任何地方找到映射(我在发布之前尝试用谷歌搜索它们,但没有成功)。

那么与这些面具相关的常用键是什么?

4

2 回答 2

7

通常 Mask1 是 Alt 或 Meta,Mask2 是 Num lock,Mask3 是 AltGr,Mask4 是 Win,Mask5 是 Scroll lock,但这在 X 实现和/或键盘模型之间有所不同。

资料来源:我自己的运行 X11 的计算机,以及网络上散布的各种代码片段。并非所有这些都是一致的,例如有人说 Mod1 是 Alt 而 Mod4 是 Meta。

X11 程序通常让用户配置对应于 Mask1 ... Mask5 的动作,并让他们整理哪些键设置哪些掩码。

于 2016-05-01T15:23:54.207 回答
6

您实际上可以使用诸如xmodmap. 在X Window System中有八个修饰符。8个修饰符是

  1. shift
  2. lock
  3. control
  4. mod1
  5. mod2
  6. mod3
  7. mod4
  8. 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现在通过mod5with进行更改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修饰符被帮助关闭。

于 2018-05-23T04:16:27.243 回答