Annotation of XNU/iokit/Drivers/hidsystem/drvApplePS2Keyboard/ApplePS2Keyboard.cpp, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.