【问题标题】:Get status of currently active modifiers in X11获取 X11 中当前激活的修饰符的状态
【发布时间】:2016-06-23 11:20:25
【问题描述】:

有没有办法获取 X 中当前活动修饰符的信息?例如。如果 Capslock 处于活动状态,如果按下 shift 等。

根据xkbcommon-keysyms.h,这是所有 X11 修饰符的列表:

#define XKB_KEY_Shift_L                       0xffe1  /* Left shift */
#define XKB_KEY_Shift_R                       0xffe2  /* Right shift */
#define XKB_KEY_Control_L                     0xffe3  /* Left control */
#define XKB_KEY_Control_R                     0xffe4  /* Right control */
#define XKB_KEY_Caps_Lock                     0xffe5  /* Caps lock */
#define XKB_KEY_Shift_Lock                    0xffe6  /* Shift lock */

#define XKB_KEY_Meta_L                        0xffe7  /* Left meta */
#define XKB_KEY_Meta_R                        0xffe8  /* Right meta */
#define XKB_KEY_Alt_L                         0xffe9  /* Left alt */
#define XKB_KEY_Alt_R                         0xffea  /* Right alt */
#define XKB_KEY_Super_L                       0xffeb  /* Left super */
#define XKB_KEY_Super_R                       0xffec  /* Right super */
#define XKB_KEY_Hyper_L                       0xffed  /* Left hyper */
#define XKB_KEY_Hyper_R                       0xffee  /* Right hyper */

但是我怎样才能得到这些键的状态呢?我没有找到相应的功能。提前致谢!

【问题讨论】:

    标签: c linux keyboard x11


    【解决方案1】:

    这样做的正确方法如下:

    在接收到 KeyPress 事件后,您获取 XKeyEvent 数据,并从中获取状态,并将其转换如下(这是 GLFW 处理 X11 事件的内部机制的一部分https://github.com/glfw/glfw/blob/7e8da57094281c73a0be5669a4b79686b4917f6c/src/x11_window.c#L186):

    static int translateState(int state)
    {
        int mods = 0;
    
        if (state & ShiftMask)
            mods |= GLFW_MOD_SHIFT;
        if (state & ControlMask)
            mods |= GLFW_MOD_CONTROL;
        if (state & Mod1Mask)
            mods |= GLFW_MOD_ALT;
        if (state & Mod4Mask)
            mods |= GLFW_MOD_SUPER;
        if (state & LockMask)
            mods |= GLFW_MOD_CAPS_LOCK;
        if (state & Mod2Mask)
            mods |= GLFW_MOD_NUM_LOCK;
    
        return mods;
    }
    

    你这样称呼那个函数:

    translateState(xev.xkey.state);
    

    其中 xev 是您收到的 XEvent。当然,您应该使用自己的标志而不是 GLFW 枚举,或者用它做其他事情。

    【讨论】:

      【解决方案2】:

      不,这不是修饰符列表。这是修饰键列表。

      X11 修饰符有ShiftMaskMod1Mask 等。逻辑修饰符不同于物理键。左移和右移键产生相同的修饰符掩码。

      如果您需要修饰符掩码,则每个 X11 键和按钮事件都包含 state 成员中的活动修饰符掩码。如果你使用 Xkb(你可能应该),这里有 XkbGetState

      我不知道有什么方法可以获取物理键的状态,除了监视按键和按键释放事件。

      【讨论】:

      • 所有内容都以位掩码的形式返回,位于 XkbStateRec 结构中。有关文档,请参阅 here。这里的base_groupbase_mods 由物理上“按下”或报告给X11 的键和修饰符组成。
      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2011-01-05
      • 2012-07-13
      相关资源
      最近更新 更多