首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xcb键盘掩码意味着

xcb键盘掩码意味着
EN

Stack Overflow用户
提问于 2013-10-15 08:18:48
回答 2查看 3.5K关注 0票数 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 (我是正确的吗?),但是对于其他按钮,我在任何地方都找不到映射(我在发布之前试图搜索它们,但没有成功)。

那么,与这些面具相关的通常的密钥是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-01 15:23:54

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

来源:我自己的计算机运行X11,网络上有各种各样的代码,并不是所有的代码都是一致的,比如有人说Mod1是Alt,Mod4是Meta。

X11程序通常允许用户配置与Mask1相对应的操作。Mask5,并让它们排序哪个键集哪个掩码。

票数 7
EN

Stack Overflow用户

发布于 2018-05-23 04:16:27

实际上,您可以使用像xmodmap这样的实用工具来配置这些键(或任何键)映射到什么。在X窗口系统中有八个修饰符。这8个修饰符是

  1. shift
  2. lock
  3. control
  4. mod1
  5. mod2
  6. mod3
  7. mod4
  8. mod5

要查看当前将哪些键映射到这些修饰符,可以运行xmodmap -pm,它将打印修饰符映射。例如:对我来说输出是

代码语言:javascript
复制
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并编写如下内容:

代码语言:javascript
复制
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

代码语言:javascript
复制
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要糟糕得多,甚至更糟。

(键盘非常简单(仅仅是扫描物理键矩阵的circuit+microcontroller,知道USB隐藏的键盘端固件,然后是将依赖固件的扫描代码映射到标准化密钥的内核端驱动程序),但人们使它们变得非常复杂。另外,扫描码/密钥码从一开始就应该是32位的。)

在X协议中,8个修饰符(shift、.、mod1、.、mod5)有一个与它们相关联的位掩码。这是XCB使用C enum实现的位掩码,其精确值是:

代码语言:javascript
复制
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修饰符是帮助下的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19376338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档