OSDN Git Service

Rewrite code to handle original keys. Use VK_{CONTROL,SHIFT,MENU}
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Wed, 11 May 2011 14:39:49 +0000 (23:39 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sat, 11 Jun 2011 03:23:05 +0000 (12:23 +0900)
instead of VK_{R,L}{CONTROL,SHIFT,MENU} to simplify code.

xkeymacsdll/xkeymacsdll.cpp
xkeymacsdll/xkeymacsdll.h

index 601ab20..afe819d 100644 (file)
@@ -555,7 +555,7 @@ 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
-               Original(GetModifierState(), bVk, 1);\r
+               SetOriginal(GetModifierState(), bVk);\r
        }\r
        DoKeybd_event(bVk, 0);\r
 }\r
@@ -652,8 +652,8 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
 {\r
        ASSERT(0 <= wParam && wParam <= UCHAR_MAX);\r
 \r
-       int nCommandType = NONE;\r
-       BYTE nKey = (BYTE)wParam;\r
+       UINT nCommandType = NONE;\r
+       BYTE nOrigKey = (BYTE)wParam;\r
 \r
        static BOOL bLocked = FALSE;\r
        static const BYTE RECURSIVE_KEY = 0x07;\r
@@ -661,7 +661,7 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
        static BYTE nOneShotModifier[MAX_KEY] = {'\0'};\r
        static BOOL bCherryOneShotModifier = FALSE;\r
 \r
-//     CUtils::Log(_T("nCode = %#x, nKey = %#x, lParam = %p, %d, %d"), nCode, nKey, lParam, IsDll64, Is64ProcessHwnd(GetForegroundWindow()));\r
+//     CUtils::Log(_T("nCode = %#x, nKey = %#x, lParam = %p, %d, %d"), nOrigCode, nKey, lParam, IsDll64, Is64ProcessHwnd(GetForegroundWindow()));\r
 \r
        if (Is64ProcessHwnd(GetForegroundWindow()) != IsDll64 || CUtils::IsXkeymacs())\r
                return CallNextHookEx(g_hHookKeyboard, nCode, wParam, lParam);\r
@@ -670,7 +670,11 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                goto DO_NOTHING;\r
        }\r
 \r
