It doesn't offer any information from the generated keysym.h or
anything, but only prints the plain keycode.
If it's of any use for a user to see 'keycode 83' and not being
able to say 'keyboard.map+="keycode 83=Home"' is a different
story.

--steffen

Index: sbin/wsconsctl/Makefile
===================================================================
RCS file: /cvs/src/sbin/wsconsctl/Makefile,v
retrieving revision 1.34
diff -a -p -u -r1.34 Makefile
--- sbin/wsconsctl/Makefile     30 Jan 2010 20:48:50 -0000      1.34
+++ sbin/wsconsctl/Makefile     30 Jan 2012 15:17:46 -0000
@@ -12,7 +12,7 @@
     ${MACHINE} == "zaurus"
 
 PROG=  wsconsctl
-SRCS=  display.c keyboard.c keysym.c map_parse.y map_scan.l \
+SRCS=  display.c keyboard.c keycode.c keysym.c map_parse.y map_scan.l \
        mouse.c util.c wsconsctl.c
 
 CPPFLAGS+=     -I${.CURDIR} -I.
Index: sbin/wsconsctl/keycode.c
===================================================================
RCS file: sbin/wsconsctl/keycode.c
diff -N sbin/wsconsctl/keycode.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ sbin/wsconsctl/keycode.c    30 Jan 2012 15:18:12 -0000
@@ -0,0 +1,133 @@
+/*     $OpenBSD$       */
+
+/*
+ * Copyright (c) 2012 Steffen Daode Nurpmeso.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsksymdef.h>
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <termios.h>
+#include <unistd.h>
+#include "wsconsctl.h"
+
+static struct termios  tios_orig, tios_raw;
+
+static void    onsig(int sig);
+static void    raw_on(void), raw_off(void);
+
+static void
+onsig(int sig)
+{
+       raw_off();
+       exit(sig != SIGALRM);
+}
+
+static void
+raw_on(void)
+{
+       int arg = WSKBD_RAW;
+
+       if (tcsetattr(STDIN_FILENO, TCSANOW, &tios_raw) < 0)
+               err(1, "Can't set terminal attributes");
+       if (ioctl(STDIN_FILENO, WSKBDIO_SETMODE, &arg) < 0) {
+               arg = errno;
+               (void)tcsetattr(STDIN_FILENO, TCSANOW, &tios_orig);
+               errno = arg;
+               err(1, ((arg == ENOTTY)
+                   ? "This mode won't work on pseudo terminals"
+                   : "Can't put keyboard in raw mode (the "
+                     "WSDISPLAY_COMPAT_RAWKBD kernel option is required)"));
+       }
+       return;
+}
+
+static void
+raw_off(void)
+{
+       int arg = WSKBD_TRANSLATED;
+
+       (void)ioctl(STDIN_FILENO, WSKBDIO_SETMODE, &arg);
+       (void)tcsetattr(STDIN_FILENO, TCSANOW, &tios_orig);
+       return;
+}
+
+void
+keycode_mode(void)
+{
+       ssize_t i, skip;
+       struct sigaction sa;
+       struct itimerval it;
+       unsigned char *cursor, buffer[64];
+
+       if (tcgetattr(STDIN_FILENO, &tios_orig) < 0)
+               err(1, "Can't query terminal attributes");
+       tios_raw = tios_orig;
+       (void)cfmakeraw(&tios_raw);
+
+       sa.sa_handler = &onsig;
+       sa.sa_flags = 0;
+       (void)sigfillset(&sa.sa_mask);
+       for (i = 0; i < NSIG; ++i)
+               if (sigaction((int)i + 1, &sa, NULL) < 0 && i == SIGALRM)
+                       err(1, "Can't install SIGALRM signal handler");
+
+       printf("You may now use the keyboard.\n"
+           "After five seconds of inactivity the program terminates\n");
+       for (i = skip = 0;;) {
+               it.it_value.tv_sec = 5;
+               it.it_value.tv_usec = 0;
+               it.it_interval.tv_sec = it.it_interval.tv_usec = 0;
+               if (setitimer(ITIMER_REAL, &it, NULL) < 0)
+                       err(3, "Can't install wakeup timer");
+
+               raw_on();
+               i = read(STDIN_FILENO, buffer + skip, sizeof(buffer) - skip);
+               raw_off();
+
+               it.it_value.tv_sec = it.it_value.tv_usec = 0;
+               (void)setitimer(ITIMER_REAL, &it, NULL);
+
+               if (i <= 0)
+                       exit(1);
+               i += skip;
+
+               for (cursor = buffer; --i >= 0;) {
+                       unsigned int k = *cursor++;
+                       if ((k & 0xF0) == 0xE0 || (k & 0xF8) == 0xF0) {
+                               if (--i < 0) {
+                                       buffer[0] = (unsigned char)k;
+                                       skip = 1;
+                                       break;
+                               }
+                               k <<= 8;
+                               k |= *cursor++;
+                               k &= ((k & 0xF000) == 0xE000) ? 0x0FFF : 0x00FF;
+                       }
+                       printf("keycode %3u %-7s\n",
+                           (k & ~0x0080), (k & 0x0080) ? "release" : "press");
+                       skip = 0;
+               }
+       }
+       /* NOTREACHED */
+       return;
+}
Index: sbin/wsconsctl/wsconsctl.8
===================================================================
RCS file: /cvs/src/sbin/wsconsctl/wsconsctl.8,v
retrieving revision 1.23
diff -a -p -u -r1.23 wsconsctl.8
--- sbin/wsconsctl/wsconsctl.8  4 Aug 2008 07:32:51 -0000       1.23
+++ sbin/wsconsctl/wsconsctl.8  30 Jan 2012 15:18:12 -0000
@@ -49,6 +49,8 @@
 .Op Fl n
 .Op Fl f Ar file
 .Ar name Ns += Ns Ar value ...
