\r
void CCommands::Kdu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)\r
{\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
- BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ if (CXkeymacsDll::Get326Compatible() || CUtils::IsAtok())\r
+ before &= ~SHIFT;\r
+ CXkeymacsDll::SetModifierState(0, before);\r
\r
- if (CXkeymacsDll::Get326Compatible() || CUtils::IsAtok()) {\r
- bIsShiftDown = FALSE;\r
- }\r
-\r
- if (bIsCtrlDown) {\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
- ReleaseKey(VK_CONTROL);\r
- }\r
- if (bIsAltDown) {\r
- if (CUtils::IsVisualStudio2010())\r
- CXkeymacsDll::SetHookAltRelease(); // Ignore Alt release\r
- ReleaseKey(VK_MENU);\r
- }\r
- if (bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
-\r
- if (bVk1) {\r
+ if (bVk1)\r
CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
- }\r
- if (bVk2) {\r
+ if (bVk2)\r
CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
- }\r
- if (bVk3) {\r
+ if (bVk3)\r
CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
- }\r
- if (bVk4) {\r
+ if (bVk4)\r
CXkeymacsDll::Kdu(bVk4, m_nNumericArgument);\r
- }\r
\r
- if (bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
- if (bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
- if (bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
- }\r
+ CXkeymacsDll::SetModifierState(before, 0);\r
}\r
\r
void CCommands::SdKduSu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)\r
{\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
- BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
-\r
- if (bIsCtrlDown) {\r
- ReleaseKey(VK_CONTROL);\r
- }\r
- if (bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
- if (!bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(SHIFT, before);\r
\r
CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
- if (bVk2) {\r
+ if (bVk2)\r
CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
- }\r
- if (bVk3) {\r
+ if (bVk3)\r
CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
- }\r
- if (bVk4) {\r
+ if (bVk4)\r
CXkeymacsDll::Kdu(bVk4, m_nNumericArgument);\r
- }\r
\r
- if (!bIsShiftDown) {\r
- if (CUtils::IsShuriken()) {\r
- m_bIsSu = TRUE;\r
- } else {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
- }\r
- if (bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
- if (bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
+ if (!(before & SHIFT) && CUtils::IsShuriken()) {\r
+ m_bIsSu = TRUE;\r
+ before |= SHIFT;\r
}\r
+ CXkeymacsDll::SetModifierState(before, SHIFT);\r
}\r
\r
void CCommands::Su()\r
\r
void CCommands::CdKduCu(BYTE bVk1, BYTE bVk2)\r
{\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
- BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(CONTROL, before);\r
\r
- if (!bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
- }\r
- if (bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
- if (bIsShiftDown && !m_bSetMark) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
-\r
- if (bVk1) {\r
+ if (bVk1)\r
CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
- }\r
- if (bVk2) {\r
+ if (bVk2)\r
CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
- }\r
\r
- if (bIsShiftDown && !m_bSetMark) {\r
- DepressKey(VK_SHIFT);\r
- }\r
- if (bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
- if (!bIsCtrlDown) {\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
- ReleaseKey(VK_CONTROL);\r
- }\r
+ CXkeymacsDll::SetModifierState(before, CONTROL);\r
}\r
\r
void CCommands::CdSdKduSuCu(BYTE bVk)\r
{\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
- BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
-\r
- if (!bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
- }\r
- if (bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
- if (!bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(SHIFT | CONTROL, before);\r
\r
CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
\r
- if (!bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
- if (bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
- if (!bIsCtrlDown) {\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
- ReleaseKey(VK_CONTROL);\r
- }\r
+ CXkeymacsDll::SetModifierState(before, SHIFT | CONTROL);\r
}\r
\r
void CCommands::AdKduAu(BYTE bVk1, BYTE bVk2, BYTE bVk3)\r
{\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
- BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
-\r
- if (bIsCtrlDown) {\r
- ReleaseKey(VK_CONTROL);\r
- }\r
-\r
- if (!bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
-\r
- if (bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(META, before);\r
\r
CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
- if (bVk2) {\r
+ if (bVk2)\r
CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
- }\r
- if (bVk3) {\r
+ if (bVk3)\r
CXkeymacsDll::Kdu(bVk3, m_nNumericArgument);\r
- }\r
-\r
- if (bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
\r
- if (!bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
-\r
- if (bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- }\r
+ CXkeymacsDll::SetModifierState(before, META);\r
}\r
\r
void CCommands::AdSdKduSuAu(BYTE bVk1)\r
{\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
- BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
-\r
- if (bIsCtrlDown) {\r
- ReleaseKey(VK_CONTROL);\r
- }\r
-\r
- if (!bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
-\r
- if (!bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(SHIFT | META, before);\r
\r
CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
\r
- if (!bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
-\r
- if (!bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
-\r
- if (bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- }\r
+ CXkeymacsDll::SetModifierState(before, SHIFT | META);\r
}\r
\r
// C-a: Home\r
int CCommands::Undo()\r
{\r
if (CUtils::IsMicrosoftWord()) {\r
- static BOOL bIsCtrlDown;\r
- static BOOL bIsAltDown;\r
- static BOOL bIsShiftDown;\r
-\r
- bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
- bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
-\r
- if (!bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- }\r
- if (bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
- if (bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
-\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(CONTROL, before);\r
PostMessage(GetFocus(), WM_KEYDOWN, 'Z', 0);\r
-\r
- if (bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
- if (bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
- if (!bIsCtrlDown) {\r
- ReleaseKey(VK_CONTROL);\r
- }\r
-\r
- } else {\r
+ CXkeymacsDll::SetModifierState(before, CONTROL);\r
+ } else\r
CdKduCu('Z');\r
- }\r
return Reset(GOTO_HOOK);\r
}\r
\r
|| CUtils::IsNetscape()) {\r
// do nothing\r
} else if (CUtils::IsMicrosoftWord()) {\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
- ReleaseKey(VK_CONTROL);\r
-\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(before & ~CONTROL, before);\r
AdKduAu('N');\r
Kdu(VK_ESCAPE);\r
Kdu(VK_END);\r
-\r
- DepressKey(VK_CONTROL);\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
+ CXkeymacsDll::SetModifierState(before, before & ~CONTROL);\r
} else {\r
AdKduAu(GetFindWhatKey());\r
}\r
SdKduSu(VK_TAB, VK_TAB);\r
}\r
} else if (CUtils::IsMicrosoftWord()) {\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
- ReleaseKey(VK_CONTROL);\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(before & ~CONTROL, before);\r
\r
AdKduAu('M');\r
AdKduAu(0xBA); // VK_OEM_1 Used for miscellaneous characters; it can vary by keyboard. \r
Kdu(VK_ESCAPE);\r
Kdu(VK_END);\r
\r
- DepressKey(VK_CONTROL);\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
+ CXkeymacsDll::SetModifierState(before, before & ~CONTROL);\r
} else if (CUtils::IsLotusNotes()) {\r
BYTE bDirection = 0;\r
\r
\r
int CCommands::SwitchBetweenInputLocales()\r
{\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
+ UINT before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(0, before);\r
\r
// Alt+Shift\r
- if (bIsCtrlDown) {\r
- ReleaseKey(VK_CONTROL);\r
- }\r
- DepressKey(VK_MENU); // why?\r
- ReleaseKey(VK_MENU);\r
- DepressKey(VK_MENU);\r
- DepressKey(VK_SHIFT);\r
- ReleaseKey(VK_SHIFT);\r
- if (!bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
- if (bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- }\r
+ CXkeymacsDll::SetModifierState(SHIFT | META, 0);\r
+ CXkeymacsDll::SetModifierState(0, SHIFT | META);\r
+\r
+ CXkeymacsDll::SetModifierState(before, 0);\r
\r
return Reset(GOTO_HOOK);\r
}\r
last.time = time;\r
\r
if (bCtrl) {\r
- if (m_bSetMark) {\r
+ if (m_bSetMark)\r
CdSdKduSuCu(bVk);\r
- } else {\r
+ else\r
CdKduCu(bVk);\r
- }\r
- } else {\r
- if (m_bSetMark) {\r
- if (CUtils::IsShuriken()) {\r
- static BOOL bIsShiftDown = FALSE;\r
- static int nStep = 0;\r
- switch (nStep) {\r
- case 0:\r
- {\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU);\r
- bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT);\r
-\r
- if (bIsCtrlDown) {\r
- ReleaseKey(VK_CONTROL);\r
- }\r
- if (bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
- if (!bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
-\r
- CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
-\r
- if (bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
- if (bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- }\r
- nStep = 1;\r
- return GOTO_RECURSIVE;\r
- }\r
- case 1:\r
- nStep = 0;\r
- if (!bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
- return GOTO_HOOK;\r
- }\r
- } else {\r
- SdKduSu(bVk);\r
- }\r
- } else {\r
- Kdu(bVk);\r
+ return GOTO_HOOK;\r
+ }\r
+ if (!m_bSetMark) {\r
+ Kdu(bVk);\r
+ return GOTO_HOOK;\r
+ }\r
+ if (CUtils::IsShuriken()) {\r
+ static UINT before;\r
+ static int nStep = 0;\r
+ switch (nStep) {\r
+ case 0:\r
+ before = CXkeymacsDll::GetModifierState();\r
+ CXkeymacsDll::SetModifierState(SHIFT, before);\r
+ CXkeymacsDll::Kdu(bVk, m_nNumericArgument);\r
+ CXkeymacsDll::SetModifierState(before | SHIFT, SHIFT);\r
+ nStep = 1;\r
+ return GOTO_RECURSIVE;\r
+ case 1:\r
+ nStep = 0;\r
+ if (!(before & SHIFT))\r
+ ReleaseKey(VK_SHIFT);\r
+ return GOTO_HOOK;\r
}\r
}\r
+ SdKduSu(bVk);\r
return GOTO_HOOK;\r
}\r
\r
return !_tcsicmp(m_szApplicationName, _T("Jane2ch.exe"));\r
}\r
\r
-BOOL CUtils::UpdateKeyboardState(BYTE bVk, BYTE bState)\r
-{\r
- BYTE ks[256] = {'\0'};\r
- BOOL rc = FALSE;\r
-\r
- if ((rc = GetKeyboardState(ks)) != FALSE) {\r
- ks[bVk] = bState;\r
- rc = SetKeyboardState(ks);\r
- }\r
- return rc;\r
-}\r
-\r
BOOL CUtils::IsThunderbird()\r
{\r
return !_tcsicmp(m_szApplicationName, _T("thunderbird.exe"));\r
static BOOL IsLunascape();\r
static int GetWindowTextType(CString strWindowText);\r
static BOOL IsThunderbird();\r
- static BOOL UpdateKeyboardState(BYTE bVk, BYTE bState);\r
static BOOL IsOpenJane();\r
static void PrintWindowInfo(WINDOWINFO *pwi);\r
static BOOL IsVisualSlickEdit();\r
return res;\r
}\r
\r
-void CXkeymacsDll::SetHookAltRelease()\r
-{\r
- m_bHookAltRelease = TRUE;\r
-}\r
-\r
// set hooks\r
LRESULT WINAPI DummyProc(int code, WPARAM wp, LPARAM lp) {\r
return CallNextHookEx(0, code, wp, lp);\r
return CallNextHookEx( m_hHookShell, nCode, wParam, lParam );\r
}\r
\r
+UINT CXkeymacsDll::GetModifierState(BOOL bPhysicalKey)\r
+{\r
+ UINT result = 0;\r
+ if (IsDown(VK_SHIFT, bPhysicalKey))\r
+ result |= SHIFT;\r
+ if (IsDown(VK_CONTROL, bPhysicalKey))\r
+ result |= CONTROL;\r
+ if (IsDown(VK_MENU, bPhysicalKey))\r
+ result |= META;\r
+ return result;\r
+}\r
+\r
+void CXkeymacsDll::SetModifierState(UINT after, UINT before)\r
+{\r
+ if (after & SHIFT && !(before & SHIFT))\r
+ DepressKey(VK_SHIFT);\r
+ else if (!(after & SHIFT) && before & SHIFT)\r
+ ReleaseKey(VK_SHIFT);\r
+\r
+ if (after & CONTROL && !(before & CONTROL)) {\r
+ UpdateKeyboardState(VK_CONTROL, 1);\r
+ DepressKey(VK_CONTROL);\r
+ } else if (!(after & CONTROL) && before & CONTROL) {\r
+ ReleaseKey(VK_CONTROL);\r
+ UpdateKeyboardState(VK_CONTROL, 0);\r
+ }\r
+\r
+ if (after & META && !(before & META))\r
+ DepressKey(VK_MENU);\r
+ else if (!(after & META) && before & META) {\r
+ if (CUtils::IsVisualStudio2010())\r
+ m_bHookAltRelease = TRUE;\r
+ ReleaseKey(VK_MENU);\r
+ }\r
+}\r
+\r
+BOOL CXkeymacsDll::UpdateKeyboardState(BYTE bVk, BYTE bState)\r
+{\r
+ BYTE ks[256] = {'\0'};\r
+ if (!GetKeyboardState(ks))\r
+ return FALSE;\r
+ ks[bVk] = bState;\r
+ return SetKeyboardState(ks);\r
+}\r
+\r
BOOL CXkeymacsDll::IsDown(BYTE bVk, BOOL bPhysicalKey)\r
{\r
return bPhysicalKey ? GetAsyncKeyState(bVk) < 0 : GetKeyState(bVk) < 0;\r
// CUtils::Log(_T("i: %x, %d, %d, %d, %d, %d, %d, %d, %d"), bVk,\r
// IsDown(VK_CONTROL), IsDown(VK_CONTROL, FALSE), IsDepressedModifier(CCommands::C_), IsDepressedModifier(CCommands::C_, FALSE),\r
// IsDown(VK_MENU), IsDown(VK_MENU, FALSE), IsDepressedModifier(CCommands::MetaAlt), IsDepressedModifier(CCommands::MetaAlt, FALSE));\r
-\r
- int nCommandType = NONE;\r
- if (IsDown(VK_CONTROL)) {\r
- nCommandType |= CONTROL;\r
- }\r
- if (IsDown(VK_MENU)) {\r
- nCommandType |= META;\r
- }\r
- Original(nCommandType, bVk, 1);\r
+ Original(GetModifierState(), bVk, 1);\r
}\r
-\r
DoKeybd_event(bVk, 0);\r
}\r
\r
}\r
\r
// set command type\r
- {\r
- nCommandType = NONE;\r
- if (IsDown(VK_SHIFT, FALSE)) {\r
- nCommandType |= SHIFT;\r
- }\r
- if (IsControl()) {\r
- nCommandType |= CONTROL;\r
- }\r
- if (IsMeta()) {\r
- nCommandType |= META;\r
- }\r
- if (CCommands::bC_x()) {\r
- nCommandType |= CONTROLX;\r
- }\r
-\r
- // Ignore undefined C-x ?\r
- if (nCommandType & CONTROLX) {\r
- if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == NULL\r
- && m_Config.nFunctionID[m_nApplicationID][nCommandType][nKey] < 0) {\r
- if (m_Config.bIgnoreUndefinedC_x[m_nApplicationID]) {\r
- CCommands::Reset(GOTO_HOOK);\r
- goto HOOK;\r
- }\r
- nCommandType &= ~CONTROLX;\r
+ nCommandType = IsDown(VK_SHIFT) * SHIFT | IsControl() * CONTROL | IsMeta() * META | CCommands::bC_x() * CONTROLX;\r
+ // Ignore undefined C-x ?\r
+ if (nCommandType & CONTROLX) {\r
+ if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == NULL\r
+ && m_Config.nFunctionID[m_nApplicationID][nCommandType][nKey] < 0) {\r
+ if (m_Config.bIgnoreUndefinedC_x[m_nApplicationID]) {\r
+ CCommands::Reset(GOTO_HOOK);\r
+ goto HOOK;\r
}\r
+ nCommandType &= ~CONTROLX;\r
}\r
-\r
- // Ignore undefined Meta Ctrl+?\r
- if (CCommands::bM_() && (nCommandType & CONTROL)) {\r
- if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == NULL\r
- && m_Config.nFunctionID[m_nApplicationID][nCommandType][nKey] < 0) {\r
- if (m_Config.bIgnoreUndefinedMetaCtrl[m_nApplicationID]) {\r
- if (Original(CONTROL, nKey)) {\r
- Original(CONTROL, nKey, -1);\r
- goto DO_NOTHING;\r
- }\r
- CCommands::Reset(GOTO_HOOK);\r
- goto HOOK;\r
+ }\r
+ // Ignore undefined Meta Ctrl+?\r
+ if (CCommands::bM_() && (nCommandType & CONTROL)) {\r
+ if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == NULL\r
+ && m_Config.nFunctionID[m_nApplicationID][nCommandType][nKey] < 0) {\r
+ if (m_Config.bIgnoreUndefinedMetaCtrl[m_nApplicationID]) {\r
+ if (Original(CONTROL, nKey)) {\r
+ Original(CONTROL, nKey, -1);\r
+ goto DO_NOTHING;\r
}\r
- nCommandType &= ~META;\r
+ CCommands::Reset(GOTO_HOOK);\r
+ goto HOOK;\r
}\r
+ nCommandType &= ~META;\r
}\r
}\r
\r
{\r
BYTE nKey = (BYTE)wParam; // VK_CONTROL is needed instead of VK_RCONTROL and VK_LCONTROL in this block just for Original()\r
- int nVirtualCommandType = NONE;\r
- if (IsDown(VK_CONTROL, FALSE) && nKey != VK_CONTROL) {\r
- nVirtualCommandType |= CONTROL;\r
- }\r
- if (IsDown(VK_MENU, FALSE) && nKey != VK_MENU) {\r
- nVirtualCommandType |= META;\r
- }\r
+ int nVirtualCommandType = GetModifierState(FALSE);\r
+ if (nKey == VK_CONTROL)\r
+ nVirtualCommandType &= ~CONTROL;\r
+ if (nKey == VK_MENU)\r
+ nVirtualCommandType &= ~META;\r
if (Original(nVirtualCommandType, nKey)) {\r
Original(nVirtualCommandType, nKey, -1);\r
goto DO_NOTHING;\r
/**/ \r
void CXkeymacsDll::CallMacro()\r
{\r
- BOOL bIsCtrlDown = IsDown(VK_CONTROL, FALSE);\r
- if (bIsCtrlDown) {\r
- ReleaseKey(VK_CONTROL);\r
- }\r
- BOOL bIsAltDown = IsDown(VK_MENU, FALSE);\r
- if (bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
- BOOL bIsShiftDown = IsDown(VK_SHIFT, FALSE);\r
- if (bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
-\r
+ UINT before = GetModifierState(FALSE);\r
+ SetModifierState(0, before);\r
for (POSITION pos = m_Macro.GetHeadPosition(); pos; ) {\r
KbdMacro *pKbdMacro = (KbdMacro *)m_Macro.GetNext(pos);\r
if (pKbdMacro->lParam & BEING_RELEASED) {\r
DepressKey((BYTE)pKbdMacro->wParam, pKbdMacro->bOriginal);\r
}\r
}\r
-\r
- if (bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- }\r
- if (bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
- if (bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
+ SetModifierState(before, 0);\r
}\r
\r
/*\r
return;\r
}\r
\r
- BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
- BOOL bIsAltDown = CXkeymacsDll::IsDown(VK_MENU, FALSE);\r
- BOOL bIsShiftDown = CXkeymacsDll::IsDown(VK_SHIFT, FALSE);\r
+ UINT before = GetModifierState(FALSE);\r
\r
if (m_Config.szFunctionDefinition[nFunctionID][0] == _T('"') && m_Config.szFunctionDefinition[nFunctionID][_tcslen(m_Config.szFunctionDefinition[nFunctionID]) - 1] == _T('"')) {\r
for (unsigned int i = 1; i < _tcslen(m_Config.szFunctionDefinition[nFunctionID]) - 1; ++i) { // skip '"'\r
if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][bVk]].fCommand == CCommands::ExecuteExtendedCommand) {\r
bM_x = TRUE;\r
} else if (!bInitialized) {\r
- if (bIsCtrlDown) {\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
- ReleaseKey(VK_CONTROL);\r
- }\r
-\r
- if (bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
-\r
- if (bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
-\r
+ SetModifierState(0, before);\r
bInitialized = TRUE;\r
}\r
// CUtils::Log("CallFunction: Command Name: %s", Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][bVk]].szCommandName);\r
}\r
} else {\r
if (!bInitialized) {\r
- if (bIsCtrlDown) {\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 0);\r
- ReleaseKey(VK_CONTROL);\r
- }\r
-\r
- if (bIsAltDown) {\r
- ReleaseKey(VK_MENU);\r
- }\r
-\r
- if (bIsShiftDown) {\r
- ReleaseKey(VK_SHIFT);\r
- }\r
-\r
+ SetModifierState(0, before);\r
bInitialized = TRUE;\r
}\r
- if (nCommandType & WIN_WIN) {\r
+ if (nCommandType & WIN_WIN)\r
DepressKey(VK_LWIN);\r
- }\r
- if (nCommandType & WIN_CTRL) {\r
+ if (nCommandType & WIN_CTRL)\r
DepressKey(VK_CONTROL);\r
- }\r
- if (nCommandType & WIN_ALT) {\r
+ if (nCommandType & WIN_ALT)\r
DepressKey(VK_MENU);\r
- }\r
- if (nCommandType & SHIFT) {\r
+ if (nCommandType & SHIFT)\r
DepressKey(VK_SHIFT);\r
- }\r
\r
Kdu(bVk);\r
\r
- if (nCommandType & SHIFT && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & SHIFT))) {\r
+ if (nCommandType & SHIFT && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & SHIFT)))\r
ReleaseKey(VK_SHIFT);\r
- }\r
- if (nCommandType & WIN_ALT && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_ALT))) {\r
+ if (nCommandType & WIN_ALT && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_ALT)))\r
ReleaseKey(VK_MENU);\r
- }\r
- if (nCommandType & WIN_CTRL && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_CTRL))) {\r
+ if (nCommandType & WIN_CTRL && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_CTRL)))\r
ReleaseKey(VK_CONTROL);\r
- }\r
- if (nCommandType & WIN_WIN && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_WIN))) {\r
+ if (nCommandType & WIN_WIN && (keybinds.GetSize() <= i + 1 || !(keybinds.GetAt(i + 1).nCommandType & WIN_WIN)))\r
ReleaseKey(VK_LWIN);\r
- }\r
}\r
}\r
\r
keybinds.RemoveAll();\r
\r
- if (bInitialized) {\r
+ if (bInitialized)\r
// If these lines are invoked at M-x, a window transition does not work well.\r
-\r
- if (bIsShiftDown) {\r
- DepressKey(VK_SHIFT);\r
- }\r
-\r
- if (bIsAltDown) {\r
- DepressKey(VK_MENU);\r
- }\r
-\r
- if (bIsCtrlDown) {\r
- DepressKey(VK_CONTROL);\r
- CUtils::UpdateKeyboardState(VK_CONTROL, 1);\r
- }\r
- }\r
+ SetModifierState(before, 0);\r
return;\r
}\r
\r
static BOOL SaveConfig();\r
static BOOL LoadConfig();\r
static void SetM_xTip(const TCHAR *const szPath);\r
- static void SetHookAltRelease();\r
static BOOL Get326Compatible();\r
static void Set326Compatible(int nApplicationID, BOOL b326Compatible);\r
static void SetCursorData(HCURSOR hEnable, HCURSOR hDisableTMP, HCURSOR hDisableWOCQ, HICON hDisable, BOOL bEnable);\r
static BOOL GetEnableCUA();\r
static CClipboardSnap* GetKillRing(CClipboardSnap *pSnap, BOOL bForce = TRUE);\r
static void IncreaseKillRingIndex(int nKillRing = 1);\r
+ static UINT GetModifierState(BOOL bPhysicalKey = TRUE);\r
+ static void SetModifierState(UINT before, UINT after);\r
static BOOL IsDown(BYTE bVk, BOOL bPhysicalKey = TRUE);\r
static void Kdu(BYTE bVk, DWORD n = 1, BOOL bOriginal = TRUE);\r
static void ReleaseKey(BYTE bVk);\r
static BOOL m_bHookAltRelease;\r
static TCHAR m_M_xTip[128];\r
static void InvokeM_x(const TCHAR* const szPath);\r
+ static BOOL UpdateKeyboardState(BYTE bVK, BYTE bState);\r
static void LogCallWndProcMessage(WPARAM wParam, LPARAM lParam);\r
static void DoSetCursor();\r
static HCURSOR m_hCurrentCursor;\r