OSDN Git Service

Rewrite CXkeymacsDll::KeyboardProc.
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Wed, 6 Jul 2011 06:30:44 +0000 (15:30 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Wed, 13 Jul 2011 05:27:58 +0000 (14:27 +0900)
xkeymacsdll/xkeymacsdll.cpp
xkeymacsdll/xkeymacsdll.h

index bb8eedf..c3ada2f 100644 (file)
@@ -610,81 +610,52 @@ int CXkeymacsDll::GetAppID(const LPCSTR szName, const int fallback)
 \r
 LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)\r
 {\r
-       ASSERT(0 <= wParam && wParam <= UCHAR_MAX);\r
-\r
-       UINT nType = NONE;\r
-       BYTE nOrigKey = (BYTE)wParam;\r
+       const BYTE nOrigKey = static_cast<BYTE>(wParam);\r
+       const bool bRelease = (lParam & BEING_RELEASED) != 0;\r
+       const bool bExtended = (lParam & EXTENDED_KEY) != 0;\r
 \r
        static BOOL bLocked = FALSE;\r
        static const BYTE RECURSIVE_KEY = 0x07;\r
-       static int (*fCommand)() = NULL;\r
+       static int (*fLastCommand)() = NULL;\r
        static BYTE nOneShotModifier[MAX_KEY] = {'\0'};\r
        static BOOL bCherryOneShotModifier = FALSE;\r
 \r
-//     CUtils::Log(_T("nCode = %#x, nKey = %#x, lParam = %p, %d, %d"), nOrigCode, nKey, lParam, IsDll64, Is64ProcessHwnd(GetForegroundWindow()));\r
+//     CUtils::Log(_T("nCode = %#x, nKey = %#x, lParam = %p, %d, %d"), nCode, nOrigKey, lParam, IsDll64, Is64ProcessHwnd(GetForegroundWindow()));\r
 \r
-       if (Is64ProcessHwnd(GetForegroundWindow()) != IsDll64 || CUtils::IsXkeymacs())\r
+       if (Is64ProcessHwnd(GetForegroundWindow()) != IsDll64 || CUtils::IsXkeymacs() ||\r
+                       nCode < 0 || nCode == HC_NOREMOVE)\r
                return CallNextHookEx(g_hHookKeyboard, nCode, wParam, lParam);\r
 \r
-       if (nCode < 0 || nCode == HC_NOREMOVE) {\r
-               goto DO_NOTHING;\r
-       }\r
-\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
+               if (bRelease)\r
                        goto HOOK_RECURSIVE_KEY;\r
-               } else {\r
+               else\r
                        goto RECURSIVE_COMMAND;\r
-               }\r
        }\r
 \r
-       {\r
-               static BOOL bShift = FALSE;\r
-               if (IsDepressedShiftKeyOnly(nOrigKey)) {\r
-                       if (lParam & BEING_RELEASED) {\r
-                               if (bShift) {\r
-                                       CCommands::SetMark(FALSE);\r
-                               }\r
-                       } else {\r
-                               bShift = TRUE;\r
-                       }\r
-               } else {\r
-                       bShift = FALSE;\r
-               }\r
-       }\r
+       CancelMarkWithShift(nOrigKey, bRelease);\r
 \r
        BYTE nKey = nOrigKey;\r
        switch (nKey) {\r
        case VK_CONTROL:\r
-               if (lParam & EXTENDED_KEY) {\r
-                       nKey = VK_RCONTROL;\r
-               } else {\r
-                       nKey = VK_LCONTROL;\r
-               }\r
+               nKey = bExtended ? VK_RCONTROL : VK_LCONTROL;\r
                break;\r
        case VK_MENU:\r
-               if (lParam & EXTENDED_KEY) {\r
-                       nKey = VK_RMENU;\r
-               } else {\r
-                       nKey = VK_LMENU;\r
-               }\r
+               nKey = bExtended ? VK_RMENU : VK_LMENU;\r
                break;\r
        case VK_SHIFT:\r
-               if (lParam & EXTENDED_KEY) {\r
-                       nKey = VK_RSHIFT;\r
-               } else {\r
-                       nKey = VK_LSHIFT;\r
-               }\r
-               break;\r
-       default:\r
+               nKey = bExtended ? VK_RSHIFT : VK_LSHIFT;\r
                break;\r
        }\r
 \r
