4 #include "../driver.h"
\r
7 #pragma comment(lib, "SynCom.lib")
\r
8 #endif /* STS4MAYU */
\r
10 #include "Touchpad.h"
\r
11 #pragma comment(lib, "TouchPad.lib")
\r
12 #endif /* CTS4MAYU */
\r
14 static HANDLE s_instance;
\r
15 static UINT s_engineThreadId;
\r
18 static ISynAPI *s_synAPI;
\r
19 static ISynDevice *s_synDevice;
\r
20 static HANDLE s_notifyEvent;
\r
22 static int s_terminated;
\r
23 static HANDLE s_loopThread;
\r
24 static unsigned int s_loopThreadId;
\r
25 #endif /* STS4MAYU */
\r
27 static HTOUCHPAD s_hTP[16];
\r
28 static int s_devNum;
\r
29 #endif /* CTS4MAYU */
\r
31 static void changeTouch(int i_isBreak)
\r
33 PostThreadMessage(s_engineThreadId, WM_APP + 201, i_isBreak ? 0 : 1, 0);
\r
36 static void postEvent(WPARAM wParam, LPARAM lParam)
\r
38 PostThreadMessage(s_engineThreadId, WM_APP + 201, wParam, lParam);
\r
42 static unsigned int WINAPI loop(void *dummy)
\r
48 while (s_terminated == 0) {
\r
49 WaitForSingleObject(s_notifyEvent, INFINITE);
\r
57 result = s_synAPI->GetEventParameter(&value);
\r
58 if (result != SYN_OK) {
\r
61 if (value == SE_Configuration_Changed) {
\r
62 s_synDevice->SetEventNotification(s_notifyEvent);
\r
67 result = s_synDevice->LoadPacket(packet);
\r
68 if (result == SYNE_FAIL) {
\r
73 if (!(packet.FingerState() & SF_FingerTouch)) {
\r
78 if (packet.FingerState() & SF_FingerTouch) {
\r
88 #endif /* STS4MAYU */
\r
90 static void CALLBACK TouchpadFunc(HTOUCHPAD hTP, LPFEEDHDR lpFeedHdr, LPARAM i_lParam)
\r
92 LPRAWFEED lpRawFeed;
\r
93 static int isTouched = 0;
\r
94 static WPARAM s_wParam;
\r
95 static LPARAM s_lParam;
\r
99 lpRawFeed = (LPRAWFEED)(lpFeedHdr + 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
110 if (!lpRawFeed->wPressure) {
\r
115 if (lpRawFeed->wPressure) {
\r
121 EnableWindowsCursor(hTP, TRUE);
\r
124 static BOOL CALLBACK DevicesFunc(LPGENERICDEVICE device, LPARAM lParam)
\r
126 HTOUCHPAD hTP = NULL;
\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
136 #endif /* CTS4MAYU */
\r
138 bool WINAPI ts4mayuInit(UINT i_engineThreadId)
\r
140 s_engineThreadId = i_engineThreadId;
\r
147 s_synDevice = NULL;
\r
148 s_notifyEvent = NULL;
\r
152 result = SynCreateAPI(&s_synAPI);
\r
153 if (result != SYN_OK) {
\r
154 goto error_on_init;
\r
158 result = s_synAPI->FindDevice(SE_ConnectionAny, SE_DeviceTouchPad, &hdl);
\r
159 if (result != SYN_OK) {
\r
160 goto error_on_init;
\r
163 result = s_synAPI->CreateDevice(hdl, &s_synDevice);
\r
164 if (result != SYN_OK) {
\r
165 goto error_on_init;
\r
168 s_notifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
\r
169 if (s_notifyEvent == NULL) {
\r
170 goto error_on_init;
\r
173 s_synAPI->SetEventNotification(s_notifyEvent);
\r
174 s_synDevice->SetEventNotification(s_notifyEvent);
\r
177 (HANDLE)_beginthreadex(NULL, 0, loop, NULL, 0, &s_loopThreadId);
\r
178 if (s_loopThread == 0) {
\r
179 goto error_on_init;
\r
185 if (s_notifyEvent) {
\r
186 CloseHandle(s_notifyEvent);
\r
190 s_synDevice->Release();
\r
194 s_synAPI->Release();
\r
198 #endif /* STS4MAYU */
\r
200 // enumerate devices
\r
201 EnumDevices(DevicesFunc, NULL);
\r
203 #endif /* CTS4MAYU */
\r
207 bool WINAPI ts4mayuTerm()
\r
212 if (s_loopThread) {
\r
213 SetEvent(s_notifyEvent);
\r
214 WaitForSingleObject(s_loopThread, INFINITE);
\r
215 CloseHandle(s_loopThread);
\r
218 if (s_notifyEvent) {
\r
219 CloseHandle(s_notifyEvent);
\r
223 s_synDevice->Release();
\r
227 s_synAPI->Release();
\r
231 #endif /* STS4MAYU */
\r
233 for (int i = 0; i < s_devNum; i++) {
\r
234 StopFeed(s_hTP[i]);
\r
237 #endif /* CTS4MAYU */
\r
241 BOOL WINAPI DllMain(HANDLE module, DWORD reason, LPVOID reserve)
\r
243 s_instance = (HINSTANCE)module;
\r