+//
+// Wakeup any thread/process waiting on idle input.
+//
+VOID FASTCALL
+IdlePing(VOID)
+{
+ PPROCESSINFO ppi = PsGetCurrentProcessWin32Process();
+ PUSER_MESSAGE_QUEUE ForegroundQueue;
+ PTHREADINFO pti, ptiForeground = NULL;
+
+ ForegroundQueue = IntGetFocusMessageQueue();
+
+ if (ForegroundQueue)
+ ptiForeground = ForegroundQueue->Thread->Tcb.Win32Thread;
+
+ pti = PsGetCurrentThreadWin32Thread();
+
+ if ( pti && pti->pDeskInfo && pti == ptiForeground )
+ {
+ if ( pti->fsHooks & HOOKID_TO_FLAG(WH_FOREGROUNDIDLE) ||
+ pti->pDeskInfo->fsHooks & HOOKID_TO_FLAG(WH_FOREGROUNDIDLE) )
+ {
+ co_HOOK_CallHooks(WH_FOREGROUNDIDLE,HC_ACTION,0,0);
+ }
+ }
+
+ DPRINT("IdlePing ppi 0x%x\n",ppi);
+ if ( ppi && ppi->InputIdleEvent )
+ {
+ DPRINT("InputIdleEvent\n");
+ KeSetEvent( ppi->InputIdleEvent, IO_NO_INCREMENT, FALSE);
+ }
+}
+
+VOID FASTCALL
+IdlePong(VOID)
+{
+ PPROCESSINFO ppi = PsGetCurrentProcessWin32Process();
+
+ DPRINT("IdlePong ppi 0x%x\n",ppi);
+ if ( ppi && ppi->InputIdleEvent )
+ {
+ KeClearEvent(ppi->InputIdleEvent);
+ }
+}
+