From f0c3bf43321c81c249cf2e46e6233bdd7dbc0fe3 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Tue, 12 Oct 2010 14:44:33 +0000 Subject: [PATCH] Support for inhibiting gnome screensaver. Update issue #879 Gnome support done. --- src/CMakeLists.txt | 4 ++++ src/ui/gnomescreensaver.cpp | 19 +++++++++++++++++ src/ui/gnomescreensaver.h | 17 +++++++++++++++ src/ui/screensaver.cpp | 21 +++++++++++++++++++ src/ui/screensaver.h | 15 +++++++++++++ src/visualisations/visualisationcontainer.cpp | 5 +++++ 6 files changed, 81 insertions(+) create mode 100644 src/ui/gnomescreensaver.cpp create mode 100644 src/ui/gnomescreensaver.h create mode 100644 src/ui/screensaver.cpp create mode 100644 src/ui/screensaver.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 00a5ac6aa..2d3d76112 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -161,6 +161,7 @@ set(SOURCES ui/organisedialog.cpp ui/organiseerrordialog.cpp ui/qtsystemtrayicon.cpp + ui/screensaver.cpp ui/settingsdialog.cpp ui/systemtrayicon.cpp @@ -569,6 +570,9 @@ if(NOT APPLE AND NOT WIN32) # DeviceKit lister source list(APPEND SOURCES devices/devicekitlister.cpp) list(APPEND HEADERS devices/devicekitlister.h) + + # Gnome Screensaver DBus interface + list(APPEND SOURCES ui/gnomescreensaver.cpp) endif(NOT APPLE AND NOT WIN32) # Libgpod device backend diff --git a/src/ui/gnomescreensaver.cpp b/src/ui/gnomescreensaver.cpp new file mode 100644 index 000000000..349821de2 --- /dev/null +++ b/src/ui/gnomescreensaver.cpp @@ -0,0 +1,19 @@ +#include "gnomescreensaver.h" + +#include +#include +#include + +void GnomeScreensaver::Inhibit() { + QDBusInterface gnome_screensaver("org.gnome.ScreenSaver", "/", "org.gnome.ScreenSaver"); + QDBusReply reply = + gnome_screensaver.call("Inhibit", QCoreApplication::applicationName(), QObject::tr("Visualizations")); + if (reply.isValid()) { + cookie_ = reply.value(); + } +} + +void GnomeScreensaver::Uninhibit() { + QDBusInterface gnome_screensaver("org.gnome.ScreenSaver", "/", "org.gnome.ScreenSaver"); + gnome_screensaver.call("UnInhibit", cookie_); +} diff --git a/src/ui/gnomescreensaver.h b/src/ui/gnomescreensaver.h new file mode 100644 index 000000000..5d5489110 --- /dev/null +++ b/src/ui/gnomescreensaver.h @@ -0,0 +1,17 @@ +#ifndef GNOMESCREENSAVER_H +#define GNOMESCREENSAVER_H + +#include "screensaver.h" + +#include + +class GnomeScreensaver : public Screensaver { + public: + void Inhibit(); + void Uninhibit(); + + private: + quint32 cookie_; +}; + +#endif diff --git a/src/ui/screensaver.cpp b/src/ui/screensaver.cpp new file mode 100644 index 000000000..62daf7354 --- /dev/null +++ b/src/ui/screensaver.cpp @@ -0,0 +1,21 @@ +#include "screensaver.h" + +#include "gnomescreensaver.h" + +#ifdef Q_WS_X11 +#include +#include +#endif + +Screensaver* Screensaver::screensaver_ = 0; + +Screensaver* Screensaver::GetScreensaver() { + if (!screensaver_) { + #ifdef Q_WS_X11 + if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.gnome.ScreenSaver")) { + screensaver_ = new GnomeScreensaver(); + } + #endif + } + return screensaver_; +} diff --git a/src/ui/screensaver.h b/src/ui/screensaver.h new file mode 100644 index 000000000..769913952 --- /dev/null +++ b/src/ui/screensaver.h @@ -0,0 +1,15 @@ +#ifndef SCREENSAVER_H +#define SCREENSAVER_H + +class Screensaver { + public: + virtual void Inhibit() = 0; + virtual void Uninhibit() = 0; + + static Screensaver* GetScreensaver(); + + private: + static Screensaver* screensaver_; +}; + +#endif diff --git a/src/visualisations/visualisationcontainer.cpp b/src/visualisations/visualisationcontainer.cpp index eae2ee380..3e4026fb0 100644 --- a/src/visualisations/visualisationcontainer.cpp +++ b/src/visualisations/visualisationcontainer.cpp @@ -21,6 +21,7 @@ #include "visualisationselector.h" #include "engines/gstengine.h" #include "ui/iconloader.h" +#include "ui/screensaver.h" #include #include @@ -245,6 +246,10 @@ void VisualisationContainer::keyReleaseEvent(QKeyEvent *event) { void VisualisationContainer::ToggleFullscreen() { setWindowState(windowState() ^ Qt::WindowFullScreen); + + Screensaver* screensaver = Screensaver::GetScreensaver(); + if (screensaver) + isFullScreen() ? screensaver->Inhibit() : screensaver->Uninhibit(); } void VisualisationContainer::SetFps(int fps) {