loadkeys: Remove OPT_QUIET option
[platform/upstream/kbd.git] / src / kbdrate.c
index b1c9c1e..8d0df5a 100644 (file)
@@ -74,20 +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>
 #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>
 
@@ -105,12 +107,12 @@ static int valid_delays[] = { 250, 500, 750, 1000 };
 
 static int
 KDKBDREP_ioctl_ok(double rate, int delay, int silent) {
-#if defined(KDKBDREP) && !defined(__sparc__)
-       /* This ioctl is defined in <linux/kd.h> but is not
-          implemented anywhere - must be in some m68k patches.
-          We cannot blindly try unimplemented ioctls on sparc64 -
-          the 32<->64bit transition layer does not like it. */
-       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;
@@ -153,14 +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! */
-#else /* no KDKBDREP or __sparc__ */
-       return 0;
-#endif /* KDKBDREP */
 }
 
+#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;
@@ -171,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)" );
@@ -184,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 */
@@ -193,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 );
 }
@@ -201,7 +225,7 @@ sigalrmhandler( int sig ) {
 int
 main( int argc, char **argv ) {
 #ifdef __sparc__
-       double      rate = 20.0;      /* Default rate */
+       double      rate = 5.0;      /* Default rate */
        int         delay = 200;     /* Default delay */
 #else
        double      rate = 10.9;     /* Default rate */
@@ -213,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")))
@@ -251,9 +275,8 @@ main( int argc, char **argv ) {
                return 0;
 
 
-       /* The ioport way - will crash on sparc */
+       /* The ioport way */
 
-#ifndef __sparc__
        for (i = 0; i < RATE_COUNT; i++)
                if (rate * 10 >= valid_rates[i]) {
                        value &= 0x60;
@@ -316,7 +339,5 @@ main( int argc, char **argv ) {
                        valid_rates[value & 0x1f] / 10.0,
                        valid_delays[ (value & 0x60) >> 5 ] );
 
-#endif
-
        return 0;
 }