Num Lock Detection for Linux [Moved from main forum.]

by qbguy (Login The-Universe)
Admin

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;
}

Posted on Dec 14, 2008, 5:06 PM

Respond to this message   

Return to Index