|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22:
23: #include <IOKit/assert.h>
24: #include <IOKit/IOLib.h>
25: #include <IOKit/hidsystem/IOHIDTypes.h>
26: #include <IOKit/hidsystem/IOLLEvent.h>
27: #include "ApplePS2Keyboard.h"
28:
29: // =============================================================================
30: // ApplePS2Keyboard Class Implementation
31: //
32:
33: #define super IOHIKeyboard
34: OSDefineMetaClassAndStructors(ApplePS2Keyboard, IOHIKeyboard);
35:
36: UInt32 ApplePS2Keyboard::deviceType() { return NX_EVS_DEVICE_TYPE_KEYBOARD; };
37: UInt32 ApplePS2Keyboard::interfaceID() { return NX_EVS_DEVICE_INTERFACE_ACE; };
38:
39: UInt32 ApplePS2Keyboard::maxKeyCodes() { return KBV_NUM_KEYCODES; };
40:
41: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
42:
43: bool ApplePS2Keyboard::init(OSDictionary * properties)
44: {
45: //
46: // Initialize this object's minimal state. This is invoked right after this
47: // object is instantiated.
48: //
49:
50: if (!super::init(properties)) return false;
51:
52: _device = 0;
53: _extendCount = 0;
54: _interruptHandlerInstalled = false;
55: _ledState = 0;
56:
57: for (int index = 0; index < KBV_NUNITS; index++) _keyBitVector[index] = 0;
58:
59: return true;
60: }
61:
62: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
63:
64: ApplePS2Keyboard * ApplePS2Keyboard::probe(IOService * provider, SInt32 * score)
65: {
66: //
67: // The driver has been instructed to verify the presence of the actual
68: // hardware we represent. We are guaranteed by the controller that the
69: // keyboard clock is enabled and the keyboard itself is disabled (thus
70: // it won't send any asynchronous scan codes that may mess up the
71: // responses expected by the commands we send it). This is invoked
72: // after the init.
73: //
74:
75: ApplePS2KeyboardDevice * device = (ApplePS2KeyboardDevice *)provider;
76: PS2Request * request = device->allocateRequest();
77: bool success;
78:
79: if (!super::probe(provider, score)) return 0;
80:
81: //
82: // Check to see if the keyboard responds to a basic diagnostic echo.
83: //
84:
85: // (diagnostic echo command)
86: request->commands[0].command = kPS2C_WriteDataPort;
87: request->commands[0].inOrOut = kDP_TestKeyboardEcho;
88: request->commands[1].command = kPS2C_ReadDataPortAndCompare;
89: request->commands[1].inOrOut = 0xEE;
90: request->commandsCount = 2;
91: device->submitRequestAndBlock(request);
92:
93: // (free the request)
94: success = (request->commandsCount == 2);
95: device->freeRequest(request);
96:
97: return (success) ? this : 0;
98: }
99:
100: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
101:
102: bool ApplePS2Keyboard::start(IOService * provider)
103: {
104: //
105: // The driver has been instructed to start. This is called after a
106: // successful attach.
107: //
108:
109: if (!super::start(provider)) return false;
110:
111: //
112: // Maintain a pointer to and retain the provider object.
113: //
114:
115: _device = (ApplePS2KeyboardDevice *)provider;
116: _device->retain();
117:
118: //
119: // Install our driver's interrupt handler, for asynchronous data delivery.
120: //
121:
122: _device->installInterruptAction(this,
123: (PS2InterruptAction)&ApplePS2Keyboard::interruptOccurred);
124: _interruptHandlerInstalled = true;
125:
126: //
127: // Initialize the keyboard LED state.
128: //
129:
130: setLEDs(_ledState);
131:
132: //
133: // Enable the keyboard clock (should already be so), the keyboard IRQ line,
134: // and the keyboard Kscan -> scan code translation mode.
135: //
136:
137: setCommandByte(kCB_EnableKeyboardIRQ | kCB_TranslateMode,
138: kCB_DisableKeyboardClock);
139:
140: //
141: // Finally, we enable the keyboard itself, so that it may start reporting
142: // key events.
143: //
144:
145: setKeyboardEnable(true);
146:
147: return true;
148: }
149:
150: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
151:
152: void ApplePS2Keyboard::stop(IOService * provider)
153: {
154: //
155: // The driver has been instructed to stop. Note that we must break all
156: // connections to other service objects now (ie. no registered actions,
157: // no pointers and retains to objects, etc), if any.
158: //
159:
160: assert(_device == provider);
161:
162: //
163: // Disable the keyboard itself, so that it may stop reporting key events.
164: //
165:
166: setKeyboardEnable(false);
167:
168: //
169: // Disable the keyboard clock and the keyboard IRQ line.
170: //
171:
172: setCommandByte(kCB_DisableKeyboardClock, kCB_EnableKeyboardIRQ);
173:
174: //
175: // Uninstall the interrupt handler.
176: //
177:
178: if ( _interruptHandlerInstalled ) _device->uninstallInterruptAction();
179: _interruptHandlerInstalled = false;
180:
181: //
182: // Release the pointer to the provider object.
183: //
184:
185: _device->release();
186: _device = 0;
187:
188: super::stop(provider);
189: }
190:
191: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
192:
193: void ApplePS2Keyboard::interruptOccurred(UInt8 scanCode) // PS2InterruptAction
194: {
195: //
196: // This will be invoked automatically from our device when asynchronous
197: // keyboard data needs to be delivered. Process the keyboard data. Do
198: // NOT send any BLOCKING commands to our device in this context.
199: //
200:
201: if (scanCode == kSC_Acknowledge)
202: IOLog("%s: Unexpected acknowledge from PS/2 controller.\n", getName());
203: else if (scanCode == kSC_Resend)
204: IOLog("%s: Unexpected resend request from PS/2 controller.\n", getName());
205: else
206: dispatchKeyboardEventWithScancode(scanCode);
207: }
208:
209: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
210:
211: bool ApplePS2Keyboard::dispatchKeyboardEventWithScancode(UInt8 scanCode)
212: {
213: //
214: // Parses the given scan code, updating all necessary internal state, and
215: // should a new key be detected, the key event is dispatched.
216: //
217: // Returns true if a key event was indeed dispatched.
218: //
219:
220: unsigned int keyCode;
221: bool goingDown;
222: AbsoluteTime now;
223:
224: //
225: // See if this scan code introduces an extended key sequence. If so, note
226: // it and then return. Next time we get a key we'll finish the sequence.
227: //
228:
229: if (scanCode == kSC_Extend)
230: {
231: _extendCount = 1;
232: return false;
233: }
234:
235: //
236: // See if this scan code introduces an extended key sequence for the Pause
237: // Key. If so, note it and then return. The next time we get a key, drop
238: // it. The next key we get after that finishes the Pause Key sequence.
239: //
240: // The sequence actually sent to us by the keyboard for the Pause Key is:
241: //
242: // 1. E1 Extended Sequence for Pause Key
243: // 2. 1D Useless Data, with Up Bit Cleared
244: // 3. 45 Pause Key, with Up Bit Cleared
245: // 4. E1 Extended Sequence for Pause Key
246: // 5. 9D Useless Data, with Up Bit Set
247: // 6. C5 Pause Key, with Up Bit Set
248: //
249: // The reason items 4 through 6 are sent with the Pause Key is because the
250: // keyboard hardware never generates a release code for the Pause Key and
251: // the designers are being smart about it. The sequence above translates
252: // to this parser as two separate events, as it should be -- one down key
253: // event and one up key event (for the Pause Key).
254: //
255:
256: if (scanCode == kSC_Pause)
257: {
258: _extendCount = 2;
259: return false;
260: }
261:
262: //
263: // Convert the scan code into a key code.
264: //
265:
266: if (_extendCount == 0)
267: keyCode = scanCode & ~kSC_UpBit;
268: else
269: {
270: _extendCount--;
271: if (_extendCount) return false;
272:
273: //
274: // Convert certain extended codes on the PC keyboard into single scancodes.
275: // Refer to the conversion table in defaultKeymapOfLength.
276: //
277:
278: switch (scanCode & ~kSC_UpBit)
279: {
280: case 0x1D: keyCode = 0x60; break; // ctrl
281: case 0x38: keyCode = 0x61; break; // alt
282: case 0x1C: keyCode = 0x62; break; // enter
283: case 0x35: keyCode = 0x63; break; // /
284: case 0x48: keyCode = 0x64; break; // up arrow
285: case 0x50: keyCode = 0x65; break; // down arrow
286: case 0x4B: keyCode = 0x66; break; // left arrow
287: case 0x4D: keyCode = 0x67; break; // right arrow
288: case 0x52: keyCode = 0x68; break; // insert
289: case 0x53: keyCode = 0x69; break; // delete
290: case 0x49: keyCode = 0x6A; break; // page up
291: case 0x51: keyCode = 0x6B; break; // page down
292: case 0x47: keyCode = 0x6C; break; // home
293: case 0x4F: keyCode = 0x6D; break; // end
294: case 0x37: keyCode = 0x6E; break; // PrintScreen
295: case 0x45: keyCode = 0x6F; break; // Pause
296: case 0x5B: keyCode = 0x70; break; // Left Windows
297: case 0x5C: keyCode = 0x71; break; // Right Windows
298: case 0x5D: keyCode = 0x72; break; // Application
299: case 0x2A: // header or trailer for PrintScreen
300: default: return false;
301: }
302: }
303:
304: if (keyCode == 0) return false;
305:
306: //
307: // Update our key bit vector, which maintains the up/down status of all keys.
308: //
309:
310: goingDown = !(scanCode & kSC_UpBit);
311:
312: if (goingDown)
313: {
314: //
315: // Verify that this is not an autorepeated key -- discard it if it is.
316: //
317:
318: if (KBV_IS_KEYDOWN(keyCode, _keyBitVector)) return false;
319:
320: KBV_KEYDOWN(keyCode, _keyBitVector);
321: }
322: else
323: {
324: KBV_KEYUP(keyCode, _keyBitVector);
325: }
326:
327: //
328: // We have a valid key event -- dispatch it to our superclass.
329: //
330:
331: clock_get_uptime(&now);
332:
333: dispatchKeyboardEvent(keyCode, /*direction*/ goingDown, /*timeStamp*/ now);
334:
335: return true;
336: }
337:
338: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
339:
340: void ApplePS2Keyboard::setAlphaLockFeedback(bool locked)
341: {
342: //
343: // Set the keyboard LEDs to reflect the state of alpha (caps) lock.
344: //
345: // It is safe to issue this request from the interrupt/completion context.
346: //
347:
348: _ledState = locked ? (_ledState | kLED_CapsLock):(_ledState & ~kLED_CapsLock);
349: setLEDs(_ledState);
350: }
351:
352: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
353:
354: void ApplePS2Keyboard::setLEDs(UInt8 ledState)
355: {
356: //
357: // Asynchronously instructs the controller to set the keyboard LED state.
358: //
359: // It is safe to issue this request from the interrupt/completion context.
360: //
361:
362: PS2Request * request = _device->allocateRequest();
363:
364: // (set LEDs command)
365: request->commands[0].command = kPS2C_WriteDataPort;
366: request->commands[0].inOrOut = kDP_SetKeyboardLEDs;
367: request->commands[1].command = kPS2C_ReadDataPortAndCompare;
368: request->commands[1].inOrOut = kSC_Acknowledge;
369: request->commands[2].command = kPS2C_WriteDataPort;
370: request->commands[2].inOrOut = ledState;
371: request->commands[3].command = kPS2C_ReadDataPortAndCompare;
372: request->commands[3].inOrOut = kSC_Acknowledge;
373: request->commandsCount = 4;
374: _device->submitRequest(request); // asynchronous, auto-free'd
375: }
376:
377: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
378:
379: void ApplePS2Keyboard::setKeyboardEnable(bool enable)
380: {
381: //
382: // Instructs the keyboard to start or stop the reporting of key events.
383: // Be aware that while the keyboard is enabled, asynchronous key events
384: // may arrive in the middle of command sequences sent to the controller,
385: // and may get confused for expected command responses.
386: //
387: // It is safe to issue this request from the interrupt/completion context.
388: //
389:
390: PS2Request * request = _device->allocateRequest();
391:
392: // (keyboard enable/disable command)
393: request->commands[0].command = kPS2C_WriteDataPort;
394: request->commands[0].inOrOut = (enable)?kDP_Enable:kDP_SetDefaultsAndDisable;
395: request->commands[1].command = kPS2C_ReadDataPortAndCompare;
396: request->commands[1].inOrOut = kSC_Acknowledge;
397: request->commandsCount = 2;
398: _device->submitRequest(request); // asynchronous, auto-free'd
399: }
400:
401: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
402:
403: void ApplePS2Keyboard::setCommandByte(UInt8 setBits, UInt8 clearBits)
404: {
405: //
406: // Sets the bits setBits and clears the bits clearBits "atomically" in the
407: // controller's Command Byte. Since the controller does not provide such
408: // a read-modify-write primitive, we resort to a test-and-set try loop.
409: //
410: // Do NOT issue this request from the interrupt/completion context.
411: //
412:
413: UInt8 commandByte;
414: UInt8 commandByteNew;
415: PS2Request * request = _device->allocateRequest();
416:
417: do
418: {
419: // (read command byte)
420: request->commands[0].command = kPS2C_WriteCommandPort;
421: request->commands[0].inOrOut = kCP_GetCommandByte;
422: request->commands[1].command = kPS2C_ReadDataPort;
423: request->commands[1].inOrOut = 0;
424: request->commandsCount = 2;
425: _device->submitRequestAndBlock(request);
426:
427: //
428: // Modify the command byte as requested by caller.
429: //
430:
431: commandByte = request->commands[1].inOrOut;
432: commandByteNew = (commandByte | setBits) & (~clearBits);
433:
434: // ("test-and-set" command byte)
435: request->commands[0].command = kPS2C_WriteCommandPort;
436: request->commands[0].inOrOut = kCP_GetCommandByte;
437: request->commands[1].command = kPS2C_ReadDataPortAndCompare;
438: request->commands[1].inOrOut = commandByte;
439: request->commands[2].command = kPS2C_WriteCommandPort;
440: request->commands[2].inOrOut = kCP_SetCommandByte;
441: request->commands[3].command = kPS2C_WriteDataPort;
442: request->commands[3].inOrOut = commandByteNew;
443: request->commandsCount = 4;
444: _device->submitRequestAndBlock(request);
445:
446: //
447: // Repeat this loop if last command failed, that is, if the old command byte
448: // was modified since we first read it.
449: //
450:
451: } while (request->commandsCount != 4);
452:
453: _device->freeRequest(request);
454: }
455:
456: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
457:
458: const unsigned char * ApplePS2Keyboard::defaultKeymapOfLength(UInt32 * length)
459: {
460: //
461: // Returns the default x86 keymap string.
462: //
463: // The following keys are multi-byte sequences on the x86 keyboard. They get
464: // mapped into a single scan code for our purposes. Here is the mapping:
465: // PC Key PC Code NeXT Code
466: // Right-Ctrl E0-1D 0x60
467: // Right-Alt E0-38 0x61
468: // Keypad-Enter E0-1C 0x62
469: // Keypad-/ E0-35 0x63
470: // Up-Arrow E0-48 0x64
471: // Down-Arrow E0-50 0x65
472: // Left-Arrow E0-4B 0x66
473: // Right-Arrow E0-4D 0x67
474: // Insert E0-52 0x68
475: // Delete E0-53 0x69
476: // Page Up E0-49 0x6A
477: // Page Down E0-51 0x6B
478: // Home E0-47 0x6C
479: // End E0-4F 0x6D
480: //
481: // Because there is no Command key on the x86 keyboard, we've split the ALT
482: // keys up. We'll use Left-Alt as Command, and Right-Alt as ALT.
483: //
484:
485: #define CTRL(c) ((c)&037)
486: #define NX_MODIFIERKEY_ALPHALOCK 0
487: #define NX_MODIFIERKEY_SHIFT 1
488: #define NX_MODIFIERKEY_CONTROL 2
489: #define NX_MODIFIERKEY_ALTERNATE 3
490: #define NX_MODIFIERKEY_COMMAND 4
491: #define NX_MODIFIERKEY_NUMERICPAD 5
492: #define NX_MODIFIERKEY_HELP 6
493:
494: static const unsigned char defaultKeymapForPC[] =
495: {
496: 0x00, 0x00, // char file format
497:
498: 6, // MODIFIER KEY DEFINITIONS (6)
499: 0x01, 0x02, 0x2A, 0x36, // Shift, 2 keys
500: 0x02, 0x02, 0x1D, 0x60, // Ctrl, 2 keys
501: 0x03, 0x01, 0x61, // Alt, 1 key
502: 0x04, 0x01, 0x38, // Cmd, 1 key
503: 0x05, 0x15, 0x52, 0x53, 0x62, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D,
504: 0x4E, 0x47, 0x48, 0x49, 0x45, 0x63, 0x37, 0x4A,
505: 0x64, 0x65, 0x66, 0x67, // NumPad, 21 keys
506: 0x06, 0x01, 0x3B, // Help, 1 key
507:
508: 104, // KEY DEFINITIONS
509: 0xff, // Key 0x00 unassigned
510: // Key 0x01 modifier key mask bits (0x02)
511: (1<<NX_MODIFIERKEY_SHIFT),
512: NX_ASCIISET, CTRL('['), // no flags
513: NX_ASCIISET, '~', // Shift
514: // Key 0x02 modifier key mask bits (0x0a)
515: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
516: NX_ASCIISET, '1', // no flags
517: NX_ASCIISET, '!', // Shift
518: NX_SYMBOLSET, 0xad, // Alt
519: NX_ASCIISET, 0xa1, // Shift Alt
520: // Key 0x03 modifier key mask bits (0x0e)
521: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
522: (1<<NX_MODIFIERKEY_ALTERNATE),
523: NX_ASCIISET, '2', // no flags
524: NX_ASCIISET, '@', // Shift
525: NX_ASCIISET, CTRL('@'), // Ctrl
526: NX_ASCIISET, CTRL('@'), // Shift Ctrl
527: NX_ASCIISET, 0xb2, // Alt
528: NX_ASCIISET, 0xb3, // Shift Alt
529: NX_ASCIISET, CTRL('@'), // Ctrl Alt
530: NX_ASCIISET, CTRL('@'), // Shift Ctrl Alt
531: // Key 0x04 modifier key mask bits (0x0a)
532: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
533: NX_ASCIISET, '3', // no flags
534: NX_ASCIISET, '#', // Shift
535: NX_ASCIISET, 0xa3, // Alt
536: NX_SYMBOLSET, 0xba, // Shift Alt
537: // Key 0x05 modifier key mask bits (0x0a)
538: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
539: NX_ASCIISET, '4', // no flags
540: NX_ASCIISET, '$', // Shift
541: NX_ASCIISET, 0xa2, // Alt
542: NX_ASCIISET, 0xa8, // Shift Alt
543: // Key 0x06 modifier key mask bits (0x0a)
544: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
545: NX_ASCIISET, '5', // no flags
546: NX_ASCIISET, '%', // Shift
547: NX_SYMBOLSET, 0xa5, // Alt
548: NX_ASCIISET, 0xbd, // Shift Alt
549: // Key 0x07 modifier key mask bits (0x0e)
550: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
551: (1<<NX_MODIFIERKEY_ALTERNATE),
552: NX_ASCIISET, '6', // no flags
553: NX_ASCIISET, '^', // Shift
554: NX_ASCIISET, CTRL('^'), // Ctrl
555: NX_ASCIISET, CTRL('^'), // Shift Ctrl
556: NX_ASCIISET, 0xb6, // Alt
557: NX_ASCIISET, 0xc3, // Shift Alt
558: NX_ASCIISET, CTRL('^'), // Ctrl Alt
559: NX_ASCIISET, CTRL('^'), // Shift Ctrl Alt
560: // Key 0x08 modifier key mask bits (0x0a)
561: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
562: NX_ASCIISET, '7', // no flags
563: NX_ASCIISET, '&', // Shift
564: NX_ASCIISET, 0xb7, // Alt
565: NX_SYMBOLSET, 0xab, // Shift Alt
566: // Key 0x09 modifier key mask bits (0x0a)
567: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
568: NX_ASCIISET, '8', // no flags
569: NX_ASCIISET, '*', // Shift
570: NX_SYMBOLSET, 0xb0, // Alt
571: NX_ASCIISET, 0xb4, // Shift Alt
572: // Key 0x0A modifier key mask bits (0x0a)
573: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
574: NX_ASCIISET, '9', // no flags
575: NX_ASCIISET, '(', // Shift
576: NX_ASCIISET, 0xac, // Alt
577: NX_ASCIISET, 0xab, // Shift Alt
578: // Key 0x0B modifier key mask bits (0x0a)
579: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
580: NX_ASCIISET, '0', // no flags
581: NX_ASCIISET, ')', // Shift
582: NX_ASCIISET, 0xad, // Alt
583: NX_ASCIISET, 0xbb, // Shift Alt
584: // Key 0x0C modifier key mask bits (0x0e)
585: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
586: (1<<NX_MODIFIERKEY_ALTERNATE),
587: NX_ASCIISET, '-', // no flags
588: NX_ASCIISET, '_', // Shift
589: NX_ASCIISET, CTRL('_'), // Ctrl
590: NX_ASCIISET, CTRL('_'), // Shift Ctrl
591: NX_ASCIISET, 0xb1, // Alt
592: NX_ASCIISET, 0xd0, // Shift Alt
593: NX_ASCIISET, CTRL('_'), // Ctrl Alt
594: NX_ASCIISET, CTRL('_'), // Shift Ctrl Alt
595: // Key 0x0D modifier key mask bits (0x0a)
596: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
597: NX_ASCIISET, '=', // no flags
598: NX_ASCIISET, '+', // Shift
599: NX_SYMBOLSET, 0xb9, // Alt
600: NX_SYMBOLSET, 0xb1, // Shift Alt
601: // Key 0x0E modifier key mask bits (0x02)
602: (1<<NX_MODIFIERKEY_SHIFT),
603: NX_ASCIISET, 0x7f, // no flags
604: NX_ASCIISET, '\b', // Shift
605: // Key 0x0f modifier key mask bits (0x02)
606: (1<<NX_MODIFIERKEY_SHIFT),
607: NX_ASCIISET, '\t', // no flags
608: NX_ASCIISET, CTRL('Y'), // Shift
609: // Key 0x10 modifier key mask bits (0x0d)
610: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
611: (1<<NX_MODIFIERKEY_ALTERNATE),
612: NX_ASCIISET, 'q', // no flags
613: NX_ASCIISET, 'Q', // AlphaShift
614: NX_ASCIISET, CTRL('Q'), // Ctrl
615: NX_ASCIISET, CTRL('Q'), // AlphaShift Ctrl
616: NX_ASCIISET, 0xfa, // Alt
617: NX_ASCIISET, 0xea, // AlphaShift Alt
618: NX_ASCIISET, CTRL('Q'), // Ctrl Alt
619: NX_ASCIISET, CTRL('Q'), // AlphaShift Ctrl Alt
620: // Key 0x11 modifier key mask bits (0x0d)
621: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
622: (1<<NX_MODIFIERKEY_ALTERNATE),
623: NX_ASCIISET, 'w', // no flags
624: NX_ASCIISET, 'W', // AlphaShift
625: NX_ASCIISET, CTRL('W'), // Ctrl
626: NX_ASCIISET, CTRL('W'), // AlphaShift Ctrl
627: NX_SYMBOLSET, 0xc8, // Alt
628: NX_SYMBOLSET, 0xc7, // AlphaShift Alt
629: NX_ASCIISET, CTRL('W'), // Ctrl Alt
630: NX_ASCIISET, CTRL('W'), // AlphaShift Ctrl Alt
631: // Key 0x12 modifier key mask bits (0x0d)
632: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
633: (1<<NX_MODIFIERKEY_ALTERNATE),
634: NX_ASCIISET, 'e', // no flags
635: NX_ASCIISET, 'E', // AlphaShift
636: NX_ASCIISET, CTRL('E'), // Ctrl
637: NX_ASCIISET, CTRL('E'), // AlphaShift Ctrl
638: NX_ASCIISET, 0xc2, // Alt
639: NX_ASCIISET, 0xc5, // AlphaShift Alt
640: NX_ASCIISET, CTRL('E'), // Ctrl Alt
641: NX_ASCIISET, CTRL('E'), // AlphaShift Ctrl Alt
642: // Key 0x13 modifier key mask bits (0x0d)
643: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
644: (1<<NX_MODIFIERKEY_ALTERNATE),
645: NX_ASCIISET, 'r', // no flags
646: NX_ASCIISET, 'R', // AlphaShift
647: NX_ASCIISET, CTRL('R'), // Ctrl
648: NX_ASCIISET, CTRL('R'), // AlphaShift Ctrl
649: NX_SYMBOLSET, 0xe2, // Alt
650: NX_SYMBOLSET, 0xd2, // AlphaShift Alt
651: NX_ASCIISET, CTRL('R'), // Ctrl Alt
652: NX_ASCIISET, CTRL('R'), // AlphaShift Ctrl Alt
653: // Key 0x14 modifier key mask bits (0x0d)
654: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
655: (1<<NX_MODIFIERKEY_ALTERNATE),
656: NX_ASCIISET, 't', // no flags
657: NX_ASCIISET, 'T', // AlphaShift
658: NX_ASCIISET, CTRL('T'), // Ctrl
659: NX_ASCIISET, CTRL('T'), // AlphaShift Ctrl
660: NX_SYMBOLSET, 0xe4, // Alt
661: NX_SYMBOLSET, 0xd4, // AlphaShift Alt
662: NX_ASCIISET, CTRL('T'), // Ctrl Alt
663: NX_ASCIISET, CTRL('T'), // AlphaShift Ctrl Alt
664: // Key 0x15 modifier key mask bits (0x0d)
665: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
666: (1<<NX_MODIFIERKEY_ALTERNATE),
667: NX_ASCIISET, 'y', // no flags
668: NX_ASCIISET, 'Y', // AlphaShift
669: NX_ASCIISET, CTRL('Y'), // Ctrl
670: NX_ASCIISET, CTRL('Y'), // AlphaShift Ctrl
671: NX_ASCIISET, 0xa5, // Alt
672: NX_SYMBOLSET, 0xdb, // AlphaShift Alt
673: NX_ASCIISET, CTRL('Y'), // Ctrl Alt
674: NX_ASCIISET, CTRL('Y'), // AlphaShift Ctrl Alt
675: // Key 0x16 modifier key mask bits (0x0d)
676: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
677: (1<<NX_MODIFIERKEY_ALTERNATE),
678: NX_ASCIISET, 'u', // no flags
679: NX_ASCIISET, 'U', // AlphaShift
680: NX_ASCIISET, CTRL('U'), // Ctrl
681: NX_ASCIISET, CTRL('U'), // AlphaShift Ctrl
682: NX_ASCIISET, 0xc8, // Alt
683: NX_ASCIISET, 0xcd, // AlphaShift Alt
684: NX_ASCIISET, CTRL('U'), // Ctrl Alt
685: NX_ASCIISET, CTRL('U'), // AlphaShift Ctrl Alt
686: // Key 0x17 modifier key mask bits (0x0d)
687: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
688: (1<<NX_MODIFIERKEY_ALTERNATE),
689: NX_ASCIISET, 'i', // no flags
690: NX_ASCIISET, 'I', // AlphaShift
691: NX_ASCIISET, '\t', // Ctrl
692: NX_ASCIISET, '\t', // AlphaShift Ctrl
693: NX_ASCIISET, 0xc1, // Alt
694: NX_ASCIISET, 0xf5, // AlphaShift Alt
695: NX_ASCIISET, '\t', // Ctrl Alt
696: NX_ASCIISET, '\t', // AlphaShift Ctrl Alt
697: // Key 0x18 modifier key mask bits (0x0d)
698: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
699: (1<<NX_MODIFIERKEY_ALTERNATE),
700: NX_ASCIISET, 'o', // no flags
701: NX_ASCIISET, 'O', // AlphaShift
702: NX_ASCIISET, CTRL('O'), // Ctrl
703: NX_ASCIISET, CTRL('O'), // AlphaShift Ctrl
704: NX_ASCIISET, 0xf9, // Alt
705: NX_ASCIISET, 0xe9, // AlphaShift Alt
706: NX_ASCIISET, CTRL('O'), // Ctrl Alt
707: NX_ASCIISET, CTRL('O'), // AlphaShift Ctrl Alt
708: // Key 0x19 modifier key mask bits (0x0d)
709: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
710: (1<<NX_MODIFIERKEY_ALTERNATE),
711: NX_ASCIISET, 'p', // no flags
712: NX_ASCIISET, 'P', // AlphaShift
713: NX_ASCIISET, CTRL('P'), // Ctrl
714: NX_ASCIISET, CTRL('P'), // AlphaShift Ctrl
715: NX_SYMBOLSET, 0x70, // Alt
716: NX_SYMBOLSET, 0x50, // AlphaShift Alt
717: NX_ASCIISET, CTRL('P'), // Ctrl Alt
718: NX_ASCIISET, CTRL('P'), // AlphaShift Ctrl Alt
719: // Key 0x1A modifier key mask bits (0x0e)
720: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
721: (1<<NX_MODIFIERKEY_ALTERNATE),
722: NX_ASCIISET, '[', // no flags
723: NX_ASCIISET, '{', // Shift
724: NX_ASCIISET, CTRL('['), // Ctrl
725: NX_ASCIISET, CTRL('['), // Shift Ctrl
726: NX_ASCIISET, '`', // Alt
727: NX_ASCIISET, 0xaa, // Shift Alt
728: NX_ASCIISET, CTRL('['), // Ctrl Alt
729: NX_ASCIISET, CTRL('['), // Shift Ctrl Alt
730: // Key 0x1B modifier key mask bits (0x0e)
731: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
732: (1<<NX_MODIFIERKEY_ALTERNATE),
733: NX_ASCIISET, ']', // no flags
734: NX_ASCIISET, '}', // Shift
735: NX_ASCIISET, CTRL(']'), // Ctrl
736: NX_ASCIISET, CTRL(']'), // Shift Ctrl
737: NX_ASCIISET, '\'', // Alt
738: NX_ASCIISET, 0xba, // Shift Alt
739: NX_ASCIISET, CTRL(']'), // Ctrl Alt
740: NX_ASCIISET, CTRL(']'), // Shift Ctrl Alt
741: // Key 0x1C modifier key mask bits (0x10)
742: (1<<NX_MODIFIERKEY_COMMAND),
743: NX_ASCIISET, '\r', // no flags
744: NX_ASCIISET, CTRL('C'), // Cmd
745: 0xff, // Key 0x1D unassigned - Left Control
746: // Key 0x1E modifier key mask bits (0x0d)
747: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
748: (1<<NX_MODIFIERKEY_ALTERNATE),
749: NX_ASCIISET, 'a', // no flags
750: NX_ASCIISET, 'A', // AlphaShift
751: NX_ASCIISET, CTRL('A'), // Ctrl
752: NX_ASCIISET, CTRL('A'), // AlphaShift Ctrl
753: NX_ASCIISET, 0xca, // Alt
754: NX_ASCIISET, 0xc7, // AlphaShift Alt
755: NX_ASCIISET, CTRL('A'), // Ctrl Alt
756: NX_ASCIISET, CTRL('A'), // AlphaShift Ctrl Alt
757: // Key 0x1F modifier key mask bits (0x0d)
758: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
759: (1<<NX_MODIFIERKEY_ALTERNATE),
760: NX_ASCIISET, 's', // no flags
761: NX_ASCIISET, 'S', // AlphaShift
762: NX_ASCIISET, CTRL('S'), // Ctrl
763: NX_ASCIISET, CTRL('S'), // AlphaShift Ctrl
764: NX_ASCIISET, 0xfb, // Alt
765: NX_ASCIISET, 0xa7, // AlphaShift Alt
766: NX_ASCIISET, CTRL('S'), // Ctrl Alt
767: NX_ASCIISET, CTRL('S'), // AlphaShift Ctrl Alt
768: // Key 0x20 modifier key mask bits (0x0d)
769: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
770: (1<<NX_MODIFIERKEY_ALTERNATE),
771: NX_ASCIISET, 'd', // no flags
772: NX_ASCIISET, 'D', // AlphaShift
773: NX_ASCIISET, CTRL('D'), // Ctrl
774: NX_ASCIISET, CTRL('D'), // AlphaShift Ctrl
775: NX_SYMBOLSET, 0x44, // Alt
776: NX_SYMBOLSET, 0xb6, // AlphaShift Alt
777: NX_ASCIISET, CTRL('D'), // Ctrl Alt
778: NX_ASCIISET, CTRL('D'), // AlphaShift Ctrl Alt
779: // Key 0x21 modifier key mask bits (0x0d)
780: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
781: (1<<NX_MODIFIERKEY_ALTERNATE),
782: NX_ASCIISET, 'f', // no flags
783: NX_ASCIISET, 'F', // AlphaShift
784: NX_ASCIISET, CTRL('F'), // Ctrl
785: NX_ASCIISET, CTRL('F'), // AlphaShift Ctrl
786: NX_ASCIISET, 0xa6, // Alt
787: NX_SYMBOLSET, 0xac, // AlphaShift Alt
788: NX_ASCIISET, CTRL('F'), // Ctrl Alt
789: NX_ASCIISET, CTRL('F'), // AlphaShift Ctrl Alt
790: // Key 0x22 modifier key mask bits (0x0d)
791: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
792: (1<<NX_MODIFIERKEY_ALTERNATE),
793: NX_ASCIISET, 'g', // no flags
794: NX_ASCIISET, 'G', // AlphaShift
795: NX_ASCIISET, CTRL('G'), // Ctrl
796: NX_ASCIISET, CTRL('G'), // AlphaShift Ctrl
797: NX_ASCIISET, 0xf1, // Alt
798: NX_ASCIISET, 0xe1, // AlphaShift Alt
799: NX_ASCIISET, CTRL('G'), // Ctrl Alt
800: NX_ASCIISET, CTRL('G'), // AlphaShift Ctrl Alt
801: // Key 0x23 modifier key mask bits (0x0d)
802: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
803: (1<<NX_MODIFIERKEY_ALTERNATE),
804: NX_ASCIISET, 'h', // no flags
805: NX_ASCIISET, 'H', // AlphaShift
806: NX_ASCIISET, '\b', // Ctrl
807: NX_ASCIISET, '\b', // AlphaShift Ctrl
808: NX_ASCIISET, 0xe3, // Alt
809: NX_ASCIISET, 0xeb, // AlphaShift Alt
810: NX_ASCIISET, CTRL('@'), // Ctrl Alt
811: 0x18, CTRL('@'), // AlphaShift Ctrl Alt
812: // Key 0x24 modifier key mask bits (0x0d)
813: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
814: (1<<NX_MODIFIERKEY_ALTERNATE),
815: NX_ASCIISET, 'j', // no flags
816: NX_ASCIISET, 'J', // AlphaShift
817: NX_ASCIISET, '\n', // Ctrl
818: NX_ASCIISET, '\n', // AlphaShift Ctrl
819: NX_ASCIISET, 0xc6, // Alt
820: NX_ASCIISET, 0xae, // AlphaShift Alt
821: NX_ASCIISET, '\n', // Ctrl Alt
822: NX_ASCIISET, '\n', // AlphaShift Ctrl Alt
823: // Key 0x25 modifier key mask bits (0x0d)
824: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
825: (1<<NX_MODIFIERKEY_ALTERNATE),
826: NX_ASCIISET, 'k', // no flags
827: NX_ASCIISET, 'K', // AlphaShift
828: NX_ASCIISET, CTRL('K'), // Ctrl
829: NX_ASCIISET, CTRL('K'), // AlphaShift Ctrl
830: NX_ASCIISET, 0xce, // Alt
831: NX_ASCIISET, 0xaf, // AlphaShift Alt
832: NX_ASCIISET, CTRL('K'), // Ctrl Alt
833: NX_ASCIISET, CTRL('K'), // AlphaShift Ctrl Alt
834: // Key 0x26 modifier key mask bits (0x0d)
835: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
836: (1<<NX_MODIFIERKEY_ALTERNATE),
837: NX_ASCIISET, 'l', // no flags
838: NX_ASCIISET, 'L', // AlphaShift
839: NX_ASCIISET, '\f', // Ctrl
840: NX_ASCIISET, '\f', // AlphaShift Ctrl
841: NX_ASCIISET, 0xf8, // Alt
842: NX_ASCIISET, 0xe8, // AlphaShift Alt
843: NX_ASCIISET, '\f', // Ctrl Alt
844: NX_ASCIISET, '\f', // AlphaShift Ctrl Alt
845: // Key 0x27 modifier key mask bits (0x0a)
846: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
847: NX_ASCIISET, ';', // no flags
848: NX_ASCIISET, ':', // Shift
849: NX_SYMBOLSET, 0xb2, // Alt
850: NX_SYMBOLSET, 0xa2, // Shift Alt
851: // Key 0x28 modifier key mask bits (0x0a)
852: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
853: NX_ASCIISET, '\'', // no flags
854: NX_ASCIISET, '"', // Shift
855: NX_ASCIISET, 0xa9, // Alt
856: NX_SYMBOLSET, 0xae, // Shift Alt
857: // Key 0x29 modifier key mask bits (0x02)
858: (1<<NX_MODIFIERKEY_SHIFT),
859: NX_ASCIISET, '`', // no flags
860: NX_ASCIISET, '~', // Shift
861: 0xff, // Key 0x2A unassigned - Left Shift
862: // Key 0x2B modifier key mask bits (0x0e)
863: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
864: (1<<NX_MODIFIERKEY_ALTERNATE),
865: NX_ASCIISET, '\\', // no flags
866: NX_ASCIISET, '|', // Shift
867: NX_ASCIISET, CTRL('\\'), // Ctrl
868: NX_ASCIISET, CTRL('\\'), // Shift Ctrl
869: NX_ASCIISET, 0xe3, // Alt
870: NX_ASCIISET, 0xeb, // Shift Alt
871: NX_ASCIISET, CTRL('\\'), // Ctrl Alt
872: NX_ASCIISET, CTRL('\\'), // Shift Ctrl Alt
873: // Key 0x2C modifier key mask bits (0x0d)
874: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
875: (1<<NX_MODIFIERKEY_ALTERNATE),
876: NX_ASCIISET, 'z', // no flags
877: NX_ASCIISET, 'Z', // AlphaShift
878: NX_ASCIISET, CTRL('Z'), // Ctrl
879: NX_ASCIISET, CTRL('Z'), // AlphaShift Ctrl
880: NX_ASCIISET, 0xcf, // Alt
881: NX_SYMBOLSET, 0x57, // AlphaShift Alt
882: NX_ASCIISET, CTRL('Z'), // Ctrl Alt
883: NX_ASCIISET, CTRL('Z'), // AlphaShift Ctrl Alt
884: // Key 0x2D modifier key mask bits (0x0d)
885: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
886: (1<<NX_MODIFIERKEY_ALTERNATE),
887: NX_ASCIISET, 'x', // no flags
888: NX_ASCIISET, 'X', // AlphaShift
889: NX_ASCIISET, CTRL('X'), // Ctrl
890: NX_ASCIISET, CTRL('X'), // AlphaShift Ctrl
891: NX_SYMBOLSET, 0xb4, // Alt
892: NX_SYMBOLSET, 0xce, // AlphaShift Alt
893: NX_ASCIISET, CTRL('X'), // Ctrl Alt
894: NX_ASCIISET, CTRL('X'), // AlphaShift Ctrl Alt
895: // Key 0x2E modifier key mask bits (0x0d)
896: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
897: (1<<NX_MODIFIERKEY_ALTERNATE),
898: NX_ASCIISET, 'c', // no flags
899: NX_ASCIISET, 'C', // AlphaShift
900: NX_ASCIISET, CTRL('C'), // Ctrl
901: NX_ASCIISET, CTRL('C'), // AlphaShift Ctrl
902: NX_SYMBOLSET, 0xe3, // Alt
903: NX_SYMBOLSET, 0xd3, // AlphaShift Alt
904: NX_ASCIISET, CTRL('C'), // Ctrl Alt
905: NX_ASCIISET, CTRL('C'), // AlphaShift Ctrl Alt
906: // Key 0x2F modifier key mask bits (0x0d)
907: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
908: (1<<NX_MODIFIERKEY_ALTERNATE),
909: NX_ASCIISET, 'v', // no flags
910: NX_ASCIISET, 'V', // AlphaShift
911: NX_ASCIISET, CTRL('V'), // Ctrl
912: NX_ASCIISET, CTRL('V'), // AlphaShift Ctrl
913: NX_SYMBOLSET, 0xd6, // Alt
914: NX_SYMBOLSET, 0xe0, // AlphaShift Alt
915: NX_ASCIISET, CTRL('V'), // Ctrl Alt
916: NX_ASCIISET, CTRL('V'), // AlphaShift Ctrl Alt
917: // Key 0x30 modifier key mask bits (0x0d)
918: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
919: (1<<NX_MODIFIERKEY_ALTERNATE),
920: NX_ASCIISET, 'b', // no flags
921: NX_ASCIISET, 'B', // AlphaShift
922: NX_ASCIISET, CTRL('B'), // Ctrl
923: NX_ASCIISET, CTRL('B'), // AlphaShift Ctrl
924: NX_SYMBOLSET, 0xe5, // Alt
925: NX_SYMBOLSET, 0xf2, // AlphaShift Alt
926: NX_ASCIISET, CTRL('B'), // Ctrl Alt
927: NX_ASCIISET, CTRL('B'), // AlphaShift Ctrl Alt
928: // Key 0x31 modifier key mask bits (0x0d)
929: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
930: (1<<NX_MODIFIERKEY_ALTERNATE),
931: NX_ASCIISET, 'n', // no flags
932: NX_ASCIISET, 'N', // AlphaShift
933: NX_ASCIISET, CTRL('N'), // Ctrl
934: NX_ASCIISET, CTRL('N'), // AlphaShift Ctrl
935: NX_ASCIISET, 0xc4, // Alt
936: NX_SYMBOLSET, 0xaf, // AlphaShift Alt
937: NX_ASCIISET, CTRL('N'), // Ctrl Alt
938: NX_ASCIISET, CTRL('N'), // AlphaShift Ctrl Alt
939: // Key 0x32 modifier key mask bits (0x0d)
940: (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
941: (1<<NX_MODIFIERKEY_ALTERNATE),
942: NX_ASCIISET, 'm', // no flags
943: NX_ASCIISET, 'M', // AlphaShift
944: NX_ASCIISET, '\r', // Ctrl
945: NX_ASCIISET, '\r', // AlphaShift Ctrl
946: NX_SYMBOLSET, 0x6d, // Alt
947: NX_SYMBOLSET, 0xd8, // AlphaShift Alt
948: NX_ASCIISET, '\r', // Ctrl Alt
949: NX_ASCIISET, '\r', // AlphaShift Ctrl Alt
950: // Key 0x33 modifier key mask bits (0x0a)
951: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
952: NX_ASCIISET, ',', // no flags
953: NX_ASCIISET, '<', // Shift
954: NX_ASCIISET, 0xcb, // Alt
955: NX_SYMBOLSET, 0xa3, // Shift Alt
956: // Key 0x34 modifier key mask bits (0x0a)
957: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
958: NX_ASCIISET, '.', // no flags
959: NX_ASCIISET, '>', // Shift
960: NX_ASCIISET, 0xbc, // Alt
961: NX_SYMBOLSET, 0xb3, // Shift Alt
962: // Key 0x35 modifier key mask bits (0x0a)
963: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
964: NX_ASCIISET, '/', // no flags
965: NX_ASCIISET, '?', // Shift
966: NX_SYMBOLSET, 0xb8, // Alt
967: NX_ASCIISET, 0xbf, // Shift Alt
968: 0xff, // Key 0x36 unassigned - Right Shift
969: // Key 0x37 modifier key mask bits (0x00)
970: 0,
971: NX_ASCIISET, '*', // all
972: 0xff, // Key 0x38 unassigned - Left Alt
973: // Key 0x39 modifier key mask bits (0x0c)
974: (1<<NX_MODIFIERKEY_CONTROL)|(1<<NX_MODIFIERKEY_ALTERNATE),
975: NX_ASCIISET, ' ', // no flags
976: NX_ASCIISET, CTRL('@'), // Ctrl
977: NX_ASCIISET, 0x80, // Alt
978: NX_ASCIISET, CTRL('@'), // Ctrl Alt
979: 0xff, // Key 0x3A unassigned - CAPS LOCK
980: 0xff, // Key 0x3B unassigned - F1
981: 0xff, // Key 0x3C unassigned - F2
982: 0xff, // Key 0x3D unassigned - F3
983: 0xff, // Key 0x3E unassigned - F4
984: 0xff, // Key 0x3F unassigned - F5
985: 0xff, // Key 0x40 unassigned - F6
986: 0xff, // Key 0x41 unassigned - F7
987: 0xff, // Key 0x42 unassigned - F8
988: 0xff, // Key 0x43 unassigned - F9
989: 0xff, // Key 0x44 unassigned - F10
990: // Key 0x45 modifier key mask bits (0x0a)
991: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
992: NX_ASCIISET, '`', // no flags
993: NX_ASCIISET, '~', // Shift
994: NX_ASCIISET, '`', // Alt
995: NX_SYMBOLSET, 0xbb, // Shift Alt
996: 0xff, // Key 0x46 unassigned
997: // Key 0x47 modifier key mask bits (0x00)
998: 0,
999: NX_ASCIISET, '7', // all
1000: // Key 0x48 modifier key mask bits (0x00)
1001: 0,
1002: NX_ASCIISET, '8', // all
1003: // Key 0x49 modifier key mask bits (0x00)
1004: 0,
1005: NX_ASCIISET, '9', // all
1006: // Key 0x4A modifier key mask bits (0x00)
1007: 0,
1008: NX_SYMBOLSET, 0x2d, // all
1009: // Key 0x4B modifier key mask bits (0x00)
1010: 0,
1011: NX_ASCIISET, '4', // all
1012: // Key 0x4C modifier key mask bits (0x00)
1013: 0,
1014: NX_ASCIISET, '5', // all
1015: // Key 0x4D modifier key mask bits (0x00)
1016: 0,
1017: NX_ASCIISET, '6', // all
1018: // Key 0x4E modifier key mask bits (0x00)
1019: 0,
1020: NX_ASCIISET, '+', // all
1021: // Key 0x4F modifier key mask bits (0x00)
1022: 0,
1023: NX_ASCIISET, '1', // all
1024: // Key 0x50 modifier key mask bits (0x00)
1025: 0,
1026: NX_ASCIISET, '2', // all
1027: // Key 0x51 modifier key mask bits (0x00)
1028: 0,
1029: NX_ASCIISET, '3', // all
1030: // Key 0x52 modifier key mask bits (0x00)
1031: 0,
1032: NX_ASCIISET, '0', // all
1033: // Key 0x53 modifier key mask bits (0x00)
1034: 0,
1035: NX_ASCIISET, '.', // all
1036: 0xff, // Key 0x54 unassigned
1037: 0xff, // Key 0x55 unassigned
1038: 0xff, // Key 0x56 unassigned
1039: 0xff, // Key 0x57 unassigned - F11
1040: 0xff, // Key 0x58 unassigned - F12
1041: 0xff, // Key 0x59 unassigned
1042: 0xff, // Key 0x5A unassigned
1043: 0xff, // Key 0x5B unassigned
1044: 0xff, // Key 0x5C unassigned
1045: 0xff, // Key 0x5D unassigned
1046: 0xff, // Key 0x5E unassigned
1047: 0xff, // Key 0x5F unassigned
1048: 0xff, // Key 0x60 unassigned - Right Ctrl
1049: 0xff, // Key 0x61 unassigned - Right Alt
1050: // Key 0x62 modifier key mask bits (0x00)
1051: 0,
1052: NX_ASCIISET, CTRL('C'), // all
1053: // Key 0x63 modifier key mask bits (0x0e)
1054: (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
1055: (1<<NX_MODIFIERKEY_ALTERNATE),
1056: NX_ASCIISET, '/', // no flags
1057: NX_ASCIISET, '\\', // Shift
1058: NX_ASCIISET, '/', // Ctrl
1059: NX_ASCIISET, CTRL('\\'), // Shift Ctrl
1060: NX_ASCIISET, '/', // Alt
1061: NX_ASCIISET, '\\', // Shift Alt
1062: NX_ASCIISET, CTRL('@'), // Ctrl Alt
1063: 0x0a, CTRL('@'), // Shift Ctrl Alt
1064: // Key 0x64 modifier key mask bits (0x00)
1065: 0,
1066: NX_SYMBOLSET, 0xad, // all
1067: // Key 0x65 modifier key mask bits (0x00)
1068: 0,
1069: NX_SYMBOLSET, 0xaf, // all
1070: // Key 0x66 modifier key mask bits (0x00)
1071: 0,
1072: NX_SYMBOLSET, 0xac, // all
1073: // Key 0x67 modifier key mask bits (0x00)
1074: 0,
1075: NX_SYMBOLSET, 0xae, // all
1076: 0, // Sequence Definitions
1077: 9, // special keys
1078: 0x00, 0x68, // Sound Up
1079: 0x01, 0x69, // Sound Down
1080: 0x02, 0x6A, // Brightness Up
1081: 0x03, 0x6B, // Brightness Down
1082: 0x04, 0x3A, // Caps Lock
1083: 0x05, 0x3B, // Help Key
1084: 0x06, 0x47, // Power Key
1085: 0x07, 0x48, // Up Arrow
1086: 0x08, 0x50 // Down Arrow
1087: };
1088:
1089: *length = sizeof(defaultKeymapForPC);
1090: return defaultKeymapForPC;
1091: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.