diff options
Diffstat (limited to 'xbmc/windowing/OSScreenSaver.h')
-rw-r--r-- | xbmc/windowing/OSScreenSaver.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/xbmc/windowing/OSScreenSaver.h b/xbmc/windowing/OSScreenSaver.h new file mode 100644 index 0000000..367d6db --- /dev/null +++ b/xbmc/windowing/OSScreenSaver.h @@ -0,0 +1,118 @@ +/* + * 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. + */ + +#pragma once + +#include <memory> +#include <utility> + +namespace KODI +{ +namespace WINDOWING +{ + +class COSScreenSaverManager; + +/** + * Inhibit the OS screen saver as long as this object is alive + * + * Destroy or call \ref Release to stop this inhibitor from being active. + * The OS screen saver may still be inhibited as long as other inhibitors are + * active though. + * + * \note Make sure to release or destroy the inhibitor before the \ref + * COSScreenSaverManager is destroyed + */ +class COSScreenSaverInhibitor +{ +public: + COSScreenSaverInhibitor() noexcept; + COSScreenSaverInhibitor(COSScreenSaverInhibitor&& other) noexcept; + COSScreenSaverInhibitor& operator=(COSScreenSaverInhibitor&& other) noexcept; + ~COSScreenSaverInhibitor() noexcept; + void Release(); + bool IsActive() const; + operator bool() const; + +private: + friend class COSScreenSaverManager; + explicit COSScreenSaverInhibitor(COSScreenSaverManager* manager); + bool m_active; + COSScreenSaverManager* m_manager; + + COSScreenSaverInhibitor(COSScreenSaverInhibitor const& other) = delete; + COSScreenSaverInhibitor& operator=(COSScreenSaverInhibitor const& other) = delete; +}; + +/** + * Interface for OS screen saver control implementations + */ +class IOSScreenSaver +{ +public: + virtual ~IOSScreenSaver() = default; + /** + * Do not allow the OS screen saver to become active + * + * Calling this function multiple times without calling \ref Unhibit + * MUST NOT produce any side-effects. + */ + virtual void Inhibit() = 0; + /** + * Allow the OS screen saver to become active again + * + * Calling this function multiple times or at all without calling \ref Inhibit + * MUST NOT produce any side-effects. + */ + virtual void Uninhibit() = 0; +}; + +/** + * Dummy implementation of IOSScreenSaver + */ +class CDummyOSScreenSaver : public IOSScreenSaver +{ +public: + void Inhibit() override {} + void Uninhibit() override {} +}; + +/** + * Manage the OS screen saver + * + * This class keeps track of a number of \ref COSScreenSaverInhibitor instances + * and keeps the OS screen saver inhibited as long as at least one of them + * exists and is active. + */ +class COSScreenSaverManager +{ +public: + /** + * Create manager with backing OS-specific implementation + */ + explicit COSScreenSaverManager(std::unique_ptr<IOSScreenSaver> impl); + /** + * Create inhibitor that prevents the OS screen saver from becoming active as + * long as it is alive + */ + COSScreenSaverInhibitor CreateInhibitor(); + /** + * Check whether the OS screen saver is currently inhibited + */ + bool IsInhibited(); + +private: + friend class COSScreenSaverInhibitor; + void RemoveInhibitor(); + + unsigned int m_inhibitionCount{0u}; + std::unique_ptr<IOSScreenSaver> m_impl; +}; + +} +} |