loadkeys: Remove OPT_QUIET option
[platform/upstream/kbd.git] / src / kbdrate.c
index 5b69d1f..8d0df5a 100644 (file)
@@ -74,21 +74,22 @@ beats rebuilding the kernel!
 #include <errno.h>
 #include <sys/file.h>
 #include <sys/ioctl.h>
+#include <linux/kd.h>
 
 #ifdef __sparc__
 #include <asm/param.h>
-#include <asm/kbio.h>
 #endif
 
-#ifndef KDKBDREP
-/* usually defined in <linux/kd.h> */
-#define KDKBDREP        0x4B52  /* set keyboard delay/repeat rate;
-                                * actually used values are returned */
-struct kbd_repeat {
+#ifdef COMPAT_HEADERS
+#include "compat/linux-kd.h"
+#endif
+
+/* Equal to kernel version, but field names vary. */
+struct my_kbd_repeat {
         int delay;        /* in msec; <= 0: don't change */
         int period;       /* in msec; <= 0: don't change */
+                         /* earlier this field was misnamed "rate" */
 };
-#endif
 
 #include <signal.h>
 
@@ -106,9 +107,12 @@ static int valid_delays[] = { 250, 500, 750, 1000 };
 
 static int
 KDKBDREP_ioctl_ok(double rate, int delay, int silent) {
-       /* This ioctl is defined in <linux/kd.h> but is not
-          implemented anywhere - must be in some m68k patches. */
-       struct kbd_repeat kbdrep_s;
+       /*
+        * This ioctl is defined in <linux/kd.h> but is not
+        * implemented anywhere - must be in some m68k patches.
+        * Since 2.4.9 also on i386.
+        */
+       struct my_kbd_repeat kbdrep_s;
 
        /* don't change, just test */
        kbdrep_s.period = -1;
@@ -151,11 +155,36 @@ KDKBDREP_ioctl_ok(double rate, int delay, int silent) {
                printf( _("Typematic Rate set to %.1f cps (delay = %d ms)\n"),
                        rate, kbdrep_s.delay );
 
+       kbdrep_s.period = -1;
+       kbdrep_s.delay = -1;
+       if (ioctl( 0, KDKBDREP, &kbdrep_s )) {
+               if (errno == EINVAL)
+                       return 0;
+               perror( "ioctl(KDKBDREP)" );
+               exit( 1 );
+       }
+       printf("old delay %d, period %d\n",
+              kbdrep_s.delay, kbdrep_s.period);
+       if (kbdrep_s.period == 0)
+               rate = 0;
+       else
+               rate = 1000.0 / (double) kbdrep_s.period;
+
+       if (!silent)
+               printf( _("Typematic Rate set to %.1f cps (delay = %d ms)\n"),
+                       rate, kbdrep_s.delay );
+
        return 1;                       /* success! */
 }
 
+#ifndef KIOCSRATE
+#define arg_state attr_unused
+#else
+#define arg_state
+#endif
+
 static int
-KIOCSRATE_ioctl_ok(double rate, int delay, int silent) {
+KIOCSRATE_ioctl_ok(arg_state double rate, arg_state int delay, arg_state int silent) {
 #ifdef KIOCSRATE
        struct kbd_rate kbdrate_s;
        int fd;
@@ -166,10 +195,10 @@ KIOCSRATE_ioctl_ok(double rate, int delay, int silent) {
                exit( 1 );
        }
 
-       kbdrate_s.period = (int) (rate + 0.5);  /* round up */
+       kbdrate_s.rate = (int) (rate + 0.5);  /* round up */
        kbdrate_s.delay = delay * HZ / 1000;  /* convert ms to Hz */
-       if (kbdrate_s.period > 50)
-               kbdrate_s.period = 50;
+       if (kbdrate_s.rate > 50)
+               kbdrate_s.rate = 50;
 
        if (ioctl( fd, KIOCSRATE, &kbdrate_s )) {
                perror( "ioctl(KIOCSRATE)" );
@@ -179,7 +208,7 @@ KIOCSRATE_ioctl_ok(double rate, int delay, int silent) {
 
        if (!silent)
                printf( "Typematic Rate set to %d cps (delay = %d ms)\n",
-                       kbdrate_s.period, kbdrate_s.delay * 1000 / HZ );
+                       kbdrate_s.rate, kbdrate_s.delay * 1000 / HZ );
 
        return 1;
 #else /* no KIOCSRATE */
@@ -188,7 +217,7 @@ KIOCSRATE_ioctl_ok(double rate, int delay, int silent) {
 }
 
 static void
-sigalrmhandler( int sig ) {
+sigalrmhandler( attr_unused int sig ) {
        fprintf( stderr, "kbdrate: Failed waiting for kbd controller!\n" );
        raise( SIGINT );
 }
@@ -208,14 +237,14 @@ main( int argc, char **argv ) {
        int         fd;
        char        data;
        int         c;
-       int         i;
+       unsigned int i;
        extern char *optarg;
 
        set_progname(argv[0]);
 
        setlocale(LC_ALL, "");
-       bindtextdomain(PACKAGE, LOCALEDIR);
-       textdomain(PACKAGE);
+       bindtextdomain(PACKAGE_NAME, LOCALEDIR);
+       textdomain(PACKAGE_NAME);
 
        if (argc == 2 &&
            (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")))