diff options
Diffstat (limited to 'xbmc/windowing/linux/OSScreenSaverFreedesktop.cpp')
-rw-r--r-- | xbmc/windowing/linux/OSScreenSaverFreedesktop.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/xbmc/windowing/linux/OSScreenSaverFreedesktop.cpp b/xbmc/windowing/linux/OSScreenSaverFreedesktop.cpp new file mode 100644 index 0000000..167930d --- /dev/null +++ b/xbmc/windowing/linux/OSScreenSaverFreedesktop.cpp @@ -0,0 +1,78 @@ +/* + * 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 "OSScreenSaverFreedesktop.h" + +#include "CompileInfo.h" +#include "guilib/LocalizeStrings.h" +#include "utils/log.h" + +#include "platform/linux/DBusMessage.h" +#include "platform/linux/DBusUtil.h" + +using namespace KODI::WINDOWING::LINUX; + +namespace +{ +const std::string SCREENSAVER_OBJECT = "/org/freedesktop/ScreenSaver"; +const std::string SCREENSAVER_INTERFACE = "org.freedesktop.ScreenSaver"; +} + +bool COSScreenSaverFreedesktop::IsAvailable() +{ + // Test by making a call to a function without side-effects + CDBusMessage dummyMessage(SCREENSAVER_INTERFACE, SCREENSAVER_OBJECT, SCREENSAVER_INTERFACE, "GetActive"); + CDBusError error; + dummyMessage.SendSession(error); + // We do not care whether GetActive() is actually supported, we're just checking for the name to be there + // (GNOME for example does not support GetActive) + return !error || error.Name() == DBUS_ERROR_NOT_SUPPORTED; +} + +void COSScreenSaverFreedesktop::Inhibit() +{ + if (m_inhibited) + { + return; + } + + CDBusMessage inhibitMessage(SCREENSAVER_INTERFACE, SCREENSAVER_OBJECT, SCREENSAVER_INTERFACE, "Inhibit"); + inhibitMessage.AppendArguments(std::string(CCompileInfo::GetAppName()), + g_localizeStrings.Get(14086)); + if (!inhibitMessage.SendSession()) + { + // DBus call failed + CLog::Log(LOGERROR, "Inhibiting freedesktop screen saver failed"); + return; + } + + if (!inhibitMessage.GetReplyArguments(&m_cookie)) + { + CLog::Log(LOGERROR, "Could not retrieve cookie from org.freedesktop.ScreenSaver Inhibit response"); + return; + } + + m_inhibited = true; +} + +void COSScreenSaverFreedesktop::Uninhibit() +{ + if (!m_inhibited) + { + return; + } + + CDBusMessage uninhibitMessage(SCREENSAVER_INTERFACE, SCREENSAVER_OBJECT, SCREENSAVER_INTERFACE, "UnInhibit"); + uninhibitMessage.AppendArgument(m_cookie); + if (!uninhibitMessage.SendSession()) + { + CLog::Log(LOGERROR, "Uninhibiting freedesktop screen saver failed"); + } + + m_inhibited = false; +} |