/[hurd]/hurd/console-client/pc-kbd.c
ViewVC logotype

Diff of /hurd/console-client/pc-kbd.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by marcus, Sun Sep 22 02:13:55 2002 UTC revision 1.5 by marcus, Mon Nov 18 07:35:47 2002 UTC
# Line 39  static device_t kbd_dev; Line 39  static device_t kbd_dev;
39  /* The converter.  */  /* The converter.  */
40  static iconv_t cd;  static iconv_t cd;
41    
42    /* The status of various LEDs.  */
43    struct {
44      int scroll_lock : 1;
45      int num_lock : 1;
46      int caps_lock : 1;
47    } led_state;
48    
49    /* True if we are in the GNU Mach v1 compatibility mode.  */
50    int gnumach_v1_compat;
51    
52  /* Forward declaration.  */  /* Forward declaration.  */
53  static struct input_ops pc_kbd_ops;  static struct input_ops pc_kbd_ops;
54    
55    
56  /* A list of scan codes generated by the keyboard.  */  /* A list of scan codes generated by the keyboard, in the set 2 encoding.  */
57  enum scancode  enum scancode
58    {    {
59      SC_ESC           = 0x01,      SC_F9            = 0x01,
60      SC_1             = 0x02,      SC_F5            = 0x03,
61      SC_2             = 0x03,      SC_F3            = 0x04,
62      SC_3             = 0x04,      SC_F1            = 0x05,
63      SC_4             = 0x05,      SC_F2            = 0x06,
64      SC_5             = 0x06,      SC_F12           = 0x07,
65      SC_6             = 0x07,      SC_F10           = 0x09,
66      SC_7             = 0x08,      SC_F8            = 0x0A,
67      SC_8             = 0x09,      SC_F6            = 0x0B,
68      SC_9             = 0x0A,      SC_F4            = 0x0C,
69      SC_0             = 0x0B,      SC_TAB           = 0x0D,
70      SC_MINUS         = 0x0C,    /* - */      SC_BACKQUOTE     = 0x0E,    /* ` */
71      SC_EQUAL         = 0x0D,    /* = */      SC_LEFT_ALT      = 0x11,
72      SC_BACKSPACE     = 0x0E,      SC_LEFT_SHIFT    = 0x12,
73      SC_TAB           = 0x0F,      SC_LEFT_CTRL     = 0x14,
74      SC_Q             = 0x10,      SC_Q             = 0x15,
75      SC_W             = 0x11,      SC_1             = 0x16,
76      SC_E             = 0x12,      SC_Z             = 0x1A,
77      SC_R             = 0x13,      SC_S             = 0x1B,
78      SC_T             = 0x14,      SC_A             = 0x1C,
79      SC_Y             = 0x15,      SC_W             = 0x1D,
80      SC_U             = 0x16,      SC_2             = 0x1E,
81      SC_I             = 0x17,      SC_C             = 0x21,
82      SC_O             = 0x18,      SC_X             = 0x22,
83      SC_P             = 0x19,      SC_D             = 0x23,
84      SC_LEFT_BRACKET  = 0x1A,    /* [ */      SC_E             = 0x24,
85      SC_RIGHT_BRACKET = 0x1B,    /* ] */      SC_4             = 0x25,
86      SC_ENTER         = 0x1C,      SC_3             = 0x26,
87      SC_LEFT_CTRL     = 0x1D,      SC_SPACE         = 0x29,
88      SC_A             = 0x1E,      SC_V             = 0x2A,
89      SC_S             = 0x1F,      SC_F             = 0x2B,
90      SC_D             = 0x20,      SC_T             = 0x2C,
91      SC_F             = 0x21,      SC_R             = 0x2D,
92      SC_G             = 0x22,      SC_5             = 0x2E,
     SC_H             = 0x23,  
     SC_J             = 0x24,  
     SC_K             = 0x25,  
     SC_L             = 0x26,  
     SC_SEMICOLON     = 0x27,    /* ; */  
     SC_APOSTROPHE    = 0x28,    /* ' */  
     SC_BACKQUOTE     = 0x29,    /* ` */  
     SC_LEFT_SHIFT    = 0x2A,  
     SC_BACKSLASH     = 0x2B,    /* \ */  
     SC_Z             = 0x2C,  
     SC_X             = 0x2D,  
     SC_C             = 0x2E,  
     SC_V             = 0x2F,  
     SC_B             = 0x30,  
93      SC_N             = 0x31,      SC_N             = 0x31,
94      SC_M             = 0x32,      SC_B             = 0x32,
95      SC_COMMA         = 0x33,    /* , */      SC_H             = 0x33,
96      SC_PERIOD        = 0x34,    /* . */      SC_G             = 0x34,
97      SC_SLASH         = 0x35,    /* / */      SC_Y             = 0x35,
98      SC_RIGHT_SHIFT   = 0x36,      SC_6             = 0x36,
99      SC_PAD_ASTERISK  = 0x37,      SC_M             = 0x3A,
100      SC_LEFT_ALT      = 0x38,      SC_J             = 0x3B,
101      SC_SPACE         = 0x39,      SC_U             = 0x3C,
102      SC_CAPSLOCK      = 0x3A,      SC_7             = 0x3D,
103      SC_F1            = 0x3B,      SC_8             = 0x3E,
104      SC_F2            = 0x3C,      SC_COMMA         = 0x41,    /* , */
105      SC_F3            = 0x3D,      SC_K             = 0x42,
106      SC_F4            = 0x3E,      SC_I             = 0x43,
107      SC_F5            = 0x3F,      SC_O             = 0x44,
108      SC_F6            = 0x40,      SC_0             = 0x45,
109      SC_F7            = 0x41,      SC_9             = 0x46,
110      SC_F8            = 0x42,      SC_PERIOD        = 0x49,    /* . */
111      SC_F9            = 0x43,      SC_SLASH         = 0x4A,    /* / */
112      SC_F10           = 0x44,      SC_L             = 0x4B,
113      SC_NUMLOCK       = 0x45,      SC_SEMICOLON     = 0x4C,    /* ; */
114      SC_SCROLLLOCK    = 0x46,      SC_P             = 0x4D,
115      SC_PAD_7         = 0x47,      SC_MINUS         = 0x4E,    /* - */
116      SC_PAD_8         = 0x48,      SC_APOSTROPHE    = 0x52,    /* ' */
117      SC_PAD_9         = 0x49,      SC_LEFT_BRACKET  = 0x54,    /* [ */
118      SC_PAD_MINUS     = 0x4A,      SC_EQUAL         = 0x55,    /* = */
119      SC_PAD_4         = 0x4B,      SC_CAPSLOCK      = 0x58,
120      SC_PAD_5         = 0x4C,      SC_RIGHT_SHIFT   = 0x59,
121      SC_PAD_6         = 0x4D,      SC_ENTER         = 0x5A,
122      SC_PAD_PLUS      = 0x4E,      SC_RIGHT_BRACKET = 0x5B,    /* ] */
123      SC_PAD_1         = 0x4F,      SC_BACKSLASH     = 0x5D,    /* \ */
124      SC_PAD_2         = 0x50,      SC_BACKSPACE     = 0x66,
125      SC_PAD_3         = 0x51,      SC_PAD_1         = 0x69,
126      SC_PAD_0         = 0x52,      SC_PAD_4         = 0x6B,
127      SC_PAD_DECIMAL   = 0x53,      SC_PAD_7         = 0x6C,
128      SC_SYSREQ        = 0x54,      SC_PAD_0         = 0x70,
129      SC_F11           = 0x57,      SC_PAD_DECIMAL   = 0x71,
130      SC_F12           = 0x58,      SC_PAD_2         = 0x72,
131      SC_FLAG_UP       = 0x80,    /* ORed to basic scancode.  */      SC_PAD_5         = 0x73,
132        SC_PAD_6         = 0x74,
133        SC_PAD_8         = 0x75,
134        SC_ESC           = 0x76,
135        SC_NUMLOCK       = 0x77,
136        SC_F11           = 0x78,
137        SC_PAD_PLUS      = 0x79,
138        SC_PAD_3         = 0x7A,
139        SC_PAD_MINUS     = 0x7B,
140        SC_PAD_ASTERISK  = 0x7C,
141        SC_PAD_9         = 0x7D,
142        SC_SCROLLLOCK    = 0x7E,
143        SC_F7            = 0x83,
144      SC_EXTENDED1     = 0xE0,    /* One code follows.  */      SC_EXTENDED1     = 0xE0,    /* One code follows.  */
145      SC_EXTENDED2     = 0xE1,    /* Two codes follow (only used for Pause).  */      SC_EXTENDED2     = 0xE1,    /* Two codes follow (only used for Pause).  */
146      SC_ERROR         = 0xFF     /* Too many keys held down.  */      SC_ERROR         = 0xFF,    /* Too many keys held down.  */
147        SC_FLAG_UP       = 0xF000   /* ORed to basic scancode.  */
148    };    };
149    
150  /* Codes which can follow SC_EXTENDED1.  */  /* Codes which can follow SC_EXTENDED1.  */
151  enum scancode_x1  enum scancode_x1
152    {    {
153      SC_X1_PAD_ENTER  = 0x1C,      SC_X1_RIGHT_ALT  = 0x11,
154      SC_X1_RIGHT_CTRL = 0x1D,      SC_X1_PRTSC      = 0x12,
155      SC_X1_PAD_SLASH  = 0x35,  /*    SC_X1_PRTSC      = 0x7C,  */
156      SC_X1_PRTSC      = 0x37,      SC_X1_RIGHT_CTRL = 0x14,
157      SC_X1_RIGHT_ALT  = 0x38,      SC_X1_LEFT_GUI   = 0x1F,
158      SC_X1_BREAK      = 0x46,      SC_X1_RIGHT_GUI  = 0x27,
159      SC_X1_HOME       = 0x47,      SC_X1_APPS       = 0x2F,
160      SC_X1_UP         = 0x48,      SC_X1_POWER      = 0x37,
161      SC_X1_PGUP       = 0x49,      SC_X1_SLEEP      = 0x3F,
162      SC_X1_LEFT       = 0x4B,      SC_X1_PAD_SLASH  = 0x4A,
163      SC_X1_RIGHT      = 0x4D,      SC_X1_PAD_ENTER  = 0x5A,
164      SC_X1_END        = 0x4F,      SC_X1_WAKEUP     = 0x5E,
165      SC_X1_DOWN       = 0x50,      SC_X1_END        = 0x69,
166      SC_X1_PGDN       = 0x51,      SC_X1_LEFT       = 0x6B,
167      SC_X1_INS        = 0x52,      SC_X1_HOME       = 0x6C,
168      SC_X1_DEL        = 0x53      SC_X1_INS        = 0x70,
169        SC_X1_DEL        = 0x71,
170        SC_X1_DOWN       = 0x72,
171        SC_X1_RIGHT      = 0x74,
172        SC_X1_UP         = 0x75,
173        SC_X1_PGDN       = 0x7A,
174        SC_X1_PGUP       = 0x7D
175      };
176    
177    /* Codes which can follow SC_EXTENDED2.  */
178    enum scancode_x2
179      {
180        SC_X2_BREAK      = 0x1477,
181    };    };
182    
183    
# Line 166  char *sc_to_kc[][7] = Line 187  char *sc_to_kc[][7] =
187    {    {
188      /*None, Shift,    Ctrl,   LAlt, S+LAlt,  C+LAlt, RAlt  */      /*None, Shift,    Ctrl,   LAlt, S+LAlt,  C+LAlt, RAlt  */
189      {    0,    0,       0,      0,      0,         0,     0 },      {    0,    0,       0,      0,      0,         0,     0 },
190      { "\e", "\e",    "\e", "\e\e", "\e\e",    "\e\e",  "\e" }, /* SC_ESC.  */      { CONS_KEY_F9,  0,      0,      0,  0,         0,     0 }, /* SC_F9.  */
191      {  "1",  "!",       0,  "\e1",  "\e!",         0,   "1" }, /* SC_1.  */      {    0,    0,       0,      0,      0,         0,     0 },
192      {  "2",  "@",      "",  "\e2",  "\e@",         0,   "2" }, /* SC_2.  */      { CONS_KEY_F5, CONS_KEY_F17, 0, 0,  0,         0,     0 }, /* SC_F5.  */
193      {  "3",  "#",    "\e",  "\e3",  "\e#",         0,   "3" }, /* SC_3.  */      { CONS_KEY_F3, CONS_KEY_F15, 0, 0,  0,         0,     0 }, /* SC_F3.  */
194      {  "4",  "$",  "\x1c",  "\e4",  "\e$",  "\e\x1c",   "4" }, /* SC_4.  */      { CONS_KEY_F1, CONS_KEY_F13, 0, 0,  0,         0,     0 }, /* SC_F1.  */
195      {  "5",  "%",  "\x1d",  "\e5",  "\e%",         0,   "5" }, /* SC_5.  */      { CONS_KEY_F2, CONS_KEY_F14, 0, 0,  0,         0,     0 }, /* SC_F2.  */
196      {  "6",  "^",  "\x1e",  "\e6",  "\e^",         0,   "6" }, /* SC_6.  */      { CONS_KEY_F12, 0,      0,      0,  0,         0,     0 }, /* SC_F12.  */
197      {  "7",  "&",  "\x1f",  "\e7",  "\e&",  "\e\x1f",   "7" }, /* SC_7.  */      {    0,    0,       0,      0,      0,         0,     0 },
198      {  "8",  "*",  "\x7f",  "\e8",  "\e*",         0,   "8" }, /* SC_8.  */      { CONS_KEY_F10, 0,      0,      0,  0,         0,     0 }, /* SC_F10.  */
199      {  "9",  "(",       0,  "\e9",  "\e(",         0,   "9" }, /* SC_9.  */      { CONS_KEY_F8, CONS_KEY_F20, 0, 0,  0,         0,     0 }, /* SC_F8.  */
200      {  "0",  ")",       0,  "\e0",  "\e)",         0,   "0" }, /* SC_0.  */      { CONS_KEY_F6, CONS_KEY_F18, 0, 0,  0,         0,     0 }, /* SC_F6.  */
201      {  "-",  "_",  "\x1f",  "\e-",  "\e_",  "\e\x1f",   "-" }, /* SC_MINUS.  */      { CONS_KEY_F4, CONS_KEY_F16, 0, 0,  0,         0,     0 }, /* SC_F4.  */
     {  "=",  "+",       0,  "\e=",  "\e+",         0,   "=" }, /* SC_EQUAL.  */  
     { CONS_KEY_BACKSPACE, CONS_KEY_BACKSPACE, CONS_KEY_BACKSPACE,  
       "\e" CONS_KEY_BACKSPACE, "\e" CONS_KEY_BACKSPACE,  
       "\e" CONS_KEY_BACKSPACE, CONS_KEY_BACKSPACE }, /* SC_BACKSPACE.  */  
     /* XXX back tab?  */  
202      { "\t", "\t",    "\t", "\e\t", "\e\t",    "\e\t",  "\t" }, /* SC_TAB.  */      { "\t", "\t",    "\t", "\e\t", "\e\t",    "\e\t",  "\t" }, /* SC_TAB.  */
203        {  "`",  "~",       0,  "\e`",  "\e~",         0,     0 }, /* SC_BACKQUOTE.  */
204        {    0,    0,       0,      0,      0,         0,     0 },
205        {    0,    0,       0,      0,      0,         0,     0 },
206        {    0,    0,       0,      0,      0,         0,     0 }, /* SC_LEFT_ALT.  XXX */
207        {    0,    0,       0,      0,      0,         0,     0 }, /* SC_LEFT_SHIFT.  */
208        {    0,    0,       0,      0,      0,         0,     0 },
209        {    0,    0,       0,      0,      0,         0,     0 }, /* SC_LEFT_CTRL.  XXX */
210      {  "q",  "Q",  "\x11",  "\eq",  "\eQ",  "\e\x11",   "q" }, /* SC_Q.  */      {  "q",  "Q",  "\x11",  "\eq",  "\eQ",  "\e\x11",   "q" }, /* SC_Q.  */
211        {  "1",  "!",       0,  "\e1",  "\e!",         0,   "1" }, /* SC_1.  */
212        {    0,    0,       0,      0,      0,         0,     0 },
213        {    0,    0,       0,      0,      0,         0,     0 },
214        {    0,    0,       0,      0,      0,         0,     0 },
215        {  "z",  "Z",  "\x1a",  "\ez",  "\eZ",  "\e\x1a",   "z" }, /* SC_Z.  */
216        {  "s",  "S",  "\x13",  "\es",  "\eS",  "\e\x13",   "s" }, /* SC_S.  */
217        {  "a",  "A",  "\x01",  "\ea",  "\eA",  "\e\x01",   "a" }, /* SC_A.  */
218      {  "w",  "W",  "\x17",  "\ew",  "\eW",  "\e\x17",   "w" }, /* SC_W.  */      {  "w",  "W",  "\x17",  "\ew",  "\eW",  "\e\x17",   "w" }, /* SC_W.  */
219        {  "2",  "@",      "",  "\e2",  "\e@",         0,   "2" }, /* SC_2.  */
220        {    0,    0,       0,      0,      0,         0,     0 },
221        {    0,    0,       0,      0,      0,         0,     0 },
222        {  "c",  "C",  "\x03",  "\ec",  "\eC",  "\e\x03",  "\xc2\xa2" }, /* SC_C.  */
223        {  "x",  "X",  "\x18",  "\ex",  "\eX",  "\e\x18",   "x" }, /* SC_X.  */
224        {  "d",  "D",  "\x04",  "\ed",  "\eD",  "\e\x04",   "d" }, /* SC_D.  */
225      {  "e",  "E",  "\x05",  "\ee",  "\eE",  "\e\x05","\xe2\x82\xac" }, /* SC_E.  */      {  "e",  "E",  "\x05",  "\ee",  "\eE",  "\e\x05","\xe2\x82\xac" }, /* SC_E.  */
226      {  "r",  "R",  "\x12",  "\er",  "\eR",  "\e\x12",   "r" }, /* SC_R.  */      {  "4",  "$",  "\x1c",  "\e4",  "\e$",  "\e\x1c",   "4" }, /* SC_4.  */
227        {  "3",  "#",    "\e",  "\e3",  "\e#",         0,   "3" }, /* SC_3.  */
228        {    0,    0,       0,      0,      0,         0,     0 },
229        {    0,    0,       0,      0,      0,         0,     0 },
230        {  " ",  " ",      "",  "\e ",  "\e ",  /*XXX*/0,   " " }, /* SC_SPACE.  */
231        {  "v",  "V",  "\x16",  "\ev",  "\eV",  "\e\x16",   "v" }, /* SC_V.  */
232        {  "f",  "F",  "\x06",  "\ef",  "\eF",  "\e\x06",   "f" }, /* SC_F.  */
233      {  "t",  "T",  "\x14",  "\et",  "\eT",  "\e\x14",   "t" }, /* SC_T.  */      {  "t",  "T",  "\x14",  "\et",  "\eT",  "\e\x14",   "t" }, /* SC_T.  */
234        {  "r",  "R",  "\x12",  "\er",  "\eR",  "\e\x12",   "r" }, /* SC_R.  */
235        {  "5",  "%",  "\x1d",  "\e5",  "\e%",         0,   "5" }, /* SC_5.  */
236        {    0,    0,       0,      0,      0,         0,     0 },
237        {    0,    0,       0,      0,      0,         0,     0 },
238        {  "n",  "N",  "\x0e",  "\en",  "\eN",  "\e\x0e",   "n" }, /* SC_N.  */
239        {  "b",  "B",  "\x02",  "\eb",  "\eB",  "\e\x02",   "b" }, /* SC_B.  */
240        {  "h",  "H",  "\x08",  "\eh",  "\eH",  "\e\x08",   "h" }, /* SC_H.  */
241        {  "g",  "G",  "\x07",  "\eg",  "\eG",  "\e\x07",   "g" }, /* SC_G.  */
242      {  "y",  "Y",  "\x19",  "\ey",  "\eY",  "\e\x19",   "y" }, /* SC_Y.  */      {  "y",  "Y",  "\x19",  "\ey",  "\eY",  "\e\x19",   "y" }, /* SC_Y.  */
243        {  "6",  "^",  "\x1e",  "\e6",  "\e^",         0,   "6" }, /* SC_6.  */
244        {    0,    0,       0,      0,      0,         0,     0 },
245        {    0,    0,       0,      0,      0,         0,     0 },
246        {    0,    0,       0,      0,      0,         0,     0 },
247        {  "m",  "M",  "\x0d",  "\em",  "\eM",  "\e\x0d",   "m" }, /* SC_M.  */
248        {  "j",  "J",  "\x0a",  "\ej",  "\eJ",  "\e\x0a",   "j" }, /* SC_J.  */
249      {  "u",  "U",  "\x15",  "\eu",  "\eU",  "\e\x15",   "u" }, /* SC_U.  */      {  "u",  "U",  "\x15",  "\eu",  "\eU",  "\e\x15",   "u" }, /* SC_U.  */
250        {  "7",  "&",  "\x1f",  "\e7",  "\e&",  "\e\x1f",   "7" }, /* SC_7.  */
251        {  "8",  "*",  "\x7f",  "\e8",  "\e*",         0,   "8" }, /* SC_8.  */
252        {    0,    0,       0,      0,      0,         0,     0 },
253        {    0,    0,       0,      0,      0,         0,     0 },
254        {  ",",  "<",       0,  "\e,",  "\e<",         0,     0 }, /* SC_COMMA.  */
255        {  "k",  "K",  "\x0b",  "\ek",  "\eK",  "\e\x0b",   "k" }, /* SC_K.  */
256      {  "i",  "I",  "\x09",  "\ei",  "\eI",  "\e\x09",   "i" }, /* SC_I.  */      {  "i",  "I",  "\x09",  "\ei",  "\eI",  "\e\x09",   "i" }, /* SC_I.  */
257      {  "o",  "O",  "\x0f",  "\eo",  "\eO",  "\e\x0f",   "o" }, /* SC_O.  */      {  "o",  "O",  "\x0f",  "\eo",  "\eO",  "\e\x0f",   "o" }, /* SC_O.  */
258      {  "p",  "P",  "\x10",  "\ep",  "\eP",  "\e\x10",   "p" }, /* SC_P.  */      {  "0",  ")",       0,  "\e0",  "\e)",         0,   "0" }, /* SC_0.  */
259      {  "[",  "{",    "\e",  "\e[",  "\e{",         0,     0 }, /* SC_LEFT_BRACKET.  */      {  "9",  "(",       0,  "\e9",  "\e(",         0,   "9" }, /* SC_9.  */
260      {  "]",  "}",  "\x1d",  "\e]",  "\e}",  "\e\x1d",   "~" }, /* SC_RIGHT_BRACKET.  */      {    0,    0,       0,      0,      0,         0,     0 },
261      {"\x0d","\x0d",  "\x0d","\e\x0d","\e\x0d","\e\x0d","\x0d" }, /* SC_ENTER.  */      {    0,    0,       0,      0,      0,         0,     0 },
262      {    0,    0,       0,      0,      0,         0,     0 }, /* SC_LEFT_CTRL.  XXX */      {  ".",  ">",       0,  "\e.",  "\e>",         0,     0 }, /* SC_PERIOD.  */
263      {  "a",  "A",  "\x01",  "\ea",  "\eA",  "\e\x01",   "a" }, /* SC_A.  */      {  "/",  "?",  "\x7f",  "\e/",  "\e?",         0,     0 }, /* SC_SLASH.  */
     {  "s",  "S",  "\x13",  "\es",  "\eS",  "\e\x13",   "s" }, /* SC_S.  */  
     {  "d",  "D",  "\x04",  "\ed",  "\eD",  "\e\x04",   "d" }, /* SC_D.  */  
     {  "f",  "F",  "\x06",  "\ef",  "\eF",  "\e\x06",   "f" }, /* SC_F.  */  
     {  "g",  "G",  "\x07",  "\eg",  "\eG",  "\e\x07",   "g" }, /* SC_G.  */  
     {  "h",  "H",  "\x08",  "\eh",  "\eH",  "\e\x08",   "h" }, /* SC_H.  */  
     {  "j",  "J",  "\x0a",  "\ej",  "\eJ",  "\e\x0a",   "j" }, /* SC_J.  */  
     {  "k",  "K",  "\x0b",  "\ek",  "\eK",  "\e\x0b",   "k" }, /* SC_K.  */  
264      {  "l",  "L",  "\x0c",  "\el",  "\eL",  "\e\x0c",   "l" }, /* SC_L.  */      {  "l",  "L",  "\x0c",  "\el",  "\eL",  "\e\x0c",   "l" }, /* SC_L.  */
265      {  ";",  ":",       0,  "\e;",  "\e:",         0,     0 }, /* SC_SEMICOLON.  */      {  ";",  ":",       0,  "\e;",  "\e:",         0,     0 }, /* SC_SEMICOLON.  */
266        {  "p",  "P",  "\x10",  "\ep",  "\eP",  "\e\x10",   "p" }, /* SC_P.  */
267        {  "-",  "_",  "\x1f",  "\e-",  "\e_",  "\e\x1f",   "-" }, /* SC_MINUS.  */
268        {    0,    0,       0,      0,      0,         0,     0 },
269        {    0,    0,       0,      0,      0,         0,     0 },
270        {    0,    0,       0,      0,      0,         0,     0 },
271      {  "'", "\"",  "\x07",  "\e'", "\e\"",         0,     0 }, /* SC_APOSTROPHE.  */      {  "'", "\"",  "\x07",  "\e'", "\e\"",         0,     0 }, /* SC_APOSTROPHE.  */
272      {  "`",  "~",       0,  "\e`",  "\e~",         0,     0 }, /* SC_BACKQUOTE.  */      {    0,    0,       0,      0,      0,         0,     0 },
273      {    0,    0,       0,      0,      0,         0,     0 }, /* SC_LEFT_SHIFT.  */      {  "[",  "{",    "\e",  "\e[",  "\e{",         0,     0 }, /* SC_LEFT_BRACKET.  */
274      { "\\",  "|",  "\x1c", "\e\\",  "\e|",         0,     0 }, /* SC_BACKSLASH.  */      {  "=",  "+",       0,  "\e=",  "\e+",         0,   "=" }, /* SC_EQUAL.  */
275      {  "z",  "Z",  "\x1a",  "\ez",  "\eZ",  "\e\x1a",   "z" }, /* SC_Z.  */      {    0,    0,       0,      0,      0,         0,     0 },
276      {  "x",  "X",  "\x18",  "\ex",  "\eX",  "\e\x18",   "x" }, /* SC_X.  */      {    0,    0,       0,      0,      0,         0,     0 },
     {  "c",  "C",  "\x03",  "\ec",  "\eC",  "\e\x03",  "\xc2\xa2" }, /* SC_C.  */  
     {  "v",  "V",  "\x16",  "\ev",  "\eV",  "\e\x16",   "v" }, /* SC_V.  */  
     {  "b",  "B",  "\x02",  "\eb",  "\eB",  "\e\x02",   "b" }, /* SC_B.  */  
     {  "n",  "N",  "\x0e",  "\en",  "\eN",  "\e\x0e",   "n" }, /* SC_N.  */  
     {  "m",  "M",  "\x0d",  "\em",  "\eM",  "\e\x0d",   "m" }, /* SC_M.  */  
     {  ",",  "<",       0,  "\e,",  "\e<",         0,     0 }, /* SC_COMMA.  */  
     {  ".",  ">",       0,  "\e.",  "\e>",         0,     0 }, /* SC_PERIOD.  */  
     {  "/",  "?",  "\x7f",  "\e/",  "\e?",         0,     0 }, /* SC_SLASH.  */  
     {    0,    0,       0,      0,      0,         0,     0 }, /* SC_RIGHT_SHIFT.  */  
     {  "*",  "*",     "*",    "*",    "*",       "*",   "*" }, /* SC_PAD_ASTERISK.  XXX */  
     {    0,    0,       0,      0,      0,         0,     0 }, /* SC_LEFT_ALT.  XXX */  
     {  " ",  " ",      "",  "\e ",  "\e ",  /*XXX*/0,   " " }, /* SC_SPACE.  */  
277      {    0,    0,       0,      0,      0,         0,     0 }, /* SC_CAPSLOCK.  */      {    0,    0,       0,      0,      0,         0,     0 }, /* SC_CAPSLOCK.  */
278      { CONS_KEY_F1, CONS_KEY_F13, 0, 0,  0,         0,     0 }, /* SC_F1.  */      {    0,    0,       0,      0,      0,         0,     0 }, /* SC_RIGHT_SHIFT.  */
279      { CONS_KEY_F2, CONS_KEY_F14, 0, 0,  0,         0,     0 }, /* SC_F2.  */      {"\x0d","\x0d",  "\x0d","\e\x0d","\e\x0d","\e\x0d","\x0d" }, /* SC_ENTER.  */
280      { CONS_KEY_F3, CONS_KEY_F15, 0, 0,  0,         0,     0 }, /* SC_F3.  */      {  "]",  "}",  "\x1d",  "\e]",  "\e}",  "\e\x1d",   "~" }, /* SC_RIGHT_BRACKET.  */
281      { CONS_KEY_F4, CONS_KEY_F16, 0, 0,  0,         0,     0 }, /* SC_F4.  */      {    0,    0,       0,      0,      0,         0,     0 },
282      { CONS_KEY_F5, CONS_KEY_F17, 0, 0,  0,         0,     0 }, /* SC_F5.  */      { "\\",  "|",  "\x1c", "\e\\",  "\e|",         0,     0 }, /* SC_BACKSLASH.  */
283      { CONS_KEY_F6, CONS_KEY_F18, 0, 0,  0,         0,     0 }, /* SC_F6.  */      {    0,    0,       0,      0,      0,         0,     0 },
284      { CONS_KEY_F7, CONS_KEY_F19, 0, 0,  0,         0,     0 }, /* SC_F7.  */      {    0,    0,       0,      0,      0,         0,     0 },
285      { CONS_KEY_F8, CONS_KEY_F20, 0, 0,  0,         0,     0 }, /* SC_F8.  */      {    0,    0,       0,      0,      0,         0,     0 },
286      { CONS_KEY_F9,  0,      0,      0,  0,         0,     0 }, /* SC_F9.  */      {    0,    0,       0,      0,      0,         0,     0 },
287      { CONS_KEY_F10, 0,      0,      0,  0,         0,     0 }, /* SC_F10.  */      {    0,    0,       0,      0,      0,         0,     0 },
288      { 0,   0,       0,      0,      0,  0,     0 }, /* SC_NUMLOCK.  */      {    0,    0,       0,      0,      0,         0,     0 },
289      { 0,   0,       0,      0,      0,  0,     0 }, /* SC_SCROLLLOCK.  */      {    0,    0,       0,      0,      0,         0,     0 },
290      { CONS_KEY_HOME,  CONS_KEY_HOME,  CONS_KEY_HOME, 0, 0, 0, 0 }, /* SC_PAD_7.  */      {    0,    0,       0,      0,      0,         0,     0 },
291      { CONS_KEY_UP,    CONS_KEY_UP,    CONS_KEY_UP,   0, 0, 0, 0 }, /* SC_PAD_8.  */      { CONS_KEY_BACKSPACE, CONS_KEY_BACKSPACE, CONS_KEY_BACKSPACE,
292      { CONS_KEY_PPAGE, CONS_KEY_PPAGE, CONS_KEY_PPAGE,0, 0, 0, 0 }, /* SC_PAD_9.  */        "\e" CONS_KEY_BACKSPACE, "\e" CONS_KEY_BACKSPACE,
293      {  "-",    "-",      "-",   "-",    "-",       "-",   "-" }, /* SC_PAD_MINUS.  */        "\e" CONS_KEY_BACKSPACE, CONS_KEY_BACKSPACE }, /* SC_BACKSPACE.  */
294      { CONS_KEY_LEFT,  CONS_KEY_LEFT,  CONS_KEY_LEFT, 0, 0, 0, 0 }, /* SC_PAD_4.  */      {    0,    0,       0,      0,      0,         0,     0 },
295      {/* XXX */ "\e[G",      "\e[G",         "\e[G", 0, 0, 0, 0 }, /* SC_PAD_5.  */      {    0,    0,       0,      0,      0,         0,     0 },
     { CONS_KEY_RIGHT, CONS_KEY_RIGHT, CONS_KEY_RIGHT,0, 0, 0, 0 }, /* SC_PAD_6.  */  
     {  "+",    "+",      "+",   "+",    "+",       "+",   "+" }, /* SC_PAD_MINUS.  */  
296      { CONS_KEY_END,   CONS_KEY_END,   CONS_KEY_END,  0, 0, 0, 0 }, /* SC_PAD_1.  */      { CONS_KEY_END,   CONS_KEY_END,   CONS_KEY_END,  0, 0, 0, 0 }, /* SC_PAD_1.  */
297      { CONS_KEY_DOWN,  CONS_KEY_DOWN,  CONS_KEY_DOWN, 0, 0, 0, 0 }, /* SC_PAD_2.  */      {    0,    0,       0,      0,      0,         0,     0 },
298      { CONS_KEY_NPAGE, CONS_KEY_NPAGE, CONS_KEY_NPAGE,0, 0, 0, 0 }, /* SC_PAD_3.  */      { CONS_KEY_LEFT,  CONS_KEY_LEFT,  CONS_KEY_LEFT, 0, 0, 0, 0 }, /* SC_PAD_4.  */
299        { CONS_KEY_HOME,  CONS_KEY_HOME,  CONS_KEY_HOME, 0, 0, 0, 0 }, /* SC_PAD_7.  */
300        {    0,    0,       0,      0,      0,         0,     0 },
301        {    0,    0,       0,      0,      0,         0,     0 },
302        {    0,    0,       0,      0,      0,         0,     0 },
303      { CONS_KEY_IC,    CONS_KEY_IC,    CONS_KEY_IC,   0, 0, 0, 0 }, /* SC_PAD_0.  */      { CONS_KEY_IC,    CONS_KEY_IC,    CONS_KEY_IC,   0, 0, 0, 0 }, /* SC_PAD_0.  */
304      { CONS_KEY_DC,    CONS_KEY_DC,    CONS_KEY_DC,   0, 0, 0, 0 }, /* SC_PAD_DECIMAL.  */      { CONS_KEY_DC,    CONS_KEY_DC,    CONS_KEY_DC,   0, 0, 0, 0 }, /* SC_PAD_DECIMAL.  */
305      {    0,      0, /*XX*/0,      0,      0,         0,       0 }, /* SC_SYSREQ.  */      { CONS_KEY_DOWN,  CONS_KEY_DOWN,  CONS_KEY_DOWN, 0, 0, 0, 0 }, /* SC_PAD_2.  */
306      {    0,      0,       0,      0,      0,         0,       0 }, /* Unused.  */      {/* XXX */ "\e[G",      "\e[G",         "\e[G", 0, 0, 0, 0 }, /* SC_PAD_5.  */
307      {    0,      0,       0,      0,      0,         0,       0 }, /* Unused.  */      { CONS_KEY_RIGHT, CONS_KEY_RIGHT, CONS_KEY_RIGHT,0, 0, 0, 0 }, /* SC_PAD_6.  */
308        { CONS_KEY_UP,    CONS_KEY_UP,    CONS_KEY_UP,   0, 0, 0, 0 }, /* SC_PAD_8.  */
309        { "\e", "\e",    "\e", "\e\e", "\e\e",    "\e\e",  "\e" }, /* SC_ESC.  */
310        { 0,   0,       0,      0,      0,  0,     0 }, /* SC_NUMLOCK.  */
311      { CONS_KEY_F11, 0,      0,      0,      0,         0,     0 }, /* SC_F11.  */      { CONS_KEY_F11, 0,      0,      0,      0,         0,     0 }, /* SC_F11.  */
312      { CONS_KEY_F12, 0,      0,      0,      0,         0,     0 }  /* SC_F12.  */      {  "+",    "+",      "+",   "+",    "+",       "+",   "+" }, /* SC_PAD_PLUS.  */
313        { CONS_KEY_NPAGE, CONS_KEY_NPAGE, CONS_KEY_NPAGE,0, 0, 0, 0 }, /* SC_PAD_3.  */
314        {  "-",    "-",      "-",   "-",    "-",       "-",   "-" }, /* SC_PAD_MINUS.  */
315        {  "*",  "*",     "*",    "*",    "*",       "*",   "*" }, /* SC_PAD_ASTERISK.  XXX */
316        { CONS_KEY_PPAGE, CONS_KEY_PPAGE, CONS_KEY_PPAGE,0, 0, 0, 0 }, /* SC_PAD_9.  */
317        { 0,   0,       0,      0,      0,  0,     0 }, /* SC_SCROLLLOCK.  */
318        {    0,    0,       0,      0,      0,         0,     0 },
319        {    0,    0,       0,      0,      0,         0,     0 },
320        {    0,    0,       0,      0,      0,         0,     0 },
321        {    0,    0,       0,      0,      0,         0,     0 },
322        { CONS_KEY_F7, CONS_KEY_F19, 0, 0,  0,         0,     0 }  /* SC_F7.  */
323    };    };
324    
325  char *sc_x1_to_kc[][7] =  char *sc_x1_to_kc[][7] =
# Line 270  char *sc_x1_to_kc[][7] = Line 333  char *sc_x1_to_kc[][7] =
333      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
334      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
335      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
336        { 0, 0, 0, 0, 0, 0, 0 },
337        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_RIGHT_ALT.  */
338        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_PRTSC.  */
339        { 0, 0, 0, 0, 0, 0, 0 },
340        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_RIGHT_CTRL.  */
341      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
342      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
343      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
344      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
345      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
346        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_LEFT_GUI.  */
347      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
     {   "\n",   "\n",    "\n",   "\n",   "\n",      "\n",     0 }, /* SC_X1_PAD_ENTER.  */  
     {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_RIGHT_CTRL.  */  
348      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
349      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
350        { 0, 0, 0, 0, 0, 0, 0 },
351        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_RIGHT_GUI.  */
352      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
353      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
354      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
355        { 0, 0, 0, 0, 0, 0, 0 },
356        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_APPS.  */
357      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
358      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
359      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
360        { 0, 0, 0, 0, 0, 0, 0 },
361        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_POWER.  */
362      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
363      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
364      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
365      { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 },
366        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_SLEEP.  */
367        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
368        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
369        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
370        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
371        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
372      {    "/",    "/",     "/",    "/",    "/",       "/",     0 }, /* SC_X1_PAD_SLASH.  */      {    "/",    "/",     "/",    "/",    "/",       "/",     0 }, /* SC_X1_PAD_SLASH.  */
373        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
374        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
375        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
376        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
377        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
378        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
379        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
380      { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 },
381      {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_PRTSC.  */      {   "\n",   "\n",    "\n",   "\n",   "\n",      "\n",     0 }, /* SC_X1_PAD_ENTER.  */
     {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_RIGHT_ALT.  */  
     { 0, 0, 0, 0, 0, 0, 0 },  
382      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
383        { 0, 0, 0, 0, 0, 0, 0 },
384        {      0,      0,       0,      0,      0,         0,     0 }, /* SC_X1_WAKEUP.  */
385      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
386      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
387      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
388      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
389      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
390      { "\e[P", "\e[P",  "\e[P", "\e[P", "\e[P",    "\e[P","\e[P" }, /* SC_X1_BREAK.  */      { CONS_KEY_END,   CONS_KEY_END,   CONS_KEY_END,  CONS_KEY_END,
391      { CONS_KEY_HOME,  CONS_KEY_HOME,  CONS_KEY_HOME, CONS_KEY_HOME,        CONS_KEY_END,   CONS_KEY_END,   CONS_KEY_END },              /* SC_X1_END.  */
       CONS_KEY_HOME,  CONS_KEY_HOME,  CONS_KEY_HOME },             /* SC_X1_HOME.  */  
     { CONS_KEY_UP,    CONS_KEY_UP,    CONS_KEY_UP,   CONS_KEY_UP,  
       CONS_KEY_UP,    CONS_KEY_UP,    CONS_KEY_UP },               /* SC_X1_UP.  */  
     { CONS_KEY_PPAGE, CONS_KEY_PPAGE, CONS_KEY_PPAGE, CONS_KEY_PPAGE,  
       CONS_KEY_PPAGE, CONS_KEY_PPAGE, CONS_KEY_PPAGE },            /* SC_X1_PGUP.  */  
392      { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 },
393      { CONS_KEY_LEFT,  CONS_KEY_LEFT,  CONS_KEY_LEFT, CONS_KEY_LEFT,      { CONS_KEY_LEFT,  CONS_KEY_LEFT,  CONS_KEY_LEFT, CONS_KEY_LEFT,
394        CONS_KEY_LEFT,  CONS_KEY_LEFT,  CONS_KEY_LEFT },             /* SC_X1_LEFT.  */        CONS_KEY_LEFT,  CONS_KEY_LEFT,  CONS_KEY_LEFT },             /* SC_X1_LEFT.  */
395        { CONS_KEY_HOME,  CONS_KEY_HOME,  CONS_KEY_HOME, CONS_KEY_HOME,
396          CONS_KEY_HOME,  CONS_KEY_HOME,  CONS_KEY_HOME },             /* SC_X1_HOME.  */
397        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
398      { 0, 0, 0, 0, 0, 0, 0 },      { 0, 0, 0, 0, 0, 0, 0 },
399      { CONS_KEY_RIGHT, CONS_KEY_RIGHT, CONS_KEY_RIGHT, CONS_KEY_RIGHT,      { CONS_KEY_IC,    CONS_KEY_IC,    CONS_KEY_IC,   CONS_KEY_IC,
400        CONS_KEY_RIGHT, CONS_KEY_RIGHT, CONS_KEY_RIGHT },            /* SC_X1_RIGHT.  */        CONS_KEY_IC,    CONS_KEY_IC,    CONS_KEY_IC },               /* SC_X1_INS.  */
401      { 0, 0, 0, 0, 0, 0, 0 },      { CONS_KEY_DC,    CONS_KEY_DC,    CONS_KEY_DC,   CONS_KEY_DC,
402      { CONS_KEY_END,   CONS_KEY_END,   CONS_KEY_END,  CONS_KEY_END,        CONS_KEY_DC,    CONS_KEY_DC,    CONS_KEY_DC },               /* SC_X1_DEL.  */
       CONS_KEY_END,   CONS_KEY_END,   CONS_KEY_END },              /* SC_X1_END.  */  
403      { CONS_KEY_DOWN,  CONS_KEY_DOWN,  CONS_KEY_DOWN, CONS_KEY_DOWN,      { CONS_KEY_DOWN,  CONS_KEY_DOWN,  CONS_KEY_DOWN, CONS_KEY_DOWN,
404        CONS_KEY_DOWN,  CONS_KEY_DOWN,  CONS_KEY_DOWN },             /* SC_X1_DOWN.  */        CONS_KEY_DOWN,  CONS_KEY_DOWN,  CONS_KEY_DOWN },             /* SC_X1_DOWN.  */
405        { 0, 0, 0, 0, 0, 0, 0 },
406        { CONS_KEY_RIGHT, CONS_KEY_RIGHT, CONS_KEY_RIGHT, CONS_KEY_RIGHT,
407          CONS_KEY_RIGHT, CONS_KEY_RIGHT, CONS_KEY_RIGHT },            /* SC_X1_RIGHT.  */
408        { CONS_KEY_UP,    CONS_KEY_UP,    CONS_KEY_UP,   CONS_KEY_UP,
409          CONS_KEY_UP,    CONS_KEY_UP,    CONS_KEY_UP },               /* SC_X1_UP.  */
410        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
411        { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
412      { CONS_KEY_NPAGE, CONS_KEY_NPAGE, CONS_KEY_NPAGE, CONS_KEY_NPAGE,      { CONS_KEY_NPAGE, CONS_KEY_NPAGE, CONS_KEY_NPAGE, CONS_KEY_NPAGE,
413        CONS_KEY_NPAGE, CONS_KEY_NPAGE, CONS_KEY_NPAGE },            /* SC_X1_PGDN.  */        CONS_KEY_NPAGE, CONS_KEY_NPAGE, CONS_KEY_NPAGE },            /* SC_X1_PGDN.  */
414      { CONS_KEY_IC,    CONS_KEY_IC,    CONS_KEY_IC,   CONS_KEY_IC,      { 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0 },
415        CONS_KEY_IC,    CONS_KEY_IC,    CONS_KEY_IC },               /* SC_X1_INS.  */      { CONS_KEY_PPAGE, CONS_KEY_PPAGE, CONS_KEY_PPAGE, CONS_KEY_PPAGE,
416      { CONS_KEY_DC,    CONS_KEY_DC,    CONS_KEY_DC,   CONS_KEY_DC,        CONS_KEY_PPAGE, CONS_KEY_PPAGE, CONS_KEY_PPAGE }             /* SC_X1_PGUP.  */
417        CONS_KEY_DC,    CONS_KEY_DC,    CONS_KEY_DC }                /* SC_X1_DEL.  */    };
418    
419    char *sc_x2_to_kc[][7] =
420      {
421        /* We don't add all those zero entries here.  It's just one key,
422           so it's special cased.  */
423        { "\e[P", "\e[P",  "\e[P", "\e[P", "\e[P",    "\e[P","\e[P" }, /* SC_X1_BREAK.  */
424    };    };
425    
426    
427    /* GNU Mach v1 compatibility code.  */
428    
429    /* This is a conversion table from i8042 scancode set 1 to set 2.  */
430    enum scancode sc_set1_to_set2[] =
431      {
432        0x00,
433        SC_ESC,
434        SC_1,
435        SC_2,
436        SC_3,
437        SC_4,
438        SC_5,
439        SC_6,
440        SC_7,
441        SC_8,
442        SC_9,
443        SC_0,
444        SC_MINUS,
445        SC_EQUAL,
446        SC_BACKSPACE,
447        SC_TAB,
448        SC_Q,
449        SC_W,
450        SC_E,
451        SC_R,
452        SC_T,
453        SC_Y,
454        SC_U,
455        SC_I,
456        SC_O,
457        SC_P,
458        SC_LEFT_BRACKET,
459        SC_RIGHT_BRACKET,
460        SC_ENTER,
461        SC_LEFT_CTRL,
462        SC_A,
463        SC_S,
464        SC_D,
465        SC_F,
466        SC_G,
467        SC_H,
468        SC_J,
469        SC_K,
470        SC_L,
471        SC_SEMICOLON,
472        SC_APOSTROPHE,
473        SC_BACKQUOTE,
474        SC_LEFT_SHIFT,
475        SC_BACKSLASH,
476        SC_Z,
477        SC_X,
478        SC_C,
479        SC_V,
480        SC_B,
481        SC_N,
482        SC_M,
483        SC_COMMA,
484        SC_PERIOD,
485        SC_SLASH,
486        SC_RIGHT_SHIFT,
487        SC_PAD_ASTERISK,
488        SC_LEFT_ALT,
489        SC_SPACE,
490        SC_CAPSLOCK,
491        SC_F1,
492        SC_F2,
493        SC_F3,
494        SC_F4,
495        SC_F5,
496        SC_F6,
497        SC_F7,
498        SC_F8,
499        SC_F9,
500        SC_F10,
501        SC_NUMLOCK,
502        SC_SCROLLLOCK,
503        SC_PAD_7,
504        SC_PAD_8,
505        SC_PAD_9,
506        SC_PAD_MINUS,
507        SC_PAD_4,
508        SC_PAD_5,
509        SC_PAD_6,
510        SC_PAD_PLUS,
511        SC_PAD_1,
512        SC_PAD_2,
513        SC_PAD_3,
514        SC_PAD_0,
515        SC_PAD_DECIMAL,
516        0x00,       /* XXX SYSREQ */
517        SC_F11,
518        SC_F12,
519      };
520    
521    /* Conversion table for codes which can follow SC_EXTENDED1.  */
522    enum scancode sc_set1_to_set2_x1[] =
523      {
524        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
525        0x00, 0x00, 0x00, 0x00,
526        SC_X1_PAD_ENTER,
527        SC_X1_RIGHT_CTRL,
528        0x00, 0x00,
529        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
531        0x00, 0x00, 0x00, 0x00, 0x00,
532        SC_X1_PAD_SLASH,
533        0x00,
534        SC_X1_PRTSC,
535        SC_X1_RIGHT_ALT,
536        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
537        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
538        0x00,       /* XXX SC_X1_BREAK */
539        SC_X1_HOME,
540        SC_X1_UP,
541        SC_X1_PGUP,
542        0x00,
543        SC_X1_LEFT,
544        0x00,
545        SC_X1_RIGHT,
546        0x00,
547        SC_X1_END,
548        SC_X1_DOWN,
549        SC_X1_PGDN,
550        SC_X1_INS,
551        SC_X1_DEL
552      };
553    
554    
555  /* This gross stuff is cut & pasted from Mach sources, as Mach doesn't  /* This gross stuff is cut & pasted from Mach sources, as Mach doesn't
556     export the interface we are using here.  */     export the interface we are using here.  */
557    
# Line 405  typedef struct { Line 629  typedef struct {
629    
630  /* End of Mach code.  */  /* End of Mach code.  */
631    
632    static enum scancode
633    gnumach_v1_input_next ()
634    {
635      kd_event data_buf;
636      int up;
637      enum scancode sc;
638    
639      do
640        {
641          /* io_buf_ptr_t is (char *), not (void *).  So I have a few
642             casts to quiet warnings.  */
643          mach_msg_type_number_t data_cnt = sizeof (data_buf);
644          error_t err = device_read_inband (kbd_dev, 0, -1, sizeof (kd_event),
645                                            (void *) &data_buf, &data_cnt);
646    
647          /* XXX The error occured likely because KBD_DEV was closed, so
648             terminate.  */
649          if (err)
650            return 0;
651        }
652      while (data_buf.type != KEYBD_EVENT);
653    
654      /* Some fixed codes which are the same in set 1 and set 2, and have
655         the UP flag set.  */
656      if (data_buf.value.sc == SC_EXTENDED1
657          || data_buf.value.sc == SC_EXTENDED2
658          || data_buf.value.sc == SC_ERROR)
659        return data_buf.value.sc;
660    
661    #define SC_SET1_FLAG_UP 0x80
662      up = data_buf.value.sc & SC_SET1_FLAG_UP;
663      sc = sc_set1_to_set2[data_buf.value.sc &~ SC_SET1_FLAG_UP];
664      
665      return sc | (up ? SC_FLAG_UP : 0);
666    }
667    
668    
669    static void
670    update_leds (void)
671    {
672      char leds[2];
673      error_t err;
674    
675      /* GNU Mach v1 does not support setting the keyboard LEDs.  */
676      if (gnumach_v1_compat)
677        return;
678    
679      leds[0] = '\xed';
680      leds[1] = (led_state.scroll_lock ? 1 : 0)
681        | (led_state.num_lock ? 2 : 0)
682        | (led_state.caps_lock ? 4 : 0);
683      mach_msg_type_number_t data_cnt = 2;
684      err = device_write_inband (kbd_dev, 0, -1, (void *) leds, 2, &data_cnt);
685      if (!err && data_cnt == 1)
686        err = device_write_inband (kbd_dev, 0, -1, (void *) &leds[1], 1,
687                                   &data_cnt);
688    }
689    
690    static enum scancode
691    input_next ()
692    {
693      enum scancode sc = 0;
694      unsigned char next;
695    
696      /* GNU Mach v1 does provide keyboard input in a different format.  */
697      if (gnumach_v1_compat)
698        return gnumach_v1_input_next ();
699    
700      /* XXX This should read several characters at once.  */
701      do
702        {
703          mach_msg_type_number_t data_cnt = 1;
704          error_t err = device_read_inband (kbd_dev, 0, -1, 1,
705                                            (void *) &next, &data_cnt);
706    
707          /* XXX The error occured likely because KBD_DEV was closed, so
708             terminate.  */
709          if (err)
710            return 0;
711    
712          if (next == 0xF0)
713            /* XXX Magic constant.  */
714            sc |= SC_FLAG_UP;
715        }
716      while (next == 0xF0); /* XXX Magic constant.  */
717    
718      sc |= next;
719      return sc;
720    }
721    
722    
723  /* The input loop.  */  /* The input loop.  */
724  static any_t  static any_t
# Line 412  input_loop (any_t unused) Line 726  input_loop (any_t unused)
726  {  {
727    while (1)    while (1)
728      {      {
729        kd_event data_buf;        enum scancode fsc = input_next ();
730          enum scancode sc = fsc & ~SC_FLAG_UP;
731        /* io_buf_ptr_t is (char *), not (void *).  So I have a few        int down = !(fsc & SC_FLAG_UP);
732           casts to quiet warnings.  */        char buf[100];
733        io_buf_ptr_t data_ptr = (void *) &data_buf;        size_t size = 0;
734        mach_msg_type_number_t data_cnt = sizeof data_buf;        int modifier = -1;
735    
736        /* I suppose this could be sped up by reading multiple events        static struct {
737           per call.  But that isn't important since this is called just          wchar_t direct;
738           a couple of times per keystroke.  Things might be different          unsigned int extended : 2;
739           if we supported a mouse.  */          unsigned int left_shift : 1;
740        error_t err = device_read (kbd_dev, /* device */          unsigned int right_shift : 1;
741                                   0,       /* mode: could be D_NOWAIT */          unsigned int caps_lock : 1;
742                                   -1,      /* recnum: not used by kbdread */          unsigned int caps_lock_pressed : 1;
743                                   sizeof (kd_event), /* bytes_wanted */          unsigned int left_ctrl : 1;
744                                   &data_ptr, &data_cnt);          unsigned int right_ctrl : 1;
745        if (err)          unsigned int left_alt : 1;
746          /* XXX The error occured likely because KBD_DEV was closed, so          unsigned int right_alt : 1;
747             terminate.  */          unsigned int num_lock : 1;
748          return 0;          unsigned int num_lock_pressed : 1;
749          } state;
750    
751        if ((void *) data_ptr != &data_buf)        if (!state.left_alt && !state.right_alt)
752          {          {
753            /* Copy the structure to the expected place.  */            if (state.left_ctrl || state.right_ctrl)
754            data_buf = *(kd_event *) data_ptr;              modifier = 2;
755            munmap (data_ptr, data_cnt);            else if (state.left_shift || state.right_shift)
756          }              modifier = 1;
757              else
758                modifier = 0;
759            }
760          else if (state.left_alt)
761            {
762              if (state.left_ctrl || state.right_ctrl)
763                modifier = 5;
764              if (state.left_shift || state.right_shift)
765                modifier = 4;
766              else
767                modifier = 3;
768            }
769          else if (state.right_alt)
770            {
771              if (!state.left_ctrl && !state.right_ctrl
772                  && !state.left_shift && !state.right_shift)
773                modifier = 6;
774            }
775                
776        if (data_buf.type == KEYBD_EVENT)        if (!state.extended)
777          {          {
778            enum scancode fsc = data_buf.value.sc;            if (fsc == SC_EXTENDED1)
779            enum scancode sc = fsc & 0x7f;              state.extended = 1;
780            int down = !(fsc & SC_FLAG_UP);            else if (fsc == SC_EXTENDED2)
781            char buf[100];              state.extended = 2;
782            size_t size = 0;            else if (sc == SC_LEFT_SHIFT)
783            int modifier = -1;              state.left_shift = down;
784              else if (sc == SC_RIGHT_SHIFT)
785            static struct {              state.right_shift = down;
786              wchar_t direct;            else if (sc == SC_CAPSLOCK)
             unsigned int extended : 2;  
             unsigned int left_shift : 1;  
             unsigned int right_shift : 1;  
             unsigned int caps_lock : 1;  
             unsigned int caps_lock_pressed : 1;  
             unsigned int left_ctrl : 1;  
             unsigned int right_ctrl : 1;  
             unsigned int left_alt : 1;  
             unsigned int right_alt : 1;  
             unsigned int num_lock : 1;  
             unsigned int num_lock_pressed : 1;  
           } state;  
   
           if (!state.left_alt && !state.right_alt)  
             {  
               if (state.left_ctrl || state.right_ctrl)  
                 modifier = 2;  
               else if (state.left_shift || state.right_shift)  
                 modifier = 1;  
               else  
                 modifier = 0;  
             }  
           else if (state.left_alt)  
787              {              {
788                if (state.left_ctrl || state.right_ctrl)                if (down && !state.caps_lock_pressed)
789                  modifier = 5;                  {
790                if (state.left_shift || state.right_shift)                    state.caps_lock = !state.caps_lock;
791                  modifier = 4;                    state.caps_lock_pressed = 1;
792                else                    led_state.caps_lock = state.caps_lock;
793                  modifier = 3;                    update_leds ();
794                    }
795                  else if (!down)
796                    state.caps_lock_pressed = 0;
797              }              }
798            else if (state.right_alt)            else if (sc == SC_LEFT_CTRL)
799                state.left_ctrl = down;
800              else if (sc == SC_LEFT_ALT)
801                state.left_alt = down;
802              else if (state.left_alt && down && sc >= SC_F1 && sc <= SC_F10) /* XXX */
803                console_switch (1 + (sc - SC_F1), 0);
804              else if (state.left_alt && state.left_ctrl && down && sc == SC_BACKSPACE)
805                console_exit ();
806              else if (state.right_alt && down && sc == SC_PAD_0) /* XXX */
807                state.direct = (state.direct << 4) | 0x0;
808              else if (state.right_alt && down && sc == SC_PAD_1) /* XXX */
809                state.direct = (state.direct << 4) | 0x1;
810              else if (state.right_alt && down && sc == SC_PAD_2) /* XXX */
811                state.direct = (state.direct << 4) | 0x2;
812              else if (state.right_alt && down && sc == SC_PAD_3) /* XXX */
813                state.direct = (state.direct << 4) | 0x3;
814              else if (state.right_alt && down && sc == SC_PAD_4) /* XXX */
815                state.direct = (state.direct << 4) | 0x4;
816              else if (state.right_alt && down && sc == SC_PAD_5) /* XXX */
817                state.direct = (state.direct << 4) | 0x5;
818              else if (state.right_alt && down && sc == SC_PAD_6) /* XXX */
819                state.direct = (state.direct << 4) | 0x6;
820              else if (state.right_alt && down && sc == SC_PAD_7) /* XXX */
821                state.direct = (state.direct << 4) | 0x7;
822              else if (state.right_alt && down && sc == SC_PAD_8) /* XXX */
823                state.direct = (state.direct << 4) | 0x8;
824              else if (state.right_alt && down && sc == SC_PAD_9) /* XXX */
825                state.direct = (state.direct << 4) | 0x9;
826              else if (state.right_alt && down && sc == SC_NUMLOCK) /* XXX */
827                state.direct = (state.direct << 4) | 0xa;
828              else if (state.right_alt && down && sc == SC_PAD_ASTERISK) /* XXX */
829                state.direct = (state.direct << 4) | 0xc;
830              else if (state.right_alt && down && sc == SC_PAD_MINUS) /* XXX */
831                state.direct = (state.direct << 4) | 0xd;
832              else if (state.right_alt && down && sc == SC_PAD_PLUS) /* XXX */
833                state.direct = (state.direct << 4) | 0xe;
834              else if (sc == SC_NUMLOCK)
835              {              {
836                if (!state.left_ctrl && !state.right_ctrl                if (down && !state.num_lock_pressed)
837                    && !state.left_shift && !state.right_shift)                  {
838                  modifier = 6;                    state.num_lock = !state.num_lock;
839                      state.num_lock_pressed = 1;
840                      led_state.num_lock = state.num_lock;
841                      update_leds ();
842                    }
843                  else if (!down)
844                    state.num_lock_pressed = 0;
845              }              }
846              else if (down && sc < sizeof (sc_to_kc)/sizeof (sc_to_kc[0]))
           if (!state.extended)  
847              {              {
848                if (fsc == SC_EXTENDED1)  #if QUAERENDO_INVENIETIS
849                  state.extended = 1;                if (state.left_alt && state.right_alt
850                else if (fsc == SC_EXTENDED2)                    && sc_to_kc[sc][0][0] >= '0' && sc_to_kc[sc][0][0] <= '9'
851                  state.extended = 2;                    && sc_to_kc[sc][0][1] == '\0')
852                else if (sc == SC_LEFT_SHIFT)                  console_deprecated (sc_to_kc[sc][0][0] - '0');
853                  state.left_shift = down;                else
854                else if (sc == SC_RIGHT_SHIFT)  #endif
                 state.right_shift = down;  
               else if (sc == SC_CAPSLOCK)  
855                  {                  {
856                    if (down && !state.caps_lock_pressed)                    /* Special rule for caps lock.  */
857                      if (modifier == 0 && state.caps_lock
858                          && sc_to_kc[sc][modifier]
859                          && sc_to_kc[sc][modifier][0] >= 'a'
860                          && sc_to_kc[sc][modifier][0] <= 'z'
861                          && sc_to_kc[sc][modifier][1] == '\0')
862                        modifier = 1;
863                      else if (state.num_lock && sc == SC_PAD_0)
864                      {                      {
865                        state.caps_lock = !state.caps_lock;                        modifier = 0;
866                        state.caps_lock_pressed = 1;                        sc = SC_0;
867                      }                      }
868                    else if (!down)                    else if (state.num_lock && sc == SC_PAD_1)
                     state.caps_lock_pressed = 0;  
                 }  
               else if (sc == SC_LEFT_CTRL)  
                 state.left_ctrl = down;  
               else if (sc == SC_LEFT_ALT)  
                 state.left_alt = down;  
               else if (state.left_alt && down && sc >= SC_F1 && sc <= SC_F10) /* XXX */  
                 console_switch (1 + (sc - SC_F1), 0);  
               else if (state.left_alt && state.left_ctrl && down && sc == SC_BACKSPACE)  
                 console_exit ();  
               else if (state.right_alt && down && sc == SC_PAD_0) /* XXX */  
                 state.direct = (state.direct << 4) | 0x0;  
               else if (state.right_alt && down && sc == SC_PAD_1) /* XXX */  
                 state.direct = (state.direct << 4) | 0x1;  
               else if (state.right_alt && down && sc == SC_PAD_2) /* XXX */  
                 state.direct = (state.direct << 4) | 0x2;  
               else if (state.right_alt && down && sc == SC_PAD_3) /* XXX */  
                 state.direct = (state.direct << 4) | 0x3;  
               else if (state.right_alt && down && sc == SC_PAD_4) /* XXX */  
                 state.direct = (state.direct << 4) | 0x4;  
               else if (state.right_alt && down && sc == SC_PAD_5) /* XXX */  
                 state.direct = (state.direct << 4) | 0x5;  
               else if (state.right_alt && down && sc == SC_PAD_6) /* XXX */  
                 state.direct = (state.direct << 4) | 0x6;  
               else if (state.right_alt && down && sc == SC_PAD_7) /* XXX */  
                 state.direct = (state.direct << 4) | 0x7;  
               else if (state.right_alt && down && sc == SC_PAD_8) /* XXX */  
                 state.direct = (state.direct << 4) | 0x8;  
               else if (state.right_alt && down && sc == SC_PAD_9) /* XXX */  
                 state.direct = (state.direct << 4) | 0x9;  
               else if (state.right_alt && down && sc == SC_NUMLOCK) /* XXX */  
                 state.direct = (state.direct << 4) | 0xa;  
               else if (state.right_alt && down && sc == SC_PAD_ASTERISK) /* XXX */  
                 state.direct = (state.direct << 4) | 0xc;  
               else if (state.right_alt && down && sc == SC_PAD_MINUS) /* XXX */  
                 state.direct = (state.direct << 4) | 0xd;  
               else if (state.right_alt && down && sc == SC_PAD_PLUS) /* XXX */  
                 state.direct = (state.direct << 4) | 0xe;  
               else if (sc == SC_NUMLOCK)  
                 {  
                   if (down && !state.num_lock_pressed)  
869                      {                      {
870                        state.num_lock = !state.num_lock;                        modifier = 0;
871                        state.num_lock_pressed = 1;                        sc = SC_1;
872                      }                      }
873                    else if (!down)                    else if (state.num_lock && sc == SC_PAD_2)
                     state.num_lock_pressed = 0;  
                 }  
               else if (down && sc < sizeof (sc_to_kc)/sizeof (sc_to_kc[0]))  
                 {  
 #if QUAERENDO_INVENIETIS  
                   if (state.left_alt && state.right_alt  
                       && sc_to_kc[sc][0][0] >= '0' && sc_to_kc[sc][0][0] <= '9'  
                       && sc_to_kc[sc][0][1] == '\0')  
                     console_deprecated (sc_to_kc[sc][0][0] - '0');  
                   else  
 #endif  
874                      {                      {
875                        /* Special rule for caps lock.  */                        modifier = 0;
876                        if (modifier == 0 && state.caps_lock                        sc = SC_2;
877                            && sc_to_kc[sc][modifier]                      }
878                            && sc_to_kc[sc][modifier][0] >= 'a'                    else if (state.num_lock && sc == SC_PAD_3)
879                            && sc_to_kc[sc][modifier][0] <= 'z'                      {
880                            && sc_to_kc[sc][modifier][1] == '\0')                        modifier = 0;
881                          modifier = 1;                        sc = SC_3;
882                        else if (state.num_lock && sc == SC_PAD_0)                      }
883                          {                    else if (state.num_lock && sc == SC_PAD_4)
884                            modifier = 0;                      {
885                            sc = SC_0;                        modifier = 0;
886                          }                        sc = SC_4;
887                        else if (state.num_lock && sc == SC_PAD_1)                      }
888                          {                    else if (state.num_lock && sc == SC_PAD_5)
889                            modifier = 0;                      {
890                            sc = SC_1;                        modifier = 0;
891                          }                        sc = SC_5;
892                        else if (state.num_lock && sc == SC_PAD_2)                      }
893                          {                    else if (state.num_lock && sc == SC_PAD_6)
894                            modifier = 0;                      {
895                            sc = SC_2;                        modifier = 0;
896                          }                        sc = SC_6;
897                        else if (state.num_lock && sc == SC_PAD_3)                      }
898                          {                    else if (state.num_lock && sc == SC_PAD_7)
899                            modifier = 0;                      {
900                            sc = SC_3;                        modifier = 0;
901                          }                        sc = SC_7;
902                        else if (state.num_lock && sc == SC_PAD_4)                      }
903                          {                    else if (state.num_lock && sc == SC_PAD_8)
904                            modifier = 0;                      {
905                            sc = SC_4;                        modifier = 0;
906                          }                        sc = SC_8;
907                        else if (state.num_lock && sc == SC_PAD_5)                      }
908                          {                    else if (state.num_lock && sc == SC_PAD_9)
909                            modifier = 0;                      {
910                            sc = SC_5;                        modifier = 0;
911                          }                        sc = SC_9;
912                        else if (state.num_lock && sc == SC_PAD_6)                      }
913                          {                    else if (state.num_lock && sc == SC_PAD_DECIMAL)
914                            modifier = 0;                      {
915                            sc = SC_6;                        modifier = 0;
916                          }                        sc = SC_PERIOD;
917                        else if (state.num_lock && sc == SC_PAD_7)                      }
918                          {                    
919                            modifier = 0;                    if (modifier >= 0 && sc_to_kc[sc][modifier])
920                            sc = SC_7;                      {
921                          }                        if (!sc_to_kc[sc][modifier][0])
                       else if (state.num_lock && sc == SC_PAD_8)  
                         {  
                           modifier = 0;  
                           sc = SC_8;  
                         }  
                       else if (state.num_lock && sc == SC_PAD_9)  
                         {  
                           modifier = 0;  
                           sc = SC_9;  
                         }  
                       else if (state.num_lock && sc == SC_PAD_DECIMAL)  
922                          {                          {
923                            modifier = 0;                            /* Special meaning, emit NUL.  */
924                            sc = SC_PERIOD;                            assert (size < 100);
925                              buf[size++] = '\0';
926                          }                          }
927                          else
                       if (modifier >= 0 && sc_to_kc[sc][modifier])  
928                          {                          {
929                            if (!sc_to_kc[sc][modifier][0])                            assert (size
930                              {                                    < 101 - strlen(sc_to_kc[sc][modifier]));
931                                /* Special meaning, emit NUL.  */                            strcpy (&buf[size], sc_to_kc[sc][modifier]);
932                                assert (size < 100);                            size += strlen (sc_to_kc[sc][modifier]);
                               buf[size++] = '\0';  
                             }  
                           else  
                             {  
                               assert (size  
                                       < 101 - strlen(sc_to_kc[sc][modifier]));  
                               strcpy (&buf[size], sc_to_kc[sc][modifier]);  
                               size += strlen (sc_to_kc[sc][modifier]);  
                             }  
933                          }                          }
934                      }                      }
935                  }                  }
936              }              }
937            else if (state.extended == 1)          }
938          else if (state.extended == 1)
939            {
940              state.extended = 0;
941              if (sc == SC_X1_RIGHT_CTRL)
942                state.right_ctrl = down;
943              else if (sc == SC_X1_RIGHT_ALT)
944              {              {
945                state.extended = 0;                state.right_alt = down;
946                if (sc == SC_X1_RIGHT_CTRL)                
947                  state.right_ctrl = down;                /* Handle the AltGR+Keypad direct input.  */
948                else if (sc == SC_X1_RIGHT_ALT)                if (down)
949                    state.direct = (wchar_t) 0;
950                  else
951                  {                  {
952                    state.right_alt = down;                    if (state.direct != (wchar_t) 0)
   
                   /* Handle the AltGR+Keypad direct input.  */  
                   if (down)  
                     state.direct = (wchar_t) 0;  
                   else  
953                      {                      {
954                        if (state.direct != (wchar_t) 0)                        char *buffer = &buf[size];
955                          size_t left = sizeof (buf) - size;
956                          char *inbuf = (char *) &state.direct;
957                          size_t inbufsize = sizeof (wchar_t);
958                          int nr;
959                          
960                          nr = iconv (cd, &inbuf, &inbufsize, &buffer, &left);
961                          if (nr == (size_t) -1)
962                          {                          {
963                            char *buffer = &buf[size];                            if (errno == E2BIG)
964                            size_t left = sizeof (buf) - size;                              console_error (L"Input buffer overflow");
965                            char *inbuf = (char *) &state.direct;                            else if (errno == EILSEQ)
966                            size_t inbufsize = sizeof (wchar_t);                              console_error
967                            int nr;                                (L"Input contained invalid byte sequence");
968                              else if (errno == EINVAL)
969                            nr = iconv (cd, &inbuf, &inbufsize, &buffer, &left);                              console_error
970                            if (nr == (size_t) -1)                                (L"Input contained incomplete byte sequence");
971                              {                            else
972                                if (errno == E2BIG)                              console_error
973                                  console_error (L"Input buffer overflow");                                (L"Input caused unexpected error");
                               else if (errno == EILSEQ)  
                                 console_error  
                                   (L"Input contained invalid byte sequence");  
                               else if (errno == EINVAL)  
                                 console_error  
                                   (L"Input contained incomplete byte sequence");  
                               else  
                                 console_error  
                                   (L"Input caused unexpected error");  
                             }  
                           size = sizeof (buf) - left;  
974                          }                          }
975                          size = sizeof (buf) - left;
976                      }                      }
977                  }                  }
978                else if (state.right_alt && down && sc == SC_X1_PAD_SLASH) /* XXX */              }
979                  state.direct = (state.direct << 4) | 0xb;            else if (state.right_alt && down && sc == SC_X1_PAD_SLASH) /* XXX */
980                else if (state.right_alt && down && sc == SC_X1_PAD_ENTER) /* XXX */              state.direct = (state.direct << 4) | 0xb;
981                  state.direct = (state.direct << 4) | 0xf;            else if (state.right_alt && down && sc == SC_X1_PAD_ENTER) /* XXX */
982                else if (state.left_alt && down && sc == SC_X1_RIGHT) /* XXX */              state.direct = (state.direct << 4) | 0xf;
983                  console_switch (0, 1);            else if (state.left_alt && down && sc == SC_X1_RIGHT) /* XXX */
984                else if (state.left_alt && down && sc == SC_X1_LEFT) /* XXX */              console_switch (0, 1);
985                  console_switch (0, -1);            else if (state.left_alt && down && sc == SC_X1_LEFT) /* XXX */
986                else if (state.left_alt && down && sc == SC_X1_UP) /* XXX */              console_switch (0, -1);
987                  console_scrollback (CONS_SCROLL_DELTA_LINES, 1);            else if (state.left_alt && down && sc == SC_X1_UP) /* XXX */
988                else if (state.left_alt && down && sc == SC_X1_DOWN) /* XXX */              console_scrollback (CONS_SCROLL_DELTA_LINES, 1);
989                  console_scrollback (CONS_SCROLL_DELTA_LINES, -1);            else if (state.left_alt && down && sc == SC_X1_DOWN) /* XXX */
990                else if (state.right_shift && down && sc == SC_X1_PGUP) /* XXX */              console_scrollback (CONS_SCROLL_DELTA_LINES, -1);
991                  console_scrollback (CONS_SCROLL_DELTA_SCREENS, 0.5);            else if (state.right_shift && down && sc == SC_X1_PGUP) /* XXX */
992                else if (state.right_shift && down && sc == SC_X1_PGDN) /* XXX */              console_scrollback (CONS_SCROLL_DELTA_SCREENS, 0.5);
993                  console_scrollback (CONS_SCROLL_DELTA_SCREENS, -0.5);            else if (state.right_shift && down && sc == SC_X1_PGDN) /* XXX */
994                else if (down && sc < sizeof (sc_x1_to_kc)/sizeof (sc_x1_to_kc[0]))              console_scrollback (CONS_SCROLL_DELTA_SCREENS, -0.5);
995              else if (down && sc < sizeof (sc_x1_to_kc)/sizeof (sc_x1_to_kc[0]))
996                {
997                  if (modifier >= 0 && sc_x1_to_kc[sc][modifier])
998                  {                  {
999                    if (modifier >= 0 && sc_x1_to_kc[sc][modifier])                    assert (size < 101 - strlen(sc_x1_to_kc[sc][modifier]));
1000                      {                    strcpy (&buf[size], sc_x1_to_kc[sc][modifier]);
1001                        assert (size < 101 - strlen(sc_x1_to_kc[sc][modifier]));                    size += strlen (sc_x1_to_kc[sc][modifier]);
                       strcpy (&buf[size], sc_x1_to_kc[sc][modifier]);  
                       size += strlen (sc_x1_to_kc[sc][modifier]);  
                     }  
1002                  }                  }
1003              }              }
           else if (state.extended == 2)  
             state.extended = 3;  
           else if (state.extended == 3)  
             state.extended = 0;  
   
           if (size)  
             console_input (buf, size);  
1004          }          }
1005          else if (state.extended == 2)
1006            state.extended = 3;
1007          else if (state.extended == 3)
1008            state.extended = 0;
1009          
1010          if (size)
1011            console_input (buf, size);
1012      }      }
1013    return 0;    return 0;
1014  }  }
# Line 742  pc_kbd_start (void *handle) Line 1029  pc_kbd_start (void *handle)
1029  {  {
1030    error_t err;    error_t err;
1031    device_t device_master;    device_t device_master;
   int data[1];  
1032    
1033    cd = iconv_open ("UTF-8", "WCHAR_T");    cd = iconv_open ("UTF-8", "WCHAR_T");
1034    if (cd == (iconv_t) -1)    if (cd == (iconv_t) -1)
# Line 755  pc_kbd_start (void *handle) Line 1041  pc_kbd_start (void *handle)
1041        return err;        return err;
1042      }      }
1043    
1044    err = device_open (device_master, D_READ, "kbd", &kbd_dev);    err = device_open (device_master, D_READ | D_WRITE, "@>=kbd", &kbd_dev);
1045      if (err == D_NO_SUCH_DEVICE)
1046        {
1047          /* GNU Mach v1 has a different device.  */
1048          gnumach_v1_compat = 1;
1049          err = device_open (device_master, D_READ, "kbd", &kbd_dev);
1050        }
1051    
1052    mach_port_deallocate (mach_task_self (), device_master);    mach_port_deallocate (mach_task_self (), device_master);
1053    if (err)    if (err)
1054      {      {
# Line 763  pc_kbd_start (void *handle) Line 1056  pc_kbd_start (void *handle)
1056        return err;        return err;
1057      }      }
1058    
1059    data[0] = KB_EVENT;    if (gnumach_v1_compat)
   err = device_set_status (kbd_dev, KDSKBDMODE, data, 1);  
   if (err)  
1060      {      {
1061        device_close (kbd_dev);        int data = KB_EVENT;
1062        mach_port_deallocate (mach_task_self (), kbd_dev);        err = device_set_status (kbd_dev, KDSKBDMODE, &data, 1);
1063        iconv_close (cd);        if (err)
1064        return err;          {
1065              device_close (kbd_dev);
1066              mach_port_deallocate (mach_task_self (), kbd_dev);
1067              iconv_close (cd);
1068              return err;
1069            }
1070      }      }
1071      update_leds ();
1072    
1073    err = driver_add_input (&pc_kbd_ops, NULL);    err = driver_add_input (&pc_kbd_ops, NULL);
1074    if (err)    if (err)
1075      {      {
1076        device_set_status (kbd_dev, KDSKBDMODE, data, 1);        if (gnumach_v1_compat)
1077            {
1078              int data = KB_ASCII;
1079              device_set_status (kbd_dev, KDSKBDMODE, &data, 1);
1080            }
1081        device_close (kbd_dev);        device_close (kbd_dev);
1082        mach_port_deallocate (mach_task_self (), kbd_dev);        mach_port_deallocate (mach_task_self (), kbd_dev);
1083        iconv_close (cd);        iconv_close (cd);
# Line 791  pc_kbd_start (void *handle) Line 1092  pc_kbd_start (void *handle)
1092  static error_t  static error_t
1093  pc_kbd_fini (void *handle, int force)  pc_kbd_fini (void *handle, int force)
1094  {  {
   int data[1];  
   
1095    driver_remove_input (&pc_kbd_ops, NULL);    driver_remove_input (&pc_kbd_ops, NULL);
1096    data[0] = KB_ASCII;    if (gnumach_v1_compat)
1097    device_set_status (kbd_dev, KDSKBDMODE, data, 1);      {
1098          int data = KB_ASCII;
1099          device_set_status (kbd_dev, KDSKBDMODE, &data, 1);
1100        }
1101    device_close (kbd_dev);    device_close (kbd_dev);
1102    mach_port_deallocate (mach_task_self (), kbd_dev);    mach_port_deallocate (mach_task_self (), kbd_dev);
1103    iconv_close (cd);    iconv_close (cd);
# Line 808  pc_kbd_fini (void *handle, int force) Line 1110  pc_kbd_fini (void *handle, int force)
1110  static error_t  static error_t
1111  pc_kbd_set_scroll_lock_status (void *handle, int onoff)  pc_kbd_set_scroll_lock_status (void *handle, int onoff)
1112  {  {
1113    /* XXX */    led_state.scroll_lock = onoff;
1114      update_leds ();
1115    return 0;    return 0;
1116  }  }
1117    

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26