/**************************************************************************** NumlockX - (C) 2000 Lubos Lunak Released under the terms of the GNU General Public License main.c - $Id: enable_X11_numlock.c 158725 2001-03-29 11:17:40Z gc $ ****************************************************************************/ /* The NumLock state detection code is originally from KLeds by Hans Matzen */ #define __main_C #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #define HAS_XKB 1 #ifdef HAS_XKB #include #endif void usage( const char* argv0 ) { printf( "NumlockX - (C) 2000 Lubos Lunak \n\n" #ifdef HAS_XKB "Usage : %s [on|off|switch]\n" "on - sets NumLock on in X (default)\n" "off - sets NumLock off in X\n" "switch - changes NumLock state in X\n" #else "Usage : %s\n" "Changes NumLock state in X\n" "( NumLock state detection not available," " compiled without XKB )\n" #endif "\n" , argv0 ); } Display* disp; #ifdef HAS_XKB int get_numlock_state() { unsigned int states; if( XkbGetIndicatorState( disp, XkbUseCoreKbd, &states) != Success ) { printf("Error while reading Indicator status\n"); XCloseDisplay( disp ); exit( 3 ); } return states & 0x02; /* NumLock appears to be bit1 */ } #endif void change_numlock() { XTestFakeKeyEvent( disp, XKeysymToKeycode( disp, XK_Num_Lock ), True, CurrentTime ); XTestFakeKeyEvent( disp, XKeysymToKeycode( disp, XK_Num_Lock ), False, CurrentTime ); } #ifdef HAS_XKB void set_on() { if( !get_numlock_state()) change_numlock(); } void set_off() { if( get_numlock_state()) change_numlock(); } #endif int main( int argc, char* argv[] ) { if( argc > 2 ) { usage( argv[ 0 ] ); return 1; } disp = XOpenDisplay( NULL ); if( disp == NULL ) { printf( "Error opening display\n" ); return 2; } if( argc == 1 ) #if HAS_XKB set_on(); else if( strncmp( argv[ 1 ], "on", 2 ) == 0 ) set_on(); else if( strncmp( argv[ 1 ], "of", 2 ) == 0 ) set_off(); #else change_numlock(); /* if( argc == 1 ) */ #endif else if( strncmp( argv[ 1 ], "switch", 6 ) == 0 ) change_numlock(); else { usage( argv[ 0 ] ); XCloseDisplay( disp ); return 1; } XCloseDisplay( disp ); return 0; }