OSDN Git Service

Make minor modifications in ipc.h and related files.
[xkeymacs/xkeymacs.git] / xkeymacsdll / xkeymacsdll.cpp
index cb0f25d..006a49f 100644 (file)
@@ -1,11 +1,10 @@
 // xkeymacsdll.cpp : Defines the initialization routines for the DLL.\r
 //\r
 \r
-#include "stdafx.h"\r
-#include "resource.h"\r
+#include "xkeymacsdll.h"\r
 #include "Utils.h"\r
 #include "Commands.h"\r
-#include <afxdllx.h>\r
+#include "../xkeymacs/resource.h"\r
 #include <math.h>\r
 #include <Imm.h>\r
 #include <vector>\r
@@ -133,51 +132,14 @@ static const int MAX_KEYNAME = _countof(KeyNames);
 \r
 static AFX_EXTENSION_MODULE XkeymacsdllDLL = { NULL, NULL };\r
 \r
-HINSTANCE g_hDllInst = NULL;\r
-UINT g_ImeManipulationMessage = 0;\r
-#pragma data_seg(".xkmcs")\r
-HHOOK g_hHookKeyboard = NULL;\r
-HHOOK g_hHookDummy = NULL;\r
-#pragma data_seg()\r
-\r
-inline bool IsWow64(HANDLE mod)\r
-{\r
-       typedef BOOL (WINAPI *pfnIsWow64Process_t)(HANDLE, PBOOL);\r
-       if (const pfnIsWow64Process_t IsWow64Process = (pfnIsWow64Process_t)GetProcAddress(GetModuleHandle(_T("kernel32")), "IsWow64Process")) {\r
-               BOOL b;\r
-               return IsWow64Process(mod, &b) && b;\r
-       }\r
-       return false;\r
-}\r
-\r
-inline bool Is64System()\r
-{\r
-       SYSTEM_INFO info;\r
-       GetNativeSystemInfo(&info);\r
-       return info.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_INTEL;\r
-}\r
-\r
-inline bool Is64Process(HANDLE mod)\r
-{\r
-       return Is64System() && !IsWow64(mod);\r
-}\r
-\r
-const bool IsDll64 = sizeof(void *) == 8;\r
-\r
-inline bool Is64ProcessHwnd(HWND hwnd)\r
-{\r
-       DWORD pid;\r
-       GetWindowThreadProcessId(hwnd, &pid);\r
-       HANDLE hmod = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid);\r
-       bool b = Is64Process(hmod);\r
-       CloseHandle(hmod);\r
-       return b;\r
-}\r
+static HINSTANCE g_hDllInst = NULL;\r
+static DWORD g_TlsIndex = 0;\r
 \r
 extern "C" int APIENTRY\r
 DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)\r
 {\r
        g_hDllInst = hInstance;\r
+       LPVOID lpData;\r
        \r
        // Remove this if you use lpReserved\r
        UNREFERENCED_PARAMETER(lpReserved);\r
@@ -185,7 +147,6 @@ DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
        switch (dwReason) {\r
        case DLL_PROCESS_ATTACH:\r
                TRACE0("XKEYMACSDLL.DLL Initializing!\n");\r
-               g_ImeManipulationMessage = RegisterWindowMessage(_T("XkManipulateIME"));\r
 \r
                // Extension DLL one-time initialization\r
                if (!AfxInitExtensionModule(XkeymacsdllDLL, hInstance)) {\r
@@ -211,11 +172,27 @@ DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
                        e->Delete();\r
 //                     CUtils::Log("DllMain: 'new' threw an exception");\r
                }\r
+\r
+               if ((g_TlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)\r
+                       return FALSE;\r
+               // fall through\r
+       case DLL_THREAD_ATTACH:\r
+               if ((lpData = LocalAlloc(LPTR, sizeof(HHOOK))) != NULL)\r
+                       TlsSetValue(g_TlsIndex, lpData);\r
                break;\r
        case DLL_PROCESS_DETACH:\r
                TRACE0("XKEYMACSDLL.DLL Terminating!\n");\r
                // Terminate the library before destructors are called\r
                AfxTermExtensionModule(XkeymacsdllDLL);\r
+               CXkeymacsDll::ReleaseKeyboardHook();\r
+               if ((lpData = TlsGetValue(g_TlsIndex)) != NULL)\r
+                       LocalFree(lpData);\r
+               TlsFree(g_TlsIndex);\r
+               break;\r
+       case DLL_THREAD_DETACH:\r
+               CXkeymacsDll::ReleaseKeyboardHook();\r
+               if ((lpData = TlsGetValue(g_TlsIndex)) != NULL)\r
+                       LocalFree(lpData);\r
                break;\r
        }\r
        return 1;   // ok\r
@@ -225,32 +202,31 @@ DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
 // CXkeymacsDll Class\r
 //////////////////////////////////////////////////////////////////////\r
 \r
-#include "xkeymacsDll.h"\r
 #pragma data_seg(".xkmcs")\r
-       DWORD   CXkeymacsDll::m_nHookAltRelease = 0;\r
-       HHOOK   CXkeymacsDll::m_hHookCallWnd = NULL;\r
-       HHOOK   CXkeymacsDll::m_hHookCallWndRet = NULL;\r
-       HHOOK   CXkeymacsDll::m_hHookGetMessage = NULL;\r
-       HHOOK   CXkeymacsDll::m_hHookShell = NULL;\r
-       BOOL    CXkeymacsDll::m_bRightControl   = FALSE;\r
-       BOOL    CXkeymacsDll::m_bRightAlt               = FALSE;\r
-       BOOL    CXkeymacsDll::m_bRightShift             = FALSE;\r
-       BOOL    CXkeymacsDll::m_bHook                   = TRUE;\r
-       CList<CClipboardSnap *, CClipboardSnap *> CXkeymacsDll::m_oKillRing;\r
-       int             CXkeymacsDll::m_nKillRing = 0;\r
-       BYTE    CXkeymacsDll::m_nOriginal[MAX_COMMAND_TYPE][MAX_KEY] = {'\0'};\r
-       int             CXkeymacsDll::m_nAppID = 0;\r
-       int             CXkeymacsDll::m_nAccelerate = 0;\r
-       int             CXkeymacsDll::m_nKeyboardSpeed = 31;\r
-       HCURSOR CXkeymacsDll::m_hCursor[MAX_STATUS] = {'\0'};\r
-       HCURSOR CXkeymacsDll::m_hCurrentCursor = NULL;\r
-       BOOL    CXkeymacsDll::m_bCursor = FALSE;\r
-       TCHAR   CXkeymacsDll::m_M_xTip[128] = "";\r
-       CONFIG  CXkeymacsDll::m_Config = {0};\r
+Config CXkeymacsDll::m_Config = {0};\r
+bool CXkeymacsDll::m_bEnableKeyboardHook = false;\r
+BOOL CXkeymacsDll::m_bHook = TRUE;\r
+DWORD CXkeymacsDll::m_nHookAltRelease = 0;\r
+BOOL CXkeymacsDll::m_bRightShift = FALSE;\r
+BOOL CXkeymacsDll::m_bRightControl = FALSE;\r
+BOOL CXkeymacsDll::m_bRightAlt = FALSE;\r
+TCHAR CXkeymacsDll::m_M_xTip[128] = "";\r
+BYTE CXkeymacsDll::m_nOriginal[MAX_COMMAND_TYPE][MAX_KEY] = {'\0'};\r
+int CXkeymacsDll::m_nAccelerate = 0;\r
+int CXkeymacsDll::m_nKeyboardSpeed = 31;\r
+HCURSOR CXkeymacsDll::m_hCurrentCursor = NULL;\r
+BOOL CXkeymacsDll::m_bCursor = FALSE;\r
+HCURSOR CXkeymacsDll::m_hCursor[MAX_STATUS] = {'\0'};\r
 #pragma data_seg()\r
-BOOL CXkeymacsDll::m_bRecordingMacro = FALSE;\r
-BOOL CXkeymacsDll::m_bDown[MAX_KEY] = {0};\r
-std::list<KbdMacro> CXkeymacsDll::m_Macro;\r
+\r
+HHOOK CXkeymacsDll::m_hHookCallWnd = NULL;\r
+HHOOK CXkeymacsDll::m_hHookCallWndRet = NULL;\r
+HHOOK CXkeymacsDll::m_hHookGetMessage = NULL;\r
+HHOOK CXkeymacsDll::m_hHookShell = NULL;\r
+int CXkeymacsDll::m_nAppID = 0;\r
+CList<CClipboardSnap *, CClipboardSnap *> CXkeymacsDll::m_oKillRing;\r
+int CXkeymacsDll::m_nKillRing = 0;\r
+KbdMacro* CXkeymacsDll::m_kbdMacro = NULL;\r
 \r
 BOOL CXkeymacsDll::SaveConfig()\r
 {\r
@@ -263,7 +239,7 @@ BOOL CXkeymacsDll::SaveConfig()
        if (hFile == INVALID_HANDLE_VALUE)\r
                return FALSE;\r
        DWORD written;\r
-       BOOL res = WriteFile(hFile, &m_Config, sizeof(m_Config), &written, NULL) || written != sizeof(m_Config);\r
+       BOOL res = WriteFile(hFile, &m_Config, sizeof(m_Config), &written, NULL) && written == sizeof(m_Config);\r
        CloseHandle(hFile);\r
        return res;\r
 }\r
@@ -284,27 +260,37 @@ BOOL CXkeymacsDll::LoadConfig()
        return res;\r
 }\r
 \r
-void CXkeymacsDll::SetConfig(const CONFIG& config)\r
+void CXkeymacsDll::SetConfig(const Config& config)\r
 {\r
        m_Config = config;\r
 }\r
 \r
-// set hooks\r
-LRESULT WINAPI DummyProc(int code, WPARAM wp, LPARAM lp) {\r
-       return CallNextHookEx(0, code, wp, lp);\r
+void CXkeymacsDll::SetHooks()\r
+{\r
+       m_hHookCallWnd = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hDllInst, 0);\r
+       m_hHookCallWndRet = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProc, g_hDllInst, 0);\r
+       m_hHookGetMessage = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hDllInst, 0);\r
+       m_hHookShell = SetWindowsHookEx(WH_SHELL, ShellProc, g_hDllInst, 0);\r
+       m_bEnableKeyboardHook = true;\r
 }\r
 \r
