From e858e08a4c99cf65c82805dedb005f10f8835fdf Mon Sep 17 00:00:00 2001
From: SerhiiGadzhilov <71632867+SerhiiGadzhilov@users.noreply.github.com>
Date: Fri, 23 Jul 2021 18:22:28 +0300
Subject: [PATCH] SYNERGY-1088 Linux client ignores prevent sleep option
---
src/lib/platform/XWindowsPowerManager.cpp | 60 +++++++++++++++++++++++
src/lib/platform/XWindowsPowerManager.h | 30 ++++++++++++
src/lib/platform/XWindowsScreen.cpp | 39 ++-------------
src/lib/platform/XWindowsScreen.h | 7 +--
4 files changed, 97 insertions(+), 39 deletions(-)
create mode 100644 src/lib/platform/XWindowsPowerManager.cpp
create mode 100644 src/lib/platform/XWindowsPowerManager.h
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;
};