Annotation of ntddk/src/input/kbdgr/kbdgr.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************\
                      2: * Module Name: kbdgr.c
                      3: *
                      4: * Copyright (c) 1985-93, Microsoft Corporation
                      5: *
                      6: * History:
                      7: * 15-01-92 PamelaO      Created.
                      8: * 04/21/92 a-kchang     Modified.
                      9: \***************************************************************************/
                     10: 
                     11: #include <windows.h>
                     12: #include "vkoem.h"
                     13: #include "kbd.h"
                     14: #include "kbdgr.h"
                     15: 
                     16: /***************************************************************************\
                     17: * asuVK[] - Virtual Scan Code to Virtual Key conversion table for GR
                     18: \***************************************************************************/
                     19: 
                     20: static USHORT ausVK[] = {
                     21:     T00, T01, T02, T03, T04, T05, T06, T07,
                     22:     T08, T09, T0A, T0B, T0C, T0D, T0E, T0F,
                     23:     T10, T11, T12, T13, T14, T15, T16, T17,
                     24:     T18, T19, T1A, T1B, T1C, T1D, T1E, T1F,
                     25:     T20, T21, T22, T23, T24, T25, T26, T27,
                     26:     T28, T29, T2A, T2B, T2C, T2D, T2E, T2F,
                     27:     T30, T31, T32, T33, T34, T35,
                     28: 
                     29:     /* 
                     30:      * Right-hand Shift key must have KBDEXT bit set.
                     31:      */
                     32:     T36 | KBDEXT,
                     33: 
                     34:     T37 | KBDMULTIVK,               // numpad_* + Shift/Alt -> SnapShot
                     35: 
                     36:     T38, T39, T3A, T3B, T3C, T3D, T3E,
                     37:     T3F, T40, T41, T42, T43, T44,
                     38: 
                     39:     /*
                     40:      * NumLock Key:
                     41:      *     KBDEXT     - VK_NUMLOCK is an Extended key
                     42:      *     KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL)
                     43:      */
                     44:     T45 | KBDEXT | KBDMULTIVK,
                     45: 
                     46:     T46 | KBDMULTIVK,
                     47: 
                     48:     /*
                     49:      * Number Pad keys:
                     50:      *     KBDNUMPAD  - digits 0-9 and decimal point.
                     51:      *     KBDSPECIAL - require special processing by Windows
                     52:      */
                     53:     T47 | KBDNUMPAD | KBDSPECIAL,   // Numpad 7 (Home)
                     54:     T48 | KBDNUMPAD | KBDSPECIAL,   // Numpad 8 (Up),
                     55:     T49 | KBDNUMPAD | KBDSPECIAL,   // Numpad 9 (PgUp),
                     56:     T4A,
                     57:     T4B | KBDNUMPAD | KBDSPECIAL,   // Numpad 4 (Left),
                     58:     T4C | KBDNUMPAD | KBDSPECIAL,   // Numpad 5 (Clear),
                     59:     T4D | KBDNUMPAD | KBDSPECIAL,   // Numpad 6 (Right),
                     60:     T4E,
                     61:     T4F | KBDNUMPAD | KBDSPECIAL,   // Numpad 1 (End),
                     62:     T50 | KBDNUMPAD | KBDSPECIAL,   // Numpad 2 (Down),
                     63:     T51 | KBDNUMPAD | KBDSPECIAL,   // Numpad 3 (PgDn),
                     64:     T52 | KBDNUMPAD | KBDSPECIAL,   // Numpad 0 (Ins),
                     65:     T53 | KBDNUMPAD | KBDSPECIAL,   // Numpad . (Del),
                     66: 
                     67:     T54, T55, T56, T57, T58
                     68: 
                     69: };
                     70: 
                     71: static VSC_VK aE0VscToVk[] = {
                     72:         { 0x1C, X1C | KBDEXT              },  // Numpad Enter
                     73:         { 0x1D, X1D | KBDEXT              },  // RControl
                     74:         { 0x35, X35 | KBDEXT              },  // Numpad Divide
                     75:         { 0x37, X37 | KBDEXT              },  // Snapshot
                     76:         { 0x38, X38 | KBDEXT | KBDSPECIAL },  // RMenu (AltGr)
                     77:         { 0x46, X46 | KBDEXT              },  // Break (Ctrl + Pause)
                     78:         { 0x47, X47 | KBDEXT              },  // Home
                     79:         { 0x48, X48 | KBDEXT              },  // Up
                     80:         { 0x49, X49 | KBDEXT              },  // Prior
                     81:         { 0x4B, X4B | KBDEXT              },  // Left
                     82:         { 0x4D, X4D | KBDEXT              },  // Right
                     83:         { 0x4F, X4F | KBDEXT              },  // End
                     84:         { 0x50, X50 | KBDEXT              },  // Down
                     85:         { 0x51, X51 | KBDEXT              },  // Next
                     86:         { 0x52, X52 | KBDEXT              },  // Insert
                     87:         { 0x53, X53 | KBDEXT              },  // Delete
                     88:         { 0,      0                       }
                     89: };
                     90: 
                     91: static VSC_VK aE1VscToVk[] = {
                     92:         { 0x1D, Y1D                       },  // Pause
                     93:         { 0   ,   0                       }
                     94: };
                     95: 
                     96: /***************************************************************************\
                     97: * aVkToBits[]  - define bitmask values for character-modifier keys
                     98: *
                     99: * typedef struct {
                    100: *     BYTE Vk;        // Virtual Key that modifies character production
                    101: *     BYTE ModBits;   // Bitmask to represent this key.
                    102: * } [];
                    103: *
                    104: * Vk       - Virtual Key code (eg: VK_SHIFT, VK_RMENU, VK_CONTROL,...)
                    105: *            Reserved Values:
                    106: *                0        null terminator
                    107: *
                    108: * ModBits  - A bitmask encoding the shifter key for use in CharModifiers (blow)
                    109: *            Reserved Values:
                    110: *                KBDSHIFT 0
                    111: *                KBDCTRL  1
                    112: *                KBDALT   2
                    113: *
                    114: * Layouts that use AltGr (VK_RMENU) to modify characters do not use this
                    115: * method to map the right-hand Alt key to Ctrl+Alt.  The KLLF_ALTGR flag
                    116: * is used instead (below).
                    117: *
                    118: * German keyboard has only three shifter keys (may be used in combination)
                    119: *     SHIFT (L & R) affects alphabnumeric keys,
                    120: *     CTRL  (L & R) is used to generate control characters
                    121: *     ALT   (L & R) used for generating characters by number with numpad
                    122: \***************************************************************************/
                    123: 
                    124: static VK_TO_BIT aVkToBits[] = {
                    125:     { VK_SHIFT,   KBDSHIFT },
                    126:     { VK_CONTROL, KBDCTRL  },
                    127:     { VK_MENU,    KBDALT   },
                    128:     { 0,          0        }
                    129: };
                    130: 
                    131: /***************************************************************************\
                    132: * aModification[]  - map character-modifier bitmask to character table index.
                    133: *
                    134: * typedef struct {
                    135: *     PVK_TO_BIT pVkToBit;     // Points to the aVkToBits[] table (above)
                    136: *     WORD       wMaxModBits;  // max valid character-modifier bitmask.
                    137: *     BYTE       ModNumber[];  // table to map char-modifier bitmask to index.
                    138: * } MODIFIERS, *PMODIFIERS;
                    139: *
                    140: * Reserved index values (in ModNumber[character-modifier bitmask])
                    141: *   SHFT_INVALID - no characters produced with this shift state.
                    142: *
                    143: * Note: index values are chosen to minimise character table sizes: the least
                    144: *       used char-modifier key combinations are given the highest indices.
                    145: \***************************************************************************/
                    146: 
                    147: static MODIFIERS CharModifiers = {
                    148:     &aVkToBits[0],
                    149:     6,
                    150:     {
                    151:     //   Character    Char-Mod 
                    152:     //  Table Index   Bitmask   Keys Pressed  : notes
                    153:     //  ===========   ======== ============== : ============
                    154:         0,            // 000                  : unshifted characters
                    155:         1,            // 001            SHIFT : capitals, ~!@# etc.
                    156:         3,            // 010       CTRL       : control characters
                    157:         4,            // 011       CTRL SHIFT : control characters
                    158:         SHFT_INVALID, // 100   ALT            : -- invalid --
                    159:         SHFT_INVALID, // 101   ALT      SHIFT : -- invalid --
                    160:         2             // 110   ALT CTRL       : equivalent to AltGr
                    161:                       // 111   ALT CTRL SHIFT : -- invalid --
                    162:     }
                    163: };
                    164: 
                    165: /***************************************************************************\
                    166: * aVkToWch2[]  - Virtual Key -> WCHAR for keys with max char-mod index == 2
                    167: * aVkToWch3[]  - Virtual Key -> WCHAR for keys with max char-mod index == 3
                    168: * aVkToWch4[]  - Virtual Key -> WCHAR for keys with max char-mod index == 4
                    169: * aVkToWch5[]  - Virtual Key -> WCHAR for keys with max char-mod index == 5
                    170: *
                    171: * This table is searched for a matching Virtual Key, then indexed with
                    172: * the character-modifier index to find the corresponding characters.
                    173: * typedef struct _VK_TO_WCHARS3 {
                    174: *     BYTE  VirtualKey;      \\ The Virtual Key code
                    175: *     BYTE  Attributes;      \\ does the CapsLock key modify the character 
                    176: *     WCHAR wch[3];          \\ Array of characters, index by char-mod index
                    177: * };
                    178: *
                    179: * Reserved VirtualKey values (first column)
                    180: *     0xff          - this line contains dead characters (diacritic)
                    181: *     0             - terminator
                    182: *
                    183: * Reserved Attribute values (second column)
                    184: *     CAPLOK        - CapsLock affects this key like Shift
                    185: *
                    186: * Reserved character values (third through last column)
                    187: *     WCH_NONE      - No character
                    188: *     WCH_DEAD      - Dead character (diacritic) value is in next line
                    189: *
                    190: \***************************************************************************/
                    191: 
                    192: static VK_TO_WCHARS2 aVkToWch2[] = {
                    193:     {'1'          , CAPLOK ,'1'       ,'!'       },
                    194:     {'4'          , CAPLOK ,'4'       ,'$'       },
                    195:     {'5'          , CAPLOK ,'5'       ,'%'       },
                    196:     {'A'          , CAPLOK ,'a'       ,'A'       },
                    197:     {'B'          , CAPLOK ,'b'       ,'B'       },
                    198:     {'C'          , CAPLOK ,'c'       ,'C'       },
                    199:     {'D'          , CAPLOK ,'d'       ,'D'       },
                    200:     {'E'          , CAPLOK ,'e'       ,'E'       },
                    201:     {'F'          , CAPLOK ,'f'       ,'F'       },
                    202:     {'G'          , CAPLOK ,'g'       ,'G'       },
                    203:     {'H'          , CAPLOK ,'h'       ,'H'       },
                    204:     {'I'          , CAPLOK ,'i'       ,'I'       },
                    205:     {'J'          , CAPLOK ,'j'       ,'J'       },
                    206:     {'K'          , CAPLOK ,'k'       ,'K'       },
                    207:     {'L'          , CAPLOK ,'l'       ,'L'       },
                    208:     {'N'          , CAPLOK ,'n'       ,'N'       },
                    209:     {'O'          , CAPLOK ,'o'       ,'O'       },
                    210:     {'P'          , CAPLOK ,'p'       ,'P'       },
                    211:     {'R'          , CAPLOK ,'r'       ,'R'       },
                    212:     {'S'          , CAPLOK ,'s'       ,'S'       },
                    213:     {'T'          , CAPLOK ,'t'       ,'T'       },
                    214:     {'U'          , CAPLOK ,'u'       ,'U'       },
                    215:     {'V'          , CAPLOK ,'v'       ,'V'       },
                    216:     {'W'          , CAPLOK ,'w'       ,'W'       },
                    217:     {'X'          , CAPLOK ,'x'       ,'X'       },
                    218:     {'Y'          , CAPLOK ,'y'       ,'Y'       },
                    219:     {'Z'          , CAPLOK ,'z'       ,'Z'       },
                    220:     {VK_OEM_3     , CAPLOK ,0xf6      ,0xd6      },
                    221:     {VK_OEM_5     , 0      ,WCH_DEAD  ,0xb0      },
                    222:     { 0xff        , CAPLOK ,'^'       ,WCH_NONE  },
                    223:     {VK_OEM_6     , 0      ,WCH_DEAD  ,WCH_DEAD  },
                    224:     { 0xff        , CAPLOK ,0xb4      ,0x60      },  // Acute, Grave
                    225:     {VK_OEM_7     , CAPLOK ,0xe4      ,0xc4      },
                    226:     {VK_OEM_8     , 0      ,WCH_NONE  ,WCH_NONE  },
                    227:     {VK_OEM_COMMA , CAPLOK ,','       ,';'       },
                    228:     {VK_OEM_PERIOD, CAPLOK ,'.'       ,':'       },
                    229:     {VK_TAB       , 0      ,'\t'      ,'\t'      },
                    230:     {VK_ADD       , 0      ,'+'       ,'+'       },     // Jun-03-92
                    231:     {VK_DECIMAL   , 0      ,','       ,','       },
                    232:     {VK_DIVIDE    , 0      ,'/'       ,'/'       },
                    233:     {VK_MULTIPLY  , 0      ,'*'       ,'*'       },
                    234:     {VK_SUBTRACT  , CAPLOK ,'-'       ,'-'       },
                    235:     {0            , 0      ,0         ,0         }
                    236: };
                    237: 
                    238: static VK_TO_WCHARS3 aVkToWch3[] = {
                    239:     //                     |          |   SHIFT  | CTRL+ALT  |
                    240:     //                     |          |==========|===========|
                    241:     {'0'          , CAPLOK ,'0'       ,'='       , '}'       },
                    242:     {'3'          , CAPLOK ,'3'       ,0xa7      , 0xb3      },
                    243:     {'7'          , CAPLOK ,'7'       ,'/'       , '{'       },
                    244:     {'8'          , CAPLOK ,'8'       ,'('       , '['       },
                    245:     {'9'          , CAPLOK ,'9'       ,')'       , ']'       },
                    246:     {'M'          , CAPLOK ,'m'       ,'M'       , 0xb5      },
                    247:     {'Q'          , CAPLOK ,'q'       ,'Q'       , '@'       },
                    248:     {VK_OEM_102   , 0      ,'<'       ,'>'       , '|'       },
                    249:     {VK_OEM_4     , CAPLOK ,0xdf      ,'?'       , '\\'      },
                    250:     {0            , 0      ,0         ,0         , 0         }
                    251: };
                    252: 
                    253: static VK_TO_WCHARS4 aVkToWch4[] = {
                    254:     //                     |          |   SHIFT  | CTRL+ALT  |  CONTROL  |
                    255:     //                     |          |==========|===========|===========|
                    256:     {VK_BACK      , 0      ,'\b'      ,'\b'      , WCH_NONE  , 0x7f      },
                    257:     {VK_CANCEL    , 0      ,0x03      ,0x03      , WCH_NONE  , 0x03      },
                    258:     {VK_ESCAPE    , 0      ,0x1b      ,0x1b      , WCH_NONE  , 0x1b      },
                    259:     {VK_OEM_1     , CAPLOK ,0xfc      ,0xdc      , WCH_NONE  , 0x1b      },
                    260:     {VK_OEM_2     , CAPLOK ,'#'       ,0x27      , WCH_NONE  , 0x1c      },
                    261:     {VK_OEM_PLUS  , CAPLOK ,'+'       ,'*'       , '~'       , 0x1d      },
                    262:     {VK_RETURN    , 0      ,'\r'      ,'\r'      , WCH_NONE  , '\n'      },
                    263:     {VK_SPACE     , 0      ,' '       ,' '       , WCH_NONE  , 0x20      },
                    264:     {0            , 0      ,0         ,0         , 0         , 0         }
                    265: };
                    266: 
                    267: static VK_TO_WCHARS5 aVkToWch5[] = {
                    268:     //                     |    | SHIFT  | CTRL+ALT  |  CONTROL  | SHFT+CTRL |
                    269:     //                     |    |========|===========|===========|===========|
                    270:     {'2'          , CAPLOK ,'2' ,'"'     , 0xb2      , WCH_NONE  , 0x00      },
                    271:     {'6'          , CAPLOK ,'6' ,'&'     , WCH_NONE  , WCH_NONE  , 0x1e      },
                    272:     {VK_OEM_MINUS , 0      ,'-' ,'_'     , WCH_NONE  , WCH_NONE  , 0x1f      },
                    273:     {0            , 0      ,0   ,0       , 0         , 0         , 0         }
                    274: };
                    275: 
                    276: static VK_TO_WCHARS1 aVkToWch1[] = {
                    277:     { VK_NUMPAD0   , 0      ,  '0'   },
                    278:     { VK_NUMPAD1   , 0      ,  '1'   },
                    279:     { VK_NUMPAD2   , 0      ,  '2'   },
                    280:     { VK_NUMPAD3   , 0      ,  '3'   },
                    281:     { VK_NUMPAD4   , 0      ,  '4'   },
                    282:     { VK_NUMPAD5   , 0      ,  '5'   },
                    283:     { VK_NUMPAD6   , 0      ,  '6'   },
                    284:     { VK_NUMPAD7   , 0      ,  '7'   },
                    285:     { VK_NUMPAD8   , 0      ,  '8'   },
                    286:     { VK_NUMPAD9   , 0      ,  '9'   },
                    287:     { 0            , 0      ,  '\0'  }   //null terminator
                    288: };
                    289: 
                    290: /***************************************************************************\
                    291: * aVkToWcharTable: table of pointers to Character Tables
                    292: *
                    293: * Describes the character tables and the order they should be searched.
                    294: *
                    295: * Note: the order determines the behavior of VkKeyScan() : this function
                    296: *       takes a character and attempts to find a Virtual Key and character-
                    297: *       modifier key combination that produces that character.  The table
                    298: *       containing the numeric keypad (aVkToWch1) must appear last so that
                    299: *       VkKeyScan('0') will be interpreted as one of keys from the main
                    300: *       section, not the numpad.  etc.
                    301: \***************************************************************************/
                    302: 
                    303: static VK_TO_WCHAR_TABLE aVkToWcharTable[] = {
                    304:     {  (PVK_TO_WCHARS1)aVkToWch3, 3, sizeof(aVkToWch3[0]) },
                    305:     {  (PVK_TO_WCHARS1)aVkToWch4, 4, sizeof(aVkToWch4[0]) },
                    306:     {  (PVK_TO_WCHARS1)aVkToWch5, 5, sizeof(aVkToWch5[0]) },
                    307:     {  (PVK_TO_WCHARS1)aVkToWch2, 2, sizeof(aVkToWch2[0]) },
                    308:     {  (PVK_TO_WCHARS1)aVkToWch1, 1, sizeof(aVkToWch1[0]) }, // must come last
                    309:     {                       NULL, 0, 0                    }
                    310: };
                    311: 
                    312: /***************************************************************************\
                    313: * aKeyNames[], aKeyNamesExt[]  - Scan Code -> Key Name tables
                    314: *
                    315: * For the GetKeyNameText() API function
                    316: *
                    317: * Tables for non-extended and extended (KBDEXT) keys.
                    318: * (Keys producing printable characters are named by the character itself)
                    319: \***************************************************************************/
                    320: 
                    321: static VSC_LPWSTR aKeyNames[] = {
                    322:     0x01,    L"ESC",
                    323:     0x0e,    L"R\xDC" L"CK",
                    324:     0x0f,    L"TABULATOR",
                    325:     0x1c,    L"EINGABE",
                    326:     0x1d,    L"STRG",
                    327:     0x2a,    L"UMSCHALT",
                    328:     0x36,    L"UMSCHALT RECHTS",
                    329:     0x37,    L" (ZEHNERTASTATUR)",
                    330:     0x38,    L"ALT",
                    331:     0x39,    L"LEER",
                    332:     0x3a,    L"FESTSTELL",
                    333:     0x3b,    L"F1",
                    334:     0x3c,    L"F2",
                    335:     0x3d,    L"F3",
                    336:     0x3e,    L"F4",
                    337:     0x3f,    L"F5",
                    338:     0x40,    L"F6",
                    339:     0x41,    L"F7",
                    340:     0x42,    L"F8",
                    341:     0x43,    L"F9",
                    342:     0x44,    L"F10",
                    343:     0x45,    L"PAUSE",
                    344:     0x46,    L"ROLLEN-FESTSTELL",
                    345:     0x47,    L"7 (ZEHNERTASTATUR)",
                    346:     0x48,    L"8 (ZEHNERTASTATUR)",
                    347:     0x49,    L"9 (ZEHNERTASTATUR)",
                    348:     0x4a,    L"- (ZEHNERTASTATUR)",
                    349:     0x4b,    L"4 (ZEHNERTASTATUR)",
                    350:     0x4c,    L"5 (ZEHNERTASTATUR)",
                    351:     0x4d,    L"6 (ZEHNERTASTATUR)",
                    352:     0x4e,    L"+ (ZEHNERTASTATUR)",
                    353:     0x4f,    L"1 (ZEHNERTASTATUR)",
                    354:     0x50,    L"2 (ZEHNERTASTATUR)",
                    355:     0x51,    L"3 (ZEHNERTASTATUR)",
                    356:     0x52,    L"0 (ZEHNERTASTATUR)",
                    357:     0x53,    L"KOMMA (ZEHNERTASTATUR)",
                    358:     0x57,    L"F11",
                    359:     0x58,    L"F12",
                    360:     0   ,    NULL
                    361: };
                    362: 
                    363: static VSC_LPWSTR aKeyNamesExt[] = {
                    364:     0x1c,    L"EINGABE (ZEHNERTASTATUR)",
                    365:     0x1d,    L"STRG-RECHTS",
                    366:     0x35,    L" (ZEHNERTASTATUR)",
                    367:     0x37,    L"DRUCK",
                    368:     0x38,    L"ALT GR",
                    369:     0x45,    L"NUM-FESTSTELL",
                    370:     0x46,    L"UNTBR",              // ICO Break
                    371:     0x47,    L"POS1",
                    372:     0x48,    L"NACH-OBEN",
                    373:     0x49,    L"BILD-NACH-OBEN",
                    374:     0x4b,    L"NACH-LINKS",
                    375:     0x4d,    L"NACH-RECHTS",
                    376:     0x4f,    L"ENDE",
                    377:     0x50,    L"NACH-UNTEN",
                    378:     0x51,    L"BILD-NACH-UNTEN",
                    379:     0x52,    L"EINFG",
                    380:     0x53,    L"ENTF",
                    381:     0x54,    L"<00>",               // ICO 00
                    382:     0x56,    L"HILFE",              // ICO Help
                    383:     0x5c,    L"L\x00D6SCH",         // ICO Clear
                    384:     0   ,    NULL
                    385: };
                    386: 
                    387: static LPWSTR aKeyNamesDead[] =  {
                    388:     L"\x00B4"     L"AKUT",
                    389:     L"`"          L"GRAVIS",
                    390:     L"^"          L"ZIRKUMFLEX",
                    391:     NULL
                    392: };
                    393: 
                    394: static DEADKEY aDeadKey[] = {
                    395:     DEADTRANS(L'a', L'`', 0x00E0),  // GRAVE
                    396:     DEADTRANS(L'e', L'`', 0x00E8),
                    397:     DEADTRANS(L'i', L'`', 0x00EC),
                    398:     DEADTRANS(L'o', L'`', 0x00F2),
                    399:     DEADTRANS(L'u', L'`', 0x00F9),
                    400:     DEADTRANS(L'A', L'`', 0x00C0),
                    401:     DEADTRANS(L'E', L'`', 0x00C8),
                    402:     DEADTRANS(L'I', L'`', 0x00CC),
                    403:     DEADTRANS(L'O', L'`', 0x00D2),
                    404:     DEADTRANS(L'U', L'`', 0x00D9),
                    405:     DEADTRANS(L' ', L'`', L'`'  ),
                    406: 
                    407:     DEADTRANS(L'a', 0x00B4, 0x00E1), // ACUTE
                    408:     DEADTRANS(L'e', 0x00B4, 0x00E9),
                    409:     DEADTRANS(L'i', 0x00B4, 0x00ED),
                    410:     DEADTRANS(L'o', 0x00B4, 0x00F3),
                    411:     DEADTRANS(L'u', 0x00B4, 0x00FA),
                    412:     DEADTRANS(L'y', 0x00B4, 0x00FD),
                    413:     DEADTRANS(L'A', 0x00B4, 0x00C1),
                    414:     DEADTRANS(L'E', 0x00B4, 0x00C9),
                    415:     DEADTRANS(L'I', 0x00B4, 0x00CD),
                    416:     DEADTRANS(L'O', 0x00B4, 0x00D3),
                    417:     DEADTRANS(L'U', 0x00B4, 0x00DA),
                    418:     DEADTRANS(L'Y', 0x00B4, 0x00DD),
                    419:     DEADTRANS(L' ', 0x00B4, 0x00B4),
                    420: 
                    421:     DEADTRANS(L'a', L'^', 0x00E2),  // CIRCUMFLEX
                    422:     DEADTRANS(L'e', L'^', 0x00EA),
                    423:     DEADTRANS(L'i', L'^', 0x00EE),
                    424:     DEADTRANS(L'o', L'^', 0x00F4),
                    425:     DEADTRANS(L'u', L'^', 0x00FB),
                    426:     DEADTRANS(L'A', L'^', 0x00C2),
                    427:     DEADTRANS(L'E', L'^', 0x00CA),
                    428:     DEADTRANS(L'I', L'^', 0x00CE),
                    429:     DEADTRANS(L'O', L'^', 0x00D4),
                    430:     DEADTRANS(L'U', L'^', 0x00DB),
                    431:     DEADTRANS(L' ', L'^', L'^'  ),
                    432:     0, 0
                    433: };
                    434: 
                    435: /***************************************************************************\
                    436: * Structure describing all tables for the layout, plus some additional flags.
                    437: *
                    438: \***************************************************************************/
                    439: 
                    440: static KBDTABLES KbdTables = {
                    441:     /*
                    442:      * Modifier keys
                    443:      */
                    444:     &CharModifiers,
                    445: 
                    446:     /*
                    447:      * Characters tables
                    448:      */
                    449:     aVkToWcharTable,
                    450: 
                    451:     /*
                    452:      * Diacritics
                    453:      */
                    454:     aDeadKey,
                    455: 
                    456:     /*
                    457:      * Names of Keys
                    458:      */
                    459:     aKeyNames,
                    460:     aKeyNamesExt,
                    461:     aKeyNamesDead,
                    462: 
                    463:     /*
                    464:      * Scan codes to Virtual Keys
                    465:      */
                    466:     ausVK,
                    467:     sizeof(ausVK) / sizeof(ausVK[0]),
                    468:     aE0VscToVk,
                    469:     aE1VscToVk,
                    470: 
                    471:     /*
                    472:      * layout-specific flags
                    473:      */
                    474:     KLLF_ALTGR        // Windows must convert AltGr key to Ctrl+Alt
                    475: };
                    476: 
                    477: /*
                    478:  * Returns the address of the layout's KbdTables struct
                    479:  * Must be exported.
                    480:  */
                    481: PKBDTABLES KbdLayerDescriptor(VOID)
                    482: {
                    483:     return &KbdTables;
                    484: }

unix.superglobalmegacorp.com

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