From fbba1c150a3b726af9b932b84a9912ac9b802ddc Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Tue, 9 Jan 2001 19:40:57 +0000 Subject: - reintegrate into CVS - really fix X11 under X --- enable_X11_numlock.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 115 insertions(+), 10 deletions(-) (limited to 'enable_X11_numlock.c') diff --git a/enable_X11_numlock.c b/enable_X11_numlock.c index 836a4de..f35decf 100644 --- a/enable_X11_numlock.c +++ b/enable_X11_numlock.c @@ -1,13 +1,118 @@ +/**************************************************************************** + + NumlockX - (C) 2000 Lubos Lunak + Released under the terms of the GNU General Public License + + main.c - + + $Id$ + +****************************************************************************/ + +/* 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 + +#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) -{ - Display* disp = XOpenDisplay( NULL ); - if( disp == NULL ) - return 1; - XTestFakeKeyEvent( disp, XKeysymToKeycode( disp, XK_Num_Lock ), True, CurrentTime ); - XTestFakeKeyEvent( disp, XKeysymToKeycode( disp, XK_Num_Lock ), False, CurrentTime ); - XCloseDisplay( disp ); - return 0; -} +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; + } -- cgit v1.2.1