diff --git a/src/lib/platform/XWindowsPowerManager.cpp b/src/lib/platform/XWindowsPowerManager.cpp new file mode 100644 index 000000000..1e8c9eaab --- /dev/null +++ b/src/lib/platform/XWindowsPowerManager.cpp @@ -0,0 +1,60 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2012-2016 Symless Ltd. + * Copyright (C) 2002 Chris Schoeneman + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * found in the file LICENSE that should have accompanied this file. + * + * This package is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "XWindowsPowerManager.h" +#include "arch/Arch.h" +#include "base/Log.h" + +namespace{ + +bool sleepInhibitCall(bool state, ArchSystemUnix::InhibitScreenServices serviceID) +{ + std::string error; + + if (!ArchSystemUnix::DBusInhibitScreenCall(serviceID, state, error)) + { + LOG((CLOG_DEBUG "DBus inhibit error %s", error.c_str())); + return false; + } + + return true; +} + +} + +XWindowsPowerManager::~XWindowsPowerManager() +{ + enableSleep(); +} + +void XWindowsPowerManager::disableSleep() +{ + if (!sleepInhibitCall(true, ArchSystemUnix::InhibitScreenServices::kScreenSaver) && + !sleepInhibitCall(true, ArchSystemUnix::InhibitScreenServices::kSessionManager)) + { + LOG((CLOG_INFO "Failed to prevent system from going to sleep")); + } +} + +void XWindowsPowerManager::enableSleep() +{ + if (!sleepInhibitCall(false, ArchSystemUnix::InhibitScreenServices::kScreenSaver) && + !sleepInhibitCall(false, ArchSystemUnix::InhibitScreenServices::kSessionManager)) + { + LOG((CLOG_INFO "Failed to enable system idle sleep")); + } +} diff --git a/src/lib/platform/XWindowsPowerManager.h b/src/lib/platform/XWindowsPowerManager.h new file mode 100644 index 000000000..43fe5a6f2 --- /dev/null +++ b/src/lib/platform/XWindowsPowerManager.h @@ -0,0 +1,30 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2012-2016 Symless Ltd. + * Copyright (C) 2002 Chris Schoeneman + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * found in the file LICENSE that should have accompanied this file. + * + * This package is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef XWINDOWSPOWERMANAGER_H +#define XWINDOWSPOWERMANAGER_H + + +class XWindowsPowerManager +{ +public: + ~XWindowsPowerManager(); + void disableSleep(); + void enableSleep(); +}; + +#endif // XWINDOWSPOWERMANAGER_H diff --git a/src/lib/platform/XWindowsScreen.cpp b/src/lib/platform/XWindowsScreen.cpp index bf2472d66..a6d1f04e7 100644 --- a/src/lib/platform/XWindowsScreen.cpp +++ b/src/lib/platform/XWindowsScreen.cpp @@ -182,6 +182,11 @@ XWindowsScreen::XWindowsScreen( XTestGrabControl(m_display, True); } + // disable sleep if the flag is set + if (App::instance().argsBase().m_preventSleep) { + m_powerManager.disableSleep(); + } + // initialize the clipboards for (ClipboardID id = 0; id < kClipboardEnd; ++id) { m_clipboard[id] = new XWindowsClipboard(m_display, m_window, id); @@ -247,12 +252,6 @@ XWindowsScreen::enable() // warp the mouse to the cursor center fakeMouseMove(m_xCenter, m_yCenter); } - - // disable sleep if the flag is set - if (App::instance().argsBase().m_preventSleep && - !disableIdleSleep()) { - LOG((CLOG_INFO "Failed to prevent system from going to sleep")); - } } void @@ -271,12 +270,6 @@ XWindowsScreen::disable() if (!m_isPrimary && m_autoRepeat) { //XAutoRepeatOn(m_display); } - - // enable sleep when the display is disabled - if (App::instance().argsBase().m_preventSleep && - !enableIdleSleep()) { - LOG((CLOG_INFO "Failed to enable system idle sleep")); - } } void @@ -2201,25 +2194,3 @@ XWindowsScreen::updateScrollDirection() } } -bool XWindowsScreen::sleepInhibitCall(bool state, ArchSystemUnix::InhibitScreenServices serviceID) -{ - std::string error; - if(!ArchSystemUnix::DBusInhibitScreenCall(serviceID, state, error)) - { - LOG((CLOG_DEBUG "DBus inhibit error %s", error.c_str())); - return false; - } - return true; -} - -bool XWindowsScreen::disableIdleSleep() -{ - return sleepInhibitCall(true, ArchSystemUnix::InhibitScreenServices::kScreenSaver) || - sleepInhibitCall(true, ArchSystemUnix::InhibitScreenServices::kSessionManager); -} - -bool XWindowsScreen::enableIdleSleep() -{ - return sleepInhibitCall(false, ArchSystemUnix::InhibitScreenServices::kScreenSaver) || - sleepInhibitCall(false, ArchSystemUnix::InhibitScreenServices::kSessionManager); -} diff --git a/src/lib/platform/XWindowsScreen.h b/src/lib/platform/XWindowsScreen.h index 9e1c4e8c6..b674b708d 100644 --- a/src/lib/platform/XWindowsScreen.h +++ b/src/lib/platform/XWindowsScreen.h @@ -23,6 +23,7 @@ #include "synergy/KeyMap.h" #include "common/stdset.h" #include "common/stdvector.h" +#include "platform/XWindowsPowerManager.h" #if X_DISPLAY_MISSING # error X11 is required to build synergy @@ -118,11 +119,6 @@ private: void onError(); static int ioErrorHandler(Display*); - // sleep management - static bool sleepInhibitCall(bool state, ArchSystemUnix::InhibitScreenServices serviceID); - static bool disableIdleSleep(); - static bool enableIdleSleep(); - private: class KeyEventFilter { public: @@ -263,4 +259,5 @@ private: // -1 for natural scrolling direction, 1 otherwise SInt32 m_scrollDirectionMouse = 1; SInt32 m_scrollDirectionTouchpad = 1; + XWindowsPowerManager m_powerManager; };