Annotation of ntddk/src/input/kbdgr/kbdgr.c, revision 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.