[cc: tech@, reply-to set to tech@]
> After suspend or hibernate, I lose my designated console keyboard layout
> (sv) and it reverts to the default (us?) wsconsctl shows that the
> encoding to still be sv,
>
> keyboard.encoding=sv
>
> What setting(s) am I missing to preserve the designated layout across
> suspend/hibernate?
Well, the mux is supposed to be a bit smart and remember a forced
keyboard layout (set with kbd(8) or wsconsctl keyboard.encoding), and
force it on new keyboard attachments.
Except that this only works when the `set encoding' ioctl is issued on
/dev/wskbd, not /dev/wskbd[0-9], which is what kbd(8) and wsconsctl(8)
prefer.
Fear not, for I have a diff for you (which I have been sitting on for
about two years, and only completed and debugged thanks to this
discussion)!
This diff attempts to achieve the following:
- keyboard drivers will now tell wskbd if the keyboard layout they ask
for is a default value, or a value they are 100% sure of (either
because your kernel has a XXXKBD_LAYOUT option, or because the
driver can tell the keyboard layout, e.g. by the country code on USB
keyboards which provide it, such as Sun's)
- when attaching a keyboard with a non-default layout, the layout will
become the default layout of the mux for new keyboard attachments if
the mux doesn't have a layout set already.
- when changing the keyboard layout of a particular keyboard with an
ioctl (i.e. using kbd(8) or wsconsctl(8)), the layout will become the
default layout of the mux for new keyboard attachments.
This actually allows special-casing of the WSKBDIO_SETENCODING ioctl in
the mux code to be removed.
If the above is a bit too complicated, let me provide an example.
I am booting a GENERIC kernel with a PS/2 us keyboard. The keyboard
is wskbd0, its layout is the default, ``us''.
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
Now I am plugging an icelandic USB keyboard with no country information.
It becomes wskbd1, and uses the default layout, ``us''.
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
keyboard1.encoding=us
Now I run:
$ wsconsctl keyboard1.encoding=is
keyboard1.encoding -> is
Now the PS/2 keyboard is still using the us layout, the USB keyboard is
using the icelandic layout (and I can enter thorns and eths), and the
default setting for new keyboards become icelandic:
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
keyboard1.encoding=is
I unplug the USB keyboard.
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
I plug the USB keyboard again. It will reattach with an icelandic
keyboard layout, whereas it would use the us layout without that diff:
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
keyboard1.encoding=is
Now I plug a Sun USB keyboard with the uk layout (pound sign as shift-3,
etc). Sun keyboards provide country information to the ukbd driver,
which uses it to select the matching layout.
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
keyboard1.encoding=is
keyboard2.encoding=uk
And the uk layout has become the default for new attachments. If I
unplug, then replug, the icelandic keyboard, it will reattach as wskbd1,
and it will pick the default mux layout, which is still icelandic.
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
keyboard1.encoding=is
keyboard2.encoding=uk
Now I unplug both USB keyboards...
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
... and put the machine to sleep.
$ zzz
I wake up the system, and connect back the icelandic keyboard:
$ wsconsctl 2>/dev/null |grep encoding
keyboard.encoding=us
keyboard1.encoding=is
Is this the behaviour you would like to get?
Miod
Index: arch/arm/xscale/pxa27x_kpc.c
===================================================================
RCS file: /cvs/src/sys/arch/arm/xscale/pxa27x_kpc.c,v
retrieving revision 1.2
diff -u -p -r1.2 pxa27x_kpc.c
--- arch/arm/xscale/pxa27x_kpc.c 9 Feb 2013 20:36:14 -0000 1.2
+++ arch/arm/xscale/pxa27x_kpc.c 23 Jan 2014 20:32:22 -0000
@@ -50,7 +50,7 @@ struct wscons_keydesc pxa27x_kpc_keydesc
};
struct wskbd_mapdata pxa27x_kpc_mapdata = {
- pxa27x_kpc_keydesctab, KB_US,
+ pxa27x_kpc_keydesctab, KB_US | KB_DEFAULT,
};
void pxa27x_kpc_cngetc(void *, u_int *, int *);
Index: arch/hp300/dev/dnkbd.c
===================================================================
RCS file: /cvs/src/sys/arch/hp300/dev/dnkbd.c,v
retrieving revision 1.18
diff -u -p -r1.18 dnkbd.c
--- arch/hp300/dev/dnkbd.c 9 Nov 2011 14:22:37 -0000 1.18
+++ arch/hp300/dev/dnkbd.c 23 Jan 2014 20:32:22 -0000
@@ -201,7 +201,7 @@ struct wskbd_mapdata dnkbd_keymapdata =
#ifdef DNKBD_LAYOUT
DNKBD_LAYOUT
#else
- KB_US
+ KB_US | KB_DEFAULT
#endif
};
Index: arch/luna88k/dev/lunaws.c
===================================================================
RCS file: /cvs/src/sys/arch/luna88k/dev/lunaws.c,v
retrieving revision 1.9
diff -u -p -r1.9 lunaws.c
--- arch/luna88k/dev/lunaws.c 22 May 2013 11:35:02 -0000 1.9
+++ arch/luna88k/dev/lunaws.c 23 Jan 2014 20:32:23 -0000
@@ -87,7 +87,7 @@ const struct wskbd_mapdata omkbd_keymapd
#ifdef OMKBD_LAYOUT
OMKBD_LAYOUT,
#else
- KB_JP,
+ KB_JP | KB_DEFAULT,
#endif
};
Index: arch/sgi/hpc/z8530kbd.c
===================================================================
RCS file: /cvs/src/sys/arch/sgi/hpc/z8530kbd.c,v
retrieving revision 1.4
diff -u -p -r1.4 z8530kbd.c
--- arch/sgi/hpc/z8530kbd.c 29 Apr 2012 09:01:38 -0000 1.4
+++ arch/sgi/hpc/z8530kbd.c 23 Jan 2014 20:32:25 -0000
@@ -163,7 +163,7 @@ static struct zsops zskbd_zsops = {
extern const struct wscons_keydesc wssgi_keydesctab[];
const struct wskbd_mapdata sgikbd_wskbd_keymapdata = {
wssgi_keydesctab,
- KB_US
+ KB_US | KB_DEFAULT
};
const struct wskbd_accessops zskbd_wskbd_accessops = {
Index: arch/vax/dec/dzkbd.c
===================================================================
RCS file: /cvs/src/sys/arch/vax/dec/dzkbd.c,v
retrieving revision 1.14
diff -u -p -r1.14 dzkbd.c
--- arch/vax/dec/dzkbd.c 20 Aug 2008 16:31:41 -0000 1.14
+++ arch/vax/dec/dzkbd.c 23 Jan 2014 20:32:26 -0000
@@ -113,7 +113,7 @@ const struct wskbd_mapdata dzkbd_keymapd
#ifdef LKKBD_LAYOUT
LKKBD_LAYOUT,
#else
- KB_US,
+ KB_US | KB_DEFAULT,
#endif
};
Index: arch/vax/vxt/qsckbd.c
===================================================================
RCS file: /cvs/src/sys/arch/vax/vxt/qsckbd.c,v
retrieving revision 1.1
diff -u -p -r1.1 qsckbd.c
--- arch/vax/vxt/qsckbd.c 27 Aug 2006 16:55:41 -0000 1.1
+++ arch/vax/vxt/qsckbd.c 23 Jan 2014 20:32:26 -0000
@@ -127,7 +127,7 @@ const struct wskbd_mapdata qsckbd_keymap
#ifdef LKKBD_LAYOUT
LKKBD_LAYOUT,
#else
- KB_US,
+ KB_US | KB_DEFAULT,
#endif
};
Index: arch/zaurus/dev/zaurus_kbd.c
===================================================================
RCS file: /cvs/src/sys/arch/zaurus/dev/zaurus_kbd.c,v
retrieving revision 1.33
diff -u -p -r1.33 zaurus_kbd.c
--- arch/zaurus/dev/zaurus_kbd.c 9 Nov 2011 14:22:37 -0000 1.33
+++ arch/zaurus/dev/zaurus_kbd.c 23 Jan 2014 20:32:26 -0000
@@ -151,7 +151,7 @@ struct wskbd_consops zkbd_consops = {
struct wskbd_mapdata zkbd_keymapdata = {
zkbd_keydesctab,
- KB_US,
+ KB_US | KB_DEFAULT,
};
Index: arch/zaurus/dev/zaurus_remote.c
===================================================================
RCS file: /cvs/src/sys/arch/zaurus/dev/zaurus_remote.c,v
retrieving revision 1.1
diff -u -p -r1.1 zaurus_remote.c
--- arch/zaurus/dev/zaurus_remote.c 17 Nov 2005 05:26:31 -0000 1.1
+++ arch/zaurus/dev/zaurus_remote.c 23 Jan 2014 20:32:26 -0000
@@ -153,7 +153,7 @@ static const struct wscons_keydesc zrc_k
};
struct wskbd_mapdata zrc_keymapdata = {
- zrc_keydesctab, KB_US
+ zrc_keydesctab, KB_US | KB_DEFAULT
};
Index: dev/adb/akbd.c
===================================================================
RCS file: /cvs/src/sys/dev/adb/akbd.c,v
retrieving revision 1.13
diff -u -p -r1.13 akbd.c
--- dev/adb/akbd.c 22 Aug 2013 11:46:38 -0000 1.13
+++ dev/adb/akbd.c 23 Jan 2014 20:32:27 -0000
@@ -80,7 +80,7 @@ struct wskbd_mapdata akbd_keymapdata = {
#ifdef AKBD_LAYOUT
AKBD_LAYOUT,
#else
- KB_US,
+ KB_US | KB_DEFAULT,
#endif
};
Index: dev/hil/hilkbd.c
===================================================================
RCS file: /cvs/src/sys/dev/hil/hilkbd.c,v
retrieving revision 1.15
diff -u -p -r1.15 hilkbd.c
--- dev/hil/hilkbd.c 9 Nov 2011 14:22:37 -0000 1.15
+++ dev/hil/hilkbd.c 23 Jan 2014 20:32:27 -0000
@@ -104,7 +104,7 @@ struct wskbd_mapdata hilkbd_keymapdata =
#ifdef HILKBD_LAYOUT
HILKBD_LAYOUT,
#else
- KB_US,
+ KB_US | KB_DEFAULT,
#endif
};
@@ -113,7 +113,7 @@ struct wskbd_mapdata hilkbd_keymapdata_p
#ifdef HILKBD_LAYOUT
HILKBD_LAYOUT,
#else
- KB_US,
+ KB_US | KB_DEFAULT,
#endif
};
Index: dev/pckbc/pckbd.c
===================================================================
RCS file: /cvs/src/sys/dev/pckbc/pckbd.c,v
retrieving revision 1.34
diff -u -p -r1.34 pckbd.c
--- dev/pckbc/pckbd.c 15 Feb 2013 10:20:07 -0000 1.34
+++ dev/pckbc/pckbd.c 23 Jan 2014 20:32:28 -0000
@@ -157,7 +157,7 @@ const struct wskbd_mapdata pckbd_keymapd
#ifdef PCKBD_LAYOUT
PCKBD_LAYOUT,
#else
- KB_US,
+ KB_US | KB_DEFAULT,
#endif
};
Index: dev/sun/sunkbdmap.c
===================================================================
RCS file: /cvs/src/sys/dev/sun/sunkbdmap.c,v
retrieving revision 1.5
diff -u -p -r1.5 sunkbdmap.c
--- dev/sun/sunkbdmap.c 29 Nov 2012 14:51:27 -0000 1.5
+++ dev/sun/sunkbdmap.c 23 Jan 2014 20:32:29 -0000
@@ -1162,7 +1162,7 @@ struct wskbd_mapdata sunkbd_keymapdata =
#ifdef SUNKBD_LAYOUT
SUNKBD_LAYOUT,
#else
- KB_US,
+ KB_US | KB_DEFAULT,
#endif
};
@@ -1171,6 +1171,6 @@ struct wskbd_mapdata sunkbd5_keymapdata
#ifdef SUNKBD5_LAYOUT
SUNKBD5_LAYOUT,
#else
- KB_US,
+ KB_US | KB_DEFAULT,
#endif
};
Index: dev/usb/ukbd.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/ukbd.c,v
retrieving revision 1.62
diff -u -p -r1.62 ukbd.c
--- dev/usb/ukbd.c 15 Nov 2013 08:17:44 -0000 1.62
+++ dev/usb/ukbd.c 23 Jan 2014 20:32:29 -0000
@@ -265,7 +265,7 @@ ukbd_attach(struct device *parent, struc
#ifdef UKBD_LAYOUT
layout = UKBD_LAYOUT;
#else
- layout = KB_US;
+ layout = KB_US | KB_DEFAULT;
#endif
}
Index: dev/wscons/wskbd.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wskbd.c,v
retrieving revision 1.75
diff -u -p -r1.75 wskbd.c
--- dev/wscons/wskbd.c 4 Nov 2013 11:57:26 -0000 1.75
+++ dev/wscons/wskbd.c 23 Jan 2014 20:32:29 -0000
@@ -122,8 +122,6 @@ int wskbddebug = 0;
#include <dev/wscons/wsmuxvar.h>
struct wskbd_internal {
- const struct wskbd_mapdata *t_keymap;
-
const struct wskbd_consops *t_consops;
void *t_consaccesscookie;
@@ -138,6 +136,9 @@ struct wskbd_internal {
keysym_t t_symbols[MAXKEYSYMSPERKEY];
struct wskbd_softc *t_sc; /* back pointer */
+
+ struct wskbd_mapdata t_keymap; /* translation map table and
+ current layout */
};
struct wskbd_softc {
@@ -165,7 +166,6 @@ struct wskbd_softc {
int sc_maplen; /* number of entries in sc_map */
struct wscons_keymap *sc_map; /* current translation map */
- kbd_t sc_layout; /* current layout */
int sc_refcnt;
u_char sc_dying; /* device is being detached */
@@ -307,6 +307,8 @@ wskbd_update_layout(struct wskbd_interna
id->t_flags |= WSKFL_METAESC;
else
id->t_flags &= ~WSKFL_METAESC;
+
+ id->t_keymap.layout = enc;
}
/*
@@ -354,7 +356,9 @@ wskbd_attach(struct device *parent, stru
{
struct wskbd_softc *sc = (struct wskbd_softc *)self;
struct wskbddev_attach_args *ap = aux;
+ kbd_t layout;
#if NWSMUX > 0
+ struct wsmux_softc *wsmux_sc;
int mux, error;
#endif
@@ -370,8 +374,11 @@ wskbd_attach(struct device *parent, stru
/* printf(" (mux %d ignored for console)", mux); */
mux = -1;
}
- if (mux >= 0)
+ if (mux >= 0) {
printf(" mux %d", mux);
+ wsmux_sc = wsmux_getmux(mux);
+ } else
+ wsmux_sc = NULL;
#else
#if 0 /* not worth keeping, especially since the default value is not -1... */
if (sc->sc_base.me_dv.dv_cfdata->wskbddevcf_mux >= 0)
@@ -384,8 +391,7 @@ wskbd_attach(struct device *parent, stru
} else {
sc->id = malloc(sizeof(struct wskbd_internal),
M_DEVBUF, M_WAITOK | M_ZERO);
- sc->id->t_keymap = ap->keymap;
- wskbd_update_layout(sc->id, ap->keymap->layout);
+ bcopy(ap->keymap, &sc->id->t_keymap, sizeof(sc->id->t_keymap));
}
#if NWSDISPLAY > 0
@@ -400,11 +406,36 @@ wskbd_attach(struct device *parent, stru
sc->sc_translating = 1;
sc->sc_ledstate = -1; /* force update */
- if (wskbd_load_keymap(sc->id->t_keymap,
- &sc->sc_map, &sc->sc_maplen) != 0)
- panic("cannot load keymap");
-
- sc->sc_layout = sc->id->t_keymap->layout;
+ /*
+ * If this layout is the default choice of the driver (i.e. the
+ * driver doesn't know better), pick the existing layout of the
+ * current mux, if any.
+ */
+ layout = sc->id->t_keymap.layout;
+#if NWSMUX > 0
+ if (layout & KB_DEFAULT) {
+ if (wsmux_sc != NULL && wsmux_get_layout(wsmux_sc) != KB_NONE)
+ layout = wsmux_get_layout(wsmux_sc);
+ }
+#endif
+ for (;;) {
+ if (wskbd_load_keymap(&sc->id->t_keymap, layout, &sc->sc_map,
+ &sc->sc_maplen) == 0)
+ break;
+#if NWSMUX > 0
+ if (layout == sc->id->t_keymap.layout)
+ panic("cannot load keymap");
+ if (wsmux_sc != NULL && wsmux_get_layout(wsmux_sc) != KB_NONE) {
+ printf("\n%s: cannot load keymap, "
+ "falling back to default\n%s",
+ sc->sc_base.me_dv.dv_xname,
+ sc->sc_base.me_dv.dv_xname);
+ layout = wsmux_get_layout(wsmux_sc);
+ } else
+#endif
+ panic("cannot load keymap");
+ }
+ wskbd_update_layout(sc->id, layout);
/* set default bell and key repeat data */
sc->sc_bell_data = wskbd_default_bell_data;
@@ -427,11 +458,21 @@ wskbd_attach(struct device *parent, stru
printf("\n");
#if NWSMUX > 0
- if (mux >= 0) {
- error = wsmux_attach_sc(wsmux_getmux(mux), &sc->sc_base);
+ if (wsmux_sc != NULL) {
+ error = wsmux_attach_sc(wsmux_sc, &sc->sc_base);
if (error)
printf("%s: attach error=%d\n",
sc->sc_base.me_dv.dv_xname, error);
+
+ /*
+ * Try and set this encoding as the mux default if it
+ * hasn't any yet, and if this is not a driver default
+ * layout (i.e. parent driver pretends to know better).
+ * Note that wsmux_set_layout() rejects layouts with
+ * KB_DEFAULT set.
+ */
+ if (wsmux_get_layout(wsmux_sc) == KB_NONE)
+ wsmux_set_layout(wsmux_sc, layout);
}
#endif
@@ -451,7 +492,6 @@ wskbd_attach(struct device *parent, stru
}
}
#endif
-
}
void
@@ -461,7 +501,7 @@ wskbd_cnattach(const struct wskbd_consop
KASSERT(!wskbd_console_initted);
- wskbd_console_data.t_keymap = mapdata;
+ bcopy(mapdata, &wskbd_console_data.t_keymap, sizeof(*mapdata));
wskbd_update_layout(&wskbd_console_data, mapdata->layout);
wskbd_console_data.t_consops = consops;
@@ -479,10 +519,11 @@ wskbd_cndetach(void)
{
KASSERT(wskbd_console_initted);
- wskbd_console_data.t_keymap = 0;
+ wskbd_console_data.t_keymap.keydesc = NULL;
+ wskbd_console_data.t_keymap.layout = KB_NONE;
- wskbd_console_data.t_consops = 0;
- wskbd_console_data.t_consaccesscookie = 0;
+ wskbd_console_data.t_consops = NULL;
+ wskbd_console_data.t_consaccesscookie = NULL;
#if NWSDISPLAY > 0
wsdisplay_unset_cons_kbd();
@@ -510,7 +551,7 @@ wskbd_repeat(void *v)
/* deliver keys */
if (sc->sc_displaydv != NULL)
wsdisplay_kbdinput(sc->sc_displaydv,
- sc->id->t_keymap->layout,
+ sc->id->t_keymap.layout,
sc->id->t_symbols, sc->sc_repeating);
} else {
/* queue event */
@@ -629,7 +670,7 @@ wskbd_input(struct device *dev, u_int ty
}
#endif
wsdisplay_kbdinput(sc->sc_displaydv,
- sc->id->t_keymap->layout,
+ sc->id->t_keymap.layout,
sc->id->t_symbols, num);
}
@@ -955,7 +996,6 @@ wskbd_displayioctl(struct device *dev, u
struct wskbd_bell_data *ubdp, *kbdp;
struct wskbd_keyrepeat_data *ukdp, *kkdp;
struct wskbd_map_data *umdp;
- struct wskbd_mapdata md;
kbd_t enc;
void *buf;
int len, error;
@@ -1070,9 +1110,9 @@ getkeyrepeat:
&sc->sc_map, &sc->sc_maplen);
memcpy(sc->sc_map, buf, len);
/* drop the variant bits handled by the map */
- sc->sc_layout = KB_USER |
- (KB_VARIANT(sc->sc_layout) & KB_HANDLEDBYWSKBD);
- wskbd_update_layout(sc->id, sc->sc_layout);
+ enc = KB_USER | (KB_VARIANT(sc->id->t_keymap.layout) &
+ KB_HANDLEDBYWSKBD);
+ wskbd_update_layout(sc->id, enc);
}
free(buf, M_TEMP);
return(error);
@@ -1086,28 +1126,30 @@ getkeyrepeat:
return(error);
case WSKBDIO_GETENCODING:
- *((kbd_t *) data) = sc->sc_layout;
+ *((kbd_t *)data) = sc->id->t_keymap.layout & ~KB_DEFAULT;
return(0);
case WSKBDIO_SETENCODING:
enc = *((kbd_t *)data);
if (KB_ENCODING(enc) == KB_USER) {
/* user map must already be loaded */
- if (KB_ENCODING(sc->sc_layout) != KB_USER)
+ if (KB_ENCODING(sc->id->t_keymap.layout) != KB_USER)
return (EINVAL);
/* map variants make no sense */
if (KB_VARIANT(enc) & ~KB_HANDLEDBYWSKBD)
return (EINVAL);
} else {
- md = *(sc->id->t_keymap); /* structure assignment */
- md.layout = enc;
- error = wskbd_load_keymap(&md, &sc->sc_map,
- &sc->sc_maplen);
+ error = wskbd_load_keymap(&sc->id->t_keymap, enc,
+ &sc->sc_map, &sc->sc_maplen);
if (error)
- return(error);
+ return (error);
}
- sc->sc_layout = enc;
wskbd_update_layout(sc->id, enc);
+#if NWSMUX > 0
+ /* Update mux default layout */
+ if (sc->sc_base.me_parent != NULL)
+ wsmux_set_layout(sc->sc_base.me_parent, enc);
+#endif
return (0);
}
@@ -1528,7 +1570,7 @@ wskbd_translate(struct wskbd_internal *i
kp = sc->sc_map + value;
} else {
kp = &kpbuf;
- wskbd_get_mapentry(id->t_keymap, value, kp);
+ wskbd_get_mapentry(&id->t_keymap, value, kp);
}
/* if this key has a command, process it first */
Index: dev/wscons/wskbdutil.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wskbdutil.c,v
retrieving revision 1.10
diff -u -p -r1.10 wskbdutil.c
--- dev/wscons/wskbdutil.c 5 Dec 2012 23:20:22 -0000 1.10
+++ dev/wscons/wskbdutil.c 23 Jan 2014 20:32:29 -0000
@@ -395,7 +395,7 @@ wskbd_init_keymap(int newlen, struct wsc
}
int
-wskbd_load_keymap(const struct wskbd_mapdata *mapdata,
+wskbd_load_keymap(const struct wskbd_mapdata *mapdata, kbd_t layout,
struct wscons_keymap **map, int *maplen)
{
int i, s, kc, stack_ptr;
@@ -404,7 +404,7 @@ wskbd_load_keymap(const struct wskbd_map
kbd_t cur;
keysym_t ksg;
- for (cur = mapdata->layout & ~KB_HANDLEDBYWSKBD, stack_ptr = 0;
+ for (cur = layout & ~KB_HANDLEDBYWSKBD, stack_ptr = 0;
cur != 0; stack_ptr++) {
mp = mapdata->keydesc;
while (mp->map_size > 0) {
Index: dev/wscons/wsksymdef.h
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsksymdef.h,v
retrieving revision 1.35
diff -u -p -r1.35 wsksymdef.h
--- dev/wscons/wsksymdef.h 18 Oct 2013 22:06:42 -0000 1.35
+++ dev/wscons/wsksymdef.h 23 Jan 2014 20:32:30 -0000
@@ -735,15 +735,16 @@
#define KB_LV 0x1b00
#define KB_IS 0x1c00
-#define KB_NODEAD 0x000001 /* disable dead accents */
-#define KB_DECLK 0x000002 /* DEC LKnnn layout */
-#define KB_LK401 0x000004 /* DEC LK401 instead LK201 */
-#define KB_SWAPCTRLCAPS 0x000008 /* swap Left-Control and
Caps-Lock */
-#define KB_DVORAK 0x000010 /* Dvorak layout */
-#define KB_METAESC 0x000020 /* generate ESC prefix on ALT-key */
-#define KB_IOPENER 0x000040 /* f1-f12 -> ESC,f1-f11 */
-#define KB_MACHDEP 0x000080 /* machine dependent */
-#define KB_APPLE 0x010000 /* Apple specific layout */
+#define KB_NODEAD 0x00000001 /* disable dead accents */
+#define KB_DECLK 0x00000002 /* DEC LKnnn layout */
+#define KB_LK401 0x00000004 /* DEC LK401 instead LK201 */
+#define KB_SWAPCTRLCAPS 0x00000008 /* swap Left-Control and
Caps-Lock */
+#define KB_DVORAK 0x00000010 /* Dvorak layout */
+#define KB_METAESC 0x00000020 /* generate ESC prefix on ALT-key */
+#define KB_IOPENER 0x00000040 /* f1-f12 -> ESC,f1-f11 */
+#define KB_MACHDEP 0x00000080 /* machine dependent */
+#define KB_APPLE 0x00010000 /* Apple specific layout */
+#define KB_DEFAULT 0x80000000 /* (attach-only) default
layout */
#define KB_ENCTAB \
{ KB_USER, "user" }, \
Index: dev/wscons/wsksymvar.h
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsksymvar.h,v
retrieving revision 1.7
diff -u -p -r1.7 wsksymvar.h
--- dev/wscons/wsksymvar.h 26 Jun 2008 05:42:19 -0000 1.7
+++ dev/wscons/wsksymvar.h 23 Jan 2014 20:32:30 -0000
@@ -60,7 +60,7 @@ struct wskbd_mapdata {
};
/* layout variant bits ignored by mapping code */
-#define KB_HANDLEDBYWSKBD KB_METAESC
+#define KB_HANDLEDBYWSKBD (KB_METAESC | KB_DEFAULT)
/*
* Utility functions.
@@ -68,7 +68,7 @@ struct wskbd_mapdata {
void wskbd_get_mapentry(const struct wskbd_mapdata *, int,
struct wscons_keymap *);
void wskbd_init_keymap(int, struct wscons_keymap **, int *);
-int wskbd_load_keymap(const struct wskbd_mapdata *,
+int wskbd_load_keymap(const struct wskbd_mapdata *, kbd_t,
struct wscons_keymap **, int *);
keysym_t wskbd_compose_value(keysym_t *);
Index: dev/wscons/wsmux.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsmux.c,v
retrieving revision 1.25
diff -u -p -r1.25 wsmux.c
--- dev/wscons/wsmux.c 2 Dec 2013 02:36:22 -0000 1.25
+++ dev/wscons/wsmux.c 23 Jan 2014 20:32:30 -0000
@@ -519,13 +519,8 @@ wsmux_do_ioctl(struct device *dv, u_long
if (!error)
ok = 1;
}
- if (ok) {
+ if (ok)
error = 0;
- if (cmd == WSKBDIO_SETENCODING) {
- sc->sc_kbd_layout = *((kbd_t *)data);
- }
-
- }
return (error);
}
@@ -633,10 +628,6 @@ wsmux_attach_sc(struct wsmux_softc *sc,
(void)wsevsrc_ioctl(me, WSKBDIO_SETMODE,
&sc->sc_rawkbd, FWRITE, 0);
#endif
- if (sc->sc_kbd_layout != KB_NONE)
- (void)wsevsrc_ioctl(me,
- WSKBDIO_SETENCODING,
- &sc->sc_kbd_layout, FWRITE, 0);
}
}
}
@@ -821,3 +812,16 @@ wsmux_set_display(struct wsmux_softc *sc
return (error);
}
#endif /* NWSDISPLAY > 0 */
+
+uint32_t
+wsmux_get_layout(struct wsmux_softc *sc)
+{
+ return sc->sc_kbd_layout;
+}
+
+void
+wsmux_set_layout(struct wsmux_softc *sc, uint32_t layout)
+{
+ if ((layout & KB_DEFAULT) == 0)
+ sc->sc_kbd_layout = layout;
+}
Index: dev/wscons/wsmuxvar.h
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsmuxvar.h,v
retrieving revision 1.9
diff -u -p -r1.9 wsmuxvar.h
--- dev/wscons/wsmuxvar.h 2 Dec 2013 02:36:22 -0000 1.9
+++ dev/wscons/wsmuxvar.h 23 Jan 2014 20:32:30 -0000
@@ -93,6 +93,8 @@ struct wsmux_softc *wsmux_create(const c
int wsmux_attach_sc(struct wsmux_softc *, struct wsevsrc *);
void wsmux_detach_sc(struct wsevsrc *);
int wsmux_set_display(struct wsmux_softc *, struct device *);
+uint32_t wsmux_get_layout(struct wsmux_softc *);
+void wsmux_set_layout(struct wsmux_softc *, uint32_t);
int wskbd_add_mux(int, struct wsmux_softc *);
int wsmouse_add_mux(int, struct wsmux_softc *);