我正在尝试通过以下方式确定处理键:
在xcb中,对于XCB_MOD_MASK_1,它似乎是Alt(我是正确的?),但对于其他人按钮我找不到任何地方的映射(我试图在发布之前谷歌他们,但没有成功)。
那么与这些面具相关的常用密钥是什么?
答案 0 :(得分:5)
通常Mask1是Alt或Meta,Mask2是Num lock,Mask3是AltGr,Mask4是Win,Mask5是Scroll lock,但这在X实现和/或键盘模型之间有所不同。
资料来源:我自己的电脑运行X11,以及网上的各种各样的代码。并非所有这些都是一致的,例如有人说Mod1是Alt,Mod4是Meta。
X11程序通常允许用户配置与Mask1 ... Mask5相对应的操作,并让他们找出哪些键设置掩码。
答案 1 :(得分:2)
您可以使用xmodmap
等实用程序实际配置这些键(或任何键)映射到的内容。在X服务器下有八个修饰符。 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
对应的密钥代码是另一项挑战。
EG。要获取密钥代码100
以生成ISO_Level3_Shift
(现在为mod3
),请将以下内容添加到~/.Xmodmap
文件中并运行xmodmap ~/.Xmodmap
。
keycode 100 = ISO_Level3_Shift
您可能会听到xmodmap
已被弃用,并且您应该使用XKB配置文件和内容,但使用XKB会更糟糕。
在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字节的结构,其中一个字段是位掩码,其中的位根据在该按键事件期间按下的修饰符设置。例如。如果设置了第3位,则表示XCB_MOD_MASK_CONTROL
已设置,这意味着Control
修饰符已帮助关闭。