summaryrefslogtreecommitdiffstats
path: root/xbmc/windowing/OSScreenSaver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/windowing/OSScreenSaver.cpp')
-rw-r--r--xbmc/windowing/OSScreenSaver.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/xbmc/windowing/OSScreenSaver.cpp b/xbmc/windowing/OSScreenSaver.cpp
new file mode 100644
index 0000000..3651314
--- /dev/null
+++ b/xbmc/windowing/OSScreenSaver.cpp
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2017-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "OSScreenSaver.h"
+
+#include "utils/log.h"
+
+using namespace KODI::WINDOWING;
+
+COSScreenSaverManager::COSScreenSaverManager(std::unique_ptr<IOSScreenSaver> impl)
+: m_impl{std::move(impl)}
+{
+}
+
+COSScreenSaverInhibitor COSScreenSaverManager::CreateInhibitor()
+{
+ COSScreenSaverInhibitor inhibitor{this};
+ if (m_inhibitionCount++ == 0)
+ {
+ // Inhibit if this was first inhibitor
+ CLog::Log(LOGDEBUG, "Inhibiting OS screen saver");
+ m_impl->Inhibit();
+ }
+ return inhibitor;
+}
+
+bool COSScreenSaverManager::IsInhibited()
+{
+ return (m_inhibitionCount > 0);
+}
+
+void COSScreenSaverManager::RemoveInhibitor()
+{
+ if (--m_inhibitionCount == 0)
+ {
+ CLog::Log(LOGDEBUG, "Uninhibiting OS screen saver");
+ // Uninhibit if this was last inhibitor
+ m_impl->Uninhibit();
+ }
+}
+
+COSScreenSaverInhibitor::COSScreenSaverInhibitor() noexcept
+: m_active{false}, m_manager{}
+{
+}
+
+COSScreenSaverInhibitor::COSScreenSaverInhibitor(COSScreenSaverManager* manager)
+: m_active{true}, m_manager{manager}
+{
+}
+
+COSScreenSaverInhibitor::COSScreenSaverInhibitor(COSScreenSaverInhibitor&& other) noexcept
+: m_active{false}, m_manager{}
+{
+ *this = std::move(other);
+}
+
+COSScreenSaverInhibitor& COSScreenSaverInhibitor::operator=(COSScreenSaverInhibitor&& other) noexcept
+{
+ Release();
+ m_active = other.m_active;
+ m_manager = other.m_manager;
+ other.m_active = false;
+ other.m_manager = nullptr;
+ return *this;
+}
+
+bool COSScreenSaverInhibitor::IsActive() const
+{
+ return m_active;
+}
+
+COSScreenSaverInhibitor::operator bool() const
+{
+ return IsActive();
+}
+
+void COSScreenSaverInhibitor::Release()
+{
+ if (m_active)
+ {
+ m_manager->RemoveInhibitor();
+ m_active = false;
+ }
+}
+
+COSScreenSaverInhibitor::~COSScreenSaverInhibitor() noexcept
+{
+ Release();
+}
+
+
+