home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / server / ddx / x386 / x386Kbd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-02  |  17.6 KB  |  437 lines

  1. /*
  2.  * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and its
  5.  * documentation for any purpose is hereby granted without fee, provided that
  6.  * the above copyright notice appear in all copies and that both that
  7.  * copyright notice and this permission notice appear in supporting
  8.  * documentation, and that the name of Thomas Roell not be used in
  9.  * advertising or publicity pertaining to distribution of the software without
  10.  * specific, written prior permission.  Thomas Roell makes no representations
  11.  * about the suitability of this software for any purpose.  It is provided
  12.  * "as is" without express or implied warranty.
  13.  *
  14.  * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  15.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  16.  * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  17.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  18.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  19.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  20.  * PERFORMANCE OF THIS SOFTWARE.
  21.  *
  22.  * $Header: /proj/X11/mit/server/ddx/x386/RCS/x386Kbd.c,v 1.1 1991/06/02 22:36:16 root Exp $
  23.  */
  24.  
  25. #include "X.h"
  26. #include "Xmd.h"
  27. #include "input.h"
  28. #include "scrnintstr.h"
  29.  
  30. #include "compiler.h"
  31.  
  32. #include "x386Procs.h"
  33. #include "x386OSD.h"
  34. #include "atKeynames.h"
  35.  
  36. /*
  37.  * For Scancodes see notes in atKeynames.h  !!!!
  38.  */
  39. static KeySym map[NUM_KEYCODES * GLYPHS_PER_KEY] = { 
  40.     /* 0x00 */  NoSymbol,       NoSymbol,    NoSymbol,    NoSymbol,
  41.     /* 0x01 */  XK_Escape,      NoSymbol,    NoSymbol,    NoSymbol,
  42.     /* 0x02 */  XK_1,           XK_exclam,    NoSymbol,    NoSymbol,
  43.     /* 0x03 */  XK_2,           XK_at,        NoSymbol,    NoSymbol,
  44.     /* 0x04 */  XK_3,           XK_numbersign,    NoSymbol,    NoSymbol,
  45.     /* 0x05 */  XK_4,           XK_dollar,    NoSymbol,    NoSymbol,
  46.     /* 0x06 */  XK_5,           XK_percent,    NoSymbol,    NoSymbol,
  47.     /* 0x07 */  XK_6,           XK_asciicircum,    NoSymbol,    NoSymbol,
  48.     /* 0x08 */  XK_7,           XK_ampersand,    NoSymbol,    NoSymbol,
  49.     /* 0x09 */  XK_8,           XK_asterisk,    NoSymbol,    NoSymbol,
  50.     /* 0x0a */  XK_9,           XK_parenleft,    NoSymbol,    NoSymbol,
  51.     /* 0x0b */  XK_0,           XK_parenright,    NoSymbol,    NoSymbol,
  52.     /* 0x0c */  XK_minus,       XK_underscore,    NoSymbol,    NoSymbol,
  53.     /* 0x0d */  XK_equal,       XK_plus,    NoSymbol,    NoSymbol,
  54.     /* 0x0e */  XK_BackSpace,   NoSymbol,    NoSymbol,    NoSymbol,
  55.     /* 0x0f */  XK_Tab,         NoSymbol,    NoSymbol,    NoSymbol,
  56.     /* 0x10 */  XK_Q,           NoSymbol,    NoSymbol,    NoSymbol,
  57.     /* 0x11 */  XK_W,           NoSymbol,    NoSymbol,    NoSymbol,
  58.     /* 0x12 */  XK_E,           NoSymbol,    NoSymbol,    NoSymbol,
  59.     /* 0x13 */  XK_R,           NoSymbol,    NoSymbol,    NoSymbol,
  60.     /* 0x14 */  XK_T,           NoSymbol,    NoSymbol,    NoSymbol,
  61.     /* 0x15 */  XK_Y,           NoSymbol,    NoSymbol,    NoSymbol,
  62.     /* 0x16 */  XK_U,           NoSymbol,    NoSymbol,    NoSymbol,
  63.     /* 0x17 */  XK_I,           NoSymbol,    NoSymbol,    NoSymbol,
  64.     /* 0x18 */  XK_O,           NoSymbol,    NoSymbol,    NoSymbol,
  65.     /* 0x19 */  XK_P,           NoSymbol,    NoSymbol,    NoSymbol,
  66.     /* 0x1a */  XK_bracketleft, XK_braceleft,    NoSymbol,    NoSymbol,
  67.     /* 0x1b */  XK_bracketright,XK_braceright,    NoSymbol,    NoSymbol,
  68.     /* 0x1c */  XK_Return,      NoSymbol,    NoSymbol,    NoSymbol,
  69.     /* 0x1d */  XK_Control_L,   NoSymbol,    NoSymbol,    NoSymbol,
  70.     /* 0x1e */  XK_A,           NoSymbol,    NoSymbol,    NoSymbol,
  71.     /* 0x1f */  XK_S,           NoSymbol,    NoSymbol,    NoSymbol,
  72.     /* 0x20 */  XK_D,           NoSymbol,    NoSymbol,    NoSymbol,
  73.     /* 0x21 */  XK_F,           NoSymbol,    NoSymbol,    NoSymbol,
  74.     /* 0x22 */  XK_G,           NoSymbol,    NoSymbol,    NoSymbol,
  75.     /* 0x23 */  XK_H,           NoSymbol,    NoSymbol,    NoSymbol,
  76.     /* 0x24 */  XK_J,           NoSymbol,    NoSymbol,    NoSymbol,
  77.     /* 0x25 */  XK_K,           NoSymbol,    NoSymbol,    NoSymbol,
  78.     /* 0x26 */  XK_L,           NoSymbol,    NoSymbol,    NoSymbol,
  79.     /* 0x27 */  XK_semicolon,   XK_colon,    NoSymbol,    NoSymbol,
  80.     /* 0x28 */  XK_quoteright,  XK_quotedbl,    NoSymbol,    NoSymbol,
  81.     /* 0x29 */  XK_quoteleft,    XK_asciitilde,    NoSymbol,    NoSymbol,
  82.     /* 0x2a */  XK_Shift_L,     NoSymbol,    NoSymbol,    NoSymbol,
  83.     /* 0x2b */  XK_backslash,   XK_bar,        NoSymbol,    NoSymbol,
  84.     /* 0x2c */  XK_Z,           NoSymbol,    NoSymbol,    NoSymbol,
  85.     /* 0x2d */  XK_X,           NoSymbol,    NoSymbol,    NoSymbol,
  86.     /* 0x2e */  XK_C,           NoSymbol,    NoSymbol,    NoSymbol,
  87.     /* 0x2f */  XK_V,           NoSymbol,    NoSymbol,    NoSymbol,
  88.     /* 0x30 */  XK_B,           NoSymbol,    NoSymbol,    NoSymbol,
  89.     /* 0x31 */  XK_N,           NoSymbol,    NoSymbol,    NoSymbol,
  90.     /* 0x32 */  XK_M,           NoSymbol,    NoSymbol,    NoSymbol,
  91.     /* 0x33 */  XK_comma,       XK_less,    NoSymbol,    NoSymbol,
  92.     /* 0x34 */  XK_period,      XK_greater,    NoSymbol,    NoSymbol,
  93.     /* 0x35 */  XK_slash,       XK_question,    NoSymbol,    NoSymbol,
  94.     /* 0x36 */  XK_Shift_R,     NoSymbol,    NoSymbol,    NoSymbol,
  95.     /* 0x37 */  XK_KP_Multiply, NoSymbol,    NoSymbol,    NoSymbol,
  96.     /* 0x38 */  XK_Alt_L,    NoSymbol,    NoSymbol,    NoSymbol,
  97.     /* 0x39 */  XK_space,       NoSymbol,    NoSymbol,    NoSymbol,
  98.     /* 0x3a */  XK_Caps_Lock,   NoSymbol,    NoSymbol,    NoSymbol,
  99.     /* 0x3b */  XK_F1,          NoSymbol,    NoSymbol,    NoSymbol,
  100.     /* 0x3c */  XK_F2,          NoSymbol,    NoSymbol,    NoSymbol,
  101.     /* 0x3d */  XK_F3,          NoSymbol,    NoSymbol,    NoSymbol,
  102.     /* 0x3e */  XK_F4,          NoSymbol,    NoSymbol,    NoSymbol,
  103.     /* 0x3f */  XK_F5,          NoSymbol,    NoSymbol,    NoSymbol,
  104.     /* 0x40 */  XK_F6,          NoSymbol,    NoSymbol,    NoSymbol,
  105.     /* 0x41 */  XK_F7,          NoSymbol,    NoSymbol,    NoSymbol,
  106.     /* 0x42 */  XK_F8,          NoSymbol,    NoSymbol,    NoSymbol,
  107.     /* 0x43 */  XK_F9,          NoSymbol,    NoSymbol,    NoSymbol,
  108.     /* 0x44 */  XK_F10,         NoSymbol,    NoSymbol,    NoSymbol,
  109.     /* 0x45 */  XK_Num_Lock,    NoSymbol,    NoSymbol,    NoSymbol,
  110.     /* 0x46 */  XK_Scroll_Lock,    NoSymbol,    NoSymbol,    NoSymbol,
  111.     /* 0x47 */  XK_Home,        XK_KP_7,    XK_KP_7,    XK_Home,
  112.     /* 0x48 */  XK_Up,          XK_KP_8,    XK_KP_8,    XK_Up,
  113.     /* 0x49 */  XK_Prior,       XK_KP_9,    XK_KP_9,    XK_Prior,
  114.     /* 0x4a */  XK_KP_Subtract, NoSymbol,    NoSymbol,    NoSymbol,
  115.     /* 0x4b */  XK_Left,        XK_KP_4,    XK_KP_4,    XK_Left,
  116.     /* 0x4c */  XK_Begin,       XK_KP_5,    XK_KP_5,    XK_Begin,
  117.     /* 0x4d */  XK_Right,       XK_KP_6,    XK_KP_6,    XK_Right,
  118.     /* 0x4e */  XK_KP_Add,      NoSymbol,    NoSymbol,    NoSymbol,
  119.     /* 0x4f */  XK_End,         XK_KP_1,    XK_KP_1,    XK_End,
  120.     /* 0x50 */  XK_Down,        XK_KP_2,    XK_KP_2,    XK_Down,
  121.     /* 0x51 */  XK_Next,        XK_KP_3,    XK_KP_3,    XK_Next,
  122.     /* 0x52 */  XK_Insert,      XK_KP_0,    XK_KP_0,    XK_Insert,
  123.     /* 0x53 */  XK_Delete,      XK_KP_Decimal,    XK_KP_Decimal,    XK_Delete,
  124.     /* 0x54 */  XK_Sys_Req,    NoSymbol,    NoSymbol,    NoSymbol,
  125.     /* 0x55 */  NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  126.     /* 0x56 */  XK_less,    XK_greater,    NoSymbol,    NoSymbol,
  127.     /* 0x57 */  XK_F11,        NoSymbol,    NoSymbol,    NoSymbol,
  128.     /* 0x58 */  XK_F12,        NoSymbol,    NoSymbol,    NoSymbol,
  129.  
  130.     /* 0x59 */  XK_Home,    NoSymbol,    NoSymbol,    NoSymbol,
  131.     /* 0x5a */  XK_Up,        NoSymbol,    NoSymbol,    NoSymbol,
  132.     /* 0x5b */  XK_Prior,    NoSymbol,    NoSymbol,    NoSymbol,
  133.     /* 0x5c */  XK_Left,    NoSymbol,    NoSymbol,    NoSymbol,
  134.     /* 0x5d */  XK_Begin,    NoSymbol,    NoSymbol,    NoSymbol,
  135.     /* 0x5e */  XK_Right,    NoSymbol,    NoSymbol,    NoSymbol,
  136.     /* 0x5f */  XK_End,        NoSymbol,    NoSymbol,    NoSymbol,
  137.     /* 0x60 */  XK_Down,    NoSymbol,    NoSymbol,    NoSymbol,
  138.     /* 0x61 */  XK_Next,    NoSymbol,    NoSymbol,    NoSymbol,
  139.     /* 0x62 */  XK_Insert,    NoSymbol,    NoSymbol,    NoSymbol,
  140.     /* 0x63 */  XK_Delete,    NoSymbol,    NoSymbol,    NoSymbol,
  141.     /* 0x64 */  XK_KP_Enter,    NoSymbol,    NoSymbol,    NoSymbol,
  142.     /* 0x65 */  XK_Control_R,    NoSymbol,    NoSymbol,    NoSymbol,
  143.     /* 0x66 */  XK_Pause,    NoSymbol,    NoSymbol,    NoSymbol,
  144.     /* 0x67 */  XK_Print,    NoSymbol,    NoSymbol,    NoSymbol,
  145.     /* 0x68 */  XK_KP_Divide,    NoSymbol,    NoSymbol,    NoSymbol,
  146.     /* 0x69 */  XK_Mode_switch,    NoSymbol,    NoSymbol,    NoSymbol,
  147.     /* 0x6a */  XK_Break,    NoSymbol,    NoSymbol,    NoSymbol,
  148. };
  149.  
  150. #define KD_GET_ENTRY(i,n) \
  151.   eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]]
  152.  
  153. /*
  154.  * NOTE: Not all possible remappable symbols are remapped. There are two main
  155.  *       reasons:
  156.  *                 a) The mapping between scancode and SYSV/386 - symboltable
  157.  *                    is inconsistent between different versions and has some
  158.  *                    BIG mistakes.
  159.  *                 b) In X-Windows there is a difference between numpad-keys
  160.  *                    and normal keys. SYSV/386 uses for both kinds of keys
  161.  *                    the same symbol.
  162.  *
  163.  *       Thus only the alpha keypad and the function keys are translated.
  164.  *       Also CapsLock, NumLock, ScrollLock, Shift, Control & Alt.
  165.  */
  166.  
  167. static unsigned char remap[128] = {
  168.      0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
  169.   0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
  170.   0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
  171.   0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
  172.   0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
  173.   0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
  174.   0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
  175.   0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
  176.   0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
  177.      0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
  178.      0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
  179.   0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
  180.      0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
  181.      0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
  182.      0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
  183.      0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
  184. };
  185.  
  186. static KeySym eascii_to_x[512] = {
  187.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  188.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  189.     XK_BackSpace,    XK_Tab,        XK_Linefeed,    NoSymbol,
  190.     NoSymbol,    XK_Return,    NoSymbol,    NoSymbol,
  191.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  192.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  193.     NoSymbol,    NoSymbol,    NoSymbol,    XK_Escape,
  194.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  195.     XK_space,    XK_exclam,    XK_quotedbl,    XK_numbersign,
  196.     XK_dollar,    XK_percent,    XK_ampersand,    XK_apostrophe,
  197.     XK_parenleft,    XK_parenright,    XK_asterisk,    XK_plus,
  198.     XK_comma,    XK_minus,    XK_period,    XK_slash,
  199.     XK_0,        XK_1,        XK_2,        XK_3,
  200.     XK_4,        XK_5,        XK_6,        XK_7,
  201.     XK_8,        XK_9,        XK_colon,    XK_semicolon,
  202.     XK_less,    XK_equal,    XK_greater,    XK_question,
  203.     XK_at,        XK_A,        XK_B,        XK_C,
  204.     XK_D,        XK_E,        XK_F,        XK_G,
  205.     XK_H,        XK_I,        XK_J,        XK_K,
  206.     XK_L,        XK_M,        XK_N,        XK_O,
  207.     XK_P,        XK_Q,        XK_R,        XK_S,
  208.     XK_T,        XK_U,        XK_V,        XK_W,
  209.     XK_X,        XK_Y,        XK_Z,        XK_bracketleft,
  210.     XK_backslash,    XK_bracketright,XK_asciicircum,    XK_underscore,
  211.     XK_grave,    XK_a,        XK_b,        XK_c,
  212.     XK_d,        XK_e,        XK_f,        XK_g,
  213.     XK_h,        XK_i,        XK_j,        XK_k,
  214.     XK_l,        XK_m,        XK_n,        XK_o,
  215.     XK_p,        XK_q,        XK_r,        XK_s,
  216.     XK_t,        XK_u,        XK_v,        XK_w,
  217.     XK_x,        XK_y,        XK_z,        XK_braceleft,
  218.     XK_bar,        XK_braceright,    XK_asciitilde,    XK_Delete,
  219.     XK_Ccedilla,    XK_udiaeresis,    XK_eacute,    XK_acircumflex,
  220.     XK_adiaeresis,    XK_agrave,    XK_aring,    XK_ccedilla,
  221.     XK_ecircumflex,    XK_ediaeresis,    XK_egrave,    XK_idiaeresis,
  222.     XK_icircumflex,    XK_igrave,    XK_Adiaeresis,    XK_Aring,
  223.     XK_Eacute,    XK_ae,        XK_AE,        XK_ocircumflex,
  224.     XK_odiaeresis,    XK_ograve,    XK_ucircumflex,    XK_ugrave,
  225.     XK_ydiaeresis,    XK_Odiaeresis,    XK_Udiaeresis,    XK_cent,
  226.     XK_sterling,    XK_yen,        XK_paragraph,    XK_section,
  227.     XK_aacute,    XK_iacute,    XK_oacute,    XK_uacute,
  228.     XK_ntilde,    XK_Ntilde,    XK_ordfeminine,    XK_masculine,
  229.     XK_questiondown,XK_hyphen,    XK_notsign,    XK_onehalf,
  230.     XK_onequarter,    XK_exclamdown,    XK_guillemotleft,XK_guillemotright,
  231.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  232.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  233.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  234.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  235.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  236.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  237.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  238.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  239.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  240.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  241.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  242.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  243.     XK_Greek_alpha,    XK_ssharp,    XK_Greek_GAMMA,    XK_Greek_pi,
  244.     XK_Greek_SIGMA,    XK_Greek_sigma,    XK_mu,            XK_Greek_tau,
  245.     XK_Greek_PHI,    XK_Greek_THETA,    XK_Greek_OMEGA,    XK_Greek_delta,
  246.     XK_infinity,    XK_Ooblique,    XK_Greek_epsilon, XK_intersection,
  247.     XK_identical,    XK_plusminus,    XK_greaterthanequal, XK_lessthanequal,
  248.     XK_topintegral,    XK_botintegral,    XK_division,    XK_similarequal,
  249.     XK_degree,    NoSymbol,    NoSymbol,    XK_radical,
  250.     XK_Greek_eta,    XK_twosuperior,    XK_periodcentered, NoSymbol,
  251.  
  252.     /* 
  253.      * special marked entries (256 + x)
  254.      */
  255.  
  256.     NoSymbol,    NoSymbol,    XK_Shift_L,    XK_Shift_R,
  257.     XK_Caps_Lock,    XK_Num_Lock,    XK_Scroll_Lock,    XK_Alt_L,
  258.     NoSymbol,    XK_Control_L,    XK_Alt_L,    XK_Mode_switch,
  259.     XK_Control_L,    XK_Control_R,    NoSymbol,    NoSymbol,
  260.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  261.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  262.     NoSymbol,    NoSymbol,    NoSymbol,    XK_F1,
  263.     XK_F2,        XK_F3,        XK_F4,        XK_F5,
  264.     XK_F6,        XK_F7,        XK_F8,        XK_F9,
  265.     XK_F10,        XK_F11,        XK_F12,        NoSymbol,
  266.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  267.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  268.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  269.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  270.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  271.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  272.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  273.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  274.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  275.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  276.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  277.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  278.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  279.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  280.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  281.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  282.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  283.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  284.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  285.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  286.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  287.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  288.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  289.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  290.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  291.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  292.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  293.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  294.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  295.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  296.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  297.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  298.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  299.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  300.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  301.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  302.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  303.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  304.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  305.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  306.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  307.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  308.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  309.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  310.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  311.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  312.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  313.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  314.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  315.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  316.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  317.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  318.     NoSymbol,    NoSymbol,    NoSymbol,    NoSymbol,
  319.       };
  320.  
  321.  
  322. /*
  323.  * LegalModifier --
  324.  *      determine whether a key is a legal modifier key, i.e send a
  325.  *      press/release sequence.
  326.  */
  327.  
  328. /*ARGSUSED*/
  329. Bool
  330. LegalModifier(key)
  331.      int  key;
  332. {
  333.   return (TRUE);
  334. }
  335.  
  336.  
  337.       
  338. /*
  339.  * x386KbdGetMapping --
  340.  *    Get the national keyboard mapping. The keyboard type is set, a new map
  341.  *      and the modifiermap is computed.
  342.  */
  343.  
  344. void
  345. x386KbdGetMapping (pKeySyms, pModMap)
  346.      KeySymsPtr pKeySyms;
  347.      CARD8      *pModMap;
  348. {
  349.   KeySym        *k;
  350.   keymap_t      keymap;
  351.   char          type;
  352.   int           i;
  353.   
  354.   /*
  355.    * use the keymap, which can be gotten from our oringinal vt??.
  356.    * ( ttymap(1) !!!! )
  357.    */
  358.   if (ioctl(x386Info.consoleFd, GIO_KEYMAP, &keymap) != -1) {
  359.     for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
  360.       
  361.       if (remap[i]) {
  362.     
  363.     k = map + (remap[i] << 2);
  364.     
  365.     k[0] = KD_GET_ENTRY(i,0);             /* non-shifed */
  366.     k[1] = KD_GET_ENTRY(i,1);          /* shifted */
  367.     k[2] = KD_GET_ENTRY(i,4);          /* alt */
  368.     k[3] = KD_GET_ENTRY(i,5);          /* alt - shifted */
  369.  
  370.     if (k[3] == k[2]) k[3] = NoSymbol;
  371.     if (k[2] == k[1]) k[2] = NoSymbol;
  372.     if (k[1] == k[0]) k[1] = NoSymbol;
  373.     if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
  374.       }
  375.   }
  376.   
  377.   /*
  378.    * compute the modifier map
  379.    */
  380.   for (i = 0; i < MAP_LENGTH; i++)
  381.     pModMap[i] = NoSymbol;  /* make sure it is restored */
  382.   
  383.   for (k = map, i = MIN_KEYCODE;
  384.        i < (NUM_KEYCODES + MIN_KEYCODE);
  385.        i++, k += 4)
  386.     
  387.     switch(*k) {
  388.       
  389.     case XK_Shift_L:
  390.     case XK_Shift_R:
  391.       pModMap[i] = ShiftMask;
  392.       break;
  393.       
  394.     case XK_Control_L:
  395.     case XK_Control_R:
  396.       pModMap[i] = ControlMask;
  397.       break;
  398.       
  399.     case XK_Caps_Lock:
  400.       pModMap[i] = LockMask;
  401.       break;
  402.       
  403.     case XK_Alt_L:
  404.     case XK_Alt_R:
  405.       pModMap[i] = AltMask;
  406.       break;
  407.       
  408.     case XK_Num_Lock:
  409.       if (!x386Info.serverNumLock) pModMap[i] = NumLockMask;
  410.       break;
  411.  
  412.     case XK_Scroll_Lock:
  413.       pModMap[i] = ScrollLockMask;
  414.       break;
  415.  
  416.       /* kana support */
  417.     case XK_Kana_Lock:
  418.     case XK_Kana_Shift:
  419.       pModMap[i] = KanaMask;
  420.       break;
  421.  
  422.       /* alternate troggle for multinational support */
  423.     case XK_Mode_switch:
  424.       pModMap[i] = AltLangMask;
  425.       break;
  426.  
  427.     }
  428.   
  429.   x386Info.kbdType =
  430.     ioctl(x386Info.consoleFd, KDGKBTYPE, &type) != -1 ? type : KB_101;
  431.  
  432.   pKeySyms->map        = map;
  433.   pKeySyms->mapWidth   = GLYPHS_PER_KEY;
  434.   pKeySyms->minKeyCode = MIN_KEYCODE;
  435.   pKeySyms->maxKeyCode = MAX_KEYCODE;
  436. }
  437.