OSDN Git Service

collect some files' permissions
[yamy/yamy.git] / ts4mayu / ts4mayu.cpp
1 #include <windows.h>\r
2 #include <process.h>\r
3 #include <tchar.h>\r
4 #include "../driver.h"\r
5 #ifdef STS4MAYU\r
6 #include "SynKit.h"\r
7 #pragma comment(lib, "SynCom.lib")\r
8 #endif /* STS4MAYU */\r
9 #ifdef CTS4MAYU\r
10 #include "Touchpad.h"\r
11 #pragma comment(lib, "TouchPad.lib")\r
12 #endif /* CTS4MAYU */\r
13 \r
14 static HANDLE s_instance;\r
15 static UINT s_engineThreadId;\r
16 \r
17 #ifdef STS4MAYU\r
18 static ISynAPI *s_synAPI;\r
19 static ISynDevice *s_synDevice;\r
20 static HANDLE s_notifyEvent;\r
21 \r
22 static int s_terminated;\r
23 static HANDLE s_loopThread;\r
24 static unsigned int s_loopThreadId;\r
25 #endif /* STS4MAYU */\r
26 #ifdef CTS4MAYU\r
27 static HTOUCHPAD s_hTP[16];\r
28 static int s_devNum;\r
29 #endif /* CTS4MAYU */\r
30 \r
31 static void changeTouch(int i_isBreak)\r
32 {\r
33   PostThreadMessage(s_engineThreadId, WM_APP + 201, i_isBreak ? 0 : 1, 0);\r
34 }\r
35 \r
36 static void postEvent(WPARAM wParam, LPARAM lParam)\r
37 {\r
38   PostThreadMessage(s_engineThreadId, WM_APP + 201, wParam, lParam);\r
39 }\r
40 \r
41 #ifdef STS4MAYU\r
42 static unsigned int WINAPI loop(void *dummy)\r
43 {\r
44   HRESULT result;\r
45   SynPacket packet;\r
46   int isTouched = 0;\r
47 \r
48   while (s_terminated == 0) {\r
49     WaitForSingleObject(s_notifyEvent, INFINITE);\r
50     if (s_terminated) {\r
51       break;\r
52     }\r
53 \r
54     for (;;) {\r
55       long value;\r
56 \r
57       result = s_synAPI->GetEventParameter(&value);\r
58       if (result != SYN_OK) {\r
59         break;\r
60       }\r
61       if (value == SE_Configuration_Changed) {\r
62         s_synDevice->SetEventNotification(s_notifyEvent);\r
63       }\r
64     }\r
65 \r
66     for (;;) {\r
67       result = s_synDevice->LoadPacket(packet);\r
68       if (result == SYNE_FAIL) {\r
69         break;\r
70       }\r
71 \r
72       if (isTouched) {\r
73         if (!(packet.FingerState() & SF_FingerTouch)) {\r
74           changeTouch(1);\r
75           isTouched = 0;\r
76         }\r
77       } else {\r
78         if (packet.FingerState() & SF_FingerTouch) {\r
79           changeTouch(0);\r
80           isTouched = 1;\r
81         }\r
82       }\r
83     }\r
84   }\r
85   _endthreadex(0);\r
86   return 0;\r
87 }\r
88 #endif /* STS4MAYU */\r
89 #ifdef CTS4MAYU\r
90 static void CALLBACK TouchpadFunc(HTOUCHPAD hTP, LPFEEDHDR lpFeedHdr, LPARAM i_lParam)\r
91 {\r
92         LPRAWFEED lpRawFeed;\r
93         static int isTouched = 0;\r
94         static WPARAM s_wParam;\r
95         static LPARAM s_lParam;\r
96         WPARAM wParam;\r
97         LPARAM lParam;\r
98 \r
99         lpRawFeed = (LPRAWFEED)(lpFeedHdr + 1);\r
100 #if 1\r
101         wParam = lpRawFeed->wPressure;\r
102         lParam = lpRawFeed->y << 16 | lpRawFeed->x;\r
103         if (wParam != s_wParam || lParam != s_lParam) {\r
104           postEvent(wParam, lParam);\r
105           s_wParam = wParam;\r
106           s_lParam = lParam;\r
107         }\r
108 #else\r
109         if (isTouched) {\r
110           if (!lpRawFeed->wPressure) {\r
111             changeTouch(1);\r
112             isTouched = 0;\r
113           }\r
114         } else {\r
115           if (lpRawFeed->wPressure) {\r
116             changeTouch(0);\r
117             isTouched = 1;\r
118           }\r
119         }\r
120 #endif\r
121         EnableWindowsCursor(hTP, TRUE);\r
122 }\r
123 \r
124 static BOOL CALLBACK DevicesFunc(LPGENERICDEVICE device, LPARAM lParam)\r
125 {\r
126         HTOUCHPAD hTP = NULL;\r
127         BOOL ret = FALSE;\r
128 \r
129         s_hTP[s_devNum] = GetPad(device->devicePort);\r
130         CreateCallback(s_hTP[s_devNum], TouchpadFunc,\r
131                        TPF_RAW | TPF_POSTMESSAGE, NULL);\r
132         StartFeed(s_hTP[s_devNum]);\r
133         ++s_devNum;\r
134         return TRUE;\r
135 }\r
136 #endif /* CTS4MAYU */\r
137 \r
138 bool WINAPI ts4mayuInit(UINT i_engineThreadId)\r
139 {\r
140   s_engineThreadId = i_engineThreadId;\r
141 \r
142 #ifdef STS4MAYU\r
143   HRESULT result;\r
144   long hdl;\r
145 \r
146   s_synAPI = NULL;\r
147   s_synDevice = NULL;\r
148   s_notifyEvent = NULL;\r
149 \r
150   s_terminated = 0;\r
151 \r
152   result = SynCreateAPI(&s_synAPI);\r
153   if (result != SYN_OK) {\r
154     goto error_on_init;\r
155   }\r
156 \r
157   hdl = -1;\r
158   result = s_synAPI->FindDevice(SE_ConnectionAny, SE_DeviceTouchPad, &hdl);\r
159   if (result != SYN_OK) {\r
160     goto error_on_init;\r
161   }\r
162 \r
163   result = s_synAPI->CreateDevice(hdl, &s_synDevice);\r
164   if (result != SYN_OK) {\r
165     goto error_on_init;\r
166   }\r
167 \r
168   s_notifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);\r
169   if (s_notifyEvent == NULL) {\r
170     goto error_on_init;\r
171   }\r
172 \r
173   s_synAPI->SetEventNotification(s_notifyEvent);\r
174   s_synDevice->SetEventNotification(s_notifyEvent);\r
175 \r
176   s_loopThread =\r
177     (HANDLE)_beginthreadex(NULL, 0, loop, NULL, 0, &s_loopThreadId);\r
178   if (s_loopThread == 0) {\r
179     goto error_on_init;\r
180   }\r
181 \r
182   return true;\r
183 \r
184 error_on_init:\r
185   if (s_notifyEvent) {\r
186     CloseHandle(s_notifyEvent);\r
187   }\r
188 \r
189   if (s_synDevice) {\r
190     s_synDevice->Release();\r
191   }\r
192 \r
193   if (s_synAPI) {\r
194     s_synAPI->Release();\r
195   }\r
196 \r
197   return false;\r
198 #endif /* STS4MAYU */\r
199 #ifdef CTS4MAYU\r
200   // enumerate devices\r
201   EnumDevices(DevicesFunc, NULL);\r
202   return true;\r
203 #endif /* CTS4MAYU */\r
204 }\r
205 \r
206 \r
207 bool WINAPI ts4mayuTerm()\r
208 {\r
209 #ifdef STS4MAYU\r
210   s_terminated = 1;\r
211 \r
212   if (s_loopThread) {\r
213     SetEvent(s_notifyEvent);\r
214     WaitForSingleObject(s_loopThread, INFINITE);\r
215     CloseHandle(s_loopThread);\r
216   }\r
217 \r
218   if (s_notifyEvent) {\r
219     CloseHandle(s_notifyEvent);\r
220   }\r
221 \r
222   if (s_synDevice) {\r
223     s_synDevice->Release();\r
224   }\r
225 \r
226   if (s_synAPI) {\r
227     s_synAPI->Release();\r
228   }\r
229 \r
230   return true;\r
231 #endif /* STS4MAYU */\r
232 #ifdef CTS4MAYU\r
233   for (int i = 0; i < s_devNum; i++) {\r
234     StopFeed(s_hTP[i]);\r
235   }\r
236   return false;\r
237 #endif /* CTS4MAYU */\r
238 }\r
239 \r
240 \r
241 BOOL WINAPI DllMain(HANDLE module, DWORD reason, LPVOID reserve)\r
242 {\r
243     s_instance = (HINSTANCE)module;\r
244 \r
245     return TRUE;\r
246 }\r