OSDN Git Service

Add a new class to handle the TLS stuff
[xkeymacs/xkeymacs.git] / xkeymacsdll / xkeymacsdll.cpp
index f49c0db..d8da65e 100644 (file)
@@ -5,6 +5,7 @@
 #include "Utils.h"\r
 #include "Commands.h"\r
 #include "CmdTable.h"\r
+#include "TLS.h"\r
 #include "../xkeymacs/resource.h"\r
 #include <math.h>\r
 #include <Imm.h>\r
@@ -19,13 +20,11 @@ static char THIS_FILE[] = __FILE__;
 static AFX_EXTENSION_MODULE XkeymacsdllDLL = { NULL, NULL };\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
@@ -58,27 +57,20 @@ 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
+               if (!TLS::Alloc())\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
+               TLS::Free();\r
                break;\r
        case DLL_THREAD_DETACH:\r
                CXkeymacsDll::ReleaseKeyboardHook();\r
-               if ((lpData = TlsGetValue(g_TlsIndex)) != NULL)\r
-                       LocalFree(lpData);\r
+               TLS::FreeLocal();\r
                break;\r
        }\r
        return 1;   // ok\r
@@ -164,17 +156,8 @@ void CXkeymacsDll::SetHooks()
 \r
 void CXkeymacsDll::SetKeyboardHook(DWORD threadId)\r
 {\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, KeyboardProc, g_hDllInst, threadId ? threadId : GetCurrentThreadId());\r
+       if (!TLS::GetKeyboardHook())\r
+               TLS::PutKeyboardHook(SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hDllInst, threadId ? threadId : GetCurrentThreadId()));\r
 }\r
 \r
 inline void unhook(HHOOK &hh)\r
@@ -201,9 +184,10 @@ void CXkeymacsDll::ReleaseHooks()
 \r
 void CXkeymacsDll::ReleaseKeyboardHook()\r
 {\r
-       HHOOK *phHook = reinterpret_cast<HHOOK *>(TlsGetValue(g_TlsIndex));\r
-       if (phHook)\r
-               unhook(*phHook);\r
+       HHOOK hook = TLS::GetKeyboardHook();\r
+       if (!hook)\r
+               return;\r
+       UnhookWindowsHookEx(hook);\r
 }\r
 \r
 void CXkeymacsDll::SetHookStateDirect(bool enable)\r