-void CXkeymacsDll::SetHooks()\r
+void CXkeymacsDll::SetKeyboardHook()\r
 {\r
-       m_hHookCallWnd = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndProc, g_hDllInst, 0);\r
-       m_hHookCallWndRet = SetWindowsHookEx(WH_CALLWNDPROCRET, (HOOKPROC)CallWndRetProc, g_hDllInst, 0);\r
-       m_hHookGetMessage = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, g_hDllInst, 0);\r
-       m_hHookShell = SetWindowsHookEx(WH_SHELL, (HOOKPROC)ShellProc, g_hDllInst, 0);\r
-       g_hHookDummy = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)DummyProc, g_hDllInst, 0);\r
-       g_hHookKeyboard = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, g_hDllInst, 0);\r
+       LPVOID lpData = TlsGetValue(g_TlsIndex);\r
+       if (!lpData) {\r
+               lpData = LocalAlloc(LPTR, sizeof(HHOOK));\r
+               if (!lpData)\r
+                       return;\r
+               if (!TlsSetValue(g_TlsIndex, lpData))\r
+                       return;\r
+       }\r
+       HHOOK *phHook = reinterpret_cast<HHOOK *>(lpData);\r
+       if (!*phHook)\r
+               *phHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, g_hDllInst, GetCurrentThreadId());\r
 }\r
 \r
