有没有办法在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 */
但我如何获得这些密钥的状态?我没有找到相应的功能。提前谢谢!
答案 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修饰符为ShiftMask
,Mod1Mask
等。逻辑修饰符与物理键不同。左移和右移键导致相同的修改器掩码。
如果需要修改器蒙版,则每个X11键和按钮事件都在state
成员中包含一个活动修改器的蒙版。如果您使用Xkb(您可能应该),则有XkbGetState
。
除了监控按键和按键释放事件之外,我不知道获取物理按键状态的任何方法。