Skip to content

Commit

Permalink
Merge pull request #5232 from MerryMage/osx-screensaver
Browse files Browse the repository at this point in the history
Disable screensaver on OS X
  • Loading branch information
Helios747 committed May 3, 2017
2 parents 7c3905a + 4537969 commit ad829ec
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 22 deletions.
58 changes: 58 additions & 0 deletions Source/Core/DolphinWX/Frame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -688,6 +688,64 @@ WXLRESULT CFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
}
#endif

void CFrame::InhibitScreensaver()
{
// Inhibit the screensaver. Depending on the operating system this may also
// disable low-power states and/or screen dimming.

#if defined(HAVE_X11) && HAVE_X11
if (SConfig::GetInstance().bDisableScreenSaver)
{
X11Utils::InhibitScreensaver(X11Utils::XDisplayFromHandle(GetHandle()),
X11Utils::XWindowFromHandle(GetHandle()), true);
}
#endif

#ifdef _WIN32
// Prevents Windows from sleeping, turning off the display, or idling
EXECUTION_STATE should_screen_save =
SConfig::GetInstance().bDisableScreenSaver ? ES_DISPLAY_REQUIRED : 0;
SetThreadExecutionState(ES_CONTINUOUS | should_screen_save | ES_SYSTEM_REQUIRED);
#endif

#ifdef __APPLE__
if (SConfig::GetInstance().bDisableScreenSaver)
{
CFStringRef reason_for_activity = CFSTR("Emulation Running");
if (IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep,
kIOPMAssertionLevelOn, reason_for_activity,
&m_power_assertion) != kIOReturnSuccess)
{
m_power_assertion = kIOPMNullAssertionID;
}
}
#endif
}

void CFrame::UninhibitScreensaver()
{
#if defined(HAVE_X11) && HAVE_X11
if (SConfig::GetInstance().bDisableScreenSaver)
{
X11Utils::InhibitScreensaver(X11Utils::XDisplayFromHandle(GetHandle()),
X11Utils::XWindowFromHandle(GetHandle()), false);
}
#endif

#ifdef _WIN32
// 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
}

void CFrame::UpdateTitle(const std::string& str)
{
if (SConfig::GetInstance().bRenderToMain && SConfig::GetInstance().m_InterfaceStatusbar)
Expand Down
11 changes: 11 additions & 0 deletions Source/Core/DolphinWX/Frame.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
#include "UICommon/X11Utils.h"
#endif

#ifdef __APPLE__
#include <IOKit/pwr_mgt/IOPMLib.h>
#endif

// Class declarations
class CGameListCtrl;
class CCodeWindow;
Expand Down Expand Up @@ -226,6 +230,13 @@ class CFrame : public CRenderFrame
WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
#endif

// Screensaver
#ifdef __APPLE__
IOPMAssertionID m_power_assertion = kIOPMNullAssertionID;
#endif
void InhibitScreensaver();
void UninhibitScreensaver();

void DoOpen(bool Boot);
void DoPause();
void DoToggleToolbar(bool);
Expand Down
24 changes: 2 additions & 22 deletions Source/Core/DolphinWX/FrameTools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -721,18 +721,7 @@ void CFrame::StartGame(const std::string& filename)
}
else
{
#if defined(HAVE_X11) && HAVE_X11
if (SConfig::GetInstance().bDisableScreenSaver)
X11Utils::InhibitScreensaver(X11Utils::XDisplayFromHandle(GetHandle()),
X11Utils::XWindowFromHandle(GetHandle()), true);
#endif

#ifdef _WIN32
// Prevents Windows from sleeping, turning off the display, or idling
EXECUTION_STATE shouldScreenSave =
SConfig::GetInstance().bDisableScreenSaver ? ES_DISPLAY_REQUIRED : 0;
SetThreadExecutionState(ES_CONTINUOUS | shouldScreenSave | ES_SYSTEM_REQUIRED);
#endif
InhibitScreensaver();

// We need this specifically to support setting the focus properly when using
// the 'render to main window' feature on Windows
Expand Down Expand Up @@ -904,16 +893,7 @@ void CFrame::OnStopped()
m_confirm_stop = false;
m_tried_graceful_shutdown = false;

#if defined(HAVE_X11) && HAVE_X11
if (SConfig::GetInstance().bDisableScreenSaver)
X11Utils::InhibitScreensaver(X11Utils::XDisplayFromHandle(GetHandle()),
X11Utils::XWindowFromHandle(GetHandle()), false);
#endif

#ifdef _WIN32
// Allow windows to resume normal idling behavior
SetThreadExecutionState(ES_CONTINUOUS);
#endif
UninhibitScreensaver();

m_render_frame->SetTitle(StrToWxStr(scm_rev_str));

Expand Down

0 comments on commit ad829ec

Please sign in to comment.