OSDN Git Service

Rewrite code to change modifier states.
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Tue, 10 May 2011 07:51:52 +0000 (16:51 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Fri, 10 Jun 2011 08:06:55 +0000 (17:06 +0900)
xkeymacsdll/Commands.cpp
xkeymacsdll/Utils.cpp
xkeymacsdll/Utils.h
xkeymacsdll/xkeymacsdll.cpp
xkeymacsdll/xkeymacsdll.h

index 35edd56..cd61978 100644 (file)
@@ -317,92 +317,41 @@ void CCommands::ReleaseKey(BYTE bVk)
 \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
@@ -415,141 +364,49 @@ void CCommands::Su()
 \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
@@ -1131,39 +988,12 @@ int CCommands::KillLine(BOOL bAllFormat, int (*pCommand)())
 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
@@ -2666,15 +2496,12 @@ int CCommands::Search(SEARCH_DIRECTION direction)
                         || 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
@@ -2703,8 +2530,8 @@ void CCommands::SetSearchDirection(SEARCH_DIRECTION direction)
                        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
@@ -2717,8 +2544,7 @@ void CCommands::SetSearchDirection(SEARCH_DIRECTION direction)
                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
@@ -3050,24 +2876,14 @@ int CCommands::CallLastKbdMacro()
 \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
@@ -3328,58 +3144,35 @@ GOTO CCommands::MoveCaret(BYTE bVk, BOOL bCtrl)
        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
index 2019db5..c96cd10 100644 (file)
@@ -1149,18 +1149,6 @@ BOOL CUtils::IsOpenJane()
        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
index 4793c5e..1a4d298 100644 (file)
@@ -18,7 +18,6 @@ public:
        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
index 440a008..7453094 100644 (file)
@@ -298,11 +298,6 @@ BOOL CXkeymacsDll::LoadConfig()
        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
@@ -603,6 +598,51 @@ LRESULT CALLBACK CXkeymacsDll::ShellProc(int nCode, WPARAM wParam, LPARAM lParam
        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
@@ -662,17 +702,8 @@ void CXkeymacsDll::DepressKey(BYTE bVk, BOOL bOriginal)    // bVk is virtual-key co
 //             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
@@ -891,59 +922,41 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
        }\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
@@ -1604,19 +1617,8 @@ BOOL CXkeymacsDll::DefiningMacro()
 /**/ \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
@@ -1625,16 +1627,7 @@ void CXkeymacsDll::CallMacro()
                        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
@@ -1727,9 +1720,7 @@ void CXkeymacsDll::CallFunction(int nFunctionID)
                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
@@ -1768,19 +1759,7 @@ void CXkeymacsDll::CallFunction(int nFunctionID)
                        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
@@ -1801,69 +1780,36 @@ void CXkeymacsDll::CallFunction(int nFunctionID)
                        }\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
index eed2513..05112d7 100644 (file)
@@ -56,7 +56,6 @@ 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
@@ -87,6 +86,8 @@ public:
        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
@@ -103,6 +104,7 @@ private:
        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