Annotation of ntddk/src/input/inc/kbd.h, revision 1.1.1.1

1.1       root        1: /****************************** Module Header ******************************\
                      2: * Module Name: kbd.h
                      3: *
                      4: * Copyright (c) 1985-91, Microsoft Corporation
                      5: *
                      6: * Keyboard table values that form the basis for languages and keyboard types.
                      7: * The basis is US, kbd type 4 - all others are a variation on this.
                      8: * This file is included by all kbd**.h files.
                      9: *
                     10: * History:
                     11: * 10-Jan-1991 GregoryW
                     12: * 23-Apr-1991 IanJa         VSC_TO_VK _* macros from oemtab.c
                     13: \***************************************************************************/
                     14: 
                     15: #ifndef _KBD_
                     16: #define _KBD_
                     17: 
                     18: /****************************************************************************\
                     19: *
                     20: * Keyboard Layers.   Used in kdb??.dll and in usersrv.dll
                     21: *
                     22: \****************************************************************************/
                     23: 
                     24: /*
                     25:  * Key Event (KE) structure
                     26:  * Stores a Virtual Key event
                     27:  */
                     28: typedef struct tagKE {
                     29:     BYTE   bScanCode;   // Virtual Scan Code (Set 1)
                     30:     USHORT usFlaggedVk; // Vk | Flags 
                     31: } KE, *PKE;
                     32: 
                     33: typedef BOOL (* KEPROC)(PKE pKe);
                     34: 
                     35: /*
                     36:  * KE.usFlaggedVk values, also used in the keyboard layer tables.
                     37:  */
                     38: #define KBDEXT     (USHORT)0x0100
                     39: #define KBDMULTIVK (USHORT)0x0200
                     40: #define KBDSPECIAL (USHORT)0x0400
                     41: #define KBDNUMPAD  (USHORT)0x0800
                     42: #define KBDBREAK   (USHORT)0x8000
                     43: 
                     44: /*
                     45:  * Key message lParam bits
                     46:  */
                     47: #define EXTENDED_BIT   0x01000000
                     48: #define DONTCARE_BIT   0x02000000
                     49: #define FAKE_KEYSTROKE 0x02000000
                     50: 
                     51: /*
                     52:  * Keyboard Shift State defines. These correspond to the bit mask defined
                     53:  * by the VkKeyScan() API.
                     54:  */
                     55: #define KBDBASE        0
                     56: #define KBDSHIFT       1
                     57: #define KBDCTRL        2
                     58: #define KBDALT         4
                     59: 
                     60: /*
                     61:  * Handy diacritics
                     62:  */
                     63: #define GRAVE           0x0300
                     64: #define ACUTE           0x0301
                     65: #define CIRCUMFLEX      0x0302
                     66: #define TILDE           0x0303
                     67: #define MACRON          0x0304
                     68: #define OVERSCORE       0x0305
                     69: #define BREVE           0x0306
                     70: #define DOT_ABOVE       0x0307
                     71: #define UMLAUT          0x0308
                     72: #define DIARESIS        UMLAUT
                     73: #define HOOK_ABOVE      0x0309
                     74: #define RING            0x030A
                     75: #define DOUBLE_ACUTE    0x030B
                     76: #define HACEK           0x030C
                     77: 
                     78: #define CEDILLA         0x0327
                     79: #define OGONEK          0x0328
                     80: #define TONOS           0x0384
                     81: #define DIARESIS_TONOS  0x0385
                     82: 
                     83: 
                     84: #define wszGRAVE           L"\x0300"
                     85: #define wszACUTE           L"\x0301"
                     86: #define wszCIRCUMFLEX      L"\x0302"
                     87: #define wszTILDE           L"\x0303"
                     88: #define wszMACRON          L"\x0304"
                     89: #define wszOVERSCORE       L"\x0305"
                     90: #define wszBREVE           L"\x0306"
                     91: #define wszDOT_ABOVE       L"\x0307"
                     92: #define wszUMLAUT          L"\x0308"
                     93: #define wszHOOK_ABOVE      L"\x0309"
                     94: #define wszRING            L"\x030A"
                     95: #define wszDOUBLE_ACUTE    L"\x030B"
                     96: #define wszHACEK           L"\x030C"
                     97: 
                     98: #define wszCEDILLA         L"\x0327"
                     99: #define wszOGONEK          L"\x0328"
                    100: #define wszTONOS           L"\x0384"
                    101: #define wszDIARESIS_TONOS  L"\x0385"
                    102: 
                    103: /*
                    104:  * function prototypes
                    105:  */
                    106: VOID    VSCFromSC(PKE pke);
                    107: BYTE    VKFromVSC(PKE pke, BYTE bPrefix, LPBYTE afKeyState);
                    108: BOOL    KEOEMProcs(PKE pke);
                    109: BOOL    KELocaleProcs(PKE pke);
                    110: VOID    _KeyEvent(USHORT usVk, WORD wScanCode, DWORD ExtraInfo);
                    111: 
                    112: /***************************************************************************\
                    113: * MODIFIER KEYS
                    114: *
                    115: * All keyboards have "Modifier" keys which are used to alter the behaviour of
                    116: * some of the other keys.  These shifter keys are usually:
                    117: *   Shift  (left and/or right Shift key)
                    118: *   Ctrl   (left and/or right Ctrl key)
                    119: *   Alt    (left and/or right Alt key)
                    120: *   AltGr  (right Alt key only)
                    121: *
                    122: * NOTE:
                    123: *   All keyboards use the Shift key.
                    124: *   All keyboards use a Ctrl key to generate ASCII control characters.
                    125: *   All keyboards with a number pad use the Alt key and the NumPad to
                    126: *     generate characters by number.
                    127: *   Keyboards using AltGr as a Modifier Key usually translate the Virtual
                    128: *     ScanCode to Virtual Keys VK_CTRL + VK_ALT at input time: the Modifier
                    129: *     tables should be written to treat Ctrl + Alt as a valid shifter
                    130: *     key combination in these cases.
                    131: *
                    132: * By holding down 0 or more of these Modifier keys, a "shift state" is
                    133: * obtained : the shift state may affect the translation of Virtual Scancodes
                    134: * to Virtual Keys and/or the translation of Virtuals Key to Characters.
                    135: *
                    136: * EXAMPLES:
                    137: *
                    138: * Each key on a particular keyboard may be marked with up to five different
                    139: * characters in five different positions:
                    140: *
                    141: *              .-------.
                    142: *             /|       |\
                    143: *            : | 2   4 | :
                    144: *            | |       | |
                    145: *            | |       | |
                    146: *            | | 1   3 | |
                    147: *            | |_______| |
                    148: *            | /       \ |
                    149: *            |/    5    \|
                    150: *            `-----------'
                    151: *
                    152: * A key may also be able to generate a character that is not marked on it:
                    153: * these are ASCII Control chars, lower-case letters and/or "invisible keys".
                    154: *                                                  .-------.
                    155: *      An example of an "Invisible Key":          /|       |\
                    156: *                                                : | >     | :
                    157: *  The German M24 keyboard 2 should produce the  | |       | |
                    158: *  '|' character when ALT SHIFT is is held down  | |       | |
                    159: *  while the '<' key (shown here) is pressed:    | | <   \ | |
                    160: *  This keyboard has four other invisible        | |_______| |
                    161: *  characters.  France, Italy and Spain also     | /       \ |
                    162: *  support invisible characters on the M24       |/         \|
                    163: *  Keyboard 2 with ALT SHIFT depressed.          `-----------'
                    164: *
                    165: * The keyboard table must list the keys that contribute to it's shift state,
                    166: * and indicate which combinations are valid.  This is done with
                    167: *    aCharModifiers[]  - convert combinations of Modifier Keys to Bitmasks.
                    168: * and
                    169: *    aModification[];  - convert Modifier Bitmasks to enumerated Modifications
                    170: *
                    171: * AN EXAMPLE OF VALID AND INVALID MODIFIER KEY COMBINATIONS
                    172: *
                    173: *    The US English keyboard has 3 Modifier keys:
                    174: *      Shift (left or right); Ctrl (left or right); and Alt (left or right).
                    175: *
                    176: *    The only valid combinations of these Modifier Keys are:
                    177: *      none pressed      : Character at position (1) on the key.
                    178: *      Shift             : Character at position (2) on the key.
                    179: *      Ctrl              : Ascii Control characters
                    180: *      Shift + Ctrl      : Ascii Control characters
                    181: *      Alt               : Character-by-number on the numpad
                    182: *
                    183: *    The invalid combinations (that do not generate any characters) are:
                    184: *      Shift + Alt
                    185: *      Alt + Ctrl
                    186: *      Shift + Alt + Ctrl
                    187: *
                    188: * Something (???) :
                    189: * -----------------
                    190: *      Modifier keys              Character produced
                    191: *      -------------------------  ------------------
                    192: *   0  No shifter key depressed   position 1
                    193: *   1  Shift key is depressed     position 2
                    194: *   2  AltGr (r.h. Alt) depressed position 4 or 5 (whichever is marked)
                    195: *
                    196: * However, note that 3 shifter keys (SHIFT, can be combined in a
                    197: * characters, depending on the Keyboards
                    198: * Consider the following keyboards:
                    199: *
                    200: *     .-------.            STRANGE KBD         PECULIAR KBD
                    201: *    /|       |\           ==================  ==================
                    202: *   : | 2   4 | :    1   -
                    203: *   | |       | |    2   - SHIFT               SHIFT
                    204: *   | |       | |    3   - MENU                MENU
                    205: *   | | 1   3 | |    4   - SHIFT + MENU        SHIFT + MENU
                    206: *   | |_______| |    5   -    no such keys     CTRL  + MENU
                    207: *   | /       \ |
                    208: *   |/    5    \|
                    209: *   `-----------'
                    210: * Both STRANGE and PECULIAR keyboards could have aVkToBits[] =
                    211: *   { VK_SHIFT  , KBDSHIFT }, // 0x01
                    212: *   { VK_CONTROL, KBDCTRL  }, // 0x02
                    213: *   { VK_MENU   , KBDALT   }, // 0x04
                    214: *   { 0,          0        }
                    215: *
                    216: * The STRANGE keyboard has 4 distinct shift states, while the PECULIAR kbd
                    217: * has 5.  However, note that 3 shifter bits can be combined in a
                    218: * total of 2^3 == 8 ways.  Each such combination must be related to one (or
                    219: * none) of the enumerated shift states.
                    220: * Each shifter key combination can be represented by three binary bits:
                    221: *  Bit 0  is set if VK_SHIFT is down
                    222: *  Bit 1  is set if VK_CONTROL is down
                    223: *  Bit 2  is set if VK_MENU is down
                    224: *
                    225: * Example: If the STRANGE keyboard generates no characters in combination
                    226: * when just the ALT key is held down, nor when the SHIFT, CTRL and ALT keys
                    227: * are all held down, then the tables might look like this:
                    228: *
                    229: *                                VK_MENU,
                    230: *                        VK_CTRL,                    0
                    231: *    };
                    232: *    aModification[] = {
                    233: *        0,            //   0       0       0     = 000  <none>
                    234: *        1,            //   0       0       1     = 001  SHIFT
                    235: *        SHFT_INVALID, //   0       1       0     = 010  ALT
                    236: *        2,            //   0       1       1     = 011  SHIFT ALT
                    237: *        3,            //   1       0       0     = 100  CTRL
                    238: *        4,            //   1       0       1     = 101  SHIFT CTRL
                    239: *        5,            //   1       1       0     = 110  CTRL ALT
                    240: *        SHFT_INVALID  //   1       1       1     = 111  SHIFT CTRL ALT
                    241: *    };
                    242: *
                    243: *
                    244: \***************************************************************************/
                    245: 
                    246: /***************************************************************************\
                    247: * VK_TO_BIT - associate a Virtual Key with a Modifier bitmask.
                    248: *
                    249: * Vk        - the Virtual key (eg: VK_SHIFT, VK_RMENU, VK_CONTROL etc.)
                    250: *             Special Values:
                    251: *                0        null terminator
                    252: * ModBits   - a combination of KBDALT, KBDCTRL, KBDSHIFT and kbd-specific bits
                    253: *             Any kbd-specific shift bits must be the lowest-order bits other
                    254: *             than KBDSHIFT, KBDCTRL and KBDALT (0, 1 & 2)
                    255: *
                    256: * Those languages that use AltGr (VK_RMENU) to shift keys convert it to
                    257: * CTRL+ALT with the KBDSPECIAL bit in the ausVK[] entry for VK_RMENU
                    258: * and by having an entry in aVkToPfnOem[] to simulate the right Vk sequence.
                    259: *
                    260: \***************************************************************************/
                    261: typedef struct {
                    262:     BYTE Vk;
                    263:     BYTE ModBits;
                    264: } VK_TO_BIT, *PVK_TO_BIT;
                    265: 
                    266: /***************************************************************************\
                    267: * pModNumber  - a table to map shift bits to enumerated shift states
                    268: *
                    269: * Table attributes: Ordered table
                    270: *
                    271: * Maps all possible shifter key combinations to an enumerated shift state.
                    272: * The size of the table depends on the value of the highest order bit used
                    273: * in aCharModifiers[*].ModBits
                    274: *
                    275: * Special values for aModification[*]
                    276: *   SHFT_INVALID - no characters produced with this shift state.
                    277: LATER: (ianja) no SHFT_CTRL - control characters encoded in tables like others
                    278: *   SHFT_CTRL    - standard control character production (all keyboards must
                    279: *                  be able to produce CTRL-C == 0x0003 etc.)
                    280: *   Other        - enumerated shift state (not less than 0)
                    281: *
                    282: * This table is indexed by the Modifier Bits to obtain an Modification Number.
                    283: *
                    284: *                        CONTROL MENU SHIFT
                    285: *
                    286: *    aModification[] = {
                    287: *        0,            //   0     0     0     = 000  <none>
                    288: *        1,            //   0     0     1     = 001  SHIFT
                    289: *        SHFT_INVALID, //   0     1     0     = 010  ALT
                    290: *        2,            //   0     1     1     = 011  SHIFT ALT
                    291: *        3,            //   1     0     0     = 100  CTRL
                    292: *        4,            //   1     0     1     = 101  SHIFT CTRL
                    293: *        5,            //   1     1     0     = 110  CTRL ALT
                    294: *        SHFT_INVALID  //   1     1     1     = 111  SHIFT CTRL ALT
                    295: *    };
                    296: *
                    297: \***************************************************************************/
                    298: typedef struct {
                    299:     PVK_TO_BIT pVkToBit;     // Virtual Keys -> Mod bits
                    300:     WORD       wMaxModBits;  // max Modification bit combination value
                    301:     BYTE       ModNumber[];  // Mod bits -> Modification Number
                    302: } MODIFIERS, *PMODIFIERS;
                    303: 
                    304: WORD GetModifierBits(PMODIFIERS pModifiers, LPBYTE afKeyState);
                    305: WORD GetModificationNumber(PMODIFIERS pModifiers, WORD wModBits);
                    306: 
                    307: #define SHFT_INVALID 0x0F
                    308: 
                    309: /***************************************************************************\
                    310: * apulCvt_VK[] - obtain VK translation table from shift state
                    311: *     A VK translation table is used to change the value of the Virtual Key
                    312: *     according to the shift state.   OEM only (not locale-specific)
                    313: \***************************************************************************/
                    314: extern PULONG *gapulCvt_VK;
                    315: extern ULONG *gapulCvt_VK_101[];
                    316: extern ULONG *gapulCvt_VK_84[];
                    317: 
                    318: /***************************************************************************\
                    319: * awNumPadCvt[]   - Translate cursor movement keys to numpad keys
                    320: \***************************************************************************/
                    321: extern MODIFIERS Modifiers_VK;
                    322: extern BYTE aVkNumpad[];
                    323: 
                    324: /***************************************************************************\
                    325: * VSC_VK     - Associate a Virtual Scancode with a Virtual Key
                    326: *  Vsc - Virtual Scancode
                    327: *  Vk  - Virtual Key | flags
                    328: * Used by VKFromVSC() for scancodes prefixed 0xE0 or 0xE1
                    329: \***************************************************************************/
                    330: typedef struct VSC_VK {
                    331:     BYTE Vsc;
                    332:     USHORT Vk;
                    333: } VSC_VK, *PVSC_VK;
                    334: 
                    335: /***************************************************************************\
                    336: * VK_VSC     - Associate a Virtual Key with a Virtual Scancode
                    337: *  Vk  - Virtual Key
                    338: *  Vsc - Virtual Scancode
                    339: * Used by MapVirtualKey for Virtual Keys not appearing in ausVK[]
                    340: \***************************************************************************/
                    341: typedef struct VK_VSC {
                    342:     BYTE Vk;
                    343:     BYTE Vsc;
                    344: } VK_VSC, *PVK_VSC;
                    345: 
                    346: /***************************************************************************\
                    347: *
                    348: * VK_TO_WCHARS<n> - Associate a Virtual Key with <n> UNICODE characters
                    349: *
                    350: * VirtualKey  - The Virtual Key.
                    351: * wch[]       - An array of characters, one for each shift state that
                    352: *               applies to the specified Virtual Key.
                    353: *
                    354: * Special values for VirtualKey:
                    355: *    -1        - This entry contains dead chars for the previous entry
                    356: *    0         - Terminates a VK_TO_WCHARS[] table
                    357: *
                    358: * Special values for Attributes:
                    359: *    CAPLOK    - The CAPS-LOCK/SHIFT-LOCK key affects this key like SHIFT
                    360: *
                    361: * Special values for wch[*]:
                    362: *    WCH_NONE  - No character is generated by pressing this key with the
                    363: *                current shift state.
                    364: *    WCH_DEAD  - The character is a dead-key: the next VK_TO_WCHARS[] entry
                    365: *                will contain the values of the dead characters (diaresis)
                    366: *                that can be produced by the Virtual Key.
                    367: *
                    368: \***************************************************************************/
                    369: #define WCH_NONE 0xF000
                    370: #define WCH_DEAD 0xF001
                    371: 
                    372: #define CAPLOK   0x01
                    373: 
                    374: /*
                    375:  * Macro for VK to WCHAR with "n" shift states
                    376:  */
                    377: #define TYPEDEF_VK_TO_WCHARS(n) typedef struct _VK_TO_WCHARS##n {  \
                    378:                                     BYTE  VirtualKey;      \
                    379:                                     BYTE  Attributes;      \
                    380:                                     WCHAR wch[n];          \
                    381:                                 } VK_TO_WCHARS##n, *PVK_TO_WCHARS##n;
                    382: 
                    383: /*
                    384:  * To facilitate coding the table scanning routine.
                    385:  */
                    386: 
                    387: /*
                    388:  * Table element types (for various numbers of shift states), used
                    389:  * to facilitate static initializations of tables.
                    390:  * VK_TO_WCHARS1 and PVK_TO_WCHARS1 may be used as the generic type
                    391:  */
                    392: TYPEDEF_VK_TO_WCHARS(1) // VK_TO_WCHARS1, *PVK_TO_WCHARS1;
                    393: TYPEDEF_VK_TO_WCHARS(2) // VK_TO_WCHARS2, *PVK_TO_WCHARS2;
                    394: TYPEDEF_VK_TO_WCHARS(3) // VK_TO_WCHARS3, *PVK_TO_WCHARS3;
                    395: TYPEDEF_VK_TO_WCHARS(4) // VK_TO_WCHARS4, *PVK_TO_WCHARS4;
                    396: TYPEDEF_VK_TO_WCHARS(5) // VK_TO_WCHARS5, *PVK_TO_WCHARS5;
                    397: TYPEDEF_VK_TO_WCHARS(6) // VK_TO_WCHARS6, *PVK_TO_WCHARS5;
                    398: 
                    399: /***************************************************************************\
                    400: *
                    401: * VK_TO_WCHAR_TABLE - Describe a table of VK_TO_WCHARS1
                    402: *
                    403: * pVkToWchars     - points to the table.
                    404: * nModifications  - the number of shift-states supported by this table.
                    405: *                   (this is the number of elements in pVkToWchars[*].wch[])
                    406: *
                    407: * A keyboard may have several such tables: all keys with the same number of
                    408: *    shift-states are grouped together in one table.
                    409: *
                    410: * Special values for pVktoWchars:
                    411: *     NULL     - Terminates a VK_TO_WCHAR_TABLE[] list.
                    412: *
                    413: \***************************************************************************/
                    414: 
                    415: typedef struct _VK_TO_WCHAR_TABLE {
                    416:     PVK_TO_WCHARS1 pVkToWchars;
                    417:     BYTE           nModifications;
                    418:     BYTE           cbSize;
                    419: } VK_TO_WCHAR_TABLE, *PVK_TO_WCHAR_TABLE;
                    420: 
                    421: /***************************************************************************\
                    422: *
                    423: * Dead Key (diaresis) tables
                    424: *
                    425: * LATER IanJa: supplant by an NLS API that composes Diacritic+Base -> WCHAR
                    426: *
                    427: \***************************************************************************/
                    428: typedef struct {
                    429:     DWORD  dwBoth;  // diacritic & char
                    430:     WCHAR  wchComposed;
                    431: } DEADKEY, *PDEADKEY;
                    432: 
                    433: #define DEADTRANS(ch, accent, comp) { MAKELONG(ch, accent), comp}
                    434: 
                    435: /***************************************************************************\
                    436: * VSC_LPWSTR - associate a Virtual Scancode with a Text string
                    437: *
                    438: * Uses:
                    439: *   GetKeyNameText(), aKeyNames[]  Map virtual scancode to name of key
                    440: *
                    441: \***************************************************************************/
                    442: typedef struct {
                    443:     BYTE   vsc;
                    444:     LPWSTR pwsz;
                    445: } VSC_LPWSTR, *PVSC_LPWSTR;
                    446: 
                    447: /***************************************************************************\
                    448: *
                    449: * VK_F    - associate a Virtual Key with a bitmask
                    450: *
                    451: * Uses:
                    452: *   Special handle of Virtual Keys - fake different VK sequences
                    453: *
                    454: * Vk      - A virtual key that is to produce key event simulation.
                    455: * fKEProc - A bitmask identifying the Key Event simulator procedure(s) to use.
                    456: *           The postion of each set bit is an index into a table of procedure
                    457: *           addresses.  Using a bitmask here allows one key to have more than
                    458: *           one Key Event simulator procedure.
                    459: *
                    460: \***************************************************************************/
                    461: typedef struct {
                    462:     BYTE Vk;
                    463:     BYTE fKEProc;
                    464: } VK_F, *PVK_F;
                    465: 
                    466: #define KLLF_ALTGR 0x00000001
                    467: 
                    468: /***************************************************************************\
                    469: * KBDTABLES
                    470: *
                    471: * This structure describes all the tables that implement the keyboard layer.
                    472: *
                    473: * When switching to a new layer, we get a new KBDTABLES structure: all key
                    474: * processing tables are accessed indirectly through this structure.
                    475: *
                    476: \***************************************************************************/
                    477: 
                    478: typedef struct tagKbdLayer {
                    479:     /*
                    480:      * Modifier keys
                    481:      */
                    482:     PMODIFIERS pCharModifiers;
                    483: 
                    484:     /*
                    485:      * Characters
                    486:      */
                    487:     VK_TO_WCHAR_TABLE *pVkToWcharTable;  // ptr to tbl of ptrs to tbl
                    488: 
                    489:     /*
                    490:      * Diacritics
                    491:      */
                    492:     PDEADKEY pDeadKey;
                    493: 
                    494:     /*
                    495:      * Names of Keys
                    496:      */
                    497:     VSC_LPWSTR *pKeyNames;
                    498:     VSC_LPWSTR *pKeyNamesExt;
                    499:     LPWSTR     *pKeyNamesDead;
                    500: 
                    501:     /*
                    502:      * Scan codes to Virtual Keys
                    503:      */
                    504:     USHORT *pusVSCtoVK;
                    505:     BYTE    bMaxVSCtoVK;
                    506:     PVSC_VK pVSCtoVK_E0;  // Scancode has E0 prefix
                    507:     PVSC_VK pVSCtoVK_E1;  // Scancode has E1 prefix
                    508: 
                    509:     /*
                    510:      * Locale-specific special processing
                    511:      */
                    512:     DWORD fLocaleFlags;
                    513: } KBDTABLES, *PKBDTABLES;
                    514: 
                    515: /*
                    516:  * OEM-specific special processing (keystroke simulators and filters)
                    517:  */
                    518: extern VK_F aVkToFOEM[];
                    519: extern KEPROC aKEProcOEM[];
                    520: 
                    521: /***************************************************************************\
                    522: * Macros for ausVK[] values (used below)
                    523: *
                    524: * These macros prefix each argument with VK_ to produce the name of a Virtual
                    525: * Key defined in "winuser.h" (eg: ESCAPE becomes VK_ESCAPE).
                    526: \***************************************************************************/
                    527: #ifndef KBD_TYPE
                    528: #define KBD_TYPE 4
                    529: #endif
                    530: 
                    531: /*
                    532:  * _NE() selects the Virtual Key according to keyboard type
                    533:  */
                    534: #if   (KBD_TYPE == 1)
                    535: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v1)
                    536: #elif (KBD_TYPE == 2)
                    537: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v2)
                    538: #elif (KBD_TYPE == 3)
                    539: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v3)
                    540: #elif (KBD_TYPE == 4)
                    541: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v4)
                    542: #elif (KBD_TYPE == 5)
                    543: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v5)
                    544: #elif (KBD_TYPE == 6)
                    545: #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v6)
                    546: #endif
                    547: 
                    548: /*
                    549:  * _EQ() selects the same Virtual Key for all keyboard types
                    550:  */
                    551: #define _EQ(         v4      ) (VK_##v4)
                    552: 
                    553: /*
                    554:  * A bit of trickery for virtual key names 'A' to 'Z' and '0' to '9' so
                    555:  * that they are not converted to a VK_* name.
                    556:  * With this macro, VK_'A' equates to 'A' etc.
                    557:  */
                    558: #define VK_
                    559: #define VK__none_   0xFF
                    560: 
                    561: /***************************************************************************\
                    562: * T** - Values for ausVK[] (Virtual Scan Code to Virtual Key conversion)
                    563: *
                    564: * These values are for Scancode Set 3 and the USA.
                    565: * Other languages substitute their own values where required (files kbd**.h)
                    566: *
                    567: * Six sets of keyboards are supported, according to KBD_TYPE:
                    568: *
                    569: * KBD_TYPE   Keyboard (examples)
                    570: * ========   =======================================================
                    571: *    1       AT&T '301' & '302'; Olivetti 83-key; PC-XT 84-key; etc.
                    572: *    2       Olivetti M24 102-key
                    573: *    3       HP Vectra (DIN); Olivetti 86-key; etc.
                    574: *    4 *     Enhanced 101/102-key; Olivetti A; etc.
                    575: *    5       Nokia (Ericsson) type 5 (1050, etc.)
                    576: *    6       Nokia (Ericsson) type 6 (9140)
                    577: *
                    578: * * If KBD_TYPE is not defined, the default is type 4.
                    579: *
                    580: * _EQ() : all keyboard types have the same virtual key for this scancode
                    581: * _NE() : different virtual keys for this scancode, depending on kbd type
                    582: *
                    583: *     +------+ +--------+--------+--------+--------+--------+--------+
                    584: *     | Scan | |  kbd   |  kbd   |  kbd   |  kbd   |  kbd   |  kbd   |
                    585: *     | code | | type 1 | type 2 | type 3 | type 4 | type 5 | type 6 |
                    586: \****+-------+-+--------+--------+--------+--------+--------+--------+******/
                    587: 
                    588: #define T00 _EQ(                           _none_                    )
                    589: #define T01 _EQ(                           ESCAPE                    )
                    590: #define T02 _EQ(                           '1'                       )
                    591: #define T03 _EQ(                           '2'                       )
                    592: #define T04 _EQ(                           '3'                       )
                    593: #define T05 _EQ(                           '4'                       )
                    594: #define T06 _EQ(                           '5'                       )
                    595: #define T07 _EQ(                           '6'                       )
                    596: #define T08 _EQ(                           '7'                       )
                    597: #define T09 _EQ(                           '8'                       )
                    598: #define T0A _EQ(                           '9'                       )
                    599: #define T0B _EQ(                           '0'                       )
                    600: #define T0C _EQ(                           OEM_MINUS                 )
                    601: #define T0D _NE(OEM_PLUS,OEM_4,   OEM_PLUS,OEM_PLUS,OEM_PLUS,OEM_PLUS)
                    602: #define T0E _EQ(                           BACK                      )
                    603: #define T0F _EQ(                           TAB                       )
                    604: #define T10 _EQ(                           'Q'                       )
                    605: #define T11 _EQ(                           'W'                       )
                    606: #define T12 _EQ(                           'E'                       )
                    607: #define T13 _EQ(                           'R'                       )
                    608: #define T14 _EQ(                           'T'                       )
                    609: #define T15 _EQ(                           'Y'                       )
                    610: #define T16 _EQ(                           'U'                       )
                    611: #define T17 _EQ(                           'I'                       )
                    612: #define T18 _EQ(                           'O'                       )
                    613: #define T19 _EQ(                           'P'                       )
                    614: #define T1A _NE(OEM_4,   OEM_6,   OEM_4,   OEM_4,   OEM_4,   OEM_4   )
                    615: #define T1B _NE(OEM_6,   OEM_1,   OEM_6,   OEM_6,   OEM_6,   OEM_6   )
                    616: #define T1C _EQ(                           RETURN                    )
                    617: #define T1D _EQ(                           LCONTROL                  )
                    618: #define T1E _EQ(                           'A'                       )
                    619: #define T1F _EQ(                           'S'                       )
                    620: #define T20 _EQ(                           'D'                       )
                    621: #define T21 _EQ(                           'F'                       )
                    622: #define T22 _EQ(                           'G'                       )
                    623: #define T23 _EQ(                           'H'                       )
                    624: #define T24 _EQ(                           'J'                       )
                    625: #define T25 _EQ(                           'K'                       )
                    626: #define T26 _EQ(                           'L'                       )
                    627: #define T27 _NE(OEM_1,   OEM_PLUS,OEM_1,   OEM_1,   OEM_1,   OEM_1   )
                    628: #define T28 _NE(OEM_7,   OEM_3,   OEM_7,   OEM_7,   OEM_3,   OEM_3   )
                    629: #define T29 _NE(OEM_3,   OEM_7,   OEM_3,   OEM_3,   OEM_7,   OEM_7   )
                    630: #define T2A _EQ(                           LSHIFT                    )
                    631: #define T2B _EQ(                           OEM_5                     )
                    632: #define T2C _EQ(                           'Z'                       )
                    633: #define T2D _EQ(                           'X'                       )
                    634: #define T2E _EQ(                           'C'                       )
                    635: #define T2F _EQ(                           'V'                       )
                    636: #define T30 _EQ(                           'B'                       )
                    637: #define T31 _EQ(                           'N'                       )
                    638: #define T32 _EQ(                           'M'                       )
                    639: #define T33 _EQ(                           OEM_COMMA                 )
                    640: #define T34 _EQ(                           OEM_PERIOD                )
                    641: #define T35 _EQ(                           OEM_2                     )
                    642: #define T36 _EQ(                           RSHIFT                    )
                    643: #define T37 _EQ(                           MULTIPLY                  )
                    644: #define T38 _EQ(                           LMENU                     )
                    645: #define T39 _EQ(                           ' '                       )
                    646: #define T3A _EQ(                           CAPITAL                   )
                    647: #define T3B _EQ(                           F1                        )
                    648: #define T3C _EQ(                           F2                        )
                    649: #define T3D _EQ(                           F3                        )
                    650: #define T3E _EQ(                           F4                        )
                    651: #define T3F _EQ(                           F5                        )
                    652: #define T40 _EQ(                           F6                        )
                    653: #define T41 _EQ(                           F7                        )
                    654: #define T42 _EQ(                           F8                        )
                    655: #define T43 _EQ(                           F9                        )
                    656: #define T44 _EQ(                           F10                       )
                    657: #define T45 _EQ(                           NUMLOCK                   )
                    658: #define T46 _EQ(                           OEM_SCROLL                )
                    659: #define T47 _EQ(                           HOME                      )
                    660: #define T48 _EQ(                           UP                        )
                    661: #define T49 _EQ(                           PRIOR                     )
                    662: #define T4A _EQ(                           SUBTRACT                  )
                    663: #define T4B _EQ(                           LEFT                      )
                    664: #define T4C _EQ(                           CLEAR                     )
                    665: #define T4D _EQ(                           RIGHT                     )
                    666: #define T4E _EQ(                           ADD                       )
                    667: #define T4F _EQ(                           END                       )
                    668: #define T50 _EQ(                           DOWN                      )
                    669: #define T51 _EQ(                           NEXT                      )
                    670: #define T52 _EQ(                           INSERT                    )
                    671: #define T53 _EQ(                           DELETE                    )
                    672: #define T54 _EQ(                           SNAPSHOT                  )
                    673: #define T55 _EQ(                           _none_                    )
                    674: #define T56 _NE(OEM_102, HELP,    OEM_102, OEM_102, _none_,  OEM_PA2 )
                    675: #define T57 _NE(F11,     RETURN,  F11,     F11,     _none_,  HELP    )
                    676: #define T58 _NE(F12,     LEFT,    F12,     F12,     _none_,  OEM_102 )
                    677: #define T59 _EQ(                           CLEAR                     )
                    678: #define T5A _EQ(                           NONAME                    )// WSCtrl
                    679: #define T5B _EQ(                           NONAME                    )// Finish
                    680: #define T5C _EQ(                           NONAME                    )// Jump
                    681: #define T5D _EQ(                           EREOF                     )
                    682: #define T5E _EQ(                           _none_                    )
                    683: #define T5F _EQ(                           NONAME                    )
                    684: #define T60 _EQ(                           _none_                    )
                    685: #define T61 _EQ(                           _none_                    )
                    686: #define T62 _EQ(                           _none_                    )
                    687: #define T63 _EQ(                           _none_                    )
                    688: #define T64 _EQ(                           F13                       )
                    689: #define T65 _EQ(                           F14                       )
                    690: #define T66 _EQ(                           F15                       )
                    691: #define T67 _EQ(                           F16                       )
                    692: #define T68 _EQ(                           F17                       )
                    693: #define T69 _EQ(                           F18                       )
                    694: #define T6A _EQ(                           F19                       )
                    695: #define T6B _EQ(                           F20                       )
                    696: #define T6C _EQ(                           F21                       )
                    697: #define T6D _EQ(                           F22                       )
                    698: #define T6E _EQ(                           F23                       )
                    699: #define T6F _EQ(                           _none_                    )
                    700: #define T70 _EQ(                           _none_                    )
                    701: #define T71 _EQ(                           _none_                    )
                    702: #define T72 _EQ(                           _none_                    )
                    703: #define T73 _EQ(                           _none_                    )
                    704: #define T74 _EQ(                           _none_                    )
                    705: #define T75 _EQ(                           _none_                    )
                    706: #define T76 _EQ(                           F24                       )
                    707: #define T77 _EQ(                           _none_                    )
                    708: #define T78 _EQ(                           _none_                    )
                    709: #define T79 _EQ(                           _none_                    )
                    710: #define T7A _EQ(                           _none_                    )
                    711: #define T7B _EQ(                           _none_                    )
                    712: #define T7C _EQ(                           TAB                       )
                    713: 
                    714: #define X1C _EQ(                           RETURN                    )
                    715: #define X1D _EQ(                           RCONTROL                  )
                    716: #define X35 _EQ(                           DIVIDE                    )
                    717: #define X37 _EQ(                           SNAPSHOT                  )
                    718: #define X38 _EQ(                           RMENU                     )
                    719: #define X46 _EQ(                           CANCEL                    )
                    720: #define X47 _EQ(                           HOME                      )
                    721: #define X48 _EQ(                           UP                        )
                    722: #define X49 _EQ(                           PRIOR                     )
                    723: #define X4B _EQ(                           LEFT                      )
                    724: #define X4D _EQ(                           RIGHT                     )
                    725: #define X4F _EQ(                           END                       )
                    726: #define X50 _EQ(                           DOWN                      )
                    727: #define X51 _NE(NEXT,    F1,      NEXT,    NEXT,    _none_, OEM_PA2  )
                    728: #define X52 _EQ(                           INSERT                    )
                    729: #define X53 _EQ(                           DELETE                    )
                    730: 
                    731:         /*
                    732:          * The break key is sent to us as E1,LCtrl,NumLock
                    733:          * We must conevrt the E1+LCtrl to BREAK, then ignore the Numlock
                    734:          * which must be ignored.  Alternatively, translate Ctrl-Numlock
                    735:          * to break, but don't let the CTRL through as a WM_KEYUP/DOWN) ?
                    736:          */
                    737: #define Y1D _EQ(                           PAUSE                     )
                    738: 
                    739: #define SCANCODE_LSHIFT      0x2A
                    740: #define SCANCODE_RSHIFT      0x36
                    741: #define SCANCODE_SIMULATED   (FAKE_KEYSTROKE >> 16)
                    742: 
                    743: #define SCANCODE_NUMPAD_FIRST 0x47
                    744: #define SCANCODE_NUMPAD_LAST  0x52
                    745: 
                    746: #endif // _KBD_

unix.superglobalmegacorp.com

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