Disable screensaver on OS X

When playing a game on OS X, although the screen does not go to
sleep, the screensaver is still enabled, and therefore, during
gameplay, the screensaver may start running, which is not in
accordance to the behaviour on other other environments (Windows
and X11). It can be argued that the screensaver interrupting
gameplay is a nuissance to many players.

The changes in this commit are intended to allow Dolphin to disable
the screensaver during gameplay, just as intended on other platforms.

The changes have been tested on OS X 10.11 (El Capitan).
This commit is contained in:
Salehen Shovon Rahman 2016-12-17 20:40:03 -08:00 committed by MerryMage
parent 188f2b3cc5
commit 65250c0452
2 changed files with 27 additions and 0 deletions

View File

@ -23,6 +23,10 @@
#include "UICommon/X11Utils.h"
#endif
#ifdef __APPLE__
#import <IOKit/pwr_mgt/IOPMLib.h>
#endif
// Class declarations
class CGameListCtrl;
class CCodeWindow;
@ -160,6 +164,10 @@ private:
ADD_PANE_CENTER
};
#ifdef __APPLE__
IOPMAssertionID m_power_assertion = kIOPMNullAssertionID;
#endif
wxTimer m_poll_hotkey_timer;
wxTimer m_handle_signal_timer;

View File

@ -84,6 +84,10 @@
#include "VideoCommon/VideoBackendBase.h"
#include "VideoCommon/VideoConfig.h"
#ifdef __APPLE__
#import <IOKit/pwr_mgt/IOPMLib.h>
#endif
class InputConfig;
class wxFrame;
@ -724,6 +728,14 @@ void CFrame::StartGame(const std::string& filename)
SConfig::GetInstance().bDisableScreenSaver ? ES_DISPLAY_REQUIRED : 0;
SetThreadExecutionState(ES_CONTINUOUS | shouldScreenSave | ES_SYSTEM_REQUIRED);
#endif
#ifdef __APPLE__
CFStringRef reason_for_activity = CFSTR("Emulation Running");
if (IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn,
reason_for_activity, &m_power_assertion) != kIOReturnSuccess)
{
m_power_assertion = kIOPMNullAssertionID;
}
#endif
// We need this specifically to support setting the focus properly when using
// the 'render to main window' feature on Windows
@ -898,6 +910,13 @@ void CFrame::OnStopped()
// Allow windows to resume normal idling behavior
SetThreadExecutionState(ES_CONTINUOUS);
#endif
#ifdef __APPLE__
if (m_power_assertion != kIOPMNullAssertionID)
{
IOPMAssertionRelease(m_power_assertion);
m_power_assertion = kIOPMNullAssertionID;
}
#endif
m_RenderFrame->SetTitle(StrToWxStr(scm_rev_str));