-       if (lParam & BEING_RELEASED) {\r
+#define fCommand(type) (Commands[m_Config.nCommandID[m_nApplicationID][(type)][nKey]].fCommand)\r
+#define nFunctionID (m_Config.nFunctionID[m_nApplicationID][nType][nKey])\r
+\r
+       if (bRelease) {\r
                switch (nOrigKey) {\r
                case VK_MENU:\r
                        if (m_nHookAltRelease) {\r
@@ -699,15 +670,14 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                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 && !(nOrigKey == VK_MENU && func == CCommands::MetaAlt))\r
+                               int (*const fCommand)() = fCommand(i);\r
+                               if (fCommand && !(nOrigKey == VK_MENU && fCommand == CCommands::MetaAlt))\r
                                        goto HOOK;\r
                        }\r
                }\r
                if (nOneShotModifier[nKey]) {\r
                        ReleaseKey(nOneShotModifier[nKey]);\r
                        nOneShotModifier[nKey] = 0;\r
-\r
                        if (bCherryOneShotModifier) {\r
                                bCherryOneShotModifier = FALSE;\r
                                Kdu(nKey);\r
@@ -716,15 +686,12 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                goto DO_NOTHING;\r
        }\r
 \r
-       if (m_Config.nSettingStyle[m_nApplicationID] == SETTING_DISABLE) {\r
+       if (m_Config.nSettingStyle[m_nApplicationID] == SETTING_DISABLE)\r
                goto DO_NOTHING;\r
-       }\r
 \r
        // Do Nothing for Meadow, Mule for Win32, ... if those use default setting.\r
-       if (!_tcsicmp(m_Config.szSpecialApp[m_nApplicationID], _T("Default"))\r
-        && CUtils::IsDefaultIgnoreApplication()) {\r
+       if (!_tcsicmp(m_Config.szSpecialApp[m_nApplicationID], _T("Default")) && CUtils::IsDefaultIgnoreApplication())\r
                goto DO_NOTHING;\r
-       }\r
 \r
        switch (IsPassThrough(nKey)) {\r
        case GOTO_DO_NOTHING:\r
@@ -733,35 +700,25 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                goto HOOK;\r
        case CONTINUE:\r
                break;\r
-       default:\r
-               ASSERT(0);\r
-               break;\r
        }\r
 \r
        // set command type\r
-       nType = IsDown(VK_SHIFT) * SHIFT | IsControl() * CONTROL | IsMeta() * META | CCommands::bC_x() * CONTROLX;\r
+       int nType = IsDown(VK_SHIFT) * SHIFT | IsControl() * CONTROL | IsMeta() * META | CCommands::bC_x() * CONTROLX;\r
        // Ignore undefined C-x ?\r
-       if (nType & CONTROLX) {\r
-               if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == NULL\r
-                && m_Config.nFunctionID[m_nApplicationID][nType][nKey] < 0) {\r
-                       if (m_Config.bIgnoreUndefinedC_x[m_nApplicationID]) {\r
-                               CCommands::Reset(GOTO_HOOK);\r
-                               goto HOOK;\r
-                       }\r
-                       nType &= ~CONTROLX;\r
+       if (nType & CONTROLX && fCommand(nType) == NULL && nFunctionID < 0) {\r
+               if (m_Config.bIgnoreUndefinedC_x[m_nApplicationID]) {\r
+                       CCommands::Reset(GOTO_HOOK);\r
+                       goto HOOK;\r
                }\r
+               nType &= ~CONTROLX;\r
        }\r
        // Ignore undefined Meta Ctrl+?\r
-       if (CCommands::bM_() && (nType & CONTROL)) {\r
-               if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == NULL\r
-                && m_Config.nFunctionID[m_nApplicationID][nType][nKey] < 0) {\r
-                       if (m_Config.bIgnoreUndefinedMetaCtrl[m_nApplicationID]) {\r
-                               if (CheckOriginal(CONTROL, nKey)) {\r
-                                       goto DO_NOTHING;\r
-                               }\r
-                               CCommands::Reset(GOTO_HOOK);\r
-                               goto HOOK;\r
-                       }\r
+       if (CCommands::bM_() && nType & CONTROL && fCommand(nType) == NULL && nFunctionID < 0) {\r
+               if (m_Config.bIgnoreUndefinedMetaCtrl[m_nApplicationID]) {\r
+                       if (CheckOriginal(CONTROL, nKey))\r
+                               goto DO_NOTHING;\r
+                       CCommands::Reset(GOTO_HOOK);\r
+                       goto HOOK;\r
                        nType &= ~META;\r
                }\r
        }\r
@@ -775,172 +732,128 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                goto DO_NOTHING;\r
        }\r
 \r
-       if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::EnableOrDisableXKeymacs) {\r
+       int (*const fCommand)() = fCommand(nType);\r
+       if (fCommand == CCommands::EnableOrDisableXKeymacs) {\r
                ToggleKeyboardHookState();\r
                goto HOOK;\r
        }\r
-       if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::EnableXKeymacs) {\r
-               if (!m_bHook) {\r
+       if (fCommand == CCommands::EnableXKeymacs) {\r
+               if (!m_bHook)\r
                        ToggleKeyboardHookState();\r
-               }\r
                goto HOOK;\r
        }\r
-       if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::DisableXKeymacs) {\r
-               if (m_bHook) {\r
+       if (fCommand == CCommands::DisableXKeymacs) {\r
+               if (m_bHook)\r
                        ToggleKeyboardHookState();\r
-               }\r
                goto HOOK;\r
        }\r
-       if (!m_bHook) {\r
+       if (!m_bHook)\r
                goto DO_NOTHING;\r
-       }\r
 \r
-       if (CCommands::bM_x()) {\r
-               static unsigned int index = 0;\r
+       if (CCommands::bM_x() && !bRelease) {\r
+               static size_t index = 0;\r
                static TCHAR szPath[MAX_PATH] = {'\0'};\r
-\r
-               if (lParam & BEING_RELEASED) {\r
-                       // ignore\r
-               } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::BackwardChar) {\r
-                       if (index) {\r
+               if (fCommand == CCommands::BackwardChar) {\r
+                       if (index)\r
                                --index;\r
-                       }\r
                        goto HOOKX;\r
-               } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::BeginningOfLine) {\r
+               } else if (fCommand == CCommands::BeginningOfLine) {\r
                        index = 0;\r
                        goto HOOKX;\r
-               } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::DeleteBackwardChar) {\r
+               } else if (fCommand == CCommands::DeleteBackwardChar) {\r
                        if (index) {\r
                                --index;\r
-                               memmove(&szPath[index], &szPath[index + 1], _tcslen(szPath) - index);\r
+                               memmove(szPath + index, szPath + index + 1, MAX_PATH - index);\r
                                SetM_xTip(szPath);\r
                        }\r
                        goto HOOKX;\r
-               } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::DeleteChar) {\r
+               } else if (fCommand == CCommands::DeleteChar) {\r
                        if (index < _tcslen(szPath)) {\r
-                               memmove(&szPath[index], &szPath[index + 1], _tcslen(szPath) - index);\r
+                               memmove(szPath + index, szPath + index + 1, MAX_PATH - index);\r
                                SetM_xTip(szPath);\r
                        }\r
                        goto HOOKX;\r
-               } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::EndOfLine) {\r
+               } else if (fCommand == CCommands::EndOfLine) {\r
                        index = _tcslen(szPath);\r
                        goto HOOKX;\r
-               } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::ForwardChar) {\r
-                       if (index < _tcslen(szPath)) {\r
+               } else if (fCommand == CCommands::ForwardChar) {\r
+                       if (index < _tcslen(szPath))\r
                                ++index;\r
-                       }\r
                        goto HOOKX;\r
-               } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::KeyboardQuit) {\r
+               } else if (fCommand == CCommands::KeyboardQuit) {\r
                        CCommands::bM_x(FALSE);\r
                        index = 0;\r
                        memset(szPath, 0, sizeof(szPath));\r
                        goto HOOK;\r
-               } else if (nKey == VK_RETURN\r
-                               || Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::Newline) {\r
+               } else if (nKey == VK_RETURN || fCommand == CCommands::Newline) {\r
                        InvokeM_x(szPath);\r
-\r
                        CCommands::bM_x(FALSE);\r
                        index = 0;\r
                        memset(szPath, 0, sizeof(szPath));\r
                        goto HOOK;\r
-               } else if (index < MAX_PATH - 1) {\r
+               } else if (nKey && index < MAX_PATH - 1) {\r
                        const BOOL bIsShiftDown = IsDown(VK_SHIFT, FALSE);\r
-                       for (TCHAR nAscii = 1; nAscii != 0; ++nAscii) { // repeat until overflow\r
-                               if (nKey != 0 && a2v(nAscii) == nKey && bIsShiftDown == IsShift(nAscii)) {\r
+                       TCHAR nAscii = 0;\r
+                       do { // 1-127\r
+                               if (a2v(++nAscii) == nKey && bIsShiftDown == IsShift(nAscii)) {\r
 //                                     CUtils::Log("M-x: %#X (%c), %#X (%c)", nKey, nKey, nAscii, nAscii);\r
-                                       if (index < _tcslen(szPath)) {\r
-                                               memmove(&szPath[index + 1], &szPath[index], __min(_tcslen(szPath) - index, MAX_PATH - (index + 1) - 1));\r
-                                       }\r
+                                       if (index < _tcslen(szPath))\r
+                                               memmove(szPath + index + 1, szPath + index, MAX_PATH - index - 1);\r
                                        szPath[index++] = nAscii;\r
 //                                     CUtils::Log("M-x: %c(%#04x)", nAscii, nAscii);\r
                                        SetM_xTip(szPath);\r
                                        goto HOOKX;\r
                                }\r
-                       }\r
+                       } while (nAscii != 127);\r
                }\r
        }\r
 \r
