keyboard macros from CXkeymacsDll.
<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
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
// 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
// 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
// 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
\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
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
--- /dev/null
+#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
--- /dev/null
+#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
<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
-<?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
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
\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
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
#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
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
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