/*++ 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 #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); }