diff options
Diffstat (limited to 'private/os2/os2ses/kbdtable.c')
-rw-r--r-- | private/os2/os2ses/kbdtable.c | 653 |
1 files changed, 653 insertions, 0 deletions
diff --git a/private/os2/os2ses/kbdtable.c b/private/os2/os2ses/kbdtable.c new file mode 100644 index 000000000..f1e39119e --- /dev/null +++ b/private/os2/os2ses/kbdtable.c @@ -0,0 +1,653 @@ +/*++ + +Copyright (c) 1989 Microsoft Corporation + +Module Name: + + kbdtabl.c + +Abstract: + + This module contains the translation table for KBD according to CP + +Author: + + Michael Jarus (mjarus) 28-Apr-1992 + +Environment: + + User Mode Only + +Revision History: + +--*/ + +#define WIN32_ONLY +#include "os2ses.h" +#include "event.h" +#include "trans.h" +#include "kbd.h" +#include <stdio.h> + +#ifdef JAPAN +// MSKK May.07.1993 V-AkihiS +// Support IOCtl KBD_KETKEYBDTYPE and KBD_GETHARDWAREID +USHORT KbdType, KbdSubType; +BYTE OemId, OemSubType; +#endif + +USHORT Ow2KbdHWIDs = 1; // BUGBUG -? +USHORT Ow2KCBShFlgs = 0; // BUGBUG -? + +UCHAR Ow2MiscFlags = 0; +#define EnhancedKbd 0x10 // bit 4 - Enhanced Kbd is out there (must be Bit 4!). + +UCHAR Ow2MiscFlags3 = 0; +#define AltPacket 2 // bit 1 - DCR 1713: indicates that Alt-Numpad accumulation is finished. +#define PauseLatch 4 // bit 2 - PTM 2344: indicates correct keystroke sequence for a Ctrl-NumLock. +#define E0Packet 0x10 // bit 4 - PTM 2382: indicates that an E0 packet is to be sent with the next packet. +#define SecAltNumPad 0x80 // bit 7 - PTR AK00370: indicates AltNumpad with R-Alt. + + +extern PVOID Ow2US437001, Ow2US437011, Ow2US850000, Ow2US850010; +extern PVOID Ow2BE437001, Ow2BE437011, Ow2BE850000, Ow2BE850010; +extern PVOID Ow2CF863001, Ow2CF863011, Ow2CF850000, Ow2CF850010; +extern PVOID Ow2DK865001, Ow2DK865011, Ow2DK850000, Ow2DK850010; +extern PVOID Ow2FR437001, Ow2FR437011, Ow2FR437111, Ow2FR850000, Ow2FR850010, Ow2FR850011; +extern PVOID Ow2GR437001, Ow2GR437011, Ow2GR850000, Ow2GR850010; +extern PVOID Ow2IT437001, Ow2IT437011, Ow2IT437111, Ow2IT850000, Ow2IT850010, Ow2IT850011; +extern PVOID Ow2LA437001, Ow2LA437011, Ow2LA850000, Ow2LA850010; +extern PVOID Ow2NL437001, Ow2NL437011, Ow2NL850000, Ow2NL850010; +extern PVOID Ow2NO865001, Ow2NO865011, Ow2NO850000, Ow2NO850010; +extern PVOID Ow2PO860001, Ow2PO860011, Ow2PO850000, Ow2PO850010; +extern PVOID Ow2SF437001, Ow2SF437011, Ow2SF850000, Ow2SF850010; +extern PVOID Ow2SG437001, Ow2SG437011, Ow2SG850000, Ow2SG850010; +extern PVOID Ow2SP437001, Ow2SP437011, Ow2SP850000, Ow2SP850010; +extern PVOID Ow2SU437001, Ow2SU437011, Ow2SU850000, Ow2SU850010; +extern PVOID Ow2SV437001, Ow2SV437011, Ow2SV850000, Ow2SV850010; +extern PVOID Ow2UK437001, Ow2UK437011, Ow2UK437111, Ow2UK850000, Ow2UK850010, Ow2UK850011; +#ifdef JAPAN +// MSKK Aug.02.1993 V-AkihiS +extern PVOID Ow2JP932011AX, Ow2JP437011AX; +extern PVOID Ow2JP932011IBM002, Ow2JP437011IBM002; +extern PVOID Ow2JP932011IBMA01, Ow2JP437011IBMA01; +extern PVOID Ow2JP932011IBM101, Ow2JP437011IBM101; +#endif + +typedef struct _KBD_TYPE_TABLE +{ + PVOID CP1Table; + PVOID CP2Table; +} KBD_TYPE_TABLE, *PKBD_TYPE_TABLE; + +typedef struct _KBD_LANG_TABLE +{ + ULONG Country; + ULONG CodePage1; + ULONG CodePage2; + KBD_TYPE_TABLE AtTable; + KBD_TYPE_TABLE EnTable; + KBD_TYPE_TABLE EnNewTable; +} KBD_LANG_TABLE; + +KBD_LANG_TABLE KbdNlsTable[] = + { + { + CTRY_BELGIUM, + 437, + 850, + { + &Ow2BE437001, // BE 437 AT Kbd + &Ow2BE850000, // BE 850 AT Kbd + }, + { + &Ow2BE437011, // BE 437 EN Kbd + &Ow2BE850010, // BE 850 EN Kbd + }, + { + &Ow2BE437011, // BE 437 EN Kbd (for New Std as Old) + &Ow2BE850010 // BE 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_CANADA, + 863, + 850, + { + &Ow2CF863001, // CF 863 AT Kbd + &Ow2CF850000, // CF 850 AT Kbd + }, + { + &Ow2CF863011, // CF 863 EN Kbd + &Ow2CF850010, // CF 850 EN Kbd + }, + { + &Ow2CF863011, // CF 863 EN Kbd (for New Std as Old) + &Ow2CF850010 // CF 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_DENMARK, + 865, + 850, + { + &Ow2DK865001, // DK 865 AT Kbd + &Ow2DK850000, // DK 850 AT Kbd + }, + { + &Ow2DK865011, // DK 865 EN Kbd + &Ow2DK850010, // DK 850 EN Kbd + }, + { + &Ow2DK865011, // DK 865 EN Kbd (for New Std as Old) + &Ow2DK850010 // DK 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_FRANCE, + 437, + 850, + { + &Ow2FR437001, // FR 437 AT Kbd + &Ow2FR850000, // FR 850 AT Kbd + }, + { + &Ow2FR437011, // FR 437 EN Kbd + &Ow2FR850010, // FR 850 EN Kbd + }, + { + &Ow2FR437111, // FR 437 EN Kbd New Std + &Ow2FR850011 // FR 850 EN Kbd New Std + } + }, + { + CTRY_GERMANY, + 437, + 850, + { + &Ow2GR437001, // GR 437 AT Kbd + &Ow2GR850000, // GR 850 AT Kbd + }, + { + &Ow2GR437011, // GR 437 EN Kbd + &Ow2GR850010, // GR 850 EN Kbd + }, + { + &Ow2GR437011, // GR 437 EN Kbd (for New Std as Old) + &Ow2GR850010 // GR 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_ITALY, + 437, + 850, + { + &Ow2IT437001, // IT 437 AT Kbd + &Ow2IT850000, // IT 850 AT Kbd + }, + { + &Ow2IT437011, // IT 437 EN Kbd + &Ow2IT850010, // IT 850 EN Kbd + }, + { + &Ow2IT437111, // IT 437 EN Kbd New Std + &Ow2IT850011 // IT 850 EN Kbd New Std + } + }, + { + COUNTRY_LATIN_AMERICA, + 437, + 850, + { + &Ow2LA437001, // LA 437 AT Kbd + &Ow2LA850000, // LA 850 AT Kbd + }, + { + &Ow2LA437011, // LA 437 EN Kbd + &Ow2LA850010, // LA 850 EN Kbd + }, + { + &Ow2LA437011, // LA 437 EN Kbd (for New Std as Old) + &Ow2LA850010 // LA 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_NETHERLANDS, + 437, + 850, + { + &Ow2NL437001, // NL 437 AT Kbd + &Ow2NL850000, // NL 850 AT Kbd + }, + { + &Ow2NL437011, // NL 437 EN Kbd + &Ow2NL850010, // NL 850 EN Kbd + }, + { + &Ow2NL437011, // NL 437 EN Kbd (for New Std as Old) + &Ow2NL850010 // NL 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_NORWAY, + 865, + 850, + { + &Ow2NO865001, // NO 865 AT Kbd + &Ow2NO850000, // NO 850 AT Kbd + }, + { + &Ow2NO865011, // NO 865 EN Kbd + &Ow2NO850010, // NO 850 EN Kbd + }, + { + &Ow2NO865011, // NO 865 EN Kbd (for New Std as Old) + &Ow2NO850010 // NO 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_PORTUGAL, + 860, + 850, + { + &Ow2PO860001, // PO 860 AT Kbd + &Ow2PO850000, // PO 850 AT Kbd + }, + { + &Ow2PO860011, // PO 860 EN Kbd + &Ow2PO850010, // PO 850 EN Kbd + }, + { + &Ow2PO860011, // PO 860 EN Kbd (for New Std as Old) + &Ow2PO850010 // PO 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_SWITZERLAND, + 437, + 850, + { + &Ow2SF437001, // SF 437 AT Kbd + &Ow2SF850000, // SF 850 AT Kbd + }, + { + &Ow2SF437011, // SF 437 EN Kbd + &Ow2SF850010, // SF 850 EN Kbd + }, + { + &Ow2SF437011, // SF 437 EN Kbd (for New Std as Old) + &Ow2SF850010 // SF 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_SWITZERLAND, + 437, + 850, + { + &Ow2SG437001, // SG 437 AT Kbd + &Ow2SG850000, // SG 850 AT Kbd + }, + { + &Ow2SG437011, // SG 437 EN Kbd + &Ow2SG850010, // SG 850 EN Kbd + }, + { + &Ow2SG437011, // SG 437 EN Kbd (for New Std as Old) + &Ow2SG850010 // SG 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_SPAIN, + 437, + 850, + { + &Ow2SP437001, // SP 437 AT Kbd + &Ow2SP850000, // SP 850 AT Kbd + }, + { + &Ow2SP437011, // SP 437 EN Kbd + &Ow2SP850010, // SP 850 EN Kbd + }, + { + &Ow2SP437011, // SP 437 EN Kbd (for New Std as Old) + &Ow2SP850010 // SP 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_FINLAND, + 437, + 850, + { + &Ow2SU437001, // SU 437 AT Kbd + &Ow2SU850000, // SU 850 AT Kbd + }, + { + &Ow2SU437011, // SU 437 EN Kbd + &Ow2SU850010, // SU 850 EN Kbd + }, + { + &Ow2SU437011, // SU 437 EN Kbd (for New Std as Old) + &Ow2SU850010 // SU 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_SWEDEN, + 437, + 850, + { + &Ow2SV437001, // SV 437 AT Kbd + &Ow2SV850000, // SV 850 AT Kbd + }, + { + &Ow2SV437011, // SV 437 EN Kbd + &Ow2SV850010, // SV 850 EN Kbd + }, + { + &Ow2SV437011, // SV 437 EN Kbd (for New Std as Old) + &Ow2SV850010 // SV 850 EN Kbd (for New Std as Old) + } + }, + { + CTRY_UNITED_KINGDOM, + 437, + 850, + { + &Ow2UK437001, // UK 437 AT Kbd + &Ow2UK850000, // UK 850 AT Kbd + }, + { + &Ow2UK437011, // UK 437 EN Kbd + &Ow2UK850010, // UK 850 EN Kbd + }, + { + &Ow2UK437111, // UK 437 EN Kbd New Std + &Ow2UK850011 // UK 850 EN Kbd New Std + } + }, + { + /* Must be last as the default */ + + CTRY_UNITED_STATES, + 437, + 850, + { + &Ow2US437001, // US 437 AT Kbd + &Ow2US850000, // US 850 AT Kbd + }, + { + &Ow2US437011, // US 437 EN Kbd + &Ow2US850010, // US 850 EN Kbd + }, + { + &Ow2US437011, // US 437 EN Kbd (for New Std as Old) + &Ow2US850010 // US 850 EN Kbd (for New Std as Old) + } + }, + { + 0, + 0, + 0, + { + NULL, + NULL, + }, + { + NULL, + NULL, + }, + { + NULL, + NULL + } + } + }; + +#ifdef JAPAN +// MSKK Aug.03.1993 V-AkihiS +typedef struct _KBD_TYPE_TABLE_OEM +{ + BYTE OemSubType; + KBD_TYPE_TABLE EnTable; + #if DBG + PBYTE OemSubTypeStr; + #endif +} KBD_TYPE_TABLE_OEM, *PKBD_TYPE_TABLE_OEM; + +typedef struct _KBD_TYPE_TABLE_JP +{ + BYTE OemId; + PKBD_TYPE_TABLE_OEM pKbdTableOEM; + #if DBG + PBYTE OemIdStr; + #endif +} KBD_TYPE_TABLE_JP; + +#if DBG +BYTE SubKbdTypeMicrosoftStr[] = "Microsoft"; + +BYTE AXKbdDesktopTypeStr[] = "AX KeyBoard"; +BYTE IBMKbd002TypeStr[] = "IBM-002 Keyboard"; +BYTE IBMKbdA01TypeStr[] = "106 keyboard"; +BYTE IBM101KbdTypeStr[] = "101 keyboard"; +#endif + +KBD_TYPE_TABLE_OEM KbdTypeTableMicrosoft[] = + { + { + MICROSOFT_KBD_101_TYPE, + { + &Ow2JP932011IBM101, // 101 keybaord 932 + &Ow2JP437011IBM101 // 101 keyboard 437 + } + #if DBG + , (PBYTE)&IBM101KbdTypeStr + #endif + }, + { + MICROSOFT_KBD_AX_TYPE, + { + &Ow2JP932011AX, // AX keybaord 932 + &Ow2JP437011AX // AX keyboard 437 + } + #if DBG + , (PBYTE)&AXKbdDesktopTypeStr + #endif + }, + { + MICROSOFT_KBD_106_TYPE, + { + &Ow2JP932011IBMA01, // 106 keybaord 932 + &Ow2JP437011IBMA01 // 106 keyboard 437 + } + #if DBG + , (PBYTE)&IBMKbdA01TypeStr + #endif + }, + { + MICROSOFT_KBD_002_TYPE, + { + &Ow2JP932011IBM002, // IBM-002 keybaord 932 + &Ow2JP437011IBM002 // IBM-002 keyboard 437 + } + #if DBG + , (PBYTE)&IBMKbd002TypeStr + #endif + }, + { + 0xFF, + { + NULL, + NULL + } + #if DBG + , NULL + #endif + } + }; + + +KBD_TYPE_TABLE_JP KbdTableJp[] = + { + { + SUB_KBD_TYPE_MICROSOFT, + (PKBD_TYPE_TABLE_OEM)&KbdTypeTableMicrosoft + #if DBG + , (PBYTE)&SubKbdTypeMicrosoftStr + #endif + }, + { + 0xFF, + NULL + #if DBG + , NULL + #endif + } + }; +#endif + +VOID +KbdSetTable( + IN ULONG KbdCP + ) +{ + ULONG i; + ULONG Ctry = SesGrp->KeyboardCountry; + PKBD_TYPE_TABLE pKbdType; +#ifdef JAPAN +// MSKK Aug.03.1993 V-AkihiS + ULONG j; +#endif + +#ifdef JAPAN +// MSKK Jul.29.1993 V-AkihiS + if (Ctry == COUNTRY_JAPAN) + { + // + // Get keyboard type to decide translation table + // + KbdType = GetKeyboardType(0); + KbdSubType = GetKeyboardType(1); + OemId = HIBYTE(KbdSubType); + OemSubType = LOBYTE(KbdSubType); + + for ( i = 0 ; + (KbdTableJp[i].OemId != OemId) && KbdTableJp[i+1].OemId != 0xFF; + i++ ); + for ( j = 0 ; + ((KbdTableJp[i].pKbdTableOEM)[j].OemSubType != OemSubType) && + (KbdTableJp[i].pKbdTableOEM)[j+1].OemSubType !=0xFF; + j++ ); + + switch(KbdCP) { + case CODEPAGE_JAPAN: + case 0: + Ow2KbdScanTable = (KbdTableJp[i].pKbdTableOEM)[j].EnTable.CP1Table; + break; + default: + Ow2KbdScanTable = (KbdTableJp[i].pKbdTableOEM)[j].EnTable.CP2Table; + break; + } + Ow2MiscFlags = EnhancedKbd; +#if DBG + IF_OS2_DEBUG2( OS2_EXE, KBD ) + { + KdPrint(("KbdSetTable: Country %d, CP %u, OemId %s, OemSubType %s\n", + Ctry, + KbdCP, + KbdTableJp[i].OemIdStr, + (KbdTableJp[i].pKbdTableOEM)[j].OemSubTypeStr)); + } +#endif + return; + } +#endif + + for ( i = 0 ; + (KbdNlsTable[i].Country != Ctry) && KbdNlsTable[i+1].Country ; + i++ ); + + if (SesGrp->KeyboardType == OS2SS_AT_KBD) + { + pKbdType = &KbdNlsTable[i].AtTable; + Ow2MiscFlags = 0; + } else if (SesGrp->KeyboardType == OS2SS_ENNEW_KBD) + { + pKbdType = &KbdNlsTable[i].EnNewTable; + Ow2MiscFlags = EnhancedKbd; + } else // OS2SS_EN_KBD + { + pKbdType = &KbdNlsTable[i].EnTable; + Ow2MiscFlags = EnhancedKbd; + } + + if (KbdNlsTable[i].CodePage2 == KbdCP) + { + Ow2KbdScanTable = pKbdType->CP2Table; + } else + { + // use CodePage 1 as the default + + Ow2KbdScanTable = pKbdType->CP1Table; + } + +#if DBG + IF_OS2_DEBUG2( OS2_EXE, KBD ) + { + KdPrint(("KbdSetTable: Country %d, CP %u, Type %s\n", + KbdNlsTable[i].Country, + (KbdNlsTable[i].CodePage2 == KbdCP) ? KbdCP : KbdNlsTable[i].CodePage1, + (SesGrp->KeyboardType == OS2SS_AT_KBD) ? "AT" : + ((SesGrp->KeyboardType == OS2SS_ENNEW_KBD) ? "EN-NEW" : "EN"))); + } +#endif + + return; +} + + +DWORD +KbdInitForNLS( + IN ULONG KbdCP + ) +{ + SesGrp->KbdCP = KbdCP; + KbdQueue->Cp = (USHORT)KbdCP; + KbdSetTable(KbdCP); + return (NO_ERROR); +} + + +DWORD +KbdNewCp( IN ULONG CodePage) +{ + DWORD Rc = NO_ERROR; + +#ifdef DBCS +// MSKK Apr.16.1993 V-AkihiS + ULONG CPTmp; +#endif + +#ifdef DBCS +// MSKK Apr.16.1993 V-AkihiS + CPTmp = CodePage ? CodePage : SesGrp->PrimaryCP; +#endif + if (SesGrp->KbdCP != CodePage) + { +#ifdef DBCS +// MSKK Apr.16.1993 V-AkihiS + Rc = !SetConsoleCP((UINT)CPTmp); +#else + Rc = !SetConsoleCP((UINT)CodePage); +#endif + if (Rc) + { + ASSERT1("KbdNewCp: Cannot set ConsoelCP", FALSE); + } else + { + KbdQueue->Cp = (USHORT)CodePage; + SesGrp->KbdCP = CodePage; + KbdSetTable(CodePage); + } + } + return (Rc); +} |