-inline void unhook(HHOOK &hh) {\r
+inline void unhook(HHOOK &hh)\r
+{\r
        if (hh)\r
                UnhookWindowsHookEx(hh);\r
        hh = NULL;\r
@@ -316,15 +302,20 @@ void CXkeymacsDll::ResetHooks()
        SetHooks();\r
 }\r
 \r
-// release hooks\r
 void CXkeymacsDll::ReleaseHooks()\r
 {\r
        unhook(m_hHookCallWnd);\r
        unhook(m_hHookCallWndRet);\r
        unhook(m_hHookGetMessage);\r
        unhook(m_hHookShell);\r
-       unhook(g_hHookKeyboard);\r
-       unhook(g_hHookDummy);\r
+       m_bEnableKeyboardHook = false;\r
+}\r
+\r
+void CXkeymacsDll::ReleaseKeyboardHook()\r
+{\r
+       HHOOK *phHook = reinterpret_cast<HHOOK *>(TlsGetValue(g_TlsIndex));\r
+       if (phHook)\r
+               unhook(*phHook);\r
 }\r
 \r
 void CXkeymacsDll::ToggleKeyboardHookState()\r
@@ -333,9 +324,14 @@ void CXkeymacsDll::ToggleKeyboardHookState()
        ShowKeyboardHookState();\r
 }\r
 \r
