tech-x11 archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Using wscons keymap in xf86-input-keyboard



I'm trying to make Xorg server usable on NetBSD/newsmips machines
(ryo@'s NWS-3260 and my NWS-3470), but of course they have
Sony's custom keyboards. So I have to put more tweaks to handle
such own keyboards.

I've managed to get working mod for xf86-input-keyboard to handle
keycode provided by wskbd(4), but I wonder if these NetBSD specific
(and poor Tier-II port specific) changes are acceptable.

 https://github.com/tsutsui/netbsd-xsrc/commit/d38ffd8
 https://github.com/tsutsui/netbsd-src/commit/aac69dc
 (raw diffs are also attached below)

---

IIUC, xf86-input-keyboard assumes keycode generated by PC/XT keyboard.
Then we have to prepare keycode tables to convert machine specific
keycode to XT ones in xf86-input-keyboard (even for USB ones):

 https://github.com/NetBSD/xsrc/blob/bc1411c/external/mit/xf86-input-keyboard/dist/src/bsd_KbdMap.c#L210-L1363
---
#ifdef WSCONS_SUPPORT

static CARD8 wsUsbMap[] = {
	/* 0 */ KEY_NOTUSED,
	/* 1 */ KEY_NOTUSED,
	/* 2 */ KEY_NOTUSED,
	/* 3 */ KEY_NOTUSED,
	/* 4 */ KEY_A,		
	/* 5 */ KEY_B,
	/* 6 */ KEY_C,
	/* 7 */ KEY_D,
	/* 8 */ KEY_E,
	/* 9 */ KEY_F,
	/* 10 */ KEY_G,
 :
---

or prepare "WSDISPLAY_COMPAT_RAWKBD" (not quite "raw", but actually
XT keycode map) convertion tables invoked by WSKBDIO_SETMODE ioctl
with WSKBD_RAW in each kernel (this strategy was derived from OpenBSD):

 https://github.com/NetBSD/src/blob/c9fee3e/sys/dev/hil/hilkbdmap.c#L37-L63
---
#ifdef WSDISPLAY_COMPAT_RAWKBD

/*
 * Translate HIL keycodes to US keyboard XT scancodes, for proper
 * X11-over-wsmux operation.
 *
 * XXX: Needs re-think how we should treat RAWKBD code on NetBSD.
 */
const uint8_t hilkbd_raw[0x80] = {
	0x9d, 0x00, 0xb8, 0x38, 0x36, 0x2a, 0x1d, 0x6a,
	0x4b, 0x48, 0x4c, 0x49, 0x4d, 0x47, 0x53, 0x9c,
	0x4f, 0xb5, 0x50, 0x4e, 0x51, 0x37, 0x52, 0x4a,
	0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x00, 0x00, 0x01,
	0x00, 0x44, 0x00, 0x57, 0x53, 0x43, 0x0f, 0x58,
	0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x00, 0x3a,
	0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f,
	0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x29,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x67, 0x3e, 0x3d, 0x3c, 0x3b, 0x00, 0x46, 0x1c,
	0x45, 0x3f, 0x40, 0x41, 0x42, 0x00, 0x00, 0x00,
	0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x00, 0x00,
	0x17, 0x18, 0x19, 0x1a, 0x1b, 0x2b, 0xd2, 0xd3,
	0x24, 0x25, 0x26, 0x27, 0x28, 0x1c, 0xc7, 0xc9,
	0x32, 0x33, 0x34, 0x35, 0x00, 0xcf, 0x00, 0xd1,
	0x31, 0x39, 0x00, 0x00, 0xcb, 0xd0, 0xc8, 0xcd
};
#endif
---

On the other hand, wskbd(4) already provides MI WSKBDIO_GETMAP ioctl
and we can get enough keycode info to modify Xserver keymap.

Actually ancient Xhpc server used the WSKBDIO_GETMAP ioctl
to handle custom WinCE keyboards on hpcarm/hpcmips/hpcsh machines:
 https://github.com/NetBSD/xsrc/blob/netbsd-5/xfree/xc/programs/Xserver/hw/netbsd/hpc/hpcKeymap.c#L384

I tried to use the similar way in the modern Xorg server,
but Xorg (at least DIX (Device Independent X) part) assumes(?)
all custom keyboards should be managed by the newer XKB framework.
 https://www.x.org/docs/XKB/XKBproto.pdf

The XKB design is too complex (and there are quite few keyboard
examples that require such complex customization), so I could not
prepare proper keymap files in xkeyboard-config(?) etc.

To avoid such complexity, I used alternative method by
XkbApplyMappingChange() etc. in the monolithic Xsun and X68k servers:

 https://github.com/NetBSD/xsrc/blob/bc1411c/external/mit/xorg-server/dist/hw/sun/sunKbd.c#L650-L663
---
	sunInitKbdNames(&rmlvo, pKeyboard->devicePrivate);
#if 0 /* XXX needs more work for Xorg xkb */
	InitKeyboardDeviceStruct(device, &rmlvo,
				 sunBell, sunKbdCtrl);
#else
	XkbSetRulesDflts(&rmlvo);
	InitKeyboardDeviceStruct(device, NULL,
				 sunBell, sunKbdCtrl);
	XkbApplyMappingChange(device, workingKeySyms,
			      workingKeySyms->minKeyCode,
			      workingKeySyms->maxKeyCode -
			      workingKeySyms->minKeyCode + 1,
			      workingModMap, serverClient);
#endif
---

It looks we can also use the similar method in xf86-input-keyboard,
but I wonder how it should be handled in current xf86-input-keyboard
implementation. (at least #ifdef WSKBD_GET_MAP in kbd.c looks ugly)

Comments?

---
diff --git a/external/mit/xf86-input-keyboard/dist/src/bsd_kbd.c b/external/mit/xf86-input-keyboard/dist/src/bsd_kbd.c
index 62482ad71..03d0b69fa 100644
--- a/external/mit/xf86-input-keyboard/dist/src/bsd_kbd.c
+++ b/external/mit/xf86-input-keyboard/dist/src/bsd_kbd.c
@@ -445,12 +445,14 @@ OpenKeyboard(InputInfoPtr pInfo)
            case WSKBD_TYPE_PC_AT:
                printWsType("AT", pInfo->name);
                break;
+#ifndef USE_WSKBD_GETMAP
            case 0:
                /* If wsKbdType==0, no keyboard attached to the mux. Assume USB. */
                xf86Msg(X_WARNING, "%s: No keyboard attached, assuming USB\n",
                                   pInfo->name);
                pKbd->wsKbdType = WSKBD_TYPE_USB;
                /* FALLTHROUGH */
+#endif
            case WSKBD_TYPE_USB:
                printWsType("USB", pInfo->name);
                break;
@@ -483,6 +485,9 @@ OpenKeyboard(InputInfoPtr pInfo)
            case WSKBD_TYPE_SUN5:
                printWsType("Sun5", pInfo->name);
                break;
+#endif
+#ifdef USE_WSKBD_GETMAP
+           case 0:
 #endif
            default:
                xf86Msg(X_WARNING, "%s: Unsupported wskbd type \"%d\"\n",
@@ -506,7 +511,11 @@ xf86OSKbdPreInit(InputInfoPtr pInfo)
     pKbd->Bell		= SoundBell;
     pKbd->SetLeds	= SetKbdLeds;
     pKbd->GetLeds	= GetKbdLeds;
+#ifdef USE_WSKBD_GETMAP
+    pKbd->KbdGetMapping	= KbdGetMappingFromWsksym;
+#else
     pKbd->KbdGetMapping	= KbdGetMapping;
+#endif
 
     pKbd->RemapScanCode = NULL;
 
diff --git a/external/mit/xf86-input-keyboard/dist/src/bsd_kbd.h b/external/mit/xf86-input-keyboard/dist/src/bsd_kbd.h
index 202d55c7f..b558ed6fa 100644
--- a/external/mit/xf86-input-keyboard/dist/src/bsd_kbd.h
+++ b/external/mit/xf86-input-keyboard/dist/src/bsd_kbd.h
@@ -1,3 +1,7 @@
 extern void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms,
 				CARD8 *pModMap);
+#ifdef USE_WSKBD_GETMAP
+extern void KbdGetMappingFromWsksym(InputInfoPtr pInfo, KeySymsPtr pKeySyms,
+				    CARD8 *pModMap);
+#endif
 
diff --git a/external/mit/xf86-input-keyboard/dist/src/kbd.c b/external/mit/xf86-input-keyboard/dist/src/kbd.c
index dc69775c7..2d72e29fd 100644
--- a/external/mit/xf86-input-keyboard/dist/src/kbd.c
+++ b/external/mit/xf86-input-keyboard/dist/src/kbd.c
@@ -310,6 +310,7 @@ KbdProc(DeviceIntPtr device, int what)
          pKbd->KbdGetMapping(pInfo, &keySyms, modMap);
 
          device->public.on = FALSE;
+#ifndef USE_WSKBD_GETMAP
          rmlvo.rules = xkb_rules;
          rmlvo.model = xkb_model;
          rmlvo.layout = xkb_layout;
@@ -324,6 +325,27 @@ KbdProc(DeviceIntPtr device, int what)
 
              return BadValue;
          }
+#else
+         rmlvo.rules = "base";
+         rmlvo.model = "empty";
+         rmlvo.layout = xkb_layout;
+         rmlvo.variant = xkb_variant;
+         rmlvo.options = xkb_options;
+
+         XkbSetRulesDflts(&rmlvo);
+         if (!InitKeyboardDeviceStruct(device, NULL, KbdBell, KbdCtrl))
+         {
+             xf86Msg(X_ERROR, "%s: Keyboard initialization failed. This "
+                     "could be a missing or incorrect setup of "
+                     "xkeyboard-config.\n", device->name);
+
+             return BadValue;
+         }
+         XkbApplyMappingChange(device, &keySyms,
+           keySyms.minKeyCode,
+           keySyms.maxKeyCode - keySyms.minKeyCode + 1,
+           modMap, serverClient);
+#endif /* USE_WSKBD_GETMAP */
 # ifdef XI_PROP_DEVICE_NODE
          {
              const char *device_node =
@@ -406,7 +428,9 @@ PostKbdEvent(InputInfoPtr pInfo, unsigned int scanCode, Bool down)
   KbdDevPtr    pKbd = (KbdDevPtr) pInfo->private;
   DeviceIntPtr device = pInfo->dev;
   KeyClassRec  *keyc = device->key;
+#ifndef USE_WSKBD_GETMAP
   int state;
+#endif
 
 #ifdef DEBUG
   LogMessageVerbSigSafe(X_INFO, -1, "kbd driver rec scancode: 0x%x %s\n", scanCode, down ? "down" : "up");
@@ -426,6 +450,7 @@ PostKbdEvent(InputInfoPtr pInfo, unsigned int scanCode, Bool down)
      }
   }
 
+#ifndef USE_WSKBD_GETMAP
   /*
    * PC keyboards generate separate key codes for
    * Alt+Print and Control+Pause but in the X keyboard model
@@ -439,6 +464,7 @@ PostKbdEvent(InputInfoPtr pInfo, unsigned int scanCode, Bool down)
     scanCode = KEY_Print;
   else if (scanCode == KEY_Break)
     scanCode = KEY_Pause;
+#endif
 
   xf86PostKeyboardEvent(device, scanCode + MIN_KEYCODE, down);
 }
diff --git a/external/mit/xf86-input-keyboard/dist/src/ws_KbdMap.c b/external/mit/xf86-input-keyboard/dist/src/ws_KbdMap.c
new file mode 100644
index 000000000..ba148846f
--- /dev/null
+++ b/external/mit/xf86-input-keyboard/dist/src/ws_KbdMap.c
@@ -0,0 +1,486 @@
+/* $NetBSD$	*/
+/* $XConsortium: sunKeyMap.c,v 4.22 94/05/18 11:16:07 kaleb Exp $ */
+/************************************************************
+Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
+
+                    All Rights Reserved
+
+Permission  to  use,  copy,  modify,  and  distribute   this
+software  and  its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright no-
+tice  appear  in all copies and that both that copyright no-
+tice and this permission notice appear in  supporting  docu-
+mentation,  and  that the names of Sun or X Consortium
+not be used in advertising or publicity pertaining to
+distribution  of  the software  without specific prior
+written permission. Sun and X Consortium make no
+representations about the suitability of this software for
+any purpose. It is provided "as is" without any express or
+implied warranty.
+
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
+NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
+ABLE  FOR  ANY SPECIAL, 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.
+
+********************************************************/
+
+/*
+ * Generate XKB keymap from wskbd keymap provided by WSKBDIO_GETMAP ioctl
+ *
+ * Taken from:
+ * 	xsrc/xfree/xc/programs/Xserver/hw/netbsd/hpc/hpcKeymap.c
+ * 	NetBSD: hpcKeymap.c,v 1.2 2004/07/22 18:08:59 uch Exp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "xf86.h"
+#include "xf86OSKbd.h"
+#include "atKeynames.h"
+#include "xf86Keymap.h"
+#include "xkbsrv.h"
+
+#include "bsd_kbd.h"
+
+#include <sys/ioctl.h>
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsksymdef.h>
+
+static void KeymapSetSymbol(KeySym *, CARD8 *, struct wscons_keymap *);
+
+static KeySym wsksym_to_xkeysym[] = {
+	[KS_BackSpace] = XK_BackSpace,
+	[KS_Tab] = XK_Tab,
+	[KS_Linefeed] = XK_Linefeed,
+	[KS_Clear] = XK_Clear,
+	[KS_Return] = XK_Return,
+	[KS_Escape] = XK_Escape,
+	[KS_space] = XK_space,
+	[KS_exclam] = XK_exclam,
+	[KS_quotedbl] = XK_quotedbl,
+	[KS_numbersign] = XK_numbersign,
+	[KS_dollar] = XK_dollar,
+	[KS_percent] = XK_percent,
+	[KS_ampersand] = XK_ampersand,
+	[KS_apostrophe] = XK_apostrophe,
+	[KS_parenleft] = XK_parenleft,
+	[KS_parenright] = XK_parenright,
+	[KS_asterisk] = XK_asterisk,
+	[KS_plus] = XK_plus,
+	[KS_comma] = XK_comma,
+	[KS_minus] = XK_minus,
+	[KS_period] = XK_period,
+	[KS_slash] = XK_slash,
+	[KS_0] = XK_0,
+	[KS_1] = XK_1,
+	[KS_2] = XK_2,
+	[KS_3] = XK_3,
+	[KS_4] = XK_4,
+	[KS_5] = XK_5,
+	[KS_6] = XK_6,
+	[KS_7] = XK_7,
+	[KS_8] = XK_8,
+	[KS_9] = XK_9,
+	[KS_colon] = XK_colon,
+	[KS_semicolon] = XK_semicolon,
+	[KS_less] = XK_less,
+	[KS_equal] = XK_equal,
+	[KS_greater] = XK_greater,
+	[KS_question] = XK_question,
+	[KS_at] = XK_at,
+	[KS_A] = XK_A,
+	[KS_B] = XK_B,
+	[KS_C] = XK_C,
+	[KS_D] = XK_D,
+	[KS_E] = XK_E,
+	[KS_F] = XK_F,
+	[KS_G] = XK_G,
+	[KS_H] = XK_H,
+	[KS_I] = XK_I,
+	[KS_J] = XK_J,
+	[KS_K] = XK_K,
+	[KS_L] = XK_L,
+	[KS_M] = XK_M,
+	[KS_N] = XK_N,
+	[KS_O] = XK_O,
+	[KS_P] = XK_P,
+	[KS_Q] = XK_Q,
+	[KS_R] = XK_R,
+	[KS_S] = XK_S,
+	[KS_T] = XK_T,
+	[KS_U] = XK_U,
+	[KS_V] = XK_V,
+	[KS_W] = XK_W,
+	[KS_X] = XK_X,
+	[KS_Y] = XK_Y,
+	[KS_Z] = XK_Z,
+	[KS_bracketleft] = XK_bracketleft,
+	[KS_backslash] = XK_backslash,
+	[KS_bracketright] = XK_bracketright,
+	[KS_asciicircum] = XK_asciicircum,
+	[KS_underscore] = XK_underscore,
+	[KS_grave] = XK_grave,
+	[KS_a] = XK_a,
+	[KS_b] = XK_b,
+	[KS_c] = XK_c,
+	[KS_d] = XK_d,
+	[KS_e] = XK_e,
+	[KS_f] = XK_f,
+	[KS_g] = XK_g,
+	[KS_h] = XK_h,
+	[KS_i] = XK_i,
+	[KS_j] = XK_j,
+	[KS_k] = XK_k,
+	[KS_l] = XK_l,
+	[KS_m] = XK_m,
+	[KS_n] = XK_n,
+	[KS_o] = XK_o,
+	[KS_p] = XK_p,
+	[KS_q] = XK_q,
+	[KS_r] = XK_r,
+	[KS_s] = XK_s,
+	[KS_t] = XK_t,
+	[KS_u] = XK_u,
+	[KS_v] = XK_v,
+	[KS_w] = XK_w,
+	[KS_x] = XK_x,
+	[KS_y] = XK_y,
+	[KS_z] = XK_z,
+	[KS_braceleft] = XK_braceleft,
+	[KS_bar] = XK_bar,
+	[KS_braceright] = XK_braceright,
+	[KS_asciitilde] = XK_asciitilde,
+	[KS_Delete] = XK_Delete,
+	[KS_nobreakspace] = XK_nobreakspace,
+	[KS_exclamdown] = XK_exclamdown,
+	[KS_cent] = XK_cent,
+	[KS_sterling] = XK_sterling,
+	[KS_currency] = XK_currency,
+	[KS_yen] = XK_yen,
+	[KS_brokenbar] = XK_brokenbar,
+	[KS_section] = XK_section,
+	[KS_diaeresis] = XK_diaeresis,
+	[KS_copyright] = XK_copyright,
+	[KS_ordfeminine] = XK_ordfeminine,
+	[KS_guillemotleft] = XK_guillemotleft,
+	[KS_notsign] = XK_notsign,
+	[KS_hyphen] = XK_hyphen,
+	[KS_registered] = XK_registered,
+	[KS_macron] = XK_macron,
+	[KS_degree] = XK_degree,
+	[KS_plusminus] = XK_plusminus,
+	[KS_twosuperior] = XK_twosuperior,
+	[KS_threesuperior] = XK_threesuperior,
+	[KS_acute] = XK_acute,
+	[KS_mu] = XK_mu,
+	[KS_paragraph] = XK_paragraph,
+	[KS_periodcentered] = XK_periodcentered,
+	[KS_cedilla] = XK_cedilla,
+	[KS_onesuperior] = XK_onesuperior,
+	[KS_masculine] = XK_masculine,
+	[KS_guillemotright] = XK_guillemotright,
+	[KS_onequarter] = XK_onequarter,
+	[KS_onehalf] = XK_onehalf,
+	[KS_threequarters] = XK_threequarters,
+	[KS_questiondown] = XK_questiondown,
+	[KS_Agrave] = XK_Agrave,
+	[KS_Aacute] = XK_Aacute,
+	[KS_Acircumflex] = XK_Acircumflex,
+	[KS_Atilde] = XK_Atilde,
+	[KS_Adiaeresis] = XK_Adiaeresis,
+	[KS_Aring] = XK_Aring,
+	[KS_AE] = XK_AE,
+	[KS_Ccedilla] = XK_Ccedilla,
+	[KS_Egrave] = XK_Egrave,
+	[KS_Eacute] = XK_Eacute,
+	[KS_Ecircumflex] = XK_Ecircumflex,
+	[KS_Ediaeresis] = XK_Ediaeresis,
+	[KS_Igrave] = XK_Igrave,
+	[KS_Iacute] = XK_Iacute,
+	[KS_Icircumflex] = XK_Icircumflex,
+	[KS_Idiaeresis] = XK_Idiaeresis,
+	[KS_ETH] = XK_ETH,
+	[KS_Ntilde] = XK_Ntilde,
+	[KS_Ograve] = XK_Ograve,
+	[KS_Oacute] = XK_Oacute,
+	[KS_Ocircumflex] = XK_Ocircumflex,
+	[KS_Otilde] = XK_Otilde,
+	[KS_Odiaeresis] = XK_Odiaeresis,
+	[KS_multiply] = XK_multiply,
+	[KS_Ooblique] = XK_Ooblique,
+	[KS_Ugrave] = XK_Ugrave,
+	[KS_Uacute] = XK_Uacute,
+	[KS_Ucircumflex] = XK_Ucircumflex,
+	[KS_Udiaeresis] = XK_Udiaeresis,
+	[KS_Yacute] = XK_Yacute,
+	[KS_THORN] = XK_THORN,
+	[KS_ssharp] = XK_ssharp,
+	[KS_agrave] = XK_agrave,
+	[KS_aacute] = XK_aacute,
+	[KS_acircumflex] = XK_acircumflex,
+	[KS_atilde] = XK_atilde,
+	[KS_adiaeresis] = XK_adiaeresis,
+	[KS_aring] = XK_aring,
+	[KS_ae] = XK_ae,
+	[KS_ccedilla] = XK_ccedilla,
+	[KS_egrave] = XK_egrave,
+	[KS_eacute] = XK_eacute,
+	[KS_ecircumflex] = XK_ecircumflex,
+	[KS_ediaeresis] = XK_ediaeresis,
+	[KS_igrave] = XK_igrave,
+	[KS_iacute] = XK_iacute,
+	[KS_icircumflex] = XK_icircumflex,
+	[KS_idiaeresis] = XK_idiaeresis,
+	[KS_eth] = XK_eth,
+	[KS_ntilde] = XK_ntilde,
+	[KS_ograve] = XK_ograve,
+	[KS_oacute] = XK_oacute,
+	[KS_ocircumflex] = XK_ocircumflex,
+	[KS_otilde] = XK_otilde,
+	[KS_odiaeresis] = XK_odiaeresis,
+	[KS_division] = XK_division,
+	[KS_oslash] = XK_oslash,
+	[KS_ugrave] = XK_ugrave,
+	[KS_uacute] = XK_uacute,
+	[KS_ucircumflex] = XK_ucircumflex,
+	[KS_udiaeresis] = XK_udiaeresis,
+	[KS_yacute] = XK_yacute,
+	[KS_thorn] = XK_thorn,
+	[KS_ydiaeresis] = XK_ydiaeresis,
+	[KS_Odoubleacute] = XK_Odoubleacute,
+	[KS_odoubleacute] = XK_odoubleacute,
+	[KS_Udoubleacute] = XK_Udoubleacute,
+	[KS_udoubleacute] = XK_udoubleacute,
+	[KS_dead_grave] = XK_dead_grave,
+	[KS_dead_acute] = XK_dead_acute,
+	[KS_dead_circumflex] = XK_dead_circumflex,
+	[KS_dead_tilde] = XK_dead_tilde,
+	[KS_dead_diaeresis] = XK_dead_diaeresis,
+	[KS_dead_abovering] = XK_dead_abovering,
+	[KS_dead_cedilla] = XK_dead_cedilla,
+	[KS_Shift_L] = XK_Shift_L,
+	[KS_Shift_R] = XK_Shift_R,
+	[KS_Control_L] = XK_Control_L,
+	[KS_Control_R] = XK_Control_R,
+	[KS_Caps_Lock] = XK_Caps_Lock,
+	[KS_Shift_Lock] = XK_Shift_Lock,
+	[KS_Alt_L] = XK_Alt_L,
+	[KS_Alt_R] = XK_Alt_R,
+	[KS_Multi_key] = XK_Multi_key,
+	[KS_Mode_switch] = XK_Mode_switch,
+	[KS_Num_Lock] = XK_Num_Lock,
+	[KS_Meta_L] = XK_Meta_L,
+	[KS_Meta_R] = XK_Meta_R,
+	[KS_Zenkaku_Hankaku] = XK_Zenkaku_Hankaku,
+	[KS_Hiragana_Katakana] = XK_Hiragana_Katakana,
+	[KS_Henkan_Mode] = XK_Henkan_Mode,
+	[KS_Henkan] = XK_Henkan,
+	[KS_Muhenkan] = XK_Muhenkan,
+	[KS_KP_F1] = XK_KP_F1,
+	[KS_KP_F2] = XK_KP_F2,
+	[KS_KP_F3] = XK_KP_F3,
+	[KS_KP_F4] = XK_KP_F4,
+	[KS_KP_Home] = XK_KP_Home,
+	[KS_KP_Left] = XK_KP_Left,
+	[KS_KP_Up] = XK_KP_Up,
+	[KS_KP_Right] = XK_KP_Right,
+	[KS_KP_Down] = XK_KP_Down,
+	[KS_KP_Prior] = XK_KP_Prior,
+	[KS_KP_Next] = XK_KP_Next,
+	[KS_KP_End] = XK_KP_End,
+	[KS_KP_Begin] = XK_KP_Begin,
+	[KS_KP_Insert] = XK_KP_Insert,
+	[KS_KP_Delete] = XK_KP_Delete,
+	[KS_KP_Space] = XK_KP_Space,
+	[KS_KP_Tab] = XK_KP_Tab,
+	[KS_KP_Enter] = XK_KP_Enter,
+	[KS_KP_Equal] = XK_KP_Equal,
+	[KS_KP_Numbersign] = XK_numbersign,
+	[KS_KP_Multiply] = XK_KP_Multiply,
+	[KS_KP_Add] = XK_KP_Add,
+	[KS_KP_Separator] = XK_KP_Separator,
+	[KS_KP_Subtract] = XK_KP_Subtract,
+	[KS_KP_Decimal] = XK_KP_Decimal,
+	[KS_KP_Divide] = XK_KP_Divide,
+	[KS_KP_0] = XK_KP_0,
+	[KS_KP_1] = XK_KP_1,
+	[KS_KP_2] = XK_KP_2,
+	[KS_KP_3] = XK_KP_3,
+	[KS_KP_4] = XK_KP_4,
+	[KS_KP_5] = XK_KP_5,
+	[KS_KP_6] = XK_KP_6,
+	[KS_KP_7] = XK_KP_7,
+	[KS_KP_8] = XK_KP_8,
+	[KS_KP_9] = XK_KP_9,
+	[KS_f1] = XK_F1,
+	[KS_f2] = XK_F2,
+	[KS_f3] = XK_F3,
+	[KS_f4] = XK_F4,
+	[KS_f5] = XK_F5,
+	[KS_f6] = XK_F6,
+	[KS_f7] = XK_F7,
+	[KS_f8] = XK_F8,
+	[KS_f9] = XK_F9,
+	[KS_f10] = XK_F10,
+	[KS_f11] = XK_F11,
+	[KS_f12] = XK_F12,
+	[KS_f13] = XK_F13,
+	[KS_f14] = XK_F14,
+	[KS_f15] = XK_F15,
+	[KS_f16] = XK_F16,
+	[KS_f17] = XK_F17,
+	[KS_f18] = XK_F18,
+	[KS_f19] = XK_F19,
+	[KS_f20] = XK_F20,
+	[KS_F1] = XK_F1,
+	[KS_F2] = XK_F2,
+	[KS_F3] = XK_F3,
+	[KS_F4] = XK_F4,
+	[KS_F5] = XK_F5,
+	[KS_F6] = XK_F6,
+	[KS_F7] = XK_F7,
+	[KS_F8] = XK_F8,
+	[KS_F9] = XK_F9,
+	[KS_F10] = XK_F10,
+	[KS_F11] = XK_F11,
+	[KS_F12] = XK_F12,
+	[KS_F13] = XK_F13,
+	[KS_F14] = XK_F14,
+	[KS_F15] = XK_F15,
+	[KS_F16] = XK_F16,
+	[KS_F17] = XK_F17,
+	[KS_F18] = XK_F18,
+	[KS_F19] = XK_F19,
+	[KS_F20] = XK_F20,
+	[KS_Home] = XK_Home,
+	[KS_Prior] = XK_Prior,
+	[KS_Next] = XK_Next,
+	[KS_Up] = XK_Up,
+	[KS_Down] = XK_Down,
+	[KS_Left] = XK_Left,
+	[KS_Right] = XK_Right,
+	[KS_End] = XK_End,
+	[KS_Insert] = XK_Insert,
+	[KS_Help] = XK_Help,
+	[KS_Execute] = XK_Execute,
+	[KS_Find] = XK_Find,
+	[KS_Select] = XK_Select,
+	[KS_Undo] = XK_Undo,
+	[KS_Menu] = XK_Menu,
+	[KS_Pause] = XK_Pause,
+	[0xffff] = NoSymbol,
+};
+
+void
+KbdGetMappingFromWsksym(InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
+{
+	struct wskbd_map_data map_data;
+	struct wscons_keymap *wscons_keymap, *wscons_key;
+	KeySym *x_key;
+	CARD8 *x_mod;
+	int i;
+
+	wscons_keymap =
+	    malloc(sizeof(struct wscons_keymap) * WSKBDIO_MAXMAPLEN);
+	if (wscons_keymap == NULL) {
+		xf86Msg(X_ERROR, "%s: can't allocate wscons keymap memory\n",
+		    pInfo->name);
+		return;
+	}
+	memset(wscons_keymap, 0,
+	    sizeof(struct wscons_keymap) * WSKBDIO_MAXMAPLEN);
+	map_data.maplen = WSKBDIO_MAXMAPLEN;
+	map_data.map = wscons_keymap;
+
+	/* Get console keymap */
+	if (ioctl(pInfo->fd, WSKBDIO_GETMAP, &map_data) == -1) {
+		xf86Msg(X_ERROR, "%s: can't get wskbd keymap\n", pInfo->name);
+		return;
+	}
+	for (i = 0;
+	    i < sizeof wsksym_to_xkeysym / sizeof(wsksym_to_xkeysym[0]); i++)
+		if (wsksym_to_xkeysym[i] == 0)
+			wsksym_to_xkeysym[i] = NoSymbol;
+
+	pKeySyms->map        = map;
+	pKeySyms->mapWidth   = GLYPHS_PER_KEY;
+	pKeySyms->minKeyCode = MIN_KEYCODE;
+	pKeySyms->maxKeyCode = pKeySyms->minKeyCode + map_data.maplen - 1;
+
+	xf86Msg(X_INFO, "%s: Using keysyms via WSKBDIO_GETMAP\n", pInfo->name);
+	xf86Msg(X_INFO, "%s: total %d wskbd keysyms\n",
+	    pInfo->name, map_data.maplen);
+
+	/* Reconstruct keymap */
+	x_key = &pKeySyms->map[0];
+	x_mod = &pModMap[pKeySyms->minKeyCode];
+	wscons_key = wscons_keymap;
+	for (i = 0; i < map_data.maplen; i++) {
+		/* assume GLYPHS_PER_KEY is 4 */
+		if (i == NUM_KEYCODES) {
+			xf86Msg(X_WARNING, "%s: too many wskbd keysyms\n",
+			    pInfo->name);
+			break;
+		}
+		KeymapSetSymbol(x_key, x_mod, wscons_key);
+		x_key += GLYPHS_PER_KEY;
+		x_mod++;
+		wscons_key++;
+	}
+	free(wscons_keymap);
+}
+
+static void
+KeymapSetSymbol(KeySym *xmap, CARD8 *pModMap, struct wscons_keymap *keymap)
+{
+
+	xmap[0] = wsksym_to_xkeysym[keymap->group1[0]];
+	xmap[1] = wsksym_to_xkeysym[keymap->group1[1]];
+	xmap[2] = wsksym_to_xkeysym[keymap->group2[0]];
+	xmap[3] = wsksym_to_xkeysym[keymap->group2[1]];
+
+	*pModMap = NoSymbol;
+	switch (xmap[0]) {
+	case XK_Shift_L:
+	case XK_Shift_R:
+		*pModMap = ShiftMask;
+		break;
+	case XK_Control_L:
+	case XK_Control_R:
+		*pModMap = ControlMask;
+		break;
+	case XK_Caps_Lock:
+		*pModMap = LockMask;
+		break;
+	case XK_Alt_L:
+		*pModMap = AltMask;
+		xmap[1] = XK_Meta_L;
+		break;
+	case XK_Alt_R:
+		*pModMap = AltMask;
+		xmap[1] = XK_Meta_R;
+		break;
+	case XK_Num_Lock:
+		*pModMap = NumLockMask;
+		break;
+	case XK_Scroll_Lock:
+		*pModMap = ScrollLockMask;
+		break;
+	case XK_Kana_Lock:
+	case XK_Kana_Shift:
+		*pModMap = KanaMask;
+		break;
+	case XK_Mode_switch:	/* XXX */
+		*pModMap = AltLangMask;
+		break;
+	default:
+		break;
+	}
+}

