Compile with: gcc foobar.c -o foobar -lX11 -lXtst Code: #include <X11/keysym.h> #include <X11/Xlib.h> #include <X11/extensions/XTest.h> int keyState(int iKey,Display *pDisplay) { int iKeyMask = 0; Window wDummy1, wDummy2; int iDummy3, iDummy4, iDummy5, iDummy6; int i; unsigned int iMask; XModifierKeymap* map = XGetModifierMapping(pDisplay); KeyCode keyCode = XKeysymToKeycode(pDisplay,iKey); if(keyCode == NoSymbol) return 0; for(i = 0; i < 8; ++i) { if( map->modifiermap[map->max_keypermod * i] == keyCode) { iKeyMask = 1 << i; } } XQueryPointer(pDisplay, DefaultRootWindow(pDisplay), &wDummy1, &wDummy2, &iDummy3, &iDummy4, &iDummy5, &iDummy6, &iMask ); XFreeModifiermap(map); return (iMask & iKeyMask) != 0; } int main(void) { Display* disp = XOpenDisplay( NULL ); if( disp == NULL ) return 1; if (keyState(XK_Num_Lock,disp)) { XTestFakeKeyEvent( disp, XKeysymToKeycode( disp, XK_Num_Lock), True, CurrentTime ); XTestFakeKeyEvent( disp, XKeysymToKeycode( disp, XK_Num_Lock), False, CurrentTime ); } XCloseDisplay( disp ); return 0; } |