+BOOL CXkeymacsDll::IsKeyboardHook()\r
+{\r
+       return m_bHook;\r
+}\r
+\r
 void CXkeymacsDll::ShowKeyboardHookState()\r
 {\r
-       ICONMSG msg = {MAIN_ICON,};\r
+       IconMsg msg = {MAIN_ICON,};\r
        if (m_bHook) {\r
                if (CCommands::IsTemporarilyDisableXKeymacs()) {\r
                        msg.nState = STATUS_DISABLE_TMP;\r
@@ -357,41 +353,38 @@ void CXkeymacsDll::ShowKeyboardHookState()
        DoSetCursor();\r
 }\r
 \r
-BOOL CXkeymacsDll::IsKeyboardHook()\r
-{\r
-       return m_bHook;\r
-}\r
-\r
 LRESULT CALLBACK CXkeymacsDll::CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)\r
 {\r
-       if (nCode < 0)\r
-               return CallNextHookEx(m_hHookCallWnd, nCode, wParam, lParam);\r
-       const CWPSTRUCT *cwps = reinterpret_cast<CWPSTRUCT *>(lParam);\r
-       switch (cwps->message) {\r
-       case WM_IME_STARTCOMPOSITION:\r
-               InitKeyboardProc(TRUE);\r
-               break;\r
-       case WM_IME_ENDCOMPOSITION:\r
-               InitKeyboardProc(FALSE);\r
-               break;\r
-       case WM_SETFOCUS:\r
-               if (cwps->hwnd == GetForegroundWindow()) {\r
-                       InitKeyboardProc(FALSE);\r
-                       ShowKeyboardHookState();\r
-               }\r
-               break;\r
-       case WM_NCACTIVATE:\r
-               if (cwps->wParam && cwps->hwnd == GetForegroundWindow()) {\r
+       SetKeyboardHook();\r
+       if (nCode >= 0) {\r
+               const CWPSTRUCT *cwps = reinterpret_cast<CWPSTRUCT *>(lParam);\r
+               switch (cwps->message) {\r
+               case WM_IME_STARTCOMPOSITION:\r
+                       InitKeyboardProc(TRUE);\r
+                       break;\r
+               case WM_IME_ENDCOMPOSITION:\r
                        InitKeyboardProc(FALSE);\r
-                       ShowKeyboardHookState();\r
+                       break;\r
+               case WM_SETFOCUS:\r
+                       if (cwps->hwnd == GetForegroundWindow()) {\r
+                               InitKeyboardProc(FALSE);\r
+                               ShowKeyboardHookState();\r
+                       }\r
+                       break;\r
+               case WM_NCACTIVATE:\r
+                       if (cwps->wParam && cwps->hwnd == GetForegroundWindow()) {\r
+                               InitKeyboardProc(FALSE);\r
+                               ShowKeyboardHookState();\r
+                       }\r
+                       break;\r
                }\r
-               break;\r
        }\r
-       return CallNextHookEx(m_hHookCallWnd, nCode, wParam, lParam);\r
+       return CallNextHookEx(NULL, nCode, wParam, lParam);\r
 }\r
 \r
 LRESULT CALLBACK CXkeymacsDll::CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)\r
 {\r
+       SetKeyboardHook();\r
        if (nCode >= 0) {\r
                const CWPRETSTRUCT *cwprets = reinterpret_cast<CWPRETSTRUCT *>(lParam);\r
                switch (cwprets->message) {\r
@@ -404,26 +397,24 @@ LRESULT CALLBACK CXkeymacsDll::CallWndRetProc(int nCode, WPARAM wParam, LPARAM l
                        break;\r
                }\r
        }\r
-       return CallNextHookEx(m_hHookCallWndRet, nCode, wParam, lParam);\r
+       return CallNextHookEx(NULL, nCode, wParam, lParam);\r
 }\r
 \r
 LRESULT CALLBACK CXkeymacsDll::GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)\r
 {\r
-       const MSG *msg = reinterpret_cast<MSG *>(lParam);\r
-       if (msg->message == g_ImeManipulationMessage) {\r
-               if (wParam)\r
-                       CCommands::DoSetInputMethodOpenStatus(static_cast<INPUT_METHOD_OPEN_STATUS>(msg->wParam), static_cast<BOOL>(msg->lParam));\r
-               return 1;\r
-       }\r
-       switch (msg->message) {\r
-       case WM_IME_STARTCOMPOSITION:\r
-               InitKeyboardProc(TRUE);\r
-               break;\r
-       case WM_IME_ENDCOMPOSITION:\r
-               InitKeyboardProc(FALSE);\r
-               break;\r
+       SetKeyboardHook();\r
+       if (nCode >= 0) {\r
+               const MSG *msg = reinterpret_cast<MSG *>(lParam);\r
+               switch (msg->message) {\r
+               case WM_IME_STARTCOMPOSITION:\r
+                       InitKeyboardProc(TRUE);\r
+                       break;\r
+               case WM_IME_ENDCOMPOSITION:\r
+                       InitKeyboardProc(FALSE);\r
+                       break;\r
+               }\r
        }\r
-       return CallNextHookEx(m_hHookGetMessage, nCode, wParam, lParam);\r
+       return CallNextHookEx(NULL, nCode, wParam, lParam);\r
 }\r
 \r
 LRESULT CALLBACK CXkeymacsDll::ShellProc(int nCode, WPARAM wParam, LPARAM lParam)\r
@@ -436,134 +427,7 @@ LRESULT CALLBACK CXkeymacsDll::ShellProc(int nCode, WPARAM wParam, LPARAM lParam
                        ShowKeyboardHookState();\r
                }\r
        }\r
-       return CallNextHookEx( m_hHookShell, nCode, wParam, lParam );\r
-}\r
-\r
-UINT CXkeymacsDll::GetModifierState(BOOL bPhysicalKey)\r
-{\r
-       UINT result = 0;\r
-       if (IsDown(VK_SHIFT, bPhysicalKey))\r
-               result |= SHIFT;\r
-       if (IsDown(VK_CONTROL, bPhysicalKey))\r
-               result |= CONTROL;\r
-       if (IsDown(VK_MENU, bPhysicalKey))\r
-               result |= META;\r
-       return result;\r
-}\r
-\r
-void CXkeymacsDll::SetModifierState(const UINT after, const UINT before)\r
-{\r
-       if (after & SHIFT && !(before & SHIFT))\r
-               DepressKey(VK_SHIFT);\r
-       else if (!(after & SHIFT) && before & SHIFT)\r
-               ReleaseKey(VK_SHIFT);\r
-\r
-       if (after & CONTROL && !(before & CONTROL)) {\r
-               UpdateKeyboardState(VK_CONTROL, 1);\r
-               DepressKey(VK_CONTROL);\r
-       } else if (!(after & CONTROL) && before & CONTROL) {\r
-               ReleaseKey(VK_CONTROL);\r
-               UpdateKeyboardState(VK_CONTROL, 0);\r
-       }\r
-\r
-       const BOOL bHookApp = CUtils::IsVisualCpp() || CUtils::IsFirefox() || CUtils::IsVisualStudio() || CUtils::IsInternetExplorer();\r
-       if (after & META && !(before & META)) {\r
-               if (bHookApp)\r
-                       m_nHookAltRelease |= HOOK_ALT_LATER;\r
-               DepressKey(VK_MENU);\r
-       } else if (!(after & META) && before & META) {\r
-               if (bHookApp)\r
-                       ++m_nHookAltRelease;\r
-               ReleaseKey(VK_MENU);\r
-       }\r
-}\r
-\r
-BOOL CXkeymacsDll::UpdateKeyboardState(BYTE bVk, BYTE bState)\r
-{\r
-       BYTE ks[256] = {'\0'};\r
-       if (!GetKeyboardState(ks))\r
-               return FALSE;\r
-       ks[bVk] = bState;\r
-       return SetKeyboardState(ks);\r
-}\r
-\r
-BOOL CXkeymacsDll::IsDown(BYTE bVk, BOOL bPhysicalKey)\r
-{\r
-       return bPhysicalKey ? GetAsyncKeyState(bVk) < 0 : GetKeyState(bVk) < 0;\r
-}\r
-\r
-// Do keybd_event\r
-void CXkeymacsDll::DoKeybd_event(BYTE bVk, DWORD dwFlags)\r
-{\r
-       // Set KEYEVENTF_EXTENDEDKEY if needed\r
-       switch (bVk) {\r
-       case VK_CONTROL:\r
-               if (m_bRightControl)\r
-                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
-               break;\r
-\r
-       case VK_MENU:\r
-               if (m_bRightAlt)\r
-                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
-               break;\r
-\r
-       case VK_SHIFT:\r
-               if (m_bRightShift) {\r
-                       if (CUtils::IsXPorLater())\r
-                               bVk = VK_RSHIFT;\r
-                       else\r
-                               dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
-               }\r
-               break;\r
-       case VK_PAUSE:\r
-               if (IsDown(VK_CONTROL, FALSE)) // Break\r
-                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
-               break;\r
-       case VK_INSERT:\r
-       case VK_DELETE:\r
-       case VK_HOME:\r
-       case VK_END:\r
-       case VK_NEXT:\r
-       case VK_PRIOR:\r
-       case VK_UP:\r
-       case VK_DOWN:\r
-       case VK_RIGHT:\r
-       case VK_LEFT:\r
-       case VK_NUMLOCK:\r
-       case VK_PRINT:\r
-               dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
-               break;\r
-       }\r
-//     CUtils::Log(_T("b: %x, %x, %x, %#hx, %#hx"), bVk, dwFlags, GetMessageExtraInfo(), GetKeyState(bVk), GetAsyncKeyState(bVk));\r
-       keybd_event(bVk, 0, dwFlags, GetMessageExtraInfo());\r
-//     CUtils::Log(_T("a: %x, %x, %x, %#hx, %#hx"), bVk, dwFlags, GetMessageExtraInfo(), GetKeyState(bVk), GetAsyncKeyState(bVk));\r
-}\r
-\r
-// the key is being depressed\r
-void CXkeymacsDll::DepressKey(BYTE bVk, BOOL bOriginal)        // bVk is virtual-key code, MSDN said\r
-{\r
-       if (bOriginal) {\r
-//             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
-               SetOriginal(GetModifierState(), bVk);\r
-       }\r
-       DoKeybd_event(bVk, 0);\r
-}\r
-\r
-// the key is being released\r
-void CXkeymacsDll::ReleaseKey(BYTE bVk)        // bVk is virtual-key code, MSDN said\r
-{\r
-       DoKeybd_event(bVk, KEYEVENTF_KEYUP);\r
-}\r
-\r
-// bVk down, bVk up\r
-void CXkeymacsDll::Kdu(BYTE bVk, DWORD n, BOOL bOriginal)\r
-{\r
-       while (n--) {\r
-               DepressKey(bVk, bOriginal);\r
-               ReleaseKey(bVk);\r
-       }\r
+       return CallNextHookEx(NULL, nCode, wParam, lParam);\r
 }\r
 \r
 void CXkeymacsDll::InitKeyboardProc(BOOL bImeComposition)\r
@@ -594,7 +458,7 @@ void CXkeymacsDll::InitKeyboardProc(BOOL bImeComposition)
                // Use Dialog Setting\r
                m_nAppID = GetAppID(_T("Dialog"), m_nAppID);\r
 \r
-       ICONMSG msg[3] = {\r
+       IconMsg msg[3] = {\r
                {CX_ICON, OFF_ICON, ""},\r
                {MX_ICON, OFF_ICON, ""},\r
                {META_ICON, OFF_ICON, ""}\r
@@ -605,7 +469,7 @@ void CXkeymacsDll::InitKeyboardProc(BOOL bImeComposition)
        CCommands::Reset();\r
 }\r
 \r
-int CXkeymacsDll::GetAppID(const LPCSTR szName, const int fallback)\r
+int CXkeymacsDll::GetAppID(LPCSTR szName, int fallback)\r
 {\r
        for (int i = 0; i < MAX_APP; ++i)\r
                if (!_tcsicmp(m_Config.szSpecialApp[i], szName))\r
@@ -616,8 +480,8 @@ int CXkeymacsDll::GetAppID(const LPCSTR szName, const int fallback)
 LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)\r
 {\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
+       const bool bRelease = (HIWORD(lParam) & KF_UP) != 0;\r
+       const bool bExtended = (HIWORD(lParam) & KF_EXTENDED) != 0;\r
 \r
        static BOOL bLocked = FALSE;\r
        static const BYTE RECURSIVE_KEY = 0x07;\r
@@ -625,14 +489,14 @@ 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, nOrigKey, lParam, IsDll64, Is64ProcessHwnd(GetForegroundWindow()));\r
+//     CUtils::Log(_T("nCode = %#x, nKey = %#x, lParam = %#x"), nCode, nOrigKey, lParam);\r
 \r
-       if (Is64ProcessHwnd(GetForegroundWindow()) != IsDll64 || CUtils::IsXkeymacs() ||\r
+       if (!m_bEnableKeyboardHook || CUtils::IsXkeymacs() ||\r
                        nCode < 0 || nCode == HC_NOREMOVE)\r
-               return CallNextHookEx(g_hHookKeyboard, nCode, wParam, lParam);\r
+               return CallNextHookEx(NULL, nCode, wParam, lParam);\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
+//             (HIWORD(lParam) & KF_EXTENDED) ? 1 : 0, (HIWORD(lParam) & KF_UP) ? 1 : 0, (HIWORD(lParam) & KF_REPEAT) ? 1 : 0,\r
 //             GetKeyState(nOrigKey), GetAsyncKeyState(nOrigKey));\r
 \r
        if (nOrigKey == RECURSIVE_KEY) {\r
@@ -718,24 +582,25 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                nType &= ~CONTROLX;\r
        }\r
        // Ignore undefined Meta Ctrl+?\r
-       if (CCommands::bM_() && nType & CONTROL && fCommand(nType) == NULL && nFunctionID < 0) {\r
-               if (m_Config.bIgnoreUndefinedMetaCtrl[m_nAppID]) {\r
-                       if (CheckOriginal(CONTROL, nKey))\r
-                               goto DO_NOTHING;\r
-                       CCommands::Reset(GOTO_HOOK);\r
-                       goto HOOK;\r
+       if (CCommands::bM_() && nType & CONTROL) {\r
+               if (fCommand(nType) == NULL && nFunctionID < 0) {\r
+                       if (m_Config.bIgnoreUndefinedMetaCtrl[m_nAppID]) {\r
+                               if (CheckOriginal(CONTROL, nKey))\r
+                                       goto DO_NOTHING;\r
+                               CCommands::Reset(GOTO_HOOK);\r
+                               goto HOOK;\r
+                       }\r
                        nType &= ~META;\r
                }\r
        }\r
 \r
-       int nVirtualCommandType = GetModifierState(FALSE);\r
+       int nVirtualType = GetModifierState(FALSE);\r
        if (nOrigKey == VK_CONTROL)\r
-               nVirtualCommandType &= ~CONTROL;\r
+               nVirtualType &= ~CONTROL;\r
        if (nOrigKey == VK_MENU)\r
-               nVirtualCommandType &= ~META;\r
-       if (CheckOriginal(nVirtualCommandType, nOrigKey)) {\r
+               nVirtualType &= ~META;\r
+       if (CheckOriginal(nVirtualType, nOrigKey))\r
                goto DO_NOTHING;\r
-       }\r
 \r
        int (*const fCommand)() = fCommand(nType);\r
        if (fCommand == CCommands::EnableOrDisableXKeymacs) {\r
@@ -902,25 +767,22 @@ RECURSIVE_COMMAND:
        case GOTO_HOOKX:\r
                bLocked = FALSE;\r
                goto HOOKX;\r
-               case GOTO_HOOK0_9:\r
+       case GOTO_HOOK0_9:\r
                bLocked = FALSE;\r
                goto HOOK0_9;\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
-       return CallNextHookEx(g_hHookKeyboard, nCode, wParam, lParam);\r
+       if (m_kbdMacro)\r
+               m_kbdMacro->Record(nKey, bRelease);\r
+       return CallNextHookEx(NULL, nCode, wParam, lParam);\r
 \r
 RECURSIVE:\r
        Kdu(RECURSIVE_KEY, 1, FALSE);\r
        goto HOOKX;\r
 HOOK:\r
-       CCommands::SetLastCommand(fCommand);\r
+       CCommands::SetLastCommand(fLastCommand);\r
 HOOK0_9:\r
 HOOKX:\r
        SetModifierIcons();\r
@@ -928,85 +790,214 @@ HOOK_RECURSIVE_KEY:
        return TRUE;\r
 }\r
 \r
+void CXkeymacsDll::CancelMarkWithShift(BYTE nKey, bool bRelease)\r
+{\r
+       static bool bShift;\r
+       if (nKey != VK_SHIFT)\r
+               goto exit;\r
+       BYTE bVk = 0;\r
+       do {\r
+               if (bVk == VK_SHIFT || VK_LSHIFT || VK_RSHIFT)\r
+                       continue;\r
+               if (IsDown(bVk, FALSE))\r
+                       goto exit;\r
+       } while (++bVk);\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
+int CXkeymacsDll::IsPassThrough(BYTE nKey)\r
+{\r
+       BYTE bVk = 0;\r
+       const BYTE *pnID = m_Config.nCommandID[m_nAppID][NONE]; \r
+       do {\r
+               if (IsDown(bVk) && Commands[pnID[bVk]].fCommand == CCommands::PassThrough) {\r
+                       if (bVk == nKey)\r
+                               return GOTO_HOOK;\r
+                       return GOTO_DO_NOTHING;\r
+               }\r
+       } while (++bVk);\r
+       return CONTINUE;\r
+}\r
+\r
+void CXkeymacsDll::InvokeM_x(LPCTSTR szPath)\r
+{\r
+//     CUtils::Log("M-x: szPath=_%s_", szPath);\r
+       int (*fCommand)() = NULL;\r
+       for (int i = 0; i < MAX_COMMAND; ++i)\r
+               if (_tcsicmp(szPath, Commands[i].szCommandName) == 0) {\r
+                       fCommand = Commands[i].fCommand;\r
+                       break;\r
+               }\r
+       if (fCommand) {\r
+//             CUtils::Log("M-x: Command: _%s_", Commands[i].szCommandName);\r
+               fCommand();\r
+       } else {\r
+//             CUtils::Log("M-x: Path: _%s_", szPath);\r
+               ShellExecute(NULL, NULL, szPath, NULL, NULL, SW_SHOWNORMAL);\r
+       }\r
+}\r
+\r
 void CXkeymacsDll::SetModifierIcons()\r
 {\r
-#define IconState(x) ((x) ? ON_ICON : OFF_ICON)\r
-       ICONMSG msg[6] = {\r
-               {MX_ICON, IconState(CCommands::bM_x()), ""},\r
-               {CX_ICON, IconState(CCommands::bC_x()), ""},\r
-               {META_ICON, IconState(CCommands::bM_()), ""},\r
-               {SHIFT_ICON, IconState(IsDown(VK_SHIFT, FALSE)), ""},\r
-               {CTRL_ICON, IconState(IsControl()), ""},\r
-               {ALT_ICON, IconState(IsDown(VK_MENU, FALSE)), ""}\r
+       IconMsg msg[6] = {\r
+               {MX_ICON, CCommands::bM_x(), ""},\r
+               {CX_ICON, CCommands::bC_x(), ""},\r
+               {META_ICON, CCommands::bM_(), ""},\r
+               {SHIFT_ICON, IsDown(VK_SHIFT, FALSE), ""},\r
+               {CTRL_ICON, IsControl(), ""},\r
+               {ALT_ICON, IsDown(VK_MENU, FALSE), ""}\r
        };\r
        _tcscpy_s(msg[0].szTip, m_M_xTip);\r
        SendIconMessage(msg, 6);\r
 }\r
 \r
-// Clear data of nAppID\r
-void CXkeymacsDll::Clear(int nAppID)\r
+void CXkeymacsDll::SetM_xTip(LPCTSTR szPath)\r
 {\r
-       if (0 <= nAppID && nAppID < MAX_APP) {\r
-               ZeroMemory(m_Config.szSpecialApp[nAppID], sizeof(m_Config.szSpecialApp[nAppID]));\r
-               ZeroMemory(m_Config.nCommandID[nAppID], sizeof(m_Config.nCommandID[nAppID]));\r
-               m_Config.nKillRingMax[nAppID] = 0;\r
-               m_Config.bUseDialogSetting[nAppID] = FALSE;\r
-               m_Config.nSettingStyle[nAppID] = 0;\r
-       } else {\r
-               ASSERT(0);\r
+       _tcscpy_s(m_M_xTip, "M-x LED");\r
+       if (szPath && _tcslen(szPath) < 128 - 5)\r
+               _stprintf_s(m_M_xTip, "M-x %s", szPath);\r
+}\r
+\r
+BOOL CXkeymacsDll::SendIconMessage(IconMsg *pMsg, DWORD num)\r
+{\r
+       DWORD ack, read;\r
+       return CallNamedPipe(ICON_PIPE, pMsg, sizeof(IconMsg) * num, &ack, sizeof(DWORD), &read, NMPWAIT_NOWAIT) && read == sizeof(DWORD);\r
+}\r
+\r
+void CXkeymacsDll::Kdu(BYTE bVk, DWORD n, BOOL bOriginal)\r
+{\r
+       while (n--) {\r
+               DepressKey(bVk, bOriginal);\r
+               ReleaseKey(bVk);\r
        }\r
 }\r
 \r
-BOOL CXkeymacsDll::IsValidKey(BYTE bVk)\r
+void CXkeymacsDll::DepressKey(BYTE bVk, BOOL bOriginal)        // bVk is virtual-key code, MSDN said\r
 {\r
-       if (bVk == 0xf0) {      // 0xf0: Eisu key. GetAsyncKeyState returns the wrong state of Eisu key.\r
-               return FALSE;\r
+       if (bOriginal) {\r
+//             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
+               SetOriginal(GetModifierState(), bVk);\r
        }\r
+       DoKeybd_event(bVk, 0);\r
+}\r
+\r
+void CXkeymacsDll::ReleaseKey(BYTE bVk)        // bVk is virtual-key code, MSDN said\r
+{\r
+       DoKeybd_event(bVk, KEYEVENTF_KEYUP);\r
+}\r
 \r
+void CXkeymacsDll::DoKeybd_event(BYTE bVk, DWORD dwFlags)\r
+{\r
        switch (bVk) {\r
        case VK_CONTROL:\r
+               if (m_bRightControl)\r
+                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+               break;\r
+\r
        case VK_MENU:\r
+               if (m_bRightAlt)\r
+                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+               break;\r
+\r
        case VK_SHIFT:\r
-               return FALSE;\r
-       default:\r
+               if (m_bRightShift)\r
+                       bVk = VK_RSHIFT;\r
+               break;\r
+       case VK_PAUSE:\r
+               if (IsDown(VK_CONTROL, FALSE)) // Break\r
+                       dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
+               break;\r
+       case VK_INSERT:\r
+       case VK_DELETE:\r
+       case VK_HOME:\r
+       case VK_END:\r
+       case VK_NEXT:\r
+       case VK_PRIOR:\r
+       case VK_UP:\r
+       case VK_DOWN:\r
+       case VK_RIGHT:\r
+       case VK_LEFT:\r
+       case VK_NUMLOCK:\r
+       case VK_PRINT:\r
+               dwFlags |= KEYEVENTF_EXTENDEDKEY;\r
                break;\r
        }\r
+//     CUtils::Log(_T("b: %x, %x, %x, %#hx, %#hx"), bVk, dwFlags, GetMessageExtraInfo(), GetKeyState(bVk), GetAsyncKeyState(bVk));\r
+       keybd_event(bVk, 0, dwFlags, GetMessageExtraInfo());\r
+//     CUtils::Log(_T("a: %x, %x, %x, %#hx, %#hx"), bVk, dwFlags, GetMessageExtraInfo(), GetKeyState(bVk), GetAsyncKeyState(bVk));\r
+}\r
 \r
-       return TRUE;\r
+void CXkeymacsDll::SetOriginal(UINT nType, BYTE bVk)\r
+{\r
+       m_nOriginal[nType & ~SHIFT][bVk]++;\r
 }\r
 \r
-BOOL CXkeymacsDll::IsDepressedModifier(int (__cdecl *Modifier)(void), BOOL bPhysicalKey)\r
+int CXkeymacsDll::CheckOriginal(UINT nType, BYTE bVk)\r
 {\r
-       BYTE bVk = 0;\r
-       do {\r
-               if (IsValidKey(bVk) && IsDown(bVk, bPhysicalKey) &&\r
-                               Commands[m_Config.nCommandID[m_nAppID][NONE][bVk]].fCommand == Modifier)\r
-                       return TRUE;\r
-       } while (++bVk);\r
-       return FALSE;\r
+       nType &= ~SHIFT;\r
+       if (m_nOriginal[nType][bVk])\r
+               return m_nOriginal[nType][bVk]--;\r
+       return 0;\r
 }\r
 \r
-void CXkeymacsDll::CancelMarkWithShift(BYTE nKey, bool bRelease)\r
+UINT CXkeymacsDll::GetModifierState(BOOL bPhysicalKey)\r
 {\r
-       static bool bShift;\r
-       if (nKey != VK_SHIFT)\r
-               goto exit;\r
-       BYTE bVk = 0;\r
-       do {\r
-               if (bVk == VK_SHIFT || VK_LSHIFT || VK_RSHIFT)\r
-                       continue;\r
-               if (IsDown(bVk, FALSE))\r
-                       goto exit;\r
-       } while (++bVk);\r
-       if (!bRelease) {\r
-               bShift = TRUE;\r
-               return;\r
+       UINT result = 0;\r
+       if (IsDown(VK_SHIFT, bPhysicalKey))\r
+               result |= SHIFT;\r
+       if (IsDown(VK_CONTROL, bPhysicalKey))\r
+               result |= CONTROL;\r
+       if (IsDown(VK_MENU, bPhysicalKey))\r
+               result |= META;\r
+       return result;\r
+}\r
+\r
+void CXkeymacsDll::SetModifierState(UINT after, UINT before)\r
+{\r
+       if (after & SHIFT && !(before & SHIFT))\r
+               DepressKey(VK_SHIFT);\r
+       else if (!(after & SHIFT) && before & SHIFT)\r
+               ReleaseKey(VK_SHIFT);\r
+\r
+       if (after & CONTROL && !(before & CONTROL)) {\r
+               UpdateKeyboardState(VK_CONTROL, 1);\r
+               DepressKey(VK_CONTROL);\r
+       } else if (!(after & CONTROL) && before & CONTROL) {\r
+               ReleaseKey(VK_CONTROL);\r
+               UpdateKeyboardState(VK_CONTROL, 0);\r
+       }\r
+\r
+       const BOOL bHookApp =\r
+               CUtils::IsVisualCpp() ||  CUtils::IsVisualStudio() ||\r
+               CUtils::IsInternetExplorer() || CUtils::IsFirefox() || CUtils::IsChrome();\r
+       if (after & META && !(before & META)) {\r
+               if (bHookApp)\r
+                       m_nHookAltRelease |= HOOK_ALT_LATER;\r
+               DepressKey(VK_MENU);\r
+       } else if (!(after & META) && before & META) {\r
+               if (bHookApp)\r
+                       ++m_nHookAltRelease;\r
+               ReleaseKey(VK_MENU);\r
        }\r
-       if (bShift)\r
-               CCommands::SetMark(FALSE);\r
-exit:\r
-       bShift = FALSE;\r
-       return;\r
+}\r
+\r
+BOOL CXkeymacsDll::UpdateKeyboardState(BYTE bVk, BYTE bState)\r
+{\r
+       BYTE ks[256] = {'\0'};\r
+       if (!GetKeyboardState(ks))\r
+               return FALSE;\r
+       ks[bVk] = bState;\r
+       return SetKeyboardState(ks);\r
 }\r
 \r
 BOOL CXkeymacsDll::IsControl()\r
@@ -1019,6 +1010,29 @@ BOOL CXkeymacsDll::IsMeta()
        return CCommands::bM_() || IsDepressedModifier(CCommands::MetaAlt);\r
 }\r
 \r
+BOOL CXkeymacsDll::IsDepressedModifier(int (__cdecl *Modifier)(void), BOOL bPhysicalKey)\r
+{\r
+       BYTE bVk = 0;\r
+       const BYTE *pnID = m_Config.nCommandID[m_nAppID][NONE];\r
+       do {\r
+               switch (bVk) {\r
+               case VK_SHIFT:\r
+               case VK_CONTROL:\r
+               case VK_MENU:\r
+               case 0xf0: // Eisu key. GetAsyncKeyState returns the wrong state of Eisu key.\r
+                       continue;\r
+               }\r
+               if (IsDown(bVk, bPhysicalKey) && Commands[pnID[bVk]].fCommand == Modifier)\r
+                       return TRUE;\r
+       } while (++bVk);\r
+       return FALSE;\r
+}\r
+\r
+BOOL CXkeymacsDll::IsDown(BYTE bVk, BOOL bPhysicalKey)\r
+{\r
+       return bPhysicalKey ? GetAsyncKeyState(bVk) < 0 : GetKeyState(bVk) < 0;\r
+}\r
+\r
 void CXkeymacsDll::AddKillRing(BOOL bNewData)\r
 {\r
        if (m_Config.nKillRingMax[m_nAppID] == 0) {\r
@@ -1098,19 +1112,6 @@ CClipboardSnap* CXkeymacsDll::GetKillRing(CClipboardSnap* pSnap, BOOL bForce)
        return pSnap->GetNext();\r
 }\r
 \r
-void CXkeymacsDll::SetOriginal(UINT nType, BYTE bVk)\r
-{\r
-       m_nOriginal[nType & ~SHIFT][bVk]++;\r
-}\r
-\r
-int CXkeymacsDll::CheckOriginal(UINT nType, BYTE bVk)\r
-{\r
-       nType &= ~SHIFT;\r
-       if (m_nOriginal[nType][bVk])\r
-               return m_nOriginal[nType][bVk]--;\r
-       return 0;\r
-}\r
-\r
 void CXkeymacsDll::IncreaseKillRingIndex(int nKillRing)\r
 {\r
        m_nKillRing += nKillRing;\r
@@ -1121,38 +1122,9 @@ BOOL CXkeymacsDll::GetEnableCUA()
        return m_Config.bEnableCUA[m_nAppID];\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
-{\r
-       m_bRecordingMacro = FALSE;\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.pop_back();\r
-       }\r
-}\r
-\r
-void CXkeymacsDll::CallMacro()\r
+BOOL CXkeymacsDll::Get326Compatible()\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 (m->lParam & BEING_RELEASED)\r
-                       ReleaseKey(static_cast<BYTE>(m->wParam));\r
-               else\r
-                       DepressKey(static_cast<BYTE>(m->wParam), m->bOriginal);\r
-       SetModifierState(before, 0);\r
+       return m_Config.b326Compatible[m_nAppID];\r
 }\r
 \r
 BOOL CXkeymacsDll::Is106Keyboard()\r
@@ -1160,20 +1132,9 @@ BOOL CXkeymacsDll::Is106Keyboard()
        return m_Config.b106Keyboard;\r
 }\r
 \r
-int CXkeymacsDll::IsPassThrough(BYTE nKey)\r
+void CXkeymacsDll::SetKbMacro(KbdMacro* kbdMacro)\r
 {\r
-       BYTE bVk = 0;\r
-       do {\r
-               if (IsDown(bVk)\r
-                && (Commands[m_Config.nCommandID[m_nAppID][NONE][bVk]].fCommand == CCommands::PassThrough)) {\r
-                       if (bVk == nKey) {\r
-                               return GOTO_HOOK;\r
-                       }\r
-\r
-                       return GOTO_DO_NOTHING;\r
-               }\r
-       } while (++bVk);\r
-       return CONTINUE;\r
+       m_kbdMacro = kbdMacro;\r
 }\r
 \r
 // call an original command which is defined in dot.xkeymacs\r
@@ -1483,11 +1444,7 @@ BOOL CXkeymacsDll::IsMatchWindowText(CString szWindowText)
        case IDS_WINDOW_TEXT_IGNORE:                                                    // *\r
                bIsMatchWindowText = TRUE;\r
                break;\r
-       default:\r
-               ASSERT(0);\r
-               break;\r
        }\r
-\r
 //     CUtils::Log(_T("IsMatchWindowText: %d, _%s_, _%s_"), bIsMatchWindowText, szCurrentWindowText, szWindowText);\r
        return bIsMatchWindowText;\r
 }\r
@@ -1528,46 +1485,6 @@ void CXkeymacsDll::SetCursorData(HCURSOR hEnable, HCURSOR hDisableTMP, HCURSOR h
 \r
 void CXkeymacsDll::DoSetCursor()\r
 {\r
-       if (m_bCursor && m_hCurrentCursor) {\r
+       if (m_bCursor && m_hCurrentCursor)\r
                ::SetCursor(m_hCurrentCursor);\r
-       }\r
-}\r
-\r
-BOOL CXkeymacsDll::Get326Compatible()\r
-{\r
-       return m_Config.b326Compatible[m_nAppID];\r
-}\r
-\r
-void CXkeymacsDll::InvokeM_x(const TCHAR *const szPath)\r
-{\r
-//     CUtils::Log("M-x: szPath=_%s_", szPath);\r
-       int (*fCommand)() = NULL;\r
-\r
-       for (int i = 0; i < MAX_COMMAND; ++i) {\r
-               if (_tcsicmp(szPath, Commands[i].szCommandName) == 0) {\r
-                       fCommand = Commands[i].fCommand;\r
-                       break;\r
-               }\r
-       }\r
-\r
-       if (fCommand) {\r
-//             CUtils::Log("M-x: Command: _%s_", Commands[i].szCommandName);\r
-               fCommand();\r
-       } else {\r
-//             CUtils::Log("M-x: Path: _%s_", szPath);\r
-               ShellExecute(NULL, NULL, szPath, NULL, NULL, SW_SHOWNORMAL);\r
-       }\r
-}\r
-\r
-void CXkeymacsDll::SetM_xTip(const TCHAR *const szPath)\r
-{\r
-       _tcscpy_s(m_M_xTip, "M-x LED");\r
-       if (szPath && _tcslen(szPath) < 128 - 5)\r
-               _stprintf_s(m_M_xTip, "M-x %s", szPath);\r
-}\r
-\r
-BOOL CXkeymacsDll::SendIconMessage(ICONMSG *pMsg, DWORD num)\r
-{\r
-       DWORD ack, read;\r
-       return CallNamedPipe(ICON_PIPE, pMsg, sizeof(ICONMSG) * num, &ack, sizeof(DWORD), &read, NMPWAIT_NOWAIT);\r
 }\r