Пример кода для получения состояния 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;
}
Тогда получится, протестировано с CentOS 5 на ноутбуке Dell:
gcc foo.c -o foo -lX11
foo
led_mask=2
NumLock is On
Или вы можете сделать что-то с popen("xset q | grep LED");
.
Второй бит маски довольно распространен для NumLock, но я не верю, что он гарантирован.
Оригинальный ответ: Хорошая отправная точка - xev
, доступнов течение примерно 20 лет:
xev
И вы можете декодировать ключевые события с помощью:
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))
...;
// ...
}