-       if (CCommands::bC_u()) {\r
-               if ((nType == NONE) && ('0' <= nKey) && (nKey <= '9')) {\r
+       if (CCommands::bC_u() && nType == NONE) {\r
+               if ('0' <= nKey && nKey <= '9') {\r
                        CCommands::NumericArgument(nKey - '0');\r
                        goto HOOK0_9;\r
                }\r
-               if ((nType == NONE) && (nKey == 0xBD)) {\r
+               if (nKey == VK_OEM_MINUS) {\r
                        CCommands::NumericArgumentMinus();\r
                        goto HOOK0_9;\r
                }\r
        }\r
 \r
-       if (Commands[m_Config.nCommandID[m_nApplicationID][nType & ~CONTROL][nKey]].fCommand == CCommands::OneShotModifierCtrl) {\r
-               nOneShotModifier[nKey] = VK_CONTROL;\r
-               DepressKey(VK_CONTROL);\r
-               bCherryOneShotModifier = TRUE;\r
-               goto HOOK;\r
-       } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::OneShotModifierCtrlRepeat) {\r
-               nOneShotModifier[nKey] = VK_CONTROL;\r
-               DepressKey(VK_CONTROL);\r
-               bCherryOneShotModifier = TRUE;\r
-               goto HOOK;\r
-       } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType & ~CONTROL][nKey]].fCommand == CCommands::OneShotModifierCtrlRepeat) {\r
-               ReleaseKey(VK_CONTROL);\r
-               bCherryOneShotModifier = FALSE;\r
-               Kdu(nKey);\r
-               goto HOOK;\r
-       } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType & ~META][nKey]].fCommand == CCommands::OneShotModifierAlt) {\r
-               nOneShotModifier[nKey] = VK_MENU;\r
-               DepressKey(VK_MENU);\r
-               bCherryOneShotModifier = TRUE;\r
-               goto HOOK;\r
-       } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::OneShotModifierAltRepeat) {\r
-               nOneShotModifier[nKey] = VK_MENU;\r
-               DepressKey(VK_MENU);\r
-               bCherryOneShotModifier = TRUE;\r
-               goto HOOK;\r
-       } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType & ~META][nKey]].fCommand == CCommands::OneShotModifierAltRepeat) {\r
-               ReleaseKey(VK_MENU);\r
-               bCherryOneShotModifier = FALSE;\r
-               Kdu(nKey);\r
-               goto HOOK;\r
-       } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType & ~SHIFT][nKey]].fCommand == CCommands::OneShotModifierShift) {\r
-               nOneShotModifier[nKey] = VK_SHIFT;\r
-               DepressKey(VK_SHIFT);\r
-               bCherryOneShotModifier = TRUE;\r
-               goto HOOK;\r
-       } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand == CCommands::OneShotModifierShiftRepeat) {\r
-               nOneShotModifier[nKey] = VK_SHIFT;\r
-               DepressKey(VK_SHIFT);\r
-               bCherryOneShotModifier = TRUE;\r
-               goto HOOK;\r
-       } else if (Commands[m_Config.nCommandID[m_nApplicationID][nType & ~SHIFT][nKey]].fCommand == CCommands::OneShotModifierShiftRepeat) {\r
-               ReleaseKey(VK_SHIFT);\r
-               bCherryOneShotModifier = FALSE;\r
-               Kdu(nKey);\r
-               goto HOOK;\r
-       } else {\r
-               int i;\r
-               for (i = 0; i < MAX_KEY; ++i) {\r
-                       if (nOneShotModifier[i] == nKey) {\r
-                               break;\r
-                       }\r
-               }\r
-               if (i == MAX_KEY) {\r
-                       bCherryOneShotModifier = FALSE;\r
-               }\r
+#define OneShotModifier(type, vk, mod) \\r
+       if (fCommand(nType & ~type) == CCommands::OneShotModifier ## mod || \\r
+                       fCommand(nType) == CCommands::OneShotModifier ## mod ## Repeat) { \\r
+               nOneShotModifier[nKey] = vk; \\r
+               DepressKey(vk); \\r
+               bCherryOneShotModifier = TRUE; \\r
+               goto HOOK; \\r
+       } else if (fCommand(nType & ~CONTROL) == CCommands::OneShotModifier ## mod ## Repeat) { \\r
+               ReleaseKey(vk); \\r
+               bCherryOneShotModifier = FALSE; \\r
+               Kdu(nKey); \\r
+               goto HOOK; \\r
        }\r
 \r
-       if (0 <= m_Config.nFunctionID[m_nApplicationID][nType][nKey]\r
-        && m_Config.nFunctionID[m_nApplicationID][nType][nKey] < MAX_FUNCTION\r
-        && _tcslen(m_Config.szFunctionDefinition[m_Config.nFunctionID[m_nApplicationID][nType][nKey]])) {\r
-               CallFunction(m_Config.nFunctionID[m_nApplicationID][nType][nKey]);\r
+       OneShotModifier(CONTROL, VK_CONTROL, Ctrl);\r
+       OneShotModifier(META, VK_MENU, Alt);\r
+       OneShotModifier(SHIFT, VK_SHIFT, Shift);\r
+       int i;\r
+       for (i = 0; i < MAX_KEY; ++i)\r
+               if (nOneShotModifier[i] == nOrigKey)\r
+                       break;\r
+       if (i == MAX_KEY)\r
+               bCherryOneShotModifier = FALSE;\r
+\r
+       if (0 <= nFunctionID && nFunctionID < MAX_FUNCTION && m_Config.szFunctionDefinition[nFunctionID][0]) {\r
+               CallFunction(nFunctionID);\r
                CCommands::Reset(GOTO_HOOK);\r
                goto HOOK;\r
        }\r
+#undef fCommand\r
+#undef nFunctionID\r
 \r
-       if (!Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand) {\r
-               if (nOrigKey == VK_CONTROL || nOrigKey == VK_MENU || nOrigKey == VK_SHIFT) {\r
+       if (!fCommand) {\r
+               if (nOrigKey == VK_CONTROL || nOrigKey == VK_MENU || nOrigKey == VK_SHIFT)\r
                        goto DO_NOTHING;\r
-               }\r
-\r
                if (!(nType & SHIFT)) {\r
                        if (CCommands::IsSetMark()) {\r
                                if (CCommands::MoveCaret(nKey, nType & CONTROL) != CONTINUE) {\r
@@ -950,18 +863,15 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                                CCommands::SetMark(FALSE);\r
                        }\r
                }\r
-\r
                if (1 < CCommands::GetNumericArgument()) {\r
                        Kdu(nKey, CCommands::GetNumericArgument());\r
                        CCommands::ClearNumericArgument();\r
                        goto HOOK;\r
                }\r
-\r
                goto DO_NOTHING;\r
        }\r
 \r
-       if (CCommands::IsTemporarilyDisableXKeymacs()\r
-        && Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand != CCommands::KeyboardQuit) {\r
+       if (CCommands::IsTemporarilyDisableXKeymacs()  && fCommand != CCommands::KeyboardQuit) {\r
                CCommands::SetTemporarilyDisableXKeymacs(FALSE);\r
                goto DO_NOTHING;\r
        }\r
@@ -970,40 +880,34 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
        m_bRightAlt = IsDown(VK_RMENU, FALSE);\r
        m_bRightShift = IsDown(VK_RSHIFT, FALSE);\r
 \r
-       if (!bLocked) {\r
-               bLocked = TRUE;\r
-               fCommand = Commands[m_Config.nCommandID[m_nApplicationID][nType][nKey]].fCommand;\r
+       if (bLocked)\r
+               goto HOOK_RECURSIVE_KEY;\r
+       bLocked = TRUE;\r
+       fLastCommand = fCommand;\r
 RECURSIVE_COMMAND:\r
-               switch (fCommand()) {\r
-               case GOTO_DO_NOTHING:\r
-                       bLocked = FALSE;\r
-                       goto DO_NOTHING;\r
-               case GOTO_HOOK:\r
-                       bLocked = FALSE;\r
-                       goto HOOK;\r
-               case GOTO_RECURSIVE:\r
-                       goto RECURSIVE;\r
-               case GOTO_HOOKX:\r
-                       bLocked = FALSE;\r
-                       goto HOOKX;\r
+       switch (fLastCommand()) {\r
+       case GOTO_DO_NOTHING:\r
+               bLocked = FALSE;\r
+               goto DO_NOTHING;\r
+       case GOTO_HOOK:\r
+               bLocked = FALSE;\r
+               goto HOOK;\r
+       case GOTO_RECURSIVE:\r
+               goto RECURSIVE;\r
+       case GOTO_HOOKX:\r
+               bLocked = FALSE;\r
+               goto HOOKX;\r
                case GOTO_HOOK0_9:\r
-                       bLocked = FALSE;\r
-                       goto HOOK0_9;\r
-               default:\r
-                       ASSERT(0);\r
-                       bLocked = FALSE;\r
-                       goto DO_NOTHING;\r
-               }\r
-       } else {\r
-               goto HOOK_RECURSIVE_KEY;\r
+               bLocked = FALSE;\r
+               goto HOOK0_9;\r
        }\r
 \r
 DO_NOTHING:\r
        SetModifierIcons();\r
-       if (m_bRecordingMacro && (!(lParam & BEING_RELEASED) || m_bDown[wParam])) {\r
+       if (m_bRecordingMacro && (!bRelease || m_bDown[wParam])) {\r
                KbdMacro m = { nCode, wParam, lParam, TRUE };\r
                m_Macro.push_back(m);\r
-               m_bDown[wParam] |= !(lParam & BEING_RELEASED);\r
+               m_bDown[wParam] |= !bRelease;\r
        }\r
        return CallNextHookEx(g_hHookKeyboard, nCode, wParam, lParam);\r
 \r
@@ -1104,27 +1008,27 @@ BOOL CXkeymacsDll::IsDepressedModifier(int (__cdecl *Modifier)(void), BOOL bPhys
        return FALSE;\r
 }\r
 \r
-BOOL CXkeymacsDll::IsDepressedShiftKeyOnly(BYTE nKey)\r
+void CXkeymacsDll::CancelMarkWithShift(BYTE nKey, bool bRelease)\r
 {\r
-       if (nKey != VK_SHIFT\r
-        && nKey != VK_LSHIFT\r
-        && nKey != VK_RSHIFT) {\r
-               return FALSE;\r
-       }\r
-\r
+       static bool bShift;\r
+       if (nKey != VK_SHIFT)\r
+               goto exit;\r
        BYTE bVk = 0;\r
        do {\r
-               if (bVk == VK_SHIFT\r
-                || bVk == VK_LSHIFT\r
-                || bVk == VK_RSHIFT) {\r
+               if (bVk == VK_SHIFT || VK_LSHIFT || VK_RSHIFT)\r
                        continue;\r
-               }\r
-\r
-               if (IsDown(bVk, FALSE)) {\r
-                       return FALSE;\r
-               }\r
+               if (IsDown(bVk, FALSE))\r
+                       goto exit;\r
        } while (++bVk);\r
-       return TRUE;\r
+       if (!bRelease) {\r
+               bShift = TRUE;\r
+               return;\r
+       }\r
+       if (bShift)\r
+               CCommands::SetMark(FALSE);\r
+exit:\r
+       bShift = FALSE;\r
+       return;\r
 }\r
 \r
 BOOL CXkeymacsDll::IsControl()\r
index dfca7d5..025d85f 100644 (file)
@@ -142,7 +142,7 @@ private:
        static BOOL IsShift(TCHAR nAscii);\r
        static void CallFunction(int nFuncID);\r
        static int IsPassThrough(BYTE nKey);\r
-       static BOOL IsDepressedShiftKeyOnly(BYTE nKey);\r
+       static void CancelMarkWithShift(BYTE nKey, bool bRelease);\r
        static BOOL IsDepressedModifier(int Modifier(), BOOL bPhysicalKey = TRUE);\r
        static BOOL IsValidKey(BYTE bVk);\r
        static std::list<KbdMacro> m_Macro;\r