C语言 X11 Shift + Tab keysym?



如何在Xlib中检测到Shift + Tab?我能够将KeySymXK_Tab匹配,但按住shift然后检查ev->state & ShiftMask时不匹配,所以我有点迷路了。

解决方案:

多亏了Erdal k的回答,我能够想出以下检测Shift + Tab的函数:

int detectShiftTab(XKeyEvent *xkey) {
return XLookupKeysym(xkey, 0) == XK_Tab && xkey->state & ShiftMask;
}

通过一个简单的测试,我意识到ShiftMask没有在Shift键的KeyPress上报告。除此之外,ShiftMask总是被设置的。

int main()
{
Display *dpy = XOpenDisplay(NULL);

Window win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 640, 480, 0, 0, 0);
XSetWindowAttributes attr = { .event_mask = (KeyPressMask | KeyReleaseMask) };
XChangeWindowAttributes(dpy, win, CWEventMask, &attr);
XMapWindow(dpy, win);
while (1) {
XEvent evt;
XNextEvent(dpy, &evt);
switch (evt.type) {
case KeyPress:
printf(
"key press: %s shiftmask: %dn", 
XKeysymToString(XLookupKeysym(&evt.xkey, 0)), 
(evt.xkey.state & ShiftMask) == ShiftMask
);
break;
case KeyRelease:
printf(
"key release: %s shiftmask: %dn", 
XKeysymToString(XLookupKeysym(&evt.xkey, 0)), 
(evt.xkey.state & ShiftMask) == ShiftMask
);
break;
}
}
return 0;
}

得到以下输出(输入Shift + Tab):

key press:   Shift_L shiftmask: 0
key press:   Tab shiftmask: 1
key release: Tab shiftmask: 1
key release: Shift_L shiftmask: 1

最新更新