|
|
1.1 root 1: /************************************************************
2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
4:
5: All Rights Reserved
6:
7: Permission to use, copy, modify, and distribute this software and its
8: documentation for any purpose and without fee is hereby granted,
9: provided that the above copyright notice appear in all copies and that
10: both that copyright notice and this permission notice appear in
11: supporting documentation, and that the names of Digital or MIT not be
12: used in advertising or publicity pertaining to distribution of the
13: software without specific, written prior permission.
14:
15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21: SOFTWARE.
22:
23: ********************************************************/
24: /* $Header: lk201.c,v 1.25 87/09/13 00:51:54 toddb Exp $ */
25:
26: #include "X.h"
27: #define NEED_EVENTS
28: #include "Xproto.h"
29: #include "keynames.h"
30: #include "keysym.h"
31:
32: /* This file is device dependent, but is common to several devices */
33:
34: #include <sys/types.h>
35: #include "input.h"
36:
37: #define KEYDOWN_ERROR 0x3d
38: #define POWERUP_ERROR 0x3e
39: #define BASEKEY 0x41
40: #define MINSPECIAL 0xb3
41: #define ALLUPS 0xb3
42: #define METRONOME 0xb4
43: #define OUTPUT_ERROR 0xb5
44: #define INPUT_ERROR 0xb6
45: #define MAXSPECIAL 0xba
46:
47: static u_char lastkey;
48:
49: #define NUMDIVS 14
50: static u_char divbeg[NUMDIVS] = {0xbf, 0x91, 0xbc, 0xbd, 0xb0, 0xad, 0xa6,
51: 0xa9, 0x88, 0x56, 0x63, 0x6f, 0x7b, 0x7e};
52: static u_char divend[NUMDIVS] = {0xff, 0xa5, 0xbc, 0xbe, 0xb2, 0xaf, 0xa8,
53: 0xac, 0x90, 0x62, 0x6e, 0x7a, 0x7d, 0x87};
54: /* initially set for keyboard defaults */
55: static unsigned int keymodes[8] = {0, 0, 0, 0, 0, 0x0001c000, 0, 0};
56: /* down/up keys */
57: static unsigned int keys[8]; /* down/up keys that are currently down */
58:
59: /* Handle keyboard input from LK201 */
60:
61: void
62: ProcessLK201Input (e, dev)
63: register xEvent *e;
64: DevicePtr dev;
65: {
66: register unsigned int key, bits;
67: register int idx;
68:
69: key = e->u.u.detail;
70: if (key > MAXSPECIAL || (key >= BASEKEY && key < MINSPECIAL))
71: {
72: lastkey = key;
73: idx = key >> 5;
74: key &= 0x1f;
75: key = 1 << key;
76: if (keymodes[idx] & key) /* an up down type */
77: {
78: if ((keys[idx] ^= key) & key)
79: e->u.u.type = KeyPress;
80: else
81: e->u.u.type = KeyRelease;
82: (*dev->processInputProc)(e, dev);
83: }
84: else
85: {
86: e->u.u.type = KeyPress;
87: (*dev->processInputProc)(e, dev);
88: e->u.u.type = KeyRelease;
89: (*dev->processInputProc)(e, dev);
90: }
91: }
92: else
93: {
94: switch (key)
95: {
96: case METRONOME:
97: e->u.u.type = KeyPress;
98: e->u.u.detail = lastkey;
99: (*dev->processInputProc)(e, dev);
100: e->u.u.type = KeyRelease;
101: (*dev->processInputProc)(e, dev);
102: break;
103: case ALLUPS:
104: idx = 7;
105: e->u.u.type = KeyRelease;
106: do
107: {
108: if (bits = keys[idx])
109: {
110: keys[idx] = 0;
111: key = 0;
112: do
113: {
114: if (bits & 1)
115: {
116: e->u.u.detail = (idx << 5) | key;
117: (*dev->processInputProc)(e, dev);
118: }
119: key++;
120: } while (bits >>= 1);
121: }
122: } while (--idx >= 0);
123: break;
124: case POWERUP_ERROR:
125: case KEYDOWN_ERROR:
126: case OUTPUT_ERROR:
127: case INPUT_ERROR:
128: /* Warning ("keyboard error"); XXX */
129: break;
130: }
131: }
132: }
133:
134: /* Put keyboard in autorepeat mode and return control command string.
135: * autorepeat/down: main keyboard, numeric keypad, delete, cursors
136: * up/down: all others
137: */
138:
139: static void
140: ResetLKModes (modes)
141: register int modes;
142: {
143: register int i = 0;
144: register int key, last;
145:
146: bzero ((caddr_t) keymodes, sizeof (keymodes));
147: do {
148: if (modes & 1) {
149: for (key = divbeg[i], last = divend[i]; key <= last; key++)
150: keymodes[key >> 5] |= 1 << (key & 0x1f);
151: }
152: modes >>= 1;
153: } while (++i < NUMDIVS);
154: }
155:
156: char *
157: AutoRepeatLKMode ()
158: {
159: ResetLKModes (0x3f38);
160: return ("\212\222\232\246\256\266\272\302\316\326\336\346\356\366");
161: }
162:
163: /* Put all of keyboard in down/up mode and return control command string */
164:
165: char *
166: UpDownLKMode ()
167: {
168: ResetLKModes (0x3fff);
169: return ("\216\226\236\246\256\266\276\306\316\326\336\346\356\366");
170: }
171:
172: Bool
173: LegalModifier(key)
174: BYTE key;
175: {
176: if ((key == KEY_LOCK)
177: || (key == KEY_SHIFT)
178: || (key == KEY_COMPOSE)
179: || (key == KEY_CTRL))
180: return TRUE;
181: return FALSE;
182: }
183:
184: void
185: GetLK201Mappings(pKeySyms, pModMap)
186: KeySymsPtr pKeySyms;
187: CARD8 *pModMap;
188: {
189: #define INDEX(in) ((in - MIN_LK201_KEY) * LK201_GLYPHS_PER_KEY)
190: int i;
191: KeySym *map;
192:
193: for (i = 0; i < MAP_LENGTH; i++)
194: pModMap[i] = NoSymbol; /* make sure it is restored */
195: pModMap[ KEY_LOCK ] = LockMask;
196: pModMap[ KEY_SHIFT ] = ShiftMask;
197: pModMap[ KEY_CTRL ] = ControlMask;
198: pModMap[ KEY_COMPOSE ] = Mod1Mask;
199:
200: map = (KeySym *)Xalloc(sizeof(KeySym) *
201: (MAP_LENGTH * LK201_GLYPHS_PER_KEY));
202: pKeySyms->minKeyCode = MIN_LK201_KEY;
203: pKeySyms->maxKeyCode = MAX_LK201_KEY;
204: pKeySyms->mapWidth = LK201_GLYPHS_PER_KEY;
205: pKeySyms->map = map;
206:
207: for (i = 0; i < (MAP_LENGTH * LK201_GLYPHS_PER_KEY); i++)
208: map[i] = NoSymbol; /* make sure it is restored */
209:
210: map[INDEX(KEY_F1)] = XK_F1;
211: map[INDEX(KEY_F2)] = XK_F2;
212: map[INDEX(KEY_F3)] = XK_F3;
213: map[INDEX(KEY_F4)] = XK_F4;
214: map[INDEX(KEY_F5)] = XK_F5;
215: map[INDEX(KEY_F6)] = XK_F6;
216: map[INDEX(KEY_F7)] = XK_F7;
217: map[INDEX(KEY_F8)] = XK_F8;
218: map[INDEX(KEY_F9)] = XK_F9;
219: map[INDEX(KEY_F10)] = XK_F10;
220: map[INDEX(KEY_ESC)] = XK_Escape;
221: map[INDEX(KEY_F12)] = XK_BackSpace;
222: map[INDEX(KEY_LF)] = XK_Linefeed;
223: map[INDEX(KEY_F14)] = XK_F14;
224:
225: map[INDEX(KEY_HELP)] = XK_Help;
226: map[INDEX(KEY_MENU)] = XK_Menu;
227:
228: map[INDEX(KEY_F17)] = XK_F17;
229: map[INDEX(KEY_F18)] = XK_F18;
230: map[INDEX(KEY_F19)] = XK_F19;
231: map[INDEX(KEY_F20)] = XK_F20;
232:
233: map[INDEX(KEY_FIND)] = XK_Find;
234: map[INDEX(KEY_INSERT_HERE)] = XK_Insert;
235: map[INDEX(KEY_REMOVE)] = XK_Delete;
236: map[INDEX(KEY_SELECT)] = XK_Select;
237: map[INDEX(KEY_PREV_SCREEN)] = XK_Prior;
238: map[INDEX(KEY_NEXT_SCREEN)] = XK_Next;
239:
240: map[INDEX(KEY_KP_0)] = XK_KP_0;
241: map[INDEX(KEY_KP_PERIOD)] = XK_KP_Decimal;
242: map[INDEX(KEY_KP_ENTER)] = XK_KP_Enter;
243: map[INDEX(KEY_KP_1)] = XK_KP_1;
244: map[INDEX(KEY_KP_2)] = XK_KP_2;
245: map[INDEX(KEY_KP_3)] = XK_KP_3;
246: map[INDEX(KEY_KP_4)] = XK_KP_4;
247: map[INDEX(KEY_KP_5)] = XK_KP_5;
248: map[INDEX(KEY_KP_6)] = XK_KP_6;
249: map[INDEX(KEY_KP_COMMA)] = XK_KP_Separator;
250: map[INDEX(KEY_KP_7)] = XK_KP_7;
251: map[INDEX(KEY_KP_8)] = XK_KP_8;
252: map[INDEX(KEY_KP_9)] = XK_KP_9;
253: map[INDEX(KEY_KP_HYPHEN)] = XK_KP_Subtract;
254: map[INDEX(KEY_KP_PF1)] = XK_KP_F1;
255: map[INDEX(KEY_KP_PF2)] = XK_KP_F2;
256: map[INDEX(KEY_KP_PF3)] = XK_KP_F3;
257: map[INDEX(KEY_KP_PF4)] = XK_KP_F4;
258:
259: map[INDEX(KEY_LEFT)] = XK_Left;
260: map[INDEX(KEY_RIGHT)] = XK_Right;
261: map[INDEX(KEY_DOWN)] = XK_Down;
262: map[INDEX(KEY_UP)] = XK_Up;
263:
264: map[INDEX(KEY_SHIFT)] = XK_Shift_L;
265: map[INDEX(KEY_CTRL)] = XK_Control_L;
266: map[INDEX(KEY_LOCK)] = XK_Caps_Lock;
267: map[INDEX(KEY_COMPOSE)] = XK_Multi_key;
268: map[INDEX(KEY_DELETE)] = XK_Delete;
269: map[INDEX(KEY_RETURN)] = XK_Return;
270: map[INDEX(KEY_TAB)] = XK_Tab;
271:
272: map[INDEX(KEY_TILDE)] = XK_quoteleft;
273: map[INDEX(KEY_TILDE)+1] = XK_asciitilde;
274:
275: map[INDEX(KEY_TR_1)] = XK_1;
276: map[INDEX(KEY_TR_1)+1] = XK_exclam;
277: map[INDEX(KEY_Q)] = XK_Q;
278: map[INDEX(KEY_A)] = XK_A;
279: map[INDEX(KEY_Z)] = XK_Z;
280:
281: map[INDEX(KEY_TR_2)] = XK_2;
282: map[INDEX(KEY_TR_2)+1] = XK_at;
283:
284: map[INDEX(KEY_W)] = XK_W;
285: map[INDEX(KEY_S)] = XK_S;
286: map[INDEX(KEY_X)] = XK_X;
287:
288: map[INDEX(KEY_LANGLE_RANGLE)] = XK_less;
289: map[INDEX(KEY_LANGLE_RANGLE)+1] = XK_greater;
290:
291: map[INDEX(KEY_TR_3)] = XK_3;
292: map[INDEX(KEY_TR_3)+1] = XK_numbersign;
293:
294: map[INDEX(KEY_E)] = XK_E;
295: map[INDEX(KEY_D)] = XK_D;
296: map[INDEX(KEY_C)] = XK_C;
297:
298: map[INDEX(KEY_TR_4)] = XK_4;
299: map[INDEX(KEY_TR_4)+1] = XK_dollar;
300:
301: map[INDEX(KEY_R)] = XK_R;
302: map[INDEX(KEY_F)] = XK_F;
303: map[INDEX(KEY_V)] = XK_V;
304: map[INDEX(KEY_SPACE)] = XK_space;
305:
306: map[INDEX(KEY_TR_5)] = XK_5;
307: map[INDEX(KEY_TR_5)+1] = XK_percent;
308:
309: map[INDEX(KEY_T)] = XK_T;
310: map[INDEX(KEY_G)] = XK_G;
311: map[INDEX(KEY_B)] = XK_B;
312:
313: map[INDEX(KEY_TR_6)] = XK_6;
314: map[INDEX(KEY_TR_6)+1] = XK_asciicircum;
315:
316: map[INDEX(KEY_Y)] = XK_Y;
317: map[INDEX(KEY_H)] = XK_H;
318: map[INDEX(KEY_N)] = XK_N;
319:
320: map[INDEX(KEY_TR_7)] = XK_7;
321: map[INDEX(KEY_TR_7)+1] = XK_ampersand;
322:
323: map[INDEX(KEY_U)] = XK_U;
324: map[INDEX(KEY_J)] = XK_J;
325: map[INDEX(KEY_M)] = XK_M;
326:
327: map[INDEX(KEY_TR_8)] = XK_8;
328: map[INDEX(KEY_TR_8)+1] = XK_asterisk;
329:
330: map[INDEX(KEY_I)] = XK_I;
331: map[INDEX(KEY_K)] = XK_K;
332:
333: map[INDEX(KEY_COMMA)] = XK_comma;
334: map[INDEX(KEY_COMMA)+1] = XK_less;
335:
336: map[INDEX(KEY_TR_9)] = XK_9;
337: map[INDEX(KEY_TR_9)+1] = XK_parenleft;
338:
339: map[INDEX(KEY_O)] = XK_O;
340: map[INDEX(KEY_L)] = XK_L;
341:
342: map[INDEX(KEY_PERIOD)] = XK_period;
343: map[INDEX(KEY_PERIOD)+1] = XK_greater;
344:
345: map[INDEX(KEY_TR_0)] = XK_0;
346: map[INDEX(KEY_TR_0)+1] = XK_parenright;
347:
348: map[INDEX(KEY_P)] = XK_P;
349:
350: map[INDEX(KEY_SEMICOLON)] = XK_semicolon;
351: map[INDEX(KEY_SEMICOLON)+1] = XK_colon;
352:
353: map[INDEX(KEY_QMARK)] = XK_slash;
354: map[INDEX(KEY_QMARK)+1] = XK_question;
355:
356: map[INDEX(KEY_PLUS)] = XK_equal;
357: map[INDEX(KEY_PLUS)+1] = XK_plus;
358:
359: map[INDEX(KEY_RBRACE)] = XK_bracketright;
360: map[INDEX(KEY_RBRACE)+1] = XK_braceright;
361:
362: map[INDEX(KEY_VBAR)] = XK_backslash;
363: map[INDEX(KEY_VBAR)+1] = XK_bar;
364:
365: map[INDEX(KEY_UBAR)] = XK_minus;
366: map[INDEX(KEY_UBAR)+1] = XK_underscore;
367:
368: map[INDEX(KEY_LBRACE)] = XK_bracketleft;
369: map[INDEX(KEY_LBRACE)+1] = XK_braceleft;
370:
371: map[INDEX(KEY_QUOTE)] = XK_quoteright;
372: map[INDEX(KEY_QUOTE)+1] = XK_quotedbl;
373: #undef INDEX
374: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.