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 |
|
|
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] = |
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 |
|
|
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 |
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 |
} |
} |
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) |
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 |
{ |
{ |
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); |
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); |
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 |
|
|