OSDN Git Service

Add KbdMacro class to record key strokes and remove members handling
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Wed, 14 Sep 2011 14:11:34 +0000 (23:11 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sun, 23 Oct 2011 09:56:44 +0000 (18:56 +0900)
keyboard macros from CXkeymacsDll.

xkeymacs/xkeymacs-vc10.vcxproj
xkeymacsdll/Commands.cpp
xkeymacsdll/Commands.h
xkeymacsdll/KbdMacro.cpp [new file with mode: 0644]
xkeymacsdll/KbdMacro.h [new file with mode: 0644]
xkeymacsdll/xkeymacsdll-vc10.vcxproj
xkeymacsdll/xkeymacsdll-vc10.vcxproj.filters
xkeymacsdll/xkeymacsdll.cpp
xkeymacsdll/xkeymacsdll.h

index c755751..72262d5 100644 (file)
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
   <ImportGroup Label="ExtensionTargets">\r
   </ImportGroup>\r
+  <ProjectExtensions>\r
+    <VisualStudio>\r
+      <UserProperties RESOURCE_FILE="xkeymacs.rc" />\r
+    </VisualStudio>\r
+  </ProjectExtensions>\r
 </Project>
\ No newline at end of file
index 1ca08a0..9914e93 100644 (file)
@@ -287,6 +287,7 @@ OriginalWindowPosition CCommands::m_OriginalWindowPosition[MAX_WINDOW] = {'\0'};
 BOOL CCommands::m_bIsSu = FALSE;\r
 #pragma data_seg()\r
 \r
+KbdMacro CCommands::m_kbdMacro;\r
 int (*CCommands::m_LastKillCommand)() = NULL;\r
 int (*CCommands::m_LastCommand)() = NULL;\r
 CArray<CClipboardSnap *, CClipboardSnap *> CCommands::m_oClipboardData;\r
@@ -2788,12 +2789,15 @@ int CCommands::SelectAll()
 // C-x (\r
 int CCommands::StartKbdMacro()\r
 {\r
-       if (CUtils::IsMicrosoftWord()) {\r
+       if (CUtils::IsMicrosoftWord())\r
                AdKduAu('T', 'M', 'R');\r
-       } else if (CUtils::IsHidemaru()) {\r
+       else if (CUtils::IsHidemaru())\r
                SdKduSu(VK_F1);\r
-       } else {\r
-               CXkeymacsDll::StartRecordMacro();\r
+       else {\r
+               if (bC_u())\r
+                       m_kbdMacro.Call();\r
+               m_kbdMacro.Start();\r
+               CXkeymacsDll::SetKbMacro(&m_kbdMacro);\r
        }\r
        return Reset(GOTO_HOOK);\r
 }\r
@@ -2801,12 +2805,13 @@ int CCommands::StartKbdMacro()
 // C-x )\r
 int CCommands::EndKbdMacro()\r
 {\r
-       if (CUtils::IsMicrosoftWord()) {\r
+       if (CUtils::IsMicrosoftWord())\r
                AdKduAu('T', 'M', 'R');\r
-       } else if (CUtils::IsHidemaru()) {\r
+       else if (CUtils::IsHidemaru())\r
                SdKduSu(VK_F1);\r
-       } else {\r
-               CXkeymacsDll::EndRecordMacro();\r
+       else {\r
+               m_kbdMacro.End();\r
+               CXkeymacsDll::SetKbMacro(NULL);\r
        }\r
        return Reset(GOTO_HOOK);\r
 }\r
@@ -2814,21 +2819,19 @@ int CCommands::EndKbdMacro()
 // C-x e\r
 int CCommands::CallLastKbdMacro()\r
 {\r
-       if (CUtils::IsMicrosoftWord()) {\r
+       if (CUtils::IsMicrosoftWord())\r
                AdKduAu('T', 'M', 'M');\r
-       else if (CUtils::IsHidemaru()) {\r
+       else if (CUtils::IsHidemaru()) {\r
                int n = 1;\r
-               if (!m_bDefaultNumericArgument) {\r
+               if (!m_bDefaultNumericArgument)\r
                        n = m_nNumericArgument;\r
-               }\r
                ClearNumericArgument();\r
-               while (n--) {\r
+               while (n--)\r
                        AdKduAu('M', 'P');\r
-               }\r
        } else {\r
-               while (m_nNumericArgument--) {\r
-                       CXkeymacsDll::CallMacro();\r
-               }\r
+               EndKbdMacro();\r
+               while (m_nNumericArgument--)\r
+                       m_kbdMacro.Call();\r
        }\r
        return Reset(GOTO_HOOK);\r
 }\r
index 1f15019..eaab68e 100644 (file)
@@ -11,6 +11,7 @@
 \r
 #include "StdAfx.h"\r
 #include "defs.h"\r
+#include "KbdMacro.h"\r
 #include "ClipboardSnap.h"\r
 \r
 enum SEARCH_DIRECTION { NA, FORWARD, BACKWARD, AGAIN };\r
@@ -180,6 +181,7 @@ public:
        static int GetDefaultControlID(int nComID, int nIndex);\r
 \r
 private:\r
+       static KbdMacro m_kbdMacro;\r
        static BOOL CutFollowingWord();\r
        static int CaseWord(CASE_WORD nCase);\r
        static BOOL CopyCurrentLine();\r
diff --git a/xkeymacsdll/KbdMacro.cpp b/xkeymacsdll/KbdMacro.cpp
new file mode 100644 (file)
index 0000000..653622a
--- /dev/null
@@ -0,0 +1,44 @@
+#include "KbdMacro.h"\r
+#include "xkeymacsdll.h"\r
+\r
+void KbdMacro::Start()\r
+{\r
+       ZeroMemory(m_down, sizeof(m_down));\r
+       m_keys.clear();\r
+}\r
+\r
+void KbdMacro::Record(BYTE vk, bool up)\r
+{\r
+       if (up && !m_down[vk])\r
+               return;\r
+       if (!up)\r
+               m_down[vk] = true;\r
+       Key k = {vk, up};\r
+       m_keys.push_back(k);\r
+}\r
+\r
+void KbdMacro::End()\r
+{\r
+       while (!m_keys.empty()) { // remove not pushed up\r
+               if (!m_keys.front().up)\r
+                       break;\r
+               m_keys.erase(m_keys.begin());\r
+       }\r
+       while (!m_keys.empty()) {  // remove not released push\r
+               if (m_keys.back().up)\r
+                       break;\r
+               m_keys.pop_back();\r
+       }\r
+}\r
+\r
+void KbdMacro::Call() const\r
+{\r
+       UINT before = CXkeymacsDll::GetModifierState(FALSE);\r
+       CXkeymacsDll::SetModifierState(0, before);\r
+       for (auto k = m_keys.cbegin(); k != m_keys.cend(); ++k)\r
+               if (k->up)\r
+                       CXkeymacsDll::ReleaseKey(k->vk);\r
+               else\r
+                       CXkeymacsDll::DepressKey(k->vk);\r
+       CXkeymacsDll::SetModifierState(before, 0);\r
+}\r
diff --git a/xkeymacsdll/KbdMacro.h b/xkeymacsdll/KbdMacro.h
new file mode 100644 (file)
index 0000000..d9b7265
--- /dev/null
@@ -0,0 +1,21 @@
+#pragma once\r
+\r
+#include <vector>\r
+#include "StdAfx.h"\r
+\r
+class KbdMacro\r
+{\r
+       struct Key\r
+       {\r
+               BYTE vk;\r
+               bool up;\r
+       };\r
+       std::vector<Key> m_keys;\r
+       bool m_down[256];\r
+public:\r
+       void Start();\r
+       void Record(BYTE vk, bool up);\r
+       void End();\r
+       void Call() const;\r
+};\r
+\r
index 506d1ba..734f53c 100644 (file)
     <ClCompile Include="ClipboardSnap.cpp" />\r
     <ClCompile Include="Commands.cpp" />\r
     <ClCompile Include="FunctionDefinition.cpp" />\r
+    <ClCompile Include="KbdMacro.cpp" />\r
     <ClCompile Include="StdAfx.cpp" />\r
     <ClCompile Include="Utils.cpp" />\r
     <ClCompile Include="xkeymacsdll.cpp" />\r
     <ClInclude Include="defs.h" />\r
     <ClInclude Include="FunctionDefinition.h" />\r
     <ClInclude Include="ipc.h" />\r
+    <ClInclude Include="KbdMacro.h" />\r
     <ClInclude Include="resource.h" />\r
     <ClInclude Include="StdAfx.h" />\r
     <ClInclude Include="Utils.h" />\r
index eb028c0..f8d9944 100644 (file)
@@ -1,85 +1,91 @@
-<?xml version="1.0" encoding="utf-8"?>\r
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
-  <ItemGroup>\r
-    <Filter Include="Source Files">\r
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
-    </Filter>\r
-    <Filter Include="Header Files">\r
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\r
-    </Filter>\r
-    <Filter Include="Resource Files">\r
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>\r
-    </Filter>\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <ClCompile Include="ClipboardFormatSnap.cpp">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="ClipboardSnap.cpp">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="Commands.cpp">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="FunctionDefinition.cpp">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="StdAfx.cpp">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="Utils.cpp">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
-    <ClCompile Include="xkeymacsdll.cpp">\r
-      <Filter>Source Files</Filter>\r
-    </ClCompile>\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <None Include="xkeymacsdll.def">\r
-      <Filter>Source Files</Filter>\r
-    </None>\r
-    <None Include="xkeymacs64dll.def">\r
-      <Filter>Source Files</Filter>\r
-    </None>\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <ClInclude Include="ClipboardFormatSnap.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="ClipboardSnap.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="Commands.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="FunctionDefinition.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="resource.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="StdAfx.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="Utils.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="xkeymacsdll.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="ipc.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-    <ClInclude Include="defs.h">\r
-      <Filter>Header Files</Filter>\r
-    </ClInclude>\r
-  </ItemGroup>\r
-  <ItemGroup>\r
-    <ResourceCompile Include="xkeymacsdll.rc">\r
-      <Filter>Resource Files</Filter>\r
-    </ResourceCompile>\r
-  </ItemGroup>\r
+<?xml version="1.0" encoding="utf-8"?>\r\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r\r
+  <ItemGroup>\r\r
+    <Filter Include="Source Files">\r\r
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\r
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\r
+    </Filter>\r\r
+    <Filter Include="Header Files">\r\r
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\r
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\r
+    </Filter>\r\r
+    <Filter Include="Resource Files">\r\r
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r\r
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>\r\r
+    </Filter>\r\r
+  </ItemGroup>\r\r
+  <ItemGroup>\r\r
+    <ClCompile Include="ClipboardFormatSnap.cpp">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </ClCompile>\r\r
+    <ClCompile Include="ClipboardSnap.cpp">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </ClCompile>\r\r
+    <ClCompile Include="Commands.cpp">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </ClCompile>\r\r
+    <ClCompile Include="FunctionDefinition.cpp">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </ClCompile>\r\r
+    <ClCompile Include="StdAfx.cpp">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </ClCompile>\r\r
+    <ClCompile Include="Utils.cpp">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </ClCompile>\r\r
+    <ClCompile Include="xkeymacsdll.cpp">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </ClCompile>\r\r
+    <ClCompile Include="KbdMacro.cpp">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </ClCompile>\r\r
+  </ItemGroup>\r\r
+  <ItemGroup>\r\r
+    <None Include="xkeymacsdll.def">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </None>\r\r
+    <None Include="xkeymacs64dll.def">\r\r
+      <Filter>Source Files</Filter>\r\r
+    </None>\r\r
+  </ItemGroup>\r\r
+  <ItemGroup>\r\r
+    <ClInclude Include="ClipboardFormatSnap.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="ClipboardSnap.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="Commands.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="FunctionDefinition.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="resource.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="StdAfx.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="Utils.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="xkeymacsdll.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="ipc.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="defs.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+    <ClInclude Include="KbdMacro.h">\r\r
+      <Filter>Header Files</Filter>\r\r
+    </ClInclude>\r\r
+  </ItemGroup>\r\r
+  <ItemGroup>\r\r
+    <ResourceCompile Include="xkeymacsdll.rc">\r\r
+      <Filter>Resource Files</Filter>\r\r
+    </ResourceCompile>\r\r
+  </ItemGroup>\r\r
 </Project>
\ No newline at end of file
index 17e9b79..476345c 100644 (file)
@@ -226,9 +226,7 @@ HHOOK CXkeymacsDll::m_hHookShell = NULL;
 int CXkeymacsDll::m_nAppID = 0;\r
 CList<CClipboardSnap *, CClipboardSnap *> CXkeymacsDll::m_oKillRing;\r
 int CXkeymacsDll::m_nKillRing = 0;\r
-BOOL CXkeymacsDll::m_bRecordingMacro = FALSE;\r
-BOOL CXkeymacsDll::m_bDown[MAX_KEY] = {0};\r
-std::list<KbdMacro> CXkeymacsDll::m_Macro;\r
+KbdMacro* CXkeymacsDll::m_kbdMacro = NULL;\r
 \r
 BOOL CXkeymacsDll::SaveConfig()\r
 {\r
@@ -776,11 +774,8 @@ RECURSIVE_COMMAND:
 \r
 DO_NOTHING:\r
        SetModifierIcons();\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] |= !bRelease;\r
-       }\r
+       if (m_kbdMacro)\r
+               m_kbdMacro->Record(nKey, bRelease);\r
        return CallNextHookEx(NULL, nCode, wParam, lParam);\r
 \r
 RECURSIVE:\r
@@ -1137,38 +1132,9 @@ BOOL CXkeymacsDll::Is106Keyboard()
        return m_Config.b106Keyboard;\r
 }\r
 \r
-void CXkeymacsDll::StartRecordMacro()\r
-{\r
-       if (CCommands::bC_u())\r
-               CallMacro();\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
+void CXkeymacsDll::SetKbMacro(KbdMacro* kbdMacro)\r
 {\r
-       m_bRecordingMacro = FALSE;\r
-       while (!m_Macro.empty()) { // remove not released push\r
-               const KbdMacro& m = m_Macro.back();\r
-               if (HIWORD(m.lParam) & KF_UP)\r
-                       break;\r
-               m_Macro.pop_back();\r
-       }\r
-}\r
-\r
-void CXkeymacsDll::CallMacro()\r
-{\r
-       if (m_bRecordingMacro)\r
-               m_bRecordingMacro = FALSE;\r
-       UINT before = GetModifierState(FALSE);\r
-       SetModifierState(0, before);\r
-       for (std::list<KbdMacro>::const_iterator m = m_Macro.begin(); m != m_Macro.end(); ++m)\r
-               if (HIWORD(m->lParam) & KF_UP)\r
-                       ReleaseKey(static_cast<BYTE>(m->wParam));\r
-               else\r
-                       DepressKey(static_cast<BYTE>(m->wParam), m->bOriginal);\r
-       SetModifierState(before, 0);\r
+       m_kbdMacro = kbdMacro;\r
 }\r
 \r
 // call an original command which is defined in dot.xkeymacs\r
index 85b7cf5..201d5f0 100644 (file)
 #endif // _MSC_VER > 1000\r
 \r
 #include "StdAfx.h"\r
+#include "KbdMacro.h"\r
 #include "ClipboardSnap.h"\r
 #include "defs.h"\r
 #include "ipc.h"\r
 #include <list>\r
 \r
-struct KbdMacro\r
-{\r
-       int nCode;\r
-       WPARAM wParam;\r
-       LPARAM lParam;\r
-       BOOL bOriginal;\r
-};\r
-\r
 const DWORD HOOK_ALT_LATER = 0x10000;\r
 \r
 class AFX_EXT_CLASS CXkeymacsDll  \r
@@ -53,9 +46,7 @@ public:
        static BOOL GetEnableCUA();\r
        static BOOL Get326Compatible();\r
        static BOOL Is106Keyboard();\r
-       static void StartRecordMacro();\r
-       static void EndRecordMacro();\r
-       static void CallMacro();\r
+       static void SetKbMacro(KbdMacro* kbdMacro);\r
        static int GetAccelerate(void);\r
        static void SetAccelerate(int nAccelerate);\r
        static void SetKeyboardSpeed(int nKeyboardSpeed);\r
@@ -97,9 +88,7 @@ private:
        static BOOL IsDepressedModifier(int Modifier(), BOOL bPhysicalKey = TRUE);\r
        static CList<CClipboardSnap *, CClipboardSnap *> m_oKillRing;\r
        static int m_nKillRing;\r
-       static BOOL m_bRecordingMacro;\r
-       static BOOL m_bDown[MAX_KEY];\r
-       static std::list<KbdMacro> m_Macro;\r
+       static KbdMacro* m_kbdMacro;\r
        static void CallFunction(int nFuncID);\r
        static KeyBind ParseKey(LPCTSTR& def);\r
        static BOOL IsShift(TCHAR nAscii);\r