OSDN Git Service

Rewrite code to handle keyboard macros again with std::list.
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Wed, 15 Jun 2011 08:19:05 +0000 (17:19 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Mon, 20 Jun 2011 08:22:36 +0000 (17:22 +0900)
Fix a bug where \C-u\C-x( doesn't work.

xkeymacsdll/xkeymacsdll.cpp
xkeymacsdll/xkeymacsdll.h

index a946a04..f34f5c0 100644 (file)
@@ -246,7 +246,7 @@ DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
 #pragma data_seg()\r
 BOOL CXkeymacsDll::m_bRecordingMacro = FALSE;\r
 BOOL CXkeymacsDll::m_bDown[MAX_KEY] = {0};\r
-CList<KbdMacro, KbdMacro&> CXkeymacsDll::m_Macro;\r
+std::list<KbdMacro> CXkeymacsDll::m_Macro;\r
 \r
 //////////////////////////////////////////////////////////////////////\r
 // Construction/Destruction\r
@@ -1035,24 +1035,11 @@ RECURSIVE_COMMAND:
 \r
 DO_NOTHING:\r
        SetModifierIcons();\r
-       if (m_bRecordingMacro) {\r
-               if (!(lParam & BEING_RELEASED) || m_bDown[wParam]) {\r
-                       try {\r
-                               KbdMacro m;\r
-                               m.nCode = nCode;\r
-                               m.wParam = wParam;\r
-                               m.lParam = lParam;\r
-                               m.bOriginal = TRUE;\r
-                               m_Macro.AddTail(m);\r
-                       } catch (CMemoryException* e) {\r
-                               e->Delete();\r
-//                             CUtils::Log("KeyboardProc: 'new' threw an exception");\r
-                       }\r
-                       if (!(lParam & BEING_RELEASED))\r
-                               m_bDown[wParam] = TRUE;\r
-               }\r
+       if (m_bRecordingMacro && (!(lParam & BEING_RELEASED) || m_bDown[wParam])) {\r
+               KbdMacro m = { nCode, wParam, lParam, TRUE };\r
+               m_Macro.push_back(m);\r
+               m_bDown[wParam] |= !(lParam & BEING_RELEASED);\r
        }\r
-\r
        return CallNextHookEx(g_hHookKeyboard, nCode, wParam, lParam);\r
 \r
 RECURSIVE:\r
@@ -1308,21 +1295,21 @@ BOOL CXkeymacsDll::GetEnableCUA()
 \r
 void CXkeymacsDll::StartRecordMacro()\r
 {\r
-       m_bRecordingMacro = TRUE;\r
        if (CCommands::bC_u())\r
                CallMacro();\r
-       m_Macro.RemoveAll();\r
+       m_bRecordingMacro = TRUE;\r
+       m_Macro.erase(m_Macro.begin(), m_Macro.end());\r
        ZeroMemory(m_bDown, MAX_KEY);\r
 }\r
 \r
 void CXkeymacsDll::EndRecordMacro()\r
 {\r
        m_bRecordingMacro = FALSE;\r
-       while (!m_Macro.IsEmpty()) { // remove not released push\r
-               KbdMacro& m = m_Macro.GetTail();\r
+       while (!m_Macro.empty()) { // remove not released push\r
+               const KbdMacro& m = m_Macro.back();\r
                if (m.lParam & BEING_RELEASED)\r
                        break;\r
-               m_Macro.RemoveTail();\r
+               m_Macro.pop_back();\r
        }\r
 }\r
 \r
@@ -1332,36 +1319,14 @@ void CXkeymacsDll::CallMacro()
                m_bRecordingMacro = FALSE;\r
        UINT before = GetModifierState(FALSE);\r
        SetModifierState(0, before);\r
-       for (POSITION pos = m_Macro.GetHeadPosition(); pos; ) {\r
-               KbdMacro& m = m_Macro.GetNext(pos);\r
-               if (m.lParam & BEING_RELEASED)\r
-                       ReleaseKey((BYTE)m.wParam);\r
+       for (auto m = m_Macro.begin(); m != m_Macro.end(); m++)\r
+               if (m->lParam & BEING_RELEASED)\r
+                       ReleaseKey(static_cast<BYTE>(m->wParam));\r
                else\r
-                       DepressKey((BYTE)m.wParam, m.bOriginal);\r
-       }\r
+                       DepressKey(static_cast<BYTE>(m->wParam), m->bOriginal);\r
        SetModifierState(before, 0);\r
 }\r
 \r
-/*\r
-void CXkeymacsDll::CallMacro() // for debug\r
-{\r
-       CString sz;\r
-       for (POSITION pos = m_Macro.GetHeadPosition(); pos; ) {\r
-               KbdMacro m = m_Macro.GetNext(pos);\r
-               if (m.lParam & BEING_RELEASED) {\r
-                       CString t;\r
-                       t.Format(_T("0x%xu "), m.wParam);\r
-                       sz += t;\r
-               } else {\r
-                       CString t;\r
-                       t.Format(_T("0x%xd "), m.wParam);\r
-                       sz += t;\r
-               }\r
-       }\r
-//     CUtils::Log(sz);\r
-}\r
-*/\r
-\r
 void CXkeymacsDll::Set106Keyboard(BOOL b106Keyboard)\r
 {\r
        m_Config.b106Keyboard = b106Keyboard;\r
index 8e90be9..006eac4 100644 (file)
@@ -9,6 +9,7 @@
 #pragma once\r
 #endif // _MSC_VER > 1000\r
 \r
+#include <list>\r
 #include "ClipboardSnap.h"\r
 \r
 enum { MAX_APP = 64 };\r
@@ -144,7 +145,7 @@ private:
        static BOOL IsDepressedShiftKeyOnly(BYTE nKey);\r
        static BOOL IsDepressedModifier(int Modifier(), BOOL bPhysicalKey = TRUE);\r
        static BOOL IsValidKey(BYTE bVk);\r
-       static CList<KbdMacro, KbdMacro&> m_Macro;\r
+       static std::list<KbdMacro> m_Macro;\r
        static BOOL m_bRecordingMacro;\r
        static BOOL m_bDown[MAX_KEY];\r
        static void SetOriginal(UINT nCommandType, BYTE bVk);\r