mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-11 19:35:32 +00:00
[Common] First round of class refactor
This commit is contained in:
parent
28a8911a44
commit
73b9d95bbe
10 changed files with 180 additions and 151 deletions
|
|
@ -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, ...);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,2 @@
|
|||
#pragma once
|
||||
|
||||
AIWin2000Unicode *GetApp();
|
||||
LPINTKEYBOARDINFO GetKeyboard();
|
||||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
//
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue