mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
123 lines
2.3 KiB
C++
123 lines
2.3 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//=============================================================================//
|
|
// Class for sending idle messages to a window
|
|
|
|
#include "stdafx.h"
|
|
#include "win_idle.h"
|
|
|
|
// Stub function to get into the object's main thread loop
|
|
DWORD WINAPI CWinIdle::ThreadStub(LPVOID pIdle)
|
|
{
|
|
return ((CWinIdle *)pIdle)->RunIdle();
|
|
}
|
|
|
|
CWinIdle::CWinIdle() :
|
|
m_hIdleThread(NULL),
|
|
m_hIdleEvent(NULL),
|
|
m_hStopEvent(NULL),
|
|
m_hWnd(0),
|
|
m_uMsg(0),
|
|
m_dwDelay(0)
|
|
{
|
|
}
|
|
|
|
CWinIdle::~CWinIdle()
|
|
{
|
|
EndIdle();
|
|
}
|
|
|
|
DWORD CWinIdle::RunIdle()
|
|
{
|
|
// Set up an event list
|
|
HANDLE aEvents[2];
|
|
|
|
aEvents[0] = m_hStopEvent;
|
|
aEvents[1] = m_hIdleEvent;
|
|
|
|
// Wait for a stop or idle event
|
|
while (WaitForMultipleObjects(2, aEvents, FALSE, INFINITE) != WAIT_OBJECT_0)
|
|
{
|
|
// Send an idle message
|
|
PostMessage(m_hWnd, m_uMsg, m_wParam, m_lParam);
|
|
// Wait for a bit...
|
|
Sleep(m_dwDelay);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL CWinIdle::StartIdle(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam, DWORD dwDelay)
|
|
{
|
|
// Make sure it's not already running
|
|
if (m_hIdleThread)
|
|
return FALSE;
|
|
|
|
// Make sure they send in a valid handle..
|
|
if (!hWnd)
|
|
return FALSE;
|
|
|
|
// Create the events
|
|
m_hIdleEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
m_hStopEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
|
|
// Make sure the events got created
|
|
if ((!m_hIdleEvent) || (!m_hStopEvent))
|
|
return FALSE;
|
|
|
|
// Create the thread
|
|
DWORD dwThreadID;
|
|
m_hIdleThread = CreateThread(NULL, 0, CWinIdle::ThreadStub, (void *)this, 0, &dwThreadID);
|
|
|
|
if (m_hIdleThread)
|
|
{
|
|
SetThreadPriority(m_hIdleThread, THREAD_PRIORITY_IDLE);
|
|
|
|
m_hWnd = hWnd;
|
|
m_uMsg = uMessage;
|
|
m_wParam = wParam;
|
|
m_lParam = lParam;
|
|
|
|
m_dwDelay = dwDelay;
|
|
}
|
|
|
|
return m_hIdleThread != 0;
|
|
}
|
|
|
|
BOOL CWinIdle::EndIdle()
|
|
{
|
|
// Make sure it's running
|
|
if (!m_hIdleThread)
|
|
return FALSE;
|
|
|
|
// Stop the idle thread
|
|
SetEvent(m_hStopEvent);
|
|
WaitForSingleObject(m_hIdleThread, INFINITE);
|
|
CloseHandle(m_hIdleThread);
|
|
|
|
// Get rid of the event objects
|
|
CloseHandle(m_hIdleEvent);
|
|
CloseHandle(m_hStopEvent);
|
|
|
|
// Set everything back to 0
|
|
m_hIdleEvent = 0;
|
|
m_hStopEvent = 0;
|
|
m_hIdleThread = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CWinIdle::NextIdle()
|
|
{
|
|
// Make sure the thread's running
|
|
if (!m_hIdleThread)
|
|
return;
|
|
|
|
// Signal an idle message
|
|
SetEvent(m_hIdleEvent);
|
|
}
|