Files
foobar2000-sdk/libPPUI/CPowerRequest.cpp
2021-12-14 00:28:25 -07:00

92 lines
2.3 KiB
C++

#include "stdafx.h"
#include "CPowerRequest.h"
#ifdef CPowerRequestAPI_Avail
// win32 API declaration duplicate - not always defined on some of the Windows versions we target
namespace winapi_substitute {
typedef struct _REASON_CONTEXT {
ULONG Version;
DWORD Flags;
union {
struct {
HMODULE LocalizedReasonModule;
ULONG LocalizedReasonId;
ULONG ReasonStringCount;
LPWSTR *ReasonStrings;
} Detailed;
LPWSTR SimpleReasonString;
} Reason;
} REASON_CONTEXT, *PREASON_CONTEXT;
//
// Power Request APIs
//
typedef REASON_CONTEXT POWER_REQUEST_CONTEXT, *PPOWER_REQUEST_CONTEXT, *LPPOWER_REQUEST_CONTEXT;
}
HANDLE CPowerRequestAPI::PowerCreateRequestNamed( const wchar_t * str ) {
winapi_substitute::REASON_CONTEXT ctx = {POWER_REQUEST_CONTEXT_VERSION, POWER_REQUEST_CONTEXT_SIMPLE_STRING};
ctx.Reason.SimpleReasonString = const_cast<wchar_t*>(str);
return this->PowerCreateRequest(&ctx);
}
CPowerRequest::CPowerRequest(const wchar_t * Reason) : m_Request(INVALID_HANDLE_VALUE), m_bSystem(), m_bDisplay() {
if (m_API.IsValid()) {
winapi_substitute::REASON_CONTEXT ctx = {POWER_REQUEST_CONTEXT_VERSION, POWER_REQUEST_CONTEXT_SIMPLE_STRING};
ctx.Reason.SimpleReasonString = const_cast<wchar_t*>(Reason);
m_Request = m_API.PowerCreateRequest(&ctx);
}
}
void CPowerRequest::SetSystem(bool bSystem) {
if (bSystem == m_bSystem) return;
m_bSystem = bSystem;
if (m_Request != INVALID_HANDLE_VALUE) {
m_API.ToggleSystem( m_Request, bSystem );
} else {
_UpdateTES();
}
}
void CPowerRequest::SetExecution(bool bExecution) {
if (bExecution == m_bSystem) return;
m_bSystem = bExecution;
if (m_Request != INVALID_HANDLE_VALUE) {
m_API.ToggleExecution( m_Request, bExecution );
} else {
_UpdateTES();
}
}
void CPowerRequest::SetDisplay(bool bDisplay) {
if (bDisplay == m_bDisplay) return;
m_bDisplay = bDisplay;
if (m_Request != INVALID_HANDLE_VALUE) {
m_API.ToggleDisplay(m_Request, bDisplay);
} else {
_UpdateTES();
}
}
CPowerRequest::~CPowerRequest() {
if (m_Request != INVALID_HANDLE_VALUE) {
CloseHandle(m_Request);
} else {
if (m_bDisplay || m_bSystem) SetThreadExecutionState(ES_CONTINUOUS);
}
}
void CPowerRequest::_UpdateTES() {
SetThreadExecutionState(ES_CONTINUOUS | (m_bSystem ? ES_SYSTEM_REQUIRED : 0 ) | (m_bDisplay ? ES_DISPLAY_REQUIRED : 0) );
}
#endif // _WIN32