XCB键盘按钮掩码含义

7

我正在尝试弄清楚以下按键的处理方式:

  • 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搜索它们,但没有成功)。

那么这些掩码通常关联哪些按键呢?


你能否创建一个小程序来捕获任何事件,然后尝试按下任何可能的修改器(甚至它们的组合)以查看是否匹配? - Daniele Ricci
2
通常Mask1是Alt或Meta,Mask2是Num lock,Mask3是AltGr,Mask4是Win,而Mask5是Scroll lock,但这在不同的X实现和/或键盘型号之间可能会有所不同。 - n. m.
谢谢n.m,如果您将您的评论发布为答案,我会很高兴接受它 :) - Ivan
同意伊万的观点。@n.m. 如果您能提供解决方案,我会很乐意点赞! - Noitidart
抱歉,我有点分心了 :) - n. m.
哇,有点晚了吧? :D 三年后才回复!!! :) :) 不管怎样,我会接受你的答案! - Ivan
2个回答

7
通常情况下,Mask1是Alt或Meta, Mask2是Num Lock, Mask3是AltGr, Mask4是Win,Mask5是Scroll Lock,但这在X实现和/或键盘型号之间有所不同。
来源:我自己的电脑运行X11以及网上散布的各种代码。它们并不都一致,例如一些说Mod1是Alt而Mod4是Meta。
X11程序通常允许用户配置与Mask1到Mask5对应的操作,并让它们解决哪个键设置哪个掩码的问题。

6
您可以使用类似 xmodmap 的工具实际配置这些按键(或任何按键)的映射。在 X Window 系统 中,有 8 种修饰键。这 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

现在,如果你想通过 xmodmap 更改 mod1mod5,可以打开 ~/.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要糟糕得多。
(键盘非常简单(只是一个电路+微控制器,可以扫描物理键矩阵,键盘侧固件知道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服务器向您发送事件时,该事件是一个32字节的结构体,其中一个字段是位掩码,位按照在按键事件期间按下的修饰键设置。例如,如果设置了位0,则表示设置了,这意味着修改键已按下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接