---

diff --git a/external/mit/xorg/server/drivers/xf86-input-keyboard/Makefile b/external/mit/xorg/server/drivers/xf86-input-keyboard/Makefile
index 58d31831c8a5..7756ed072146 100644
--- a/external/mit/xorg/server/drivers/xf86-input-keyboard/Makefile
+++ b/external/mit/xorg/server/drivers/xf86-input-keyboard/Makefile
@@ -16,7 +16,9 @@ CPPFLAGS+=	-DPCVT_SUPPORT
 .if ${MACHINE_ARCH} == "powerpc" || \
     ${MACHINE} == "amiga" || \
     ${MACHINE} == "evbarm" || \
+    ${MACHINE} == "ews4800mips" || \
     ${MACHINE} == "mac68k" || \
+    ${MACHINE} == "newsmips" || \
     ${MACHINE} == "pmax" || \
     ${MACHINE} == "sgimips" || \
     ${MACHINE} == "shark" || \
@@ -30,6 +32,14 @@ CPPFLAGS+=	-DWSCONS_SUPPORT
 CPPFLAGS+=	-DXKB
 CPPFLAGS.kbd.c=	-D__XKBDEFRULES__=${__XKBDEFRULES__}
 
+.if \
+    ${MACHINE} == "ews4800mips"	|| \
+    ${MACHINE} == "newsmips"	|| \
+    0
+CPPFLAGS+=	-DUSE_WSKBD_GETMAP
+SRCS+=		ws_KbdMap.c
+.endif
+
 X11EXTRAMANDEFS+=	-e 's,__xkb_path__,${X11LIBDIR}/xkb,g'
 
 COPTS.kbd.c=		-Wno-error	# XXX deprecated

---
Izumi Tsutsui


Home | Main Index | Thread Index | Old Index