【问题标题】:xcb keyboard button masks meaningxcb 键盘按钮掩码含义
【发布时间】:2013-10-22 23:15:32
【问题描述】:

我试图弄清楚哪些键是由处理的:

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

那么与这些掩码相关联的常用键是什么?

【问题讨论】:

  • 你能不能创建一个小程序来捕捉任何事件,然后尝试按下任何可能的修饰符(甚至是它们的组合)来查看是否匹配?
  • 通常 Mask1 是 Alt 或 Meta,Mask2 是 Num lock,Mask3 是 AltGr,Mask4 是 Win,Mask5 是 Scroll lock,但这会因 X 实现和/或键盘型号而异。
  • 谢谢你,n.m,如果你发表你的评论作为答案,我很乐意接受它:)
  • 同意伊万。 @n.m。如果你能转向解决方案,我很乐意投票!
  • 对不起,我有点分心了:)

标签: x11 xcb


【解决方案1】:

通常 Mask1 是 Alt 或 Meta,Mask2 是 Num lock,Mask3 是 AltGr,Mask4 是 Win,Mask5 是 Scroll lock,但这会因 X 实现和/或键盘模型而异。

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

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

【讨论】:

    【解决方案2】:

    您可以使用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 更改为mod5xmodmap,打开~/.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 修饰符被帮助关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多