From 73b9d95bbefe2741cdbe0dba75c8641b8bcb8bb2 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 13 Nov 2018 11:09:08 +1100 Subject: [PATCH] [Common] First round of class refactor --- .../src/kmx/kmxtest/inc/kmx_processor.h | 131 ++++++++++-------- .../src/kmx/kmxtest/inc/kmx_xstring.h | 12 ++ .../src/kmx/kmxtest/inc/kmxtest.h | 2 - .../kmx/kmxtest/src/appint/kmx_actions.cpp | 6 +- .../src/kmx/kmxtest/src/kmx_capslock.cpp | 14 +- .../src/kmx/kmxtest/src/kmx_file.cpp | 18 ++- .../src/kmx/kmxtest/src/kmx_modifiers.cpp | 2 +- .../src/kmx/kmxtest/src/kmx_options.cpp | 10 +- .../src/kmx/kmxtest/src/kmx_processor.cpp | 95 +++++++------ .../src/kmx/kmxtest/src/kmxtest.cpp | 41 ++---- 10 files changed, 180 insertions(+), 151 deletions(-) diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmx_processor.h b/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmx_processor.h index f201ff08db..f3a7564ff6 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmx_processor.h +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmx_processor.h @@ -362,61 +362,8 @@ typedef struct tagKMSTATE // I3616 enum ProcessStringReturn {psrPostMessages, psrCheckMatches}; -BOOL ReleaseKeyboardMemory(LPKEYBOARD kbd); - -BOOL ProcessHook(); // returns FALSE on error or key not matched [only for AITip] -BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke); -BOOL ContextMatch(LPKEY kkp); -int PostString(PWSTR str, LPKEYBOARD lpkb, PWSTR endstr, BOOL *pOutputKeystroke); - -#define ShowDlgItem(hdlg, id, fShow ) ShowWindow( GetDlgItem( (hdlg), (id) ), (fShow) ? SW_SHOW : SW_HIDE ) -#define EnableDlgItem(hdlg, id, fEnable ) EnableWindow( GetDlgItem( (hdlg), (id) ), (fEnable) ) - -BOOL LoadlpKeyboard(PSTR keyboardName); - -PSTR wstrtostr(PWSTR in); -PWSTR strtowstr(PSTR in); - -/* Debugging functions */ - -#define DebugLog(msg,...) (ShouldDebug() ? DebugLog_1(__FILE__, __LINE__, __FUNCTION__, (msg),__VA_ARGS__) : 0) -int DebugLog_1(char *file, int line, char *function, char *fmt, ...); -char *Debug_VirtualKey(WORD vk); -char *Debug_UnicodeString(PWSTR s, int x = 0); -char *Debug_ModifierName(UINT modifiers); -inline BOOL ShouldDebug(); - -#define console_error(msg,...) write_console(TRUE, (msg), __VA_ARGS__) -#define console_log(msg,...) write_console(FALSE, (msg), __VA_ARGS__) - -void write_console(BOOL error, wchar_t *fmt, ...); - /* Utility */ -PWSTR GetSystemStore(LPKEYBOARD kb, DWORD SystemID); - -#define Uni_IsSurrogate1(ch) ((ch) >= 0xD800 && (ch) <= 0xDBFF) -#define Uni_IsSurrogate2(ch) ((ch) >= 0xDC00 && (ch) <= 0xDFFF) -#define Uni_IsSMP(ch) ((ch) >= 0x10000) - -#define Uni_SurrogateToUTF32(ch, cl) (((ch) - 0xD800) * 0x400 + ((cl) - 0xDC00) + 0x10000) - -#define Uni_UTF32ToSurrogate1(ch) (((ch) - 0x10000) / 0x400 + 0xD800) -#define Uni_UTF32ToSurrogate2(ch) (((ch) - 0x10000) % 0x400 + 0xDC00) - - -void ResetCapsLock(void); -void KeyCapsLockPress(BOOL FIsUp); -void KeyShiftPress(BOOL FIsUp); - -BOOL IsEquivalentShift(UINT rshift, UINT kshift); - -void LoadKeyboardOptions(LPINTKEYBOARDINFO kp); -void FreeKeyboardOptions(LPINTKEYBOARDINFO kp); -void SetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSet, int nStoreToRead); -void ResetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToReset); -void SaveKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSave); - #define GLOBAL_ContextStackSize 80 /* External interface functions */ @@ -432,7 +379,6 @@ typedef struct tagKEYMAN64THREADDATA /* Thread Local Data */ -PKEYMAN64THREADDATA ThreadGlobals(); /* Temporary globals */ @@ -441,10 +387,83 @@ struct KMXTest_KeyboardOption { }; extern BOOL g_debug_ToConsole, g_debug_KeymanLog, g_silent; -extern DWORD g_shiftState; + extern BOOL g_simulateAltGr, g_baseLayoutGivesCtrlRAltForRAlt; extern wchar_t g_baseLayout[260], g_baseLayoutAlt[34], g_context[512]; -extern INTKEYBOARDINFO g_keyboard; extern KMXTest_KeyboardOption g_keyboardOption[1024]; extern int g_keyboardOptionCount; extern BOOL g_capsLock; + +class KMX_Processor { +private: + AIWin2000Unicode g_app; + INTKEYBOARDINFO g_keyboard = { 0 }; + KEYMAN64THREADDATA g_ThreadData = { 0 }; + DWORD g_shiftState = 0; + + /* File loading */ + LPKEYBOARD FixupKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize); + BOOL LoadKeyboard(LPSTR fileName, LPKEYBOARD *lpKeyboard); + BOOL VerifyKeyboard(LPBYTE filebase, DWORD sz); + BOOL VerifyChecksum(LPBYTE buf, DWORD sz); + PWCHAR StringOffset(PBYTE base, DWORD offset); + + BOOL ReleaseKeyboardMemory(LPKEYBOARD kbd); + + /* Keystroke Processing */ + + BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke); + BOOL ContextMatch(LPKEY kkp); + int PostString(PWSTR str, LPKEYBOARD lpkb, PWSTR endstr, BOOL *pOutputKeystroke); + + /* Platform tests */ + + BOOL IsMatchingBaseLayout(PWCHAR layoutName); + BOOL IsMatchingPlatformString(PWCHAR platform); + BOOL IsMatchingPlatform(LPSTORE s); + + /* Utility functions */ + + PWSTR GetSystemStore(LPKEYBOARD kb, DWORD SystemID); + + /* Caps Lock and modifier management */ + + void ResetCapsLock(void); + void KeyCapsLockPress(BOOL FIsUp); + void KeyShiftPress(BOOL FIsUp); + + BOOL IsEquivalentShift(UINT rshift, UINT kshift); + + /* Keyboard options */ + + void LoadKeyboardOptions(LPINTKEYBOARDINFO kp); + void FreeKeyboardOptions(LPINTKEYBOARDINFO kp); + void SetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSet, int nStoreToRead); + void ResetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToReset); + void SaveKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSave); + +public: + KMX_Processor(); + ~KMX_Processor(); + BOOL LoadlpKeyboard(PSTR keyboardName); + BOOL ProcessHook(UINT vkey, DWORD modifiers, WCHAR charCode); // returns FALSE on error or key not matched + PKEYMAN64THREADDATA ThreadGlobals(); + + AIWin2000Unicode *GetApp(); + LPINTKEYBOARDINFO GetKeyboard(); +}; + +/* Debugging functions */ + +#define DebugLog(msg,...) (ShouldDebug() ? DebugLog_1(__FILE__, __LINE__, __FUNCTION__, (msg),__VA_ARGS__) : 0) +int DebugLog_1(char *file, int line, char *function, char *fmt, ...); +char *Debug_VirtualKey(WORD vk); +char *Debug_UnicodeString(PWSTR s, int x = 0); +char *Debug_ModifierName(UINT modifiers); +inline BOOL ShouldDebug(); + +#define console_error(msg,...) write_console(TRUE, (msg), __VA_ARGS__) +#define console_log(msg,...) write_console(FALSE, (msg), __VA_ARGS__) + +void write_console(BOOL error, wchar_t *fmt, ...); + diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmx_xstring.h b/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmx_xstring.h index de320d51e7..2cfa645a6a 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmx_xstring.h +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmx_xstring.h @@ -2,6 +2,15 @@ #include "kmx_base.h" +#define Uni_IsSurrogate1(ch) ((ch) >= 0xD800 && (ch) <= 0xDBFF) +#define Uni_IsSurrogate2(ch) ((ch) >= 0xDC00 && (ch) <= 0xDFFF) +#define Uni_IsSMP(ch) ((ch) >= 0x10000) + +#define Uni_SurrogateToUTF32(ch, cl) (((ch) - 0xD800) * 0x400 + ((cl) - 0xDC00) + 0x10000) + +#define Uni_UTF32ToSurrogate1(ch) (((ch) - 0x10000) / 0x400 + 0xD800) +#define Uni_UTF32ToSurrogate2(ch) (((ch) - 0x10000) % 0x400 + 0xDC00) + PWSTR incxstr(PWSTR p); PWSTR decxstr(PWSTR p); int xstrlen(PWSTR p); @@ -9,3 +18,6 @@ int xstrlen_ignoreifopt(PWSTR p); int xstrpos(PWSTR p1, PWSTR p); PWSTR xstrchr(PWSTR buf, PWSTR chr); int xchrcmp(PWSTR ch1, PWSTR ch2); + +PSTR wstrtostr(PWSTR in); +PWSTR strtowstr(PSTR in); diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmxtest.h b/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmxtest.h index 5788436002..3f59c932d3 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmxtest.h +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/inc/kmxtest.h @@ -1,4 +1,2 @@ #pragma once -AIWin2000Unicode *GetApp(); -LPINTKEYBOARDINFO GetKeyboard(); \ No newline at end of file diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/appint/kmx_actions.cpp b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/appint/kmx_actions.cpp index 5beb4ce335..af263d8f38 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/appint/kmx_actions.cpp +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/appint/kmx_actions.cpp @@ -203,10 +203,10 @@ BOOL AIWin2000Unicode::CheckOutput(wchar_t *expectedOutput) { BOOL result = !wcscmp(output, expectedOutput); - wchar_t context[256]; - GetApp()->context->Get(context, 256); + wchar_t _context[256]; + context->Get(_context, 256); - write_console(!result, L"context = %hs\n", Debug_UnicodeString(context, 0)); + write_console(!result, L"context = %hs\n", Debug_UnicodeString(_context, 0)); write_console(!result, L"output = %hs\n", Debug_UnicodeString(output, 0)); write_console(!result, L"expected = %hs\n", Debug_UnicodeString(expectedOutput, 0)); diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_capslock.cpp b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_capslock.cpp index 0266b9a9c2..0380b5ab47 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_capslock.cpp +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_capslock.cpp @@ -4,7 +4,7 @@ */ #include "pch.h" -void ResetCapsLock(void) +void KMX_Processor::ResetCapsLock(void) { DebugLog("ResetCapsLock: enter"); @@ -14,33 +14,33 @@ void ResetCapsLock(void) if(g_capsLock) { DebugLog("ResetCapsLock: caps lock is on, switching off caps lock"); - GetApp()->QueueAction(QIT_CAPSLOCK, 0); + g_app.QueueAction(QIT_CAPSLOCK, 0); } } DebugLog("ResetCapsLock: exit"); } -void KeyCapsLockPress(BOOL FIsUp) // I3284 - void // I3529 +void KMX_Processor::KeyCapsLockPress(BOOL FIsUp) // I3284 - void // I3529 { if(g_keyboard.Keyboard->dwFlags & KF_CAPSONONLY) { if(FIsUp && !g_capsLock) // I267 - 24/11/2006 invert GetKeyState test { - GetApp()->QueueAction(QIT_CAPSLOCK, 1); + g_app.QueueAction(QIT_CAPSLOCK, 1); } } else if(g_keyboard.Keyboard->dwFlags & KF_CAPSALWAYSOFF) { if(!FIsUp && g_capsLock) { // I267 - 24/11/2006 invert GetKeyState test - GetApp()->QueueAction(QIT_CAPSLOCK, 0); + g_app.QueueAction(QIT_CAPSLOCK, 0); } } } -void KeyShiftPress(BOOL FIsUp) // I3284 - void // I3529 +void KMX_Processor::KeyShiftPress(BOOL FIsUp) // I3284 - void // I3529 { if(!g_capsLock) return; @@ -48,7 +48,7 @@ void KeyShiftPress(BOOL FIsUp) // I3284 - void // I3529 { if(!FIsUp) { - GetApp()->QueueAction(QIT_CAPSLOCK, 0); + g_app.QueueAction(QIT_CAPSLOCK, 0); } } } diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_file.cpp b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_file.cpp index 48d5ed6f98..930b375a46 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_file.cpp +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_file.cpp @@ -5,16 +5,14 @@ #include "pch.h" #include -BOOL VerifyKeyboard(LPBYTE filebase, DWORD sz); -BOOL LoadKeyboard(LPSTR fileName, LPKEYBOARD *lpKeyboard); - +/* TODO: use portable 64-bit check here */ #ifdef _WIN64 LPKEYBOARD CopyKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize); #else LPKEYBOARD FixupKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize); #endif -BOOL LoadlpKeyboard(PSTR KeyboardName) +BOOL KMX_Processor::LoadlpKeyboard(PSTR KeyboardName) { if(!LoadKeyboard(KeyboardName, &g_keyboard.Keyboard)) return FALSE; // I5136 @@ -80,7 +78,7 @@ unsigned long CalculateBufferCRC(unsigned long count, BYTE *p) return crc; } -BOOL LoadKeyboard(LPSTR fileName, LPKEYBOARD *lpKeyboard) +BOOL KMX_Processor::LoadKeyboard(LPSTR fileName, LPKEYBOARD *lpKeyboard) { DWORD sz; LPBYTE buf; @@ -166,7 +164,7 @@ BOOL LoadKeyboard(LPSTR fileName, LPKEYBOARD *lpKeyboard) return TRUE; } -PWCHAR StringOffset(PBYTE base, DWORD offset) +PWCHAR KMX_Processor::StringOffset(PBYTE base, DWORD offset) { if(offset == 0) return NULL; return (PWCHAR)(base + offset); @@ -179,7 +177,7 @@ PWCHAR StringOffset(PBYTE base, DWORD offset) * We know the base is dwFileSize * 3 * After this function finishes, we still need to keep the original data */ -LPKEYBOARD CopyKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize) +LPKEYBOARD KMX_Processor::CopyKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize) { UNREFERENCED_PARAMETER(dwFileSize); @@ -262,7 +260,7 @@ LPKEYBOARD CopyKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize) #else -LPKEYBOARD FixupKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize) +LPKEYBOARD KMX_Processor::FixupKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize) { DWORD i, j; PCOMP_KEYBOARD ckbp = (PCOMP_KEYBOARD) base; @@ -302,7 +300,7 @@ LPKEYBOARD FixupKeyboard(PBYTE bufp, PBYTE base, DWORD dwFileSize) #endif -BOOL VerifyChecksum(LPBYTE buf, DWORD sz) +BOOL KMX_Processor::VerifyChecksum(LPBYTE buf, DWORD sz) { DWORD tempcs; PCOMP_KEYBOARD ckbp; @@ -315,7 +313,7 @@ BOOL VerifyChecksum(LPBYTE buf, DWORD sz) return tempcs == CalculateBufferCRC(sz, buf); } -BOOL VerifyKeyboard(LPBYTE filebase, DWORD sz) +BOOL KMX_Processor::VerifyKeyboard(LPBYTE filebase, DWORD sz) { DWORD i; PCOMP_KEYBOARD ckbp = (PCOMP_KEYBOARD) filebase; diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_modifiers.cpp b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_modifiers.cpp index 7ae4119b88..ab9dfcb43e 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_modifiers.cpp +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_modifiers.cpp @@ -75,7 +75,7 @@ static BYTE states[MAX_RSHIFT][MAX_KSHIFT] = { * K_CTRLFLAG and K_ALTFLAG as well as specific keys correctly. */ -BOOL IsEquivalentShift(UINT rshift, UINT kshift) { +BOOL KMX_Processor::IsEquivalentShift(UINT rshift, UINT kshift) { // // The rule shift must have ISVIRTUALKEY bit set for virt.keys // diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_options.cpp b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_options.cpp index c8d8108915..0f3faf6301 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_options.cpp +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_options.cpp @@ -4,7 +4,7 @@ */ #include "pch.h" -void FreeKeyboardOptions(LPINTKEYBOARDINFO kp) +void KMX_Processor::FreeKeyboardOptions(LPINTKEYBOARDINFO kp) { assert(kp != NULL); assert(kp->Keyboard != NULL); @@ -20,7 +20,7 @@ void FreeKeyboardOptions(LPINTKEYBOARDINFO kp) kp->KeyboardOptions = NULL; } -void SetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSet, int nStoreToRead) +void KMX_Processor::SetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSet, int nStoreToRead) { assert(kp != NULL); assert(kp->Keyboard != NULL); @@ -45,7 +45,7 @@ void SetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSet, int nStoreToRead) kp->Keyboard->dpStoreArray[nStoreToSet].dpString = kp->KeyboardOptions[nStoreToSet].Value; } -void ResetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToReset) +void KMX_Processor::ResetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToReset) { assert(kp != NULL); assert(kp->Keyboard != NULL); @@ -78,7 +78,7 @@ void ResetKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToReset) } -void SaveKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSave) +void KMX_Processor::SaveKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSave) { assert(kp != NULL); assert(kp->Keyboard != NULL); @@ -96,7 +96,7 @@ void SaveKeyboardOption(LPINTKEYBOARDINFO kp, int nStoreToSave) }*/ } -void LoadKeyboardOptions(LPINTKEYBOARDINFO kp) +void KMX_Processor::LoadKeyboardOptions(LPINTKEYBOARDINFO kp) { assert(kp != NULL); assert(kp->Keyboard != NULL); diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_processor.cpp b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_processor.cpp index 6520a3df9c..5e2e644313 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_processor.cpp +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmx_processor.cpp @@ -4,6 +4,17 @@ */ #include "pch.h" // I4575 + +KMX_Processor::KMX_Processor() { + g_ThreadData.IndexStack = new WORD[GLOBAL_ContextStackSize]; //Globals::Ini()->ContextStackSize]; // I3158 // I3524 + g_ThreadData.miniContext = new WCHAR[GLOBAL_ContextStackSize]; +} + +KMX_Processor::~KMX_Processor() { + delete[] g_ThreadData.IndexStack; + delete[] g_ThreadData.miniContext; +} + /* * BOOL ProcessHook(); * @@ -17,10 +28,14 @@ * process, and checks the state of Windows for the keyboard handling. */ -BOOL ProcessHook() +BOOL KMX_Processor::ProcessHook(UINT vkey, DWORD modifiers, WCHAR charCode) { - AIWin2000Unicode *app = GetApp(); LPKEYBOARD kbd = GetKeyboard()->Keyboard; + PKEYMAN64THREADDATA _td = ThreadGlobals(); + + _td->state.vkey = vkey; + _td->state.charCode = charCode; + g_shiftState = modifiers; if (kbd->StartGroup[BEGIN_UNICODE] == -1) { // TODO: flag an error @@ -33,7 +48,7 @@ BOOL ProcessHook() ProcessGroup(gp, &fOutputKeystroke); - app->SetCurrentShiftState(g_shiftState); + g_app.SetCurrentShiftState(g_shiftState); return !fOutputKeystroke; } @@ -52,7 +67,7 @@ BOOL ProcessHook() * has a lot of crucial code in it! */ -BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke) +BOOL KMX_Processor::ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke) { DWORD i; LPKEY kkp = NULL; @@ -67,7 +82,6 @@ BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke) */ PKEYMAN64THREADDATA _td = ThreadGlobals(); - AIWin2000Unicode *app = GetApp(); LPKEYBOARD kbd = GetKeyboard()->Keyboard; sdmfI = -1; @@ -146,16 +160,16 @@ BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke) BOOL fIsBackspace = _td->state.vkey == VK_BACK && (g_shiftState & (LCTRLFLAG|RCTRLFLAG|LALTFLAG|RALTFLAG)) == 0; // I4128 if(fIsBackspace) { // I4838 // I4933 - PWCHAR pdeletecontext = app->ContextBuf(1); // I4933 + PWCHAR pdeletecontext = g_app.ContextBuf(1); // I4933 if(!pdeletecontext || *pdeletecontext == 0) { // I4933 - app->QueueAction(QIT_INVALIDATECONTEXT, 0); + g_app.QueueAction(QIT_INVALIDATECONTEXT, 0); *pOutputKeystroke = TRUE; // I4933 return FALSE; // I4933 } - app->QueueAction(QIT_BACK, BK_BACKSPACE); // I4933 + g_app.QueueAction(QIT_BACK, BK_BACKSPACE); // I4933 } else { // I4024 // I4128 // I4287 // I4290 DebugLog(" ... IsLegacy = FALSE; IsTIP = TRUE"); // I4128 - app->QueueAction(QIT_INVALIDATECONTEXT, 0); + g_app.QueueAction(QIT_INVALIDATECONTEXT, 0); *pOutputKeystroke = TRUE; return FALSE; } @@ -168,7 +182,7 @@ BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke) else if (_td->state.charCode != 0 && _td->state.charCode != 0xFFFF && gp->fUsingKeys) { /* No rule found, is a character key */ - app->QueueAction(QIT_CHAR, _td->state.charCode); + g_app.QueueAction(QIT_CHAR, _td->state.charCode); } return TRUE; @@ -185,9 +199,9 @@ BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke) // 11 Aug 2003 - I25(v6) - mcdurdin - CODE_NUL context support if(*kkp->dpContext == UC_SENTINEL && *(kkp->dpContext+1) == CODE_NUL) - wcsncpy_s(_td->miniContext, GLOBAL_ContextStackSize, app->ContextBuf(xstrlen_ignoreifopt(kkp->dpContext)-1), GLOBAL_ContextStackSize); // I3162 // I3536 + wcsncpy_s(_td->miniContext, GLOBAL_ContextStackSize, g_app.ContextBuf(xstrlen_ignoreifopt(kkp->dpContext)-1), GLOBAL_ContextStackSize); // I3162 // I3536 else - wcsncpy_s(_td->miniContext, GLOBAL_ContextStackSize, app->ContextBuf(xstrlen_ignoreifopt(kkp->dpContext)), GLOBAL_ContextStackSize); // I3162 // I3536 + wcsncpy_s(_td->miniContext, GLOBAL_ContextStackSize, g_app.ContextBuf(xstrlen_ignoreifopt(kkp->dpContext)), GLOBAL_ContextStackSize); // I3162 // I3536 _td->miniContext[GLOBAL_ContextStackSize-1] = 0; @@ -211,12 +225,12 @@ BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke) if(*p == UC_SENTINEL) switch(*(p+1)) { - case CODE_DEADKEY: app->QueueAction(QIT_BACK, BK_DEADKEY); break; + case CODE_DEADKEY: g_app.QueueAction(QIT_BACK, BK_DEADKEY); break; case CODE_NUL: break; // 11 Aug 2003 - I25(v6) - mcdurdin - CODE_NUL context support } else { - app->QueueAction(QIT_BACK, 0); + g_app.QueueAction(QIT_BACK, 0); } } p = kkp->dpOutput; @@ -254,7 +268,7 @@ BOOL ProcessGroup(LPGROUP gp, BOOL *pOutputKeystroke) * to the active application, via the Keyman PostKey buffer. */ -int PostString(PWSTR str, LPKEYBOARD lpkb, PWSTR endstr, BOOL *pOutputKeystroke) +int KMX_Processor::PostString(PWSTR str, LPKEYBOARD lpkb, PWSTR endstr, BOOL *pOutputKeystroke) { PWSTR p, q, temp; LPSTORE s; @@ -264,26 +278,25 @@ int PostString(PWSTR str, LPKEYBOARD lpkb, PWSTR endstr, BOOL *pOutputKeystroke) PKEYMAN64THREADDATA _td = ThreadGlobals(); if(!_td) return FALSE; - AIWin2000Unicode *app = GetApp(); // TODO: Refactor to use incxstr for(p = str; *p && (p < endstr || !endstr); p++) - { - if(*p == UC_SENTINEL) - switch(*(++p)) - { - case CODE_EXTENDED: // Start of a virtual key section w/shift codes - p++; + { + if(*p == UC_SENTINEL) + switch(*(++p)) + { + case CODE_EXTENDED: // Start of a virtual key section w/shift codes + p++; shift = *p; //(*p<<8) | *(p+1); - app->QueueAction(QIT_VSHIFTDOWN, shift); + g_app.QueueAction(QIT_VSHIFTDOWN, shift); p++; - app->QueueAction(QIT_VKEYDOWN, *p); - app->QueueAction(QIT_VKEYUP, *p); + g_app.QueueAction(QIT_VKEYDOWN, *p); + g_app.QueueAction(QIT_VKEYUP, *p); - app->QueueAction(QIT_VSHIFTUP, shift); + g_app.QueueAction(QIT_VSHIFTUP, shift); p++; // CODE_EXTENDEDEND ////// CODE_EXTENDEDEND will be incremented by loop @@ -293,23 +306,23 @@ int PostString(PWSTR str, LPKEYBOARD lpkb, PWSTR endstr, BOOL *pOutputKeystroke) case CODE_DEADKEY: // A deadkey to be output p++; - app->QueueAction(QIT_DEADKEY, *p); + g_app.QueueAction(QIT_DEADKEY, *p); break; case CODE_BEEP: // Sound an 'iconasterisk' beep - app->QueueAction(QIT_BELL, 0); + g_app.QueueAction(QIT_BELL, 0); break; case CODE_CONTEXT: // copy the context to the output for(q = _td->miniContext; *q; q++) { - app->QueueAction(QIT_CHAR, *q); + g_app.QueueAction(QIT_CHAR, *q); } break; case CODE_CONTEXTEX: p++; for(q = _td->miniContext, i = 0; *q && i < *p-1; i++, q=incxstr(q)); if(*q) { - app->QueueAction(QIT_CHAR, *q); + g_app.QueueAction(QIT_CHAR, *q); if(Uni_IsSurrogate1(*q) && Uni_IsSurrogate2(*(q+1))) { - app->QueueAction(QIT_CHAR, *(q+1)); + g_app.QueueAction(QIT_CHAR, *(q+1)); } } break; @@ -364,14 +377,15 @@ int PostString(PWSTR str, LPKEYBOARD lpkb, PWSTR endstr, BOOL *pOutputKeystroke) p+=2; break; } - else - app->QueueAction(QIT_CHAR, *p); + else { + g_app.QueueAction(QIT_CHAR, *p); + } } return FoundUse ? psrPostMessages : psrCheckMatches; } -BOOL IsMatchingBaseLayout(PWCHAR layoutName) // I3432 +BOOL KMX_Processor::IsMatchingBaseLayout(PWCHAR layoutName) // I3432 { BOOL bEqual = _wcsicmp(layoutName, g_baseLayout) == 0 || // I4583 _wcsicmp(layoutName, g_baseLayoutAlt) == 0; // I4583 @@ -379,7 +393,7 @@ BOOL IsMatchingBaseLayout(PWCHAR layoutName) // I3432 return bEqual; } -BOOL IsMatchingPlatformString(PWCHAR platform) // I3432 +BOOL KMX_Processor::IsMatchingPlatformString(PWCHAR platform) // I3432 { // TODO retrieve platform string from client environment return @@ -389,7 +403,7 @@ BOOL IsMatchingPlatformString(PWCHAR platform) // I3432 _wcsicmp(platform, L"native") == 0; } -BOOL IsMatchingPlatform(LPSTORE s) // I3432 +BOOL KMX_Processor::IsMatchingPlatform(LPSTORE s) // I3432 { PWCHAR t = new WCHAR[wcslen(s->dpString)+1]; wcscpy_s(t, wcslen(s->dpString)+1, s->dpString); @@ -423,7 +437,7 @@ BOOL IsMatchingPlatform(LPSTORE s) // I3432 * ContextMatch compares the context of a rule with the current context. */ -BOOL ContextMatch(LPKEY kkp) +BOOL KMX_Processor::ContextMatch(LPKEY kkp) { WORD /*i,*/ n; PWSTR p, q, qbuf, temp; @@ -434,8 +448,7 @@ BOOL ContextMatch(LPKEY kkp) //SendDebugMessageFormat(state.msg.hwnd, sdmKeyboard, kkp->Line, "ContextMatch: ENTER [%d]", kkp->Line); PKEYMAN64THREADDATA _td = ThreadGlobals(); if(!_td) return FALSE; - AIWin2000Unicode *app = GetApp(); - + memset(_td->IndexStack, 0, GLOBAL_ContextStackSize*sizeof(WORD)); // I3158 // I3524 p = kkp->dpContext; @@ -451,7 +464,7 @@ BOOL ContextMatch(LPKEY kkp) if(*p == UC_SENTINEL && *(p+1) == CODE_NUL) { // If context buf is longer than the context, then obviously not start of doc. - if(app->ContextBuf(xstrlen_ignoreifopt(p))) return FALSE; // I2484 - Fix bug with if() following nul in same statement + if(g_app.ContextBuf(xstrlen_ignoreifopt(p))) return FALSE; // I2484 - Fix bug with if() following nul in same statement p = incxstr(p); if(*p == 0) return TRUE; } @@ -498,7 +511,7 @@ BOOL ContextMatch(LPKEY kkp) } } - q = qbuf = app->ContextBuf(xstrlen_ignoreifopt(p)); + q = qbuf = g_app.ContextBuf(xstrlen_ignoreifopt(p)); if(!q) { //SendDebugMessageFormat(state.msg.hwnd, sdmKeyboard, kkp->Line, "ContextMatch: EXIT FALSE -> context too short"); diff --git a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmxtest.cpp b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmxtest.cpp index a177cbfa4c..613147ea52 100644 --- a/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmxtest.cpp +++ b/common/engine/keyboardprocessor/src/kmx/kmxtest/src/kmxtest.cpp @@ -25,15 +25,11 @@ struct KMXTest_ChToVKey { BOOL shifted; }; -/* Globals - to refactor */ +/* Globals */ -AIWin2000Unicode *g_app = NULL; -INTKEYBOARDINFO g_keyboard = { 0 }; -KEYMAN64THREADDATA g_ThreadData = { 0 }; -BOOL g_debug_ToConsole = TRUE, g_debug_KeymanLog = TRUE; -DWORD g_shiftState = 0; int g_nKeyEvents = 0; KMXTest_KeyEvent g_keyEvents[1024] = { 0 }; +BOOL g_debug_ToConsole = TRUE, g_debug_KeymanLog = TRUE; BOOL g_silent = FALSE; /* Context - to refactor */ @@ -339,38 +335,32 @@ int main(int argc, char *argv[]) { return 2; } - g_app = new AIWin2000Unicode(); + KMX_Processor kmx; - g_ThreadData.IndexStack = new WORD[GLOBAL_ContextStackSize]; //Globals::Ini()->ContextStackSize]; // I3158 // I3524 - g_ThreadData.miniContext = new WCHAR[GLOBAL_ContextStackSize]; // run; - if (!LoadlpKeyboard(filename)) { + if (!kmx.LoadlpKeyboard(filename)) { console_error(L"Failed to load %hs\n", filename); return 1; } - PKEYMAN64THREADDATA _td = ThreadGlobals(); + PKEYMAN64THREADDATA _td = kmx.ThreadGlobals(); - g_app->SetContext(g_context); + kmx.GetApp()->SetContext(g_context); console_log(L"============ Starting test ============\n"); for (int i = 0; i < g_nKeyEvents; i++) { wchar_t local_context[512]; - g_app->context->Get(local_context, 512); + kmx.GetApp()->context->Get(local_context, 512); console_log(L"%d: '%hs' + [%hs %hs]\n", i, Debug_UnicodeString(local_context), Debug_ModifierName(g_keyEvents[i].modifiers), Debug_VirtualKey(g_keyEvents[i].vkey)); - _td->state.vkey = g_keyEvents[i].vkey; - _td->state.charCode = VKeyToChar(g_keyEvents[i].modifiers, g_keyEvents[i].vkey); - g_shiftState = g_keyEvents[i].modifiers; - - BOOL outputKeystroke = !ProcessHook(); + BOOL outputKeystroke = !kmx.ProcessHook(g_keyEvents[i].vkey, g_keyEvents[i].modifiers, VKeyToChar(g_keyEvents[i].modifiers, g_keyEvents[i].vkey)); console_log(L"outputKeystroke = %d\n", outputKeystroke); } - int result = g_app->CheckOutput(g_expectedOutput) ? 0 : 1; + int result = kmx.GetApp()->CheckOutput(g_expectedOutput) ? 0 : 1; if (result == 1) { console_error(L"Output did not match expected output\n"); } else { @@ -380,33 +370,32 @@ int main(int argc, char *argv[]) { console_log(L"============ Stopping test ============\n"); - delete g_app; return result; } void ValidateOptions() { } -AIWin2000Unicode *GetApp() { - return g_app; +AIWin2000Unicode *KMX_Processor::GetApp() { + return &g_app; } -LPINTKEYBOARDINFO GetKeyboard() { +LPINTKEYBOARDINFO KMX_Processor::GetKeyboard() { return &g_keyboard; } -PKEYMAN64THREADDATA ThreadGlobals() { +PKEYMAN64THREADDATA KMX_Processor::ThreadGlobals() { return &g_ThreadData; } -BOOL ReleaseKeyboardMemory(LPKEYBOARD kbd) +BOOL KMX_Processor::ReleaseKeyboardMemory(LPKEYBOARD kbd) { if(!kbd) return TRUE; delete kbd; return TRUE; } -PWSTR GetSystemStore(LPKEYBOARD kb, DWORD SystemID) +PWSTR KMX_Processor::GetSystemStore(LPKEYBOARD kb, DWORD SystemID) { for (DWORD i = 0; i < kb->cxStoreArray; i++) if (kb->dpStoreArray[i].dwSystemID == SystemID) return kb->dpStoreArray[i].dpString;