summaryrefslogtreecommitdiffstats
path: root/private/os2/os2ses/kbdtable.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/os2/os2ses/kbdtable.c')
-rw-r--r--private/os2/os2ses/kbdtable.c653
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);
+}