diff --git a/windows/src/engine/keyman32/appint/aiTIP.cpp b/windows/src/engine/keyman32/appint/aiTIP.cpp index a2baada55b9..be657e4a124 100644 --- a/windows/src/engine/keyman32/appint/aiTIP.cpp +++ b/windows/src/engine/keyman32/appint/aiTIP.cpp @@ -67,6 +67,9 @@ extern "C" __declspec(dllexport) BOOL WINAPI TIPIsKeymanRunning() { extern "C" __declspec(dllexport) BOOL WINAPI TIPActivateKeyboard(GUID *profile) { // I3581 PKEYMAN64THREADDATA _td = ThreadGlobals(); if(!_td) return FALSE; + + RefreshToggleState(); + if(profile != NULL) { for(int i = 0; i < _td->nKeyboards; i++) { for(int j = 0; j < _td->lpKeyboards[i].nProfiles; j++) { diff --git a/windows/src/engine/keyman32/capsstate.cpp b/windows/src/engine/keyman32/capsstate.cpp index 4f9b466e9ee..bc3fc36e5b8 100644 --- a/windows/src/engine/keyman32/capsstate.cpp +++ b/windows/src/engine/keyman32/capsstate.cpp @@ -29,3 +29,21 @@ BOOL IsCapsLockOn(void) { return GetKeyState(VK_CAPITAL) & 1; } + +/** + * Resync the Caps Lock and Num Lock state cache. + * + * Use when state may be stale after focus changes or when the toggle keys + * changed while this Keyman engine instance was not processing key events. + */ +void RefreshToggleState(void) { + DWORD previousShiftState = Globals::get_ShiftState(); + + if (GetKeyState(VK_CAPITAL) & 1) *Globals::ShiftState() |= CAPITALFLAG; + else *Globals::ShiftState() &= ~CAPITALFLAG; + + if (GetKeyState(VK_NUMLOCK) & 1) *Globals::ShiftState() |= NUMLOCKFLAG; + else *Globals::ShiftState() &= ~NUMLOCKFLAG; + + SendDebugMessageFormat("Enter: %x Exit: %x", previousShiftState, Globals::get_ShiftState()); +} diff --git a/windows/src/engine/keyman32/capsstate.h b/windows/src/engine/keyman32/capsstate.h index d28ba9c0db9..0be449db302 100644 --- a/windows/src/engine/keyman32/capsstate.h +++ b/windows/src/engine/keyman32/capsstate.h @@ -20,5 +20,6 @@ #define __CAPSSTATE_H BOOL IsCapsLockOn(void); +void RefreshToggleState(void); #endif diff --git a/windows/src/engine/keyman32/kmhook_getmessage.cpp b/windows/src/engine/keyman32/kmhook_getmessage.cpp index 4c11dc31b50..4efd4879463 100644 --- a/windows/src/engine/keyman32/kmhook_getmessage.cpp +++ b/windows/src/engine/keyman32/kmhook_getmessage.cpp @@ -418,11 +418,7 @@ ProcessWMKeymanControl(WPARAM wParam, LPARAM lParam) { void GetCapsAndNumlockState() { // I4793 DWORD n = Globals::get_ShiftState(); - if(GetKeyState(VK_NUMLOCK) & 1) *Globals::ShiftState() |= NUMLOCKFLAG; - else *Globals::ShiftState() &= ~NUMLOCKFLAG; - - if(GetKeyState(VK_CAPITAL) & 1) *Globals::ShiftState() |= CAPITALFLAG; - else *Globals::ShiftState() &= ~CAPITALFLAG; + RefreshToggleState(); if(GetKeyState(VK_SHIFT) < 0) *Globals::ShiftState() |= K_SHIFTFLAG; else *Globals::ShiftState() &= ~K_SHIFTFLAG;