boo*_*oom 3 c c++ linux x11 gtk
我已经阅读了Gdk论坛链接,该链接表示从版本3.0开始实现获取num lock state api.但我使用的是2.4版本,因为我需要支持更低版本的Linux版本,因此我无法更新到3.0版本.这是讨论链接:
http://mail.gnome.org/archives/commits-list/2010-July/msg00259.html
那么,有没有其他方法可以使用内部Linux命令获得num lock状态?
问候,iSight
获取NumLock状态的示例代码.让我们foo.c:
#include <stdio.h>
#include <X11/Xlib.h>
int main(void) {
Display *dpy = XOpenDisplay(":0");
XKeyboardState x;
XGetKeyboardControl(dpy, &x);
XCloseDisplay(dpy);
printf("led_mask=%lx\n", x.led_mask);
printf("NumLock is %s\n", (x.led_mask & 2) ? "On" : "Off");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后,在戴尔笔记本电脑上使用CentOS 5进行测试:
gcc foo.c -o foo -lX11
foo
led_mask=2
NumLock is On
Run Code Online (Sandbox Code Playgroud)
或者你可以做点什么popen("xset q | grep LED");.
面具的第二位对于NumLock来说相当常见,但我不相信它是有保证的.
原始答案:一个很好的起点是xev,可用约20年:
xev
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式解码关键事件:
foobar (XKeyEvent *bar) {
char dummy[20];
KeySym key;
KeySym keyKeypad;
XLookupString(bar, dummy, sizeof dummy, &key, 0);
keyKeypad = XKeycodeToKeysym(..., bar->keycode, NUMLOCK_Mask);
if (IsKeypadKey(keyKeypad))
...;
// ...
}
Run Code Online (Sandbox Code Playgroud)