Guys, please take a look at the following hackish ugly code. This is just a proof of concept. It allows me to use an extended multimedia key (that generates 0xe0 0x32 code sequence) on my keyboard to break out of K_RAW into K_XLATE. The code is slightly tested and seems to work. It allowed me to switch out of X terminal to a normal console terminal when X server hanged. Then I could kill X and relatively easily recover from the situation that previously require either a remote access (e.g. through network) or a reboot.
What do you think about having such a capability in syscons? Of course, the mode switch should be triggered by some key combination is possible to produce on any/most supported keyboards and also should be hard to press by accident. Note that I haven't (again) checked this code with WITNESS. diff --git a/sys/dev/syscons/syscons.c b/sys/dev/syscons/syscons.c index d158f85..e543765 100644 --- a/sys/dev/syscons/syscons.c +++ b/sys/dev/syscons/syscons.c @@ -3127,6 +3127,7 @@ scgetc(sc_softc_t *sc, u_int flags) #endif u_int c; int this_scr; + static int e0 = 0; int f; int i; @@ -3159,8 +3160,22 @@ next_code: if (!(flags & SCGETC_CN)) random_harvest(&c, sizeof(c), 1, 0, RANDOM_KEYBOARD); - if (scp->kbd_mode != K_XLATE) + if (scp->kbd_mode != K_XLATE) { + if (scp->kbd_mode == K_RAW) { + if (e0) { + e0 = 0; + if (KEYCHAR(c) == 0x32) { + printf("kbd_mode: %d => %d\n", scp->kbd_mode, K_XLATE); + scp->kbd_mode = K_XLATE; + kbdd_ioctl(scp->sc->kbd, KDSKBMODE, (caddr_t)&scp->kbd_mode); + return NOKEY; + } + } + else if (KEYCHAR(c) == 0xe0) + e0 = 1; + } return KEYCHAR(c); + } /* if scroll-lock pressed allow history browsing */ if (!ISGRAPHSC(scp) && scp->history && scp->status & SLKED) { -- Andriy Gapon _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"