[Common] First round of class refactor

This commit is contained in:
Marc Durdin 2018-11-13 11:09:08 +11:00
parent 28a8911a44
commit 73b9d95bbe
10 changed files with 180 additions and 151 deletions

View file

@ -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, ...);

View file

@ -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);

View file

@ -1,4 +1,2 @@
#pragma once
AIWin2000Unicode *GetApp();
LPINTKEYBOARDINFO GetKeyboard();

View file

@ -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));

View file

@ -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);
}
}
}

View file

@ -5,16 +5,14 @@
#include "pch.h"
#include <share.h>
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;

View file

@ -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
//

View file

@ -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);

View file

@ -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");

View file

@ -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;