to keep the focus from moving to the menu.
Fix a bug where the focus moves to the menu when you release Alt
first when you use a shortcut key with Alt on Visual Studio.
Hook the release of Alt instead of a dummy push of Ctrl on Visual
C++ and Firefox. Hook it on InternetExplorer too.
before &= ~SHIFT;\r
CXkeymacsDll::SetModifierState(0, before);\r
\r
- if (bVk1)\r
- CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+ CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
if (bVk2)\r
CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
if (bVk3)\r
UINT before = CXkeymacsDll::GetModifierState();\r
CXkeymacsDll::SetModifierState(CONTROL, before);\r
\r
- if (bVk1)\r
- CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+ CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
if (bVk2)\r
CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
\r
return ScrollUp();\r
}\r
\r
- if (m_bDefaultNumericArgument) {\r
- if (CUtils::IsFirefox()\r
- || CUtils::IsVisualCpp()) {\r
- CdKduCu(0); // dummy to clear Alt effect.\r
- }\r
+ if (m_bDefaultNumericArgument)\r
return Reset(MoveCaret(VK_PRIOR));\r
- } else {\r
- while (m_nNumericArgument--) {\r
- SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
- }\r
- }\r
+ while (m_nNumericArgument--)\r
+ SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
return Reset(GOTO_HOOK);\r
}\r
\r
static void AdSdKduSuAu(BYTE bVk1);\r
static void AdKduAu(BYTE bVk1, BYTE bVk2 = 0, BYTE bVk3 = 0);\r
static void CdKduCu(BYTE bVk1, BYTE bVk2 = 0);\r
- static void Kdu(BYTE bVk1 = 0, BYTE bVk2 = 0, BYTE bVk3 = 0, BYTE bVk4 = 0);\r
+ static void Kdu(BYTE bVk1, BYTE bVk2 = 0, BYTE bVk3 = 0, BYTE bVk4 = 0);\r
static DWORD m_nNumericArgument;\r
static void Su();\r
static BOOL m_bIsSu;\r
return _tcsstr(szWindowText, _T(" - Microsoft Visual ")) != NULL;\r
}\r
\r
-BOOL CUtils::IsVisualStudio2010()\r
-{\r
- if (IsVisualStudio()) {\r
- TCHAR szWindowText[WINDOW_TEXT_LENGTH] = _T("");\r
- GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
- return _tcsstr(szWindowText, _T("2010")) != NULL;\r
- }\r
- return FALSE;\r
-}\r
-\r
BOOL CUtils::IsAccess()\r
{\r
return !_tcsicmp(m_szApplicationName, _T("MSACCESS.EXE"));\r
static BOOL IsProject();\r
static BOOL IsAccess();\r
static BOOL IsVisualStudio();\r
- static BOOL IsVisualStudio2010();\r
static BOOL IsCsh();\r
static BOOL IsSh();\r
static BOOL IsBash();\r
\r
#include "xkeymacsDll.h"\r
#pragma data_seg(".xkmcs")\r
- BOOL CXkeymacsDll::m_bHookAltRelease = FALSE;\r
+ DWORD CXkeymacsDll::m_nHookAltRelease = 0;\r
HHOOK CXkeymacsDll::m_hHookCallWnd = NULL;\r
HHOOK CXkeymacsDll::m_hHookCallWndRet = NULL;\r
HHOOK CXkeymacsDll::m_hHookGetMessage = NULL;\r
UpdateKeyboardState(VK_CONTROL, 0);\r
}\r
\r
- if (after & META && !(before & META))\r
+ BOOL bHookApp = CUtils::IsVisualCpp() || CUtils::IsFirefox() || CUtils::IsVisualStudio() || CUtils::IsInternetExplorer();\r
+ if (after & META && !(before & META)) {\r
+ if (bHookApp)\r
+ m_nHookAltRelease |= HOOK_ALT_LATER;\r
DepressKey(VK_MENU);\r
- else if (!(after & META) && before & META) {\r
- if (CUtils::IsVisualStudio2010())\r
- m_bHookAltRelease = TRUE;\r
+ } else if (!(after & META) && before & META) {\r
+ if (bHookApp)\r
+ m_nHookAltRelease++;\r
ReleaseKey(VK_MENU);\r
}\r
}\r
case VK_LMENU:\r
case VK_RMENU:\r
bAlt = TRUE;\r
- if (m_bHookAltRelease) {\r
- m_bHookAltRelease = FALSE;\r
+ if (m_nHookAltRelease) {\r
+ if (m_nHookAltRelease & ~HOOK_ALT_LATER)\r
+ m_nHookAltRelease--;\r
+ else if (m_nHookAltRelease & HOOK_ALT_LATER)\r
+ m_nHookAltRelease = 0;\r
goto HOOK;\r
}\r
// pass through\r
LPCTSTR name;\r
};\r
\r
+const DWORD HOOK_ALT_LATER = 0x10000;\r
+\r
class AFX_EXT_CLASS CXkeymacsDll \r
{\r
public:\r
CXkeymacsDll();\r
virtual ~CXkeymacsDll();\r
private:\r
- static BOOL m_bHookAltRelease;\r
+ static DWORD m_nHookAltRelease;\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