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);