summaryrefslogtreecommitdiffstats
path: root/private/os2/os2ses/kbdnls.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/os2/os2ses/kbdnls.c')
-rw-r--r--private/os2/os2ses/kbdnls.c191
1 files changed, 191 insertions, 0 deletions
diff --git a/private/os2/os2ses/kbdnls.c b/private/os2/os2ses/kbdnls.c
new file mode 100644
index 000000000..26d6c5207
--- /dev/null
+++ b/private/os2/os2ses/kbdnls.c
@@ -0,0 +1,191 @@
+/*++
+
+Copyright (c) 1989 Microsoft Corporation
+
+Module Name:
+
+ kbdnls.c
+
+Abstract:
+
+ This module contains the NLS support for Kbd.
+
+Author:
+
+ KazuM 15-May-1992
+
+Environment:
+
+ User Mode Only
+
+Revision History:
+
+--*/
+
+#ifdef DBCS
+
+// If NLS module for console doesn't present, then NO_CONSOLE_NLS switch should be enable
+// difinition.
+// If NLS module for User doesn't present, then NO_IME switch should be enable difinition.
+//#define NO_CONSOLE_NLS
+//#define NO_IME
+
+#include <stdio.h>
+#define WIN32_ONLY
+#include "os2ses.h"
+#include "event.h"
+#include "trans.h"
+#ifndef NO_IME
+#include <ime.h>
+#endif
+
+#ifndef NO_CONSOLE_NLS
+typedef struct _NLS_SHIFT_REPORT {
+ WORD wVirtualKeyCode;
+ BYTE NlsShiftKeyCode;
+} NLS_SHIFT_REPORT, *PNLS_SHIFT_REPORT;
+
+NLS_SHIFT_REPORT NlsShiftReport[] = {
+ {VK_DBE_ALPHANUMERIC, 0x80},
+ {VK_DBE_KATAKANA, 0x40},
+ {VK_DBE_HIRAGANA, 0x20},
+ {VK_KANJI, 0x10},
+ {VK_DBE_SBCSCHAR, 0x08},
+ {VK_DBE_DBCSCHAR, 0x08}
+};
+#endif
+
+BYTE
+MapWinToOs2KbdNlsShift(IN PKEY_EVENT_RECORD WinKey)
+{
+ BYTE bNlsShift = LOBYTE(HIWORD(WinKey->dwControlKeyState));
+
+// MSKK Aug.23.1993 V-AkihiS
+// if (bNlsShift & OS2_NLS_IME_CONVERSION)
+// return bNlsShift;
+// else
+// return 0;
+ return bNlsShift;
+}
+
+BYTE
+MapWinToOs2KbdInterim(IN PKEY_EVENT_RECORD WinKey)
+{
+ return (BYTE)(HIBYTE(HIWORD(WinKey->dwControlKeyState))+0x40);
+}
+
+// MSKK Aug.10.1993 V-AkihiS
+ULONG
+MapWinToOs2KbdNlsChar(IN PKEY_EVENT_RECORD WinKey,
+ OUT PKBD_MON_PACKAGE Os2KeyInfo)
+{
+// MSKK Oct.30.1992 V-AkihiS
+// MSKK Aug.05.1993 V-AkihiS
+ BOOL Dummy;
+ BYTE AsciiDbcs[2];
+ PBYTE Asc;
+ ULONG NumBytes, i;
+
+ NumBytes = sizeof(AsciiDbcs);
+ NumBytes = WideCharToMultiByte(SesGrp->KbdCP,
+ 0,
+ &WinKey->uChar.UnicodeChar,
+ 1,
+ AsciiDbcs,
+ NumBytes,
+ NULL,
+ &Dummy);
+ Asc = AsciiDbcs;
+ for (i = 0; i < NumBytes; i ++) {
+ Os2KeyInfo[i].KeyInfo.chChar = *Asc++;
+ Os2KeyInfo[i].KeyInfo.chScan = 0;
+ Os2KeyInfo[i].KeyInfo.fbStatus = MapWinToOs2KbdInterim(WinKey);
+ }
+
+#if DBG
+ IF_OD2_DEBUG(KBD)
+ {
+ KdPrint(("MapWinToOs2KbdNlsChar: ASCII %x, Uni %x, VKey %x, VScan %x, Ctrl %lx =>\n ASCII %x, Scan %x\n",
+ WinKey->uChar.AsciiChar, WinKey->uChar.UnicodeChar,
+ WinKey->wVirtualKeyCode, WinKey->wVirtualScanCode,
+ WinKey->dwControlKeyState,
+ Os2KeyInfo[0].KeyInfo.chChar, Os2KeyInfo[0].KeyInfo.chScan));
+ }
+#endif
+ return NumBytes;
+}
+
+BYTE
+MapWinToOs2KbdNlsShiftReport(IN PKEY_EVENT_RECORD WinKey,
+ IN PKBDKEYINFO Os2Key)
+{
+ int i;
+
+#ifndef NO_CONSOLE_NLS
+ if (Os2Key->bNlsShift & OS2_NLS_IME_CONVERSION)
+ {
+ for (i=0; i < sizeof(NlsShiftReport)/sizeof(NLS_SHIFT_REPORT); i++)
+ if (NlsShiftReport[i].wVirtualKeyCode == WinKey->wVirtualKeyCode)
+ if (WinKey->bKeyDown)
+ return NlsShiftReport[i].NlsShiftKeyCode;
+ }
+#endif
+ return 0;
+}
+
+VOID
+GetNlsMode(IN PKBDINFO KbdInfo)
+{
+ DWORD dwNlsMode;
+ BYTE NlsShift;
+ BYTE Interim;
+
+#ifndef NO_CONSOLE_NLS
+ if (!GetConsoleNlsMode(hConsoleInput,&dwNlsMode)) {
+#if DBG
+ IF_OD2_DEBUG2( KBD, OS2_EXE )
+ KdPrint(("GetNlsMode: Can not get CONIN NLS Mode\n"));
+#endif
+ dwNlsMode = 0;
+ }
+#else
+ dwNlsMode = 0;
+#endif
+
+ NlsShift = LOBYTE(HIWORD(dwNlsMode));
+ Interim = HIBYTE(HIWORD(dwNlsMode));
+ KbdInfo->fsInterim = MAKEWORD((KbdInfo->fsInterim | Interim),NlsShift);
+}
+
+VOID
+SetNlsMode(IN KBDINFO KbdInfo)
+{
+ DWORD dwNlsMode;
+ BYTE NlsShift;
+ BYTE Interim;
+
+ NlsShift = HIBYTE(KbdInfo.fsInterim);
+ Interim = LOBYTE(KbdInfo.fsInterim);
+ dwNlsMode = MAKELONG(0, MAKEWORD(NlsShift,Interim));
+
+#ifndef NO_CONSOLE_NLS
+// MSKK Apr.04.1993 V-AkihiS
+// MSKK Aug.23.1993 V-AkihiS
+ //
+ // When hiragana or sbcsdbcs is set, set IME enable flag too.
+ //
+ if (dwNlsMode & (NLS_DBCSCHAR | NLS_HIRAGANA)) {
+ dwNlsMode |= NLS_IME_CONVERSION;
+ }
+
+ if (!SetConsoleNlsMode(hConsoleInput,dwNlsMode)) {
+#if DBG
+ IF_OD2_DEBUG2( KBD, OS2_EXE )
+ KdPrint(("SetNlsMode: Can not set CONIN NLS Mode\n"));
+#endif
+ dwNlsMode = 0;
+ }
+#endif
+
+}
+#endif