Duckstation/src/frontend-common/platform_misc_mac.mm
Connor McLaughlin 8d7aea5e19 Host: Add GetTopLevelWindowInfo()
And use it for screensaver inhibiting on Linux.
2022-11-18 18:44:00 +10:00

69 lines
1.6 KiB
Plaintext

#include "platform_misc.h"
#include "common/log.h"
#include "common/string.h"
#include <IOKit/pwr_mgt/IOPMLib.h>
#include <cinttypes>
Log_SetChannel(FrontendCommon);
#import <AppKit/AppKit.h>
static IOPMAssertionID s_prevent_idle_assertion = kIOPMNullAssertionID;
static bool SetScreensaverInhibitMacOS(bool inhibit)
{
if (inhibit)
{
const CFStringRef reason = CFSTR("System Running");
if (IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, reason,
&s_prevent_idle_assertion) != kIOReturnSuccess)
{
Log_ErrorPrintf("IOPMAssertionCreateWithName() failed");
return false;
}
return true;
}
else
{
IOPMAssertionRelease(s_prevent_idle_assertion);
s_prevent_idle_assertion = kIOPMNullAssertionID;
return true;
}
}
static bool s_screensaver_suspended;
void FrontendCommon::SuspendScreensaver()
{
if (s_screensaver_suspended)
if (!SetScreensaverInhibitMacOS(true))
{
Log_ErrorPrintf("Failed to suspend screensaver.");
return;
}
s_screensaver_suspended = true;
}
void FrontendCommon::ResumeScreensaver()
{
if (!s_screensaver_suspended)
return;
if (!SetScreensaverInhibitMacOS(false))
Log_ErrorPrint("Failed to resume screensaver.");
s_screensaver_suspended = false;
}
bool FrontendCommon::PlaySoundAsync(const char* path)
{
NSString* nspath = [[NSString alloc] initWithUTF8String:path];
NSSound* sound = [[NSSound alloc] initWithContentsOfFile:nspath byReference:YES];
const bool result = [sound play];
[sound release];
[nspath release];
return result;
}