OSDN Git Service

Support recent versions of Microsoft Visual Studio.
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Wed, 27 Apr 2011 04:45:08 +0000 (13:45 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sat, 28 May 2011 07:58:28 +0000 (16:58 +0900)
Fix a bug where M-v doesn't work at first time on Visual Studio
2010. Fix a bug where C-g releases the control key on recent
versions of Visual Studio. Support the incremental search on them.

xkeymacsdll/Commands.cpp
xkeymacsdll/Utils.cpp
xkeymacsdll/Utils.h
xkeymacsdll/xkeymacsdll.cpp
xkeymacsdll/xkeymacsdll.h

index f4fd06a..bde626d 100644 (file)
@@ -330,6 +330,8 @@ void CCommands::Kdu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)
                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
@@ -1463,9 +1465,14 @@ DWORD CCommands::DeactivateMark()
                AdKduAu('E', 'I');\r
                return ERROR_SUCCESS;   // i.e. return 0;\r
        }\r
-       if (CUtils::IsVisualStudioDotNet()) {   // Ctrl + Click select a word on Visual Studio .NET\r
-               ReleaseKey(VK_CONTROL);\r
-               return ClickCaret();\r
+       if (CUtils::IsVisualStudio()) { // Ctrl + Click select a word on Visual Studio .NET\r
+               BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+               if (bIsCtrlDown)\r
+                       ReleaseKey(VK_CONTROL);\r
+               DWORD res = ClickCaret();\r
+               if (bIsCtrlDown)\r
+                       DepressKey(VK_CONTROL);\r
+               return res;\r
        }\r
 \r
        return ClickCaret();\r
@@ -1478,7 +1485,7 @@ int CCommands::FindFile()
        if (CUtils::IsFlash()\r
         || CUtils::IsSleipnir()) {\r
                CdKduCu('O');\r
-       } else if (CUtils::IsVisualStudioDotNet()) {\r
+       } else if (CUtils::IsVisualStudio()) {\r
                AdKduAu('F', 'O', 'F');\r
        } else {\r
                AdKduAu('F', 'O');\r
@@ -2463,7 +2470,7 @@ void CCommands::OpenFindDialog()
                AdKduAu('S', VK_RETURN);\r
        } else if (CUtils::IsNami2000()) {\r
                AdKduAu('D', 'F');\r
-       } else if (CUtils::IsVisualStudioDotNet()) {\r
+       } else if (CUtils::IsVisualStudio()) {\r
                AdKduAu('E', 'F', 'F');\r
        } else if (CUtils::IsDirector()) {\r
                AdKduAu('E', 'F', 'T');\r
@@ -2536,7 +2543,7 @@ int CCommands::Search(SEARCH_DIRECTION direction)
        }\r
 \r
        if (CUtils::IsVisualCpp()\r
-        || CUtils::IsVisualStudioDotNet()) {\r
+        || CUtils::IsVisualStudio()) {\r
                switch (direction) {\r
                case FORWARD:\r
                        CdKduCu('I');\r
@@ -3185,7 +3192,7 @@ BYTE CCommands::GetDirectionForwardKey()
         || CUtils::IsOpenJane()\r
         || CUtils::IsStoryEditor()\r
         || CUtils::IsVisualBasicEditor()\r
-        || CUtils::IsVisualStudioDotNet()\r
+        || CUtils::IsVisualStudio()\r
         || CUtils::IsWordpad()) {\r
                bDirectionForward = 0;\r
        } else if (CUtils::IsLotusNotes()\r
index b56df22..0628dd3 100644 (file)
@@ -752,9 +752,23 @@ BOOL CUtils::IsCsh()
        return !_tcsicmp(m_szApplicationName, _T("csh.exe"));\r
 }\r
 \r
-BOOL CUtils::IsVisualStudioDotNet()\r
+BOOL CUtils::IsVisualStudio()\r
 {\r
-       return !_tcsicmp(m_szApplicationName, _T("devenv.exe"));\r
+       if (IsVisualCpp() || CUtils::IsVisualBasic())\r
+               return FALSE;\r
+       TCHAR szWindowText[WINDOW_TEXT_LENGTH] = _T("");\r
+       GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\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
index 6307b74..37032d8 100644 (file)
@@ -63,7 +63,8 @@ public:
        static BOOL IsVisualBasic();\r
        static BOOL IsProject();\r
        static BOOL IsAccess();\r
-       static BOOL IsVisualStudioDotNet();\r
+       static BOOL IsVisualStudio();\r
+       static BOOL IsVisualStudio2010();\r
        static BOOL IsCsh();\r
        static BOOL IsSh();\r
        static BOOL IsBash();\r
index bcbd506..b37160d 100644 (file)
@@ -196,6 +196,7 @@ DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
 \r
 #include "xkeymacsDll.h"\r
 #pragma data_seg(".xkmcs")\r
+       BOOL    CXkeymacsDll::m_bHookAltRelease = FALSE;\r
        BOOL    CXkeymacsDll::m_bEnableKeyboardHook = FALSE;\r
        HHOOK   CXkeymacsDll::m_hHookCallWnd = NULL;\r
        HHOOK   CXkeymacsDll::m_hHookCallWndRet = NULL;\r
@@ -266,6 +267,11 @@ BOOL CXkeymacsDll::LoadConfig()
        return res;\r
 }\r
 \r
+void CXkeymacsDll::SetHookAltRelease()\r
+{\r
+       m_bHookAltRelease = TRUE;\r
+}\r
+\r
 // set hooks\r
 void CXkeymacsDll::SetHooks()\r
 {\r
@@ -816,21 +822,26 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
        }\r
 \r
        if (lParam & BEING_RELEASED) {\r
-               if (nKey == VK_MENU\r
-                || nKey == VK_LWIN\r
-                || nKey == VK_RWIN\r
-                || nKey == VK_APPS\r
-                || nKey == VK_LMENU\r
-                || nKey == VK_RMENU) {\r
-                       for (int i = 0; i < MAX_COMMAND_TYPE; ++i) {\r
-                               if (Commands[m_Config.nCommandID[m_nApplicationID][i][nKey]].fCommand\r
-                                && (Commands[m_Config.nCommandID[m_nApplicationID][i][nKey]].fCommand != CCommands::MetaAlt\r
-                                 || nKey != VK_MENU && nKey != VK_LMENU && nKey != VK_RMENU)) {\r
+               BOOL bAlt = FALSE;\r
+               switch (nKey) {\r
+               case VK_MENU:\r
+               case VK_LMENU:\r
+               case VK_RMENU:\r
+                       bAlt = TRUE;\r
+                       if (m_bHookAltRelease) {\r
+                               m_bHookAltRelease = FALSE;\r
+                               goto HOOK;\r
+                       }\r
+                       // pass through\r
+               case VK_LWIN:\r
+               case VK_RWIN:\r
+               case VK_APPS:\r
+                       for (int i = 0; i < MAX_COMMAND_TYPE; i++) {\r
+                               int (*func)() = Commands[m_Config.nCommandID[m_nApplicationID][i][nKey]].fCommand;\r
+                               if (func && !(bAlt && func == CCommands::MetaAlt))\r
                                        goto HOOK;\r
-                               }\r
                        }\r
                }\r
-\r
                if (nOneShotModifier[nKey]) {\r
                        ReleaseKey(nOneShotModifier[nKey]);\r
                        nOneShotModifier[nKey] = 0;\r
@@ -840,7 +851,6 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                                Kdu(nKey);\r
                        }\r
                }\r
-\r
                goto DO_NOTHING;\r
        }\r
 \r
index 6b30e3e..8101c62 100644 (file)
@@ -56,6 +56,7 @@ public:
        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
@@ -101,6 +102,7 @@ public:
        CXkeymacsDll();\r
        virtual ~CXkeymacsDll();\r
 private:\r
+       static BOOL m_bHookAltRelease;\r
        static TCHAR m_M_xTip[128];\r
        static void InvokeM_x(const TCHAR* const szPath);\r
        static void LogCallWndProcMessage(WPARAM wParam, LPARAM lParam);\r