aboutsummaryrefslogtreecommitdiffstats
path: root/enable_X11_numlock.c
diff options
context:
space:
mode:
Diffstat (limited to 'enable_X11_numlock.c')
-rw-r--r--enable_X11_numlock.c125
1 files changed, 115 insertions, 10 deletions
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 <l.lunak@email.cz>
+ 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 <hans@tm.informatik.uni-frankfurt.de> */
+
+#define __main_C
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <X11/extensions/XTest.h>
#include <X11/keysym.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define HAS_XKB 1
+#ifdef HAS_XKB
+#include <X11/XKBlib.h>
+#endif
+
+void usage( const char* argv0 )
+ {
+ printf( "NumlockX - (C) 2000 Lubos Lunak <l.lunak@email.cz>\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;
+ }