-       if (nKey == RECURSIVE_KEY) {\r
+//     CUtils::Log(_T("nKey = %#x, ext = %d, rel = %d, pre = %d, %#hx, %#hx"), nOrigKey,\r
+//             (lParam & EXTENDED_KEY) ? 1 : 0, (lParam & BEING_RELEASED) ? 1 : 0, (lParam & REPEATED_KEY) ? 1 : 0,\r
+//             GetKeyState(nOrigKey), GetAsyncKeyState(nOrigKey));\r
+\r
+       if (nOrigKey == RECURSIVE_KEY) {\r
                if (lParam & BEING_RELEASED) {\r
                        goto HOOK_RECURSIVE_KEY;\r
                } else {\r
@@ -680,7 +684,7 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
 \r
        {\r
                static BOOL bShift = FALSE;\r
-               if (IsDepressedShiftKeyOnly(nKey)) {\r
+               if (IsDepressedShiftKeyOnly(nOrigKey)) {\r
                        if (lParam & BEING_RELEASED) {\r
                                if (bShift) {\r
                                        CCommands::SetMark(FALSE);\r
@@ -693,6 +697,7 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                }\r
        }\r
 \r
+       BYTE nKey = nOrigKey;\r
        switch (nKey) {\r
        case VK_CONTROL:\r
                if (lParam & EXTENDED_KEY) {\r
@@ -720,12 +725,8 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
        }\r
 \r
        if (lParam & BEING_RELEASED) {\r
-               BOOL bAlt = FALSE;\r
-               switch (nKey) {\r
+               switch (nOrigKey) {\r
                case VK_MENU:\r
-               case VK_LMENU:\r
-               case VK_RMENU:\r
-                       bAlt = TRUE;\r
                        if (m_nHookAltRelease) {\r
                                if (m_nHookAltRelease & ~HOOK_ALT_LATER)\r
                                        m_nHookAltRelease--;\r
@@ -739,7 +740,7 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                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
+                               if (func && !(nOrigKey == VK_MENU && func == CCommands::MetaAlt))\r
                                        goto HOOK;\r
                        }\r
                }\r
@@ -795,8 +796,7 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                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
+                               if (CheckOriginal(CONTROL, nKey)) {\r
                                        goto DO_NOTHING;\r
                                }\r
                                CCommands::Reset(GOTO_HOOK);\r
@@ -806,17 +806,13 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                }\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 = 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
+       int nVirtualCommandType = GetModifierState(FALSE);\r
+       if (nOrigKey == VK_CONTROL)\r
+               nVirtualCommandType &= ~CONTROL;\r
+       if (nOrigKey == VK_MENU)\r
+               nVirtualCommandType &= ~META;\r
+       if (CheckOriginal(nVirtualCommandType, nOrigKey)) {\r
+               goto DO_NOTHING;\r
        }\r
 \r
        if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::EnableOrDisableXKeymacs) {\r
@@ -916,47 +912,47 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
        }\r
 \r
        if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType & ~CONTROL][nKey]].fCommand == CCommands::OneShotModifierCtrl) {\r
-               nOneShotModifier[nKey] = VK_LCONTROL;\r
-               DepressKey(nOneShotModifier[nKey]);\r
+               nOneShotModifier[nKey] = VK_CONTROL;\r
+               DepressKey(VK_CONTROL);\r
                bCherryOneShotModifier = TRUE;\r
                goto HOOK;\r
        } else if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::OneShotModifierCtrlRepeat) {\r
-               nOneShotModifier[nKey] = VK_LCONTROL;\r
-               DepressKey(nOneShotModifier[nKey]);\r
+               nOneShotModifier[nKey] = VK_CONTROL;\r
+               DepressKey(VK_CONTROL);\r
                bCherryOneShotModifier = TRUE;\r
                goto HOOK;\r
        } else if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType & ~CONTROL][nKey]].fCommand == CCommands::OneShotModifierCtrlRepeat) {\r
-               ReleaseKey(nOneShotModifier[nKey]);\r
+               ReleaseKey(VK_CONTROL);\r
                bCherryOneShotModifier = FALSE;\r
                Kdu(nKey);\r
                goto HOOK;\r
        } else if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType & ~META][nKey]].fCommand == CCommands::OneShotModifierAlt) {\r
-               nOneShotModifier[nKey] = VK_LMENU;\r
-               DepressKey(nOneShotModifier[nKey]);\r
+               nOneShotModifier[nKey] = VK_MENU;\r
+               DepressKey(VK_MENU);\r
                bCherryOneShotModifier = TRUE;\r
                goto HOOK;\r
        } else if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::OneShotModifierAltRepeat) {\r
-               nOneShotModifier[nKey] = VK_LMENU;\r
-               DepressKey(nOneShotModifier[nKey]);\r
+               nOneShotModifier[nKey] = VK_MENU;\r
+               DepressKey(VK_MENU);\r
                bCherryOneShotModifier = TRUE;\r
                goto HOOK;\r
        } else if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType & ~META][nKey]].fCommand == CCommands::OneShotModifierAltRepeat) {\r
-               ReleaseKey(nOneShotModifier[nKey]);\r
+               ReleaseKey(VK_MENU);\r
                bCherryOneShotModifier = FALSE;\r
                Kdu(nKey);\r
                goto HOOK;\r
        } else if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType & ~SHIFT][nKey]].fCommand == CCommands::OneShotModifierShift) {\r
                nOneShotModifier[nKey] = VK_SHIFT;\r
-               DepressKey(nOneShotModifier[nKey]);\r
+               DepressKey(VK_SHIFT);\r
                bCherryOneShotModifier = TRUE;\r
                goto HOOK;\r
        } else if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand == CCommands::OneShotModifierShiftRepeat) {\r
                nOneShotModifier[nKey] = VK_SHIFT;\r
-               DepressKey(nOneShotModifier[nKey]);\r
+               DepressKey(VK_SHIFT);\r
                bCherryOneShotModifier = TRUE;\r
                goto HOOK;\r
        } else if (Commands[m_Config.nCommandID[m_nApplicationID][nCommandType & ~SHIFT][nKey]].fCommand == CCommands::OneShotModifierShiftRepeat) {\r
-               ReleaseKey(nOneShotModifier[nKey]);\r
+               ReleaseKey(VK_SHIFT);\r
                bCherryOneShotModifier = FALSE;\r
                Kdu(nKey);\r
                goto HOOK;\r
@@ -980,15 +976,7 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
        }\r
 \r
        if (!Commands[m_Config.nCommandID[m_nApplicationID][nCommandType][nKey]].fCommand) {\r
-               if (nKey == VK_CONTROL\r
-                || nKey == VK_LCONTROL\r
-                || nKey == VK_RCONTROL\r
-                || nKey == VK_MENU\r
-                || nKey == VK_LMENU\r
-                || nKey == VK_RMENU\r
-                || nKey == VK_SHIFT\r
-                || nKey == VK_LSHIFT\r
-                || nKey == VK_RSHIFT) {\r
+               if (nOrigKey == VK_CONTROL || nOrigKey == VK_MENU || nOrigKey == VK_SHIFT) {\r
                        goto DO_NOTHING;\r
                }\r
 \r
@@ -1312,46 +1300,17 @@ CClipboardSnap* CXkeymacsDll::GetKillRing(CClipboardSnap* pSnap, BOOL bForce)
        return pSnap->GetNext();\r
 }\r
 \r
-void CXkeymacsDll::Original(int nCommandType, BYTE bVk, int nOriginal)\r
+void CXkeymacsDll::SetOriginal(UINT nCommandType, BYTE bVk)\r
 {\r
-       nCommandType &= ~SHIFT;\r
-\r
-       switch (bVk) {\r
-       case VK_CONTROL:\r
-               bVk = VK_LCONTROL;\r
-               break;\r
-       case VK_MENU:\r
-               bVk = VK_LMENU;\r
-               break;\r
-       case VK_SHIFT:\r
-               bVk = VK_LSHIFT;\r
-               break;\r
-       default:\r
-               break;\r
-       }\r
-\r
-       m_nOriginal[nCommandType][bVk] += nOriginal;\r
+       m_nOriginal[nCommandType & ~SHIFT][bVk]++;\r
 }\r
 \r
-int CXkeymacsDll::Original(int nCommandType, BYTE bVk)\r
+int CXkeymacsDll::CheckOriginal(UINT nCommandType, BYTE bVk)\r
 {\r
        nCommandType &= ~SHIFT;\r
-\r
-       switch (bVk) {\r
-       case VK_CONTROL:\r
-               bVk = VK_LCONTROL;\r
-               break;\r
-       case VK_MENU:\r
-               bVk = VK_LMENU;\r
-               break;\r
-       case VK_SHIFT:\r
-               bVk = VK_LSHIFT;\r
-               break;\r
-       default:\r
-               break;\r
-       }\r
-\r
-       return m_nOriginal[nCommandType][bVk];\r
+       if (m_nOriginal[nCommandType][bVk])\r
+               return m_nOriginal[nCommandType][bVk]--;\r
+       return 0;\r
 }\r
 \r
 void CXkeymacsDll::IncreaseKillRingIndex(int nKillRing)\r
index 30093a6..244a7c9 100644 (file)
@@ -139,8 +139,8 @@ private:
        static BOOL IsValidKey(BYTE bVk);\r
        static CObList m_Macro;\r
        static BOOL m_bDefiningMacro;\r
-       static void Original(int nCommandType, BYTE bVk, int nOriginal);\r
-       static int Original(int nCommandType, BYTE bVk);\r
+       static void SetOriginal(UINT nCommandType, BYTE bVk);\r
+       static int CheckOriginal(UINT nCommandType, BYTE bVk);\r
        static void InitKeyboardProc(BOOL bImeComposition);\r
        static int m_nApplicationID;\r
        static int m_nOriginal[MAX_COMMAND_TYPE][MAX_KEY];\r