OSDN Git Service

Add .vs/ to .gitignore
[xkeymacs/xkeymacs.git] / xkeymacsdll / TLS.cpp
1 #include "StdAfx.h"\r
2 #include "TLS.h"\r
3 \r
4 DWORD TLS::m_TlsIndex = TLS_OUT_OF_INDEXES;\r
5 \r
6 bool TLS::Alloc()\r
7 {\r
8         return (m_TlsIndex = TlsAlloc()) != TLS_OUT_OF_INDEXES;\r
9 }\r
10 \r
11 void TLS::Free()\r
12 {\r
13         FreeLocal();\r
14         if (m_TlsIndex != TLS_OUT_OF_INDEXES)\r
15                 TlsFree(m_TlsIndex);\r
16         m_TlsIndex = TLS_OUT_OF_INDEXES;\r
17 }\r
18 \r
19 TLS *TLS::AllocLocal()\r
20 {\r
21         if (m_TlsIndex == TLS_OUT_OF_INDEXES)\r
22                 return nullptr;\r
23         LPVOID data = TlsGetValue(m_TlsIndex);\r
24         if (!data) {\r
25                 data = LocalAlloc(LPTR, sizeof(TLS));\r
26                 if (data)\r
27                         TlsSetValue(m_TlsIndex, data);\r
28         }\r
29         return reinterpret_cast<TLS *>(data);\r
30 }\r
31 \r
32 void TLS::FreeLocal()\r
33 {\r
34         if (m_TlsIndex == TLS_OUT_OF_INDEXES)\r
35                 return;\r
36         LPVOID data = TlsGetValue(m_TlsIndex);\r
37         if (!data)\r
38                 return;\r
39         TSFHandler *tmp = reinterpret_cast<TLS *>(data)->m_TSFHandler;\r
40         if (tmp)\r
41                 tmp->Release();\r
42         LocalFree(data);\r
43         TlsSetValue(m_TlsIndex, nullptr);\r
44 }\r
45 \r
46 HHOOK TLS::GetKeyboardHook()\r
47 {\r
48         TLS *tls = AllocLocal();\r
49         return tls ? tls->m_KeyboardHook : nullptr;\r
50 }\r
51 \r
52 void TLS::PutKeyboardHook(HHOOK hook)\r
53 {\r
54         TLS *tls = AllocLocal();\r
55         if (tls)\r
56                 tls->m_KeyboardHook = hook;\r
57 }\r
58 \r
59 TSFHandler *TLS::GetTSFHandler()\r
60 {\r
61         TLS *tls = AllocLocal();\r
62         return tls ? tls->m_TSFHandler : nullptr;\r
63 }\r
64 \r
65 void TLS::PutTSFHandler(TSFHandler *tsf)\r
66 {\r
67         TLS *tls = AllocLocal();\r
68         if (tls)\r
69                 tls->m_TSFHandler = tsf;\r
70 }