/* * keyblink.c * * Renaud Waldura * * Mon Sep 12 18:47:58 1994 * Tue Sep 13 18:10:12 1994 * * And now keyboard LEDs blink ! * */ #include #include #include #include #include #include #include #include #include #include #include #include #define errif(e) if (e) { perror(argv[0]); return errno; } else {} #define DEFAULT_DURATION 60 void usage (const char* progname) { cerr << "Usage: " << progname << " -n|-NumLockKey|-c|-ComposeKey|-s|-ScrollLockKey [-d seconds]" << endl; exit(1); } main (int argc, char* argv[ ]) { if (!(argc == 2 && argv[1][0] == '-' || argc == 3 && argv[1][0] == '-' && argv[2][0] == '-')) usage(argv[0]); unsigned int duration = DEFAULT_DURATION; if (argc == 3) // get duration if (argv[2][1] == 'd') duration = atoi(&argv[2][3]); else if (argv[1][1] == 'd') { duration = atoi(&argv[1][3]); argv[1] = argv[2]; } else usage(argv[0]); unsigned char led; // get led to blink switch (argv[1][1]) { case 'c': case 'C': led = LED_COMPOSE; break; case 'n': case 'N': led = LED_NUM_LOCK; break; case 's': case 'S': led = LED_SCROLL_LOCK; break; default : usage(argv[0]); } int kb = open("/dev/kbd", O_RDWR); // open keyboard driver errif( kb < 0 ); unsigned char oldLeds; errif( ioctl(kb, KIOCGLED, &oldLeds) < 0 ); // get previous LEDs state unsigned char ledOn = oldLeds | led; // switch this led on unsigned char ledOff = oldLeds & ~led; // and off duration /= 2; // loop for duration seconds while (duration--) // blink keyboard led { errif( ioctl(kb, KIOCSLED, &ledOn) < 0 ); sleep(1); errif( ioctl(kb, KIOCSLED, &ledOff) < 0 ); sleep(1); } errif( ioctl(kb, KIOCSLED, &oldLeds) < 0 ); // restore LEDs state return close(kb); // and close keyboard driver }