+.Nm wsconsctl
+.Fl r
 .Sh DESCRIPTION
 The
 .Nm
@@ -81,6 +83,12 @@ symbol.
 See the
 .Sx EXAMPLES
 section for more details.
+.It Fl r
+Enters a raw interactive mode in which keypresses are displayed
+as their keycodes.
+This mode always operates on standard input
+and does not work on pseudo terminals.
+After five seconds of inactivity the program terminates.
 .El
 .Pp
 The
Index: sbin/wsconsctl/wsconsctl.c
===================================================================
RCS file: /cvs/src/sbin/wsconsctl/wsconsctl.c,v
retrieving revision 1.26
diff -a -p -u -r1.26 wsconsctl.c
--- sbin/wsconsctl/wsconsctl.c  20 Aug 2010 00:20:55 -0000      1.26
+++ sbin/wsconsctl/wsconsctl.c  30 Jan 2012 15:18:12 -0000
@@ -72,15 +72,17 @@ usage()
            "usage: %s [-an]\n"
            "       %s [-n] [-f file] name ...\n"
            "       %s [-n] [-f file] name=value ...\n"
-           "       %s [-n] [-f file] name+=value ...\n",
-           __progname, __progname, __progname, __progname);
+           "       %s [-n] [-f file] name+=value ...\n"
+           "       %s -r [-f file]\n",
+           __progname, __progname, __progname, __progname, __progname);
        exit(1);
 }
 
 int
 main(int argc, char *argv[])
 {
-       int i, ch, error = 0, aflag = 0, do_merge, putval, devidx, devfd;
+       int i, ch, error = 0, aflag = 0, rflag = 0,
+           do_merge, putval, devidx, devfd;
        struct vartypesw *sw = NULL;
        char *getsep = "=", *setsep = " -> ", *p;
        char *wdev = NULL;
@@ -88,7 +90,7 @@ main(int argc, char *argv[])
        struct field *f;
        char devname[20];
 
-       while ((ch = getopt(argc, argv, "af:nw")) != -1) {
+       while ((ch = getopt(argc, argv, "af:nrw")) != -1) {
                switch(ch) {
                case 'a':
                        aflag = 1;
@@ -99,6 +101,9 @@ main(int argc, char *argv[])
                case 'n':
                        getsep = setsep = NULL;
                        break;
+               case 'r':
+                       rflag = 1;
+                       break;
                case 'w':
                        /* compat */
                        break;
@@ -110,12 +115,17 @@ main(int argc, char *argv[])
        argc -= optind;
        argv += optind;
 
-       if (argc > 0 && aflag != 0)
-               errx(1, "excess arguments after -a");
-       if (argc == 0)
-               aflag = 1;
+       if (argc > 0 && (aflag != 0 || rflag != 0))
+               errx(1, "excess arguments after -%c", (aflag ? 'a' : 'r'));
+       if (rflag == 0) {
+               if (argc == 0)
+                       aflag = 1;
+       } else if (aflag != 0 || wdev != NULL || getsep == NULL)
+               errx(1, "-r is mutual exclusive with other options");
 
-       if (aflag != 0) {
+       if (rflag != 0)
+               keycode_mode();
+       else if (aflag != 0) {
                for (sw = typesw; sw->name; sw++) {
                        for (devidx = 0;; devidx++) {
                                device = (*sw->nextdev)(devidx);
Index: sbin/wsconsctl/wsconsctl.h
===================================================================
RCS file: /cvs/src/sbin/wsconsctl/wsconsctl.h,v
retrieving revision 1.13
diff -a -p -u -r1.13 wsconsctl.h
--- sbin/wsconsctl/wsconsctl.h  20 Aug 2010 00:20:55 -0000      1.13
+++ sbin/wsconsctl/wsconsctl.h  30 Jan 2012 15:18:12 -0000
@@ -76,6 +76,7 @@ keysym_t ksym_upcase(keysym_t);
 void   keyboard_get_values(int);
 int    keyboard_put_values(int);
 char * keyboard_next_device(int);
+void   keycode_mode(void);
 void   mouse_get_values(int);
 int    mouse_put_values(int);
 char * mouse_next_device(int);

Reply via email to