104 lines
3.7 KiB
C
104 lines
3.7 KiB
C
#include "progwrp.h"
|
|
#include "export.h"
|
|
#include "implementations.h"
|
|
#include <winuser.h>
|
|
|
|
BOOL WINAPI Implementation_PowerClearRequest(
|
|
HANDLE PowerRequest,
|
|
POWER_REQUEST_TYPE RequestType
|
|
)
|
|
{
|
|
LONG dwQuantity;
|
|
DWORD dwSize;
|
|
switch (RequestType)
|
|
{
|
|
case PowerRequestDisplayRequired:
|
|
SetThreadExecutionState(SetThreadExecutionState(ES_CONTINUOUS) & ~ES_DISPLAY_REQUIRED);
|
|
WaitForSingleObject(MutexRegistry, INFINITE);
|
|
RegQueryValueExA(g_hkProgwrp, "NumberActiveWakeLocks", NULL, NULL, &dwQuantity, &dwSize);
|
|
--dwQuantity;
|
|
if (dwQuantity < 0)
|
|
dwQuantity = 0;
|
|
RegSetValueExA(g_hkProgwrp, "NumberActiveWakeLocks", NULL, REG_DWORD, &dwQuantity, 4);
|
|
if(!dwQuantity)
|
|
Implementation_SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, 1, NULL, SPIF_SENDCHANGE);
|
|
ReleaseMutex(MutexRegistry);
|
|
return TRUE;
|
|
case PowerRequestSystemRequired:
|
|
SetThreadExecutionState(SetThreadExecutionState(ES_CONTINUOUS) & ~ES_SYSTEM_REQUIRED);
|
|
return TRUE;
|
|
case PowerRequestAwayModeRequired:
|
|
SetThreadExecutionState(SetThreadExecutionState(ES_CONTINUOUS) & ~ES_AWAYMODE_REQUIRED);
|
|
return TRUE;
|
|
case PowerRequestExecutionRequired:
|
|
SetThreadExecutionState(SetThreadExecutionState(ES_CONTINUOUS) & ~ES_SYSTEM_REQUIRED);
|
|
return TRUE;
|
|
}
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return FALSE;
|
|
}
|
|
HANDLE WINAPI Implementation_PowerCreateRequest(
|
|
PREASON_CONTEXT Context
|
|
)
|
|
{
|
|
DWORD dwQuantity, dwSize;
|
|
WaitForSingleObject(MutexRegistry, INFINITE);
|
|
|
|
if(!g_hkProgwrp)
|
|
RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Progwrp", &g_hkProgwrp);
|
|
if (RegQueryValueExA(g_hkProgwrp, "NumberActiveWakeLocks", NULL, NULL, &dwQuantity, &dwSize) != ERROR_SUCCESS)
|
|
{
|
|
dwQuantity = 0;
|
|
RegSetValueExA(g_hkProgwrp, "NumberActiveWakeLocks", 0, REG_DWORD, &dwQuantity, 4);
|
|
}
|
|
|
|
ReleaseMutex(MutexRegistry);
|
|
return CreateSemaphoreA(NULL, 0, 1, NULL);
|
|
}
|
|
BOOL WINAPI Implementation_PowerSetRequest(
|
|
HANDLE PowerRequest,
|
|
POWER_REQUEST_TYPE RequestType
|
|
)
|
|
{
|
|
LONG dwQuantity;
|
|
DWORD dwSize;
|
|
ULONG PreviousRequest;
|
|
switch (RequestType)
|
|
{
|
|
case PowerRequestDisplayRequired:
|
|
PreviousRequest = SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED);
|
|
// MS documentation says that this function has no effect on screensavers, while
|
|
// some GLFW code and issues claim otherwise, but that code has mostly Windows 10 in mind.
|
|
// On XP, this was insufficient. So I am also calling SystemParametersInfo to
|
|
// disable the screensaver.
|
|
SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | PreviousRequest);
|
|
WaitForSingleObject(MutexRegistry, INFINITE);
|
|
RegQueryValueExA(g_hkProgwrp, "NumberActiveWakeLocks", NULL, NULL, &dwQuantity, &dwSize);
|
|
++dwQuantity;
|
|
RegSetValueExA(g_hkProgwrp, "NumberActiveWakeLocks", NULL, REG_DWORD, &dwQuantity, 4);
|
|
if (dwQuantity > 0)
|
|
Implementation_SystemParametersInfoW(SPI_SETSCREENSAVEACTIVE, 0, NULL, SPIF_SENDCHANGE);
|
|
ReleaseMutex(MutexRegistry);
|
|
return TRUE;
|
|
case PowerRequestSystemRequired:
|
|
PreviousRequest = SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
|
|
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | PreviousRequest);
|
|
return TRUE;
|
|
case PowerRequestAwayModeRequired:
|
|
PreviousRequest = SetThreadExecutionState(ES_CONTINUOUS | ES_AWAYMODE_REQUIRED);
|
|
SetThreadExecutionState(ES_CONTINUOUS | ES_AWAYMODE_REQUIRED | PreviousRequest);
|
|
return TRUE;
|
|
case PowerRequestExecutionRequired:
|
|
PreviousRequest = SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
|
|
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | PreviousRequest);
|
|
return TRUE;
|
|
}
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return FALSE;
|
|
}
|
|
|
|
POWER_PLATFORM_ROLE WINAPI Implementation_PowerDeterminePlatformRole()
|
|
// This function reads the registry to determine
|
|
{
|
|
return PlatformRoleDesktop;
|
|
} |