From d93afd19794a49c9ead9e2012619cd646bf0f0ae Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 6 Jun 2007 18:49:28 +0000 Subject: [PATCH] Add a field to the keyboard abstraction structure that allows the USB keyboard controller to save and restore the translation state. This allows you to disconnect and reconnect a USB keyboard and not get gibberish when you type. Reported-by: Petr Janda --- sys/dev/misc/kbd/kbdreg.h | 3 ++- sys/dev/usbmisc/ukbd/ukbd.c | 17 +++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/sys/dev/misc/kbd/kbdreg.h b/sys/dev/misc/kbd/kbdreg.h index 3d89da7645..12a27dff08 100644 --- a/sys/dev/misc/kbd/kbdreg.h +++ b/sys/dev/misc/kbd/kbdreg.h @@ -24,7 +24,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/kbd/kbdreg.h,v 1.9.2.2 2001/07/30 16:46:44 yokota Exp $ - * $DragonFly: src/sys/dev/misc/kbd/kbdreg.h,v 1.5 2004/09/19 04:15:44 dillon Exp $ + * $DragonFly: src/sys/dev/misc/kbd/kbdreg.h,v 1.6 2007/06/06 18:49:27 dillon Exp $ */ #ifndef _DEV_KBD_KBDREG_H_ @@ -80,6 +80,7 @@ struct keyboard { int kb_io_base; /* port# if any */ int kb_io_size; /* # of occupied port */ int kb_led; /* LED status */ + int kb_savemode; /* device specific (used by usb) */ struct keymap *kb_keymap; /* key map */ struct accentmap *kb_accentmap; /* accent map */ struct fkeytab *kb_fkeytab; /* function key strings */ diff --git a/sys/dev/usbmisc/ukbd/ukbd.c b/sys/dev/usbmisc/ukbd/ukbd.c index dfabb53524..dd306fef0d 100644 --- a/sys/dev/usbmisc/ukbd/ukbd.c +++ b/sys/dev/usbmisc/ukbd/ukbd.c @@ -1,6 +1,6 @@ /* * $FreeBSD: src/sys/dev/usb/ukbd.c,v 1.45 2003/10/04 21:41:01 joe Exp $ - * $DragonFly: src/sys/dev/usbmisc/ukbd/ukbd.c,v 1.17 2006/12/23 00:26:26 swildner Exp $ + * $DragonFly: src/sys/dev/usbmisc/ukbd/ukbd.c,v 1.18 2007/06/06 18:49:28 dillon Exp $ */ /* @@ -588,13 +588,17 @@ ukbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) ukbd_clear_state(kbd); /* - * Initialize the translation mode only if we are not - * reattaching to an already open keyboard (e.g. console). - * Otherwise we might rip the translation mode out from - * under X. + * If reattatching to an already open keyboard (e.g. console), + * try to restore the translation mode. Otherwise set the + * translation mode to, well, translation mode so we don't + * get garbage. */ - if (!KBD_IS_CONFIGURED(kbd)) + if (!KBD_IS_CONFIGURED(kbd)) { state->ks_mode = K_XLATE; + kbd->kb_savemode = state->ks_mode; + } else { + state->ks_mode = kbd->kb_savemode; + } state->ks_iface = uaa->iface; state->ks_uaa = uaa; state->ks_ifstate = 0; @@ -1224,6 +1228,7 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg) if (state->ks_mode != *(int *)arg) { ukbd_clear_state(kbd); state->ks_mode = *(int *)arg; + kbd->kb_savemode = state->ks_mode; } break; default: -- 2.11.4.GIT