1616#pragma comment(lib, "hid.lib")
1717#pragma comment(lib, "setupapi.lib")
1818#pragma comment(lib, "winusb.lib")
19+ #pragma comment(lib, "winmm.lib")
1920
2021
2122// Global variables...
@@ -24,6 +25,8 @@ VMulti *vmulti;
2425ScreenMapper *mapper;
2526thread *tabletThread;
2627chrono::high_resolution_clock::time_point timeBegin = chrono::high_resolution_clock::now();
28+ chrono::high_resolution_clock::time_point lastMovement = chrono::high_resolution_clock::now();
29+ Vector2D prevPos;
2730
2831//
2932// Init console parameters
@@ -212,7 +215,9 @@ void RunTabletThread() {
212215//
213216// Tablet filter timer callback
214217//
215- VOID CALLBACK FilterTimerCallback (_In_ PVOID lpParameter, _In_ BOOLEAN TimerOrWaitFired) {
218+
219+ static VOID CALLBACK FilterTimerCallback (UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD dw1, DWORD dw2)
220+ {
216221 Vector2D position, position_prev;
217222 double z;
218223 TabletFilter *filter;
@@ -225,6 +230,18 @@ VOID CALLBACK FilterTimerCallback(_In_ PVOID lpParameter, _In_ BOOLEAN TimerOrWa
225230 // For debug
226231 tablet->filterTimed [0 ]->GetPosition (&position_prev);
227232
233+ // Detect absence of movement
234+ double noMovement = 0.0 ;
235+ if (position.Distance (prevPos) > 0.000001 )
236+ {
237+ lastMovement = timeNow;
238+ prevPos = position;
239+ }
240+ else
241+ {
242+ noMovement = (timeNow - lastMovement).count () / 1000000.0 ;
243+ }
244+
228245 // Loop through filters
229246 for (int filterIndex = 0 ; filterIndex < tablet->filterTimedCount ; filterIndex++) {
230247
@@ -234,6 +251,13 @@ VOID CALLBACK FilterTimerCallback(_In_ PVOID lpParameter, _In_ BOOLEAN TimerOrWa
234251 // Filter enabled?
235252 if (!filter->isEnabled ) return ;
236253
254+
255+ if (noMovement > 35 )
256+ {
257+ filter->Reset (position);
258+ return ;
259+ }
260+
237261 // Set filter targets
238262 filter->SetTarget (position, z);
239263 // filter->z = tablet->state.z;
0 commit comments