获取X11中当前活动修改器的状态

时间:2016-03-09 07:34:13

标签: c linux keyboard x11

有没有办法在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 */

但我如何获得这些密钥的状态?我没有找到相应的功能。提前谢谢!

2 个答案:

答案 0 :(得分:2)

正确的方法如下:

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

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枚举,或者对它进行其他操作。

答案 1 :(得分:0)

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

X11修饰符为ShiftMaskMod1Mask等。逻辑修饰符与物理键不同。左移和右移键导致相同的修改器掩码。

如果需要修改器蒙版,则每个X11键和按钮事件都在state成员中包含一个活动修改器的蒙版。如果您使用Xkb(您可能应该),则有XkbGetState

除了监控按键和按键释放事件之外,我不知道获取物理按键状态的任何方法。