tech-x11 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Using wscons keymap in xf86-input-keyboard
I wrote:
> 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.
If there is no particular comment about this change,
I'll commit updated one (just for readbility; attached) soon.
---
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..90e941e90 100644
--- a/external/mit/xf86-input-keyboard/dist/src/kbd.c
+++ b/external/mit/xf86-input-keyboard/dist/src/kbd.c
@@ -310,6 +310,29 @@ KbdProc(DeviceIntPtr device, int what)
pKbd->KbdGetMapping(pInfo, &keySyms, modMap);
device->public.on = FALSE;
+#ifdef USE_WSKBD_GETMAP
+ /* Use keySyms from device dependent ioctl rather than complex XKB */
+ 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;
+ }
+ /* Apply device dependent keySyms over "empty" XKB settings */
+ XkbApplyMappingChange(device, &keySyms,
+ keySyms.minKeyCode,
+ keySyms.maxKeyCode - keySyms.minKeyCode + 1,
+ modMap, serverClient);
+#else
rmlvo.rules = xkb_rules;
rmlvo.model = xkb_model;
rmlvo.layout = xkb_layout;
@@ -324,6 +347,7 @@ KbdProc(DeviceIntPtr device, int what)
return BadValue;
}
+#endif /* USE_WSKBD_GETMAP */
# ifdef XI_PROP_DEVICE_NODE
{
const char *device_node =
@@ -403,15 +427,20 @@ static void
PostKbdEvent(InputInfoPtr pInfo, unsigned int scanCode, Bool down)
{
+#ifndef USE_WSKBD_GETMAP
KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+#endif
DeviceIntPtr device = pInfo->dev;
+#ifndef USE_WSKBD_GETMAP
KeyClassRec *keyc = device->key;
int state;
+#endif
#ifdef DEBUG
LogMessageVerbSigSafe(X_INFO, -1, "kbd driver rec scancode: 0x%x %s\n", scanCode, down ? "down" : "up");
#endif
+#ifndef USE_WSKBD_GETMAP /* this convertion is necessary only for pc105 XKB */
/*
* First do some special scancode remapping ...
*/
@@ -439,6 +468,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
---
Thanks,
---
Izumi Tsutsui
Home |
Main Index |
Thread Index |
Old Index