diff --git a/CMakeLists.txt b/CMakeLists.txt index 72523181ef..e89dd86049 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -383,6 +383,7 @@ set(kwin_KDEINIT_SRCS scene_xrender.cpp scene_opengl.cpp scene_qpainter.cpp + screenlockerwatcher.cpp thumbnailitem.cpp lanczosfilter.cpp deleted.cpp diff --git a/effects.cpp b/effects.cpp index 2fe0efd4e6..4d0ecc5e22 100644 --- a/effects.cpp +++ b/effects.cpp @@ -40,16 +40,13 @@ along with this program. If not, see . #include "screenedge.h" #include "scripting/scriptedeffect.h" #include "screens.h" +#include "screenlockerwatcher.h" #include "thumbnailitem.h" #include "virtualdesktops.h" #include "workspace.h" #include "kwinglutils.h" #include -#include -#include -#include -#include #include @@ -63,104 +60,8 @@ along with this program. If not, see . #include "decorations/decorationbridge.h" #include -// dbus generated -#include "screenlocker_interface.h" - - namespace KWin { - -static const QString SCREEN_LOCKER_SERVICE_NAME = QStringLiteral("org.freedesktop.ScreenSaver"); - -ScreenLockerWatcher::ScreenLockerWatcher(QObject *parent) - : QObject(parent) - , m_interface(NULL) - , m_serviceWatcher(new QDBusServiceWatcher(this)) - , m_locked(false) -{ - connect(m_serviceWatcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), SLOT(serviceOwnerChanged(QString,QString,QString))); - m_serviceWatcher->setWatchMode(QDBusServiceWatcher::WatchForOwnerChange); - m_serviceWatcher->addWatchedService(SCREEN_LOCKER_SERVICE_NAME); - // check whether service is registered - QFutureWatcher > *watcher = new QFutureWatcher >(this); - connect(watcher, SIGNAL(finished()), SLOT(serviceRegisteredQueried())); - connect(watcher, SIGNAL(canceled()), watcher, SLOT(deleteLater())); - watcher->setFuture(QtConcurrent::run(QDBusConnection::sessionBus().interface(), - &QDBusConnectionInterface::isServiceRegistered, - SCREEN_LOCKER_SERVICE_NAME)); -} - -ScreenLockerWatcher::~ScreenLockerWatcher() -{ -} - -void ScreenLockerWatcher::serviceOwnerChanged(const QString &serviceName, const QString &oldOwner, const QString &newOwner) -{ - Q_UNUSED(oldOwner) - if (serviceName != SCREEN_LOCKER_SERVICE_NAME) { - return; - } - delete m_interface; - m_interface = NULL; - m_locked = false; - if (!newOwner.isEmpty()) { - m_interface = new OrgFreedesktopScreenSaverInterface(newOwner, QStringLiteral("/ScreenSaver"), QDBusConnection::sessionBus(), this); - connect(m_interface, SIGNAL(ActiveChanged(bool)), SLOT(setLocked(bool))); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(m_interface->GetActive(), this); - connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(activeQueried(QDBusPendingCallWatcher*))); - } -} - -void ScreenLockerWatcher::serviceRegisteredQueried() -{ - QFutureWatcher > *watcher = dynamic_cast > *>(sender()); - if (!watcher) { - return; - } - const QDBusReply &reply = watcher->result(); - if (reply.isValid() && reply.value()) { - QFutureWatcher > *ownerWatcher = new QFutureWatcher >(this); - connect(ownerWatcher, SIGNAL(finished()), SLOT(serviceOwnerQueried())); - connect(ownerWatcher, SIGNAL(canceled()), ownerWatcher, SLOT(deleteLater())); - ownerWatcher->setFuture(QtConcurrent::run(QDBusConnection::sessionBus().interface(), - &QDBusConnectionInterface::serviceOwner, - SCREEN_LOCKER_SERVICE_NAME)); - } - watcher->deleteLater(); -} - -void ScreenLockerWatcher::serviceOwnerQueried() -{ - QFutureWatcher > *watcher = dynamic_cast > *>(sender()); - if (!watcher) { - return; - } - const QDBusReply reply = watcher->result(); - if (reply.isValid()) { - serviceOwnerChanged(SCREEN_LOCKER_SERVICE_NAME, QString(), reply.value()); - } - - watcher->deleteLater(); -} - -void ScreenLockerWatcher::activeQueried(QDBusPendingCallWatcher *watcher) -{ - QDBusPendingReply reply = *watcher; - if (!reply.isError()) { - setLocked(reply.value()); - } - watcher->deleteLater(); -} - -void ScreenLockerWatcher::setLocked(bool activated) -{ - if (m_locked == activated) { - return; - } - m_locked = activated; - emit locked(m_locked); -} - //--------------------- // Static diff --git a/effects.h b/effects.h index f7bd4ba1a0..4e8a5a9d82 100644 --- a/effects.h +++ b/effects.h @@ -45,7 +45,6 @@ class Display; class QDBusPendingCallWatcher; class QDBusServiceWatcher; -class OrgFreedesktopScreenSaverInterface; namespace KWin @@ -454,29 +453,6 @@ private: Plasma::Theme *m_theme; }; -class ScreenLockerWatcher : public QObject -{ - Q_OBJECT -public: - explicit ScreenLockerWatcher(QObject *parent = 0); - virtual ~ScreenLockerWatcher(); - bool isLocked() const { - return m_locked; - } -Q_SIGNALS: - void locked(bool locked); -private Q_SLOTS: - void setLocked(bool activated); - void activeQueried(QDBusPendingCallWatcher *watcher); - void serviceOwnerChanged(const QString &serviceName, const QString &oldOwner, const QString &newOwner); - void serviceRegisteredQueried(); - void serviceOwnerQueried(); -private: - OrgFreedesktopScreenSaverInterface *m_interface; - QDBusServiceWatcher *m_serviceWatcher; - bool m_locked; -}; - inline QList EffectsHandlerImpl::elevatedWindows() const { diff --git a/screenlockerwatcher.cpp b/screenlockerwatcher.cpp new file mode 100644 index 0000000000..5534c5ae9d --- /dev/null +++ b/screenlockerwatcher.cpp @@ -0,0 +1,121 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2013 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program 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 "screenlockerwatcher.h" + +#include +#include +// dbus generated +#include "screenlocker_interface.h" + +namespace KWin +{ + +static const QString SCREEN_LOCKER_SERVICE_NAME = QStringLiteral("org.freedesktop.ScreenSaver"); + +ScreenLockerWatcher::ScreenLockerWatcher(QObject *parent) + : QObject(parent) + , m_interface(NULL) + , m_serviceWatcher(new QDBusServiceWatcher(this)) + , m_locked(false) +{ + connect(m_serviceWatcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), SLOT(serviceOwnerChanged(QString,QString,QString))); + m_serviceWatcher->setWatchMode(QDBusServiceWatcher::WatchForOwnerChange); + m_serviceWatcher->addWatchedService(SCREEN_LOCKER_SERVICE_NAME); + // check whether service is registered + QFutureWatcher > *watcher = new QFutureWatcher >(this); + connect(watcher, SIGNAL(finished()), SLOT(serviceRegisteredQueried())); + connect(watcher, SIGNAL(canceled()), watcher, SLOT(deleteLater())); + watcher->setFuture(QtConcurrent::run(QDBusConnection::sessionBus().interface(), + &QDBusConnectionInterface::isServiceRegistered, + SCREEN_LOCKER_SERVICE_NAME)); +} + +ScreenLockerWatcher::~ScreenLockerWatcher() +{ +} + +void ScreenLockerWatcher::serviceOwnerChanged(const QString &serviceName, const QString &oldOwner, const QString &newOwner) +{ + Q_UNUSED(oldOwner) + if (serviceName != SCREEN_LOCKER_SERVICE_NAME) { + return; + } + delete m_interface; + m_interface = NULL; + m_locked = false; + if (!newOwner.isEmpty()) { + m_interface = new OrgFreedesktopScreenSaverInterface(newOwner, QStringLiteral("/ScreenSaver"), QDBusConnection::sessionBus(), this); + connect(m_interface, SIGNAL(ActiveChanged(bool)), SLOT(setLocked(bool))); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(m_interface->GetActive(), this); + connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), SLOT(activeQueried(QDBusPendingCallWatcher*))); + } +} + +void ScreenLockerWatcher::serviceRegisteredQueried() +{ + QFutureWatcher > *watcher = dynamic_cast > *>(sender()); + if (!watcher) { + return; + } + const QDBusReply &reply = watcher->result(); + if (reply.isValid() && reply.value()) { + QFutureWatcher > *ownerWatcher = new QFutureWatcher >(this); + connect(ownerWatcher, SIGNAL(finished()), SLOT(serviceOwnerQueried())); + connect(ownerWatcher, SIGNAL(canceled()), ownerWatcher, SLOT(deleteLater())); + ownerWatcher->setFuture(QtConcurrent::run(QDBusConnection::sessionBus().interface(), + &QDBusConnectionInterface::serviceOwner, + SCREEN_LOCKER_SERVICE_NAME)); + } + watcher->deleteLater(); +} + +void ScreenLockerWatcher::serviceOwnerQueried() +{ + QFutureWatcher > *watcher = dynamic_cast > *>(sender()); + if (!watcher) { + return; + } + const QDBusReply reply = watcher->result(); + if (reply.isValid()) { + serviceOwnerChanged(SCREEN_LOCKER_SERVICE_NAME, QString(), reply.value()); + } + + watcher->deleteLater(); +} + +void ScreenLockerWatcher::activeQueried(QDBusPendingCallWatcher *watcher) +{ + QDBusPendingReply reply = *watcher; + if (!reply.isError()) { + setLocked(reply.value()); + } + watcher->deleteLater(); +} + +void ScreenLockerWatcher::setLocked(bool activated) +{ + if (m_locked == activated) { + return; + } + m_locked = activated; + emit locked(m_locked); +} + +} diff --git a/screenlockerwatcher.h b/screenlockerwatcher.h new file mode 100644 index 0000000000..ed6b79635e --- /dev/null +++ b/screenlockerwatcher.h @@ -0,0 +1,56 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2013 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program 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 KWIN_SCREENLOCKERWATCHER_H +#define KWIN_SCREENLOCKERWATCHER_H + +#include + +class OrgFreedesktopScreenSaverInterface; +class QDBusServiceWatcher; +class QDBusPendingCallWatcher; + +namespace KWin +{ + +class ScreenLockerWatcher : public QObject +{ + Q_OBJECT +public: + explicit ScreenLockerWatcher(QObject *parent = 0); + virtual ~ScreenLockerWatcher(); + bool isLocked() const { + return m_locked; + } +Q_SIGNALS: + void locked(bool locked); +private Q_SLOTS: + void setLocked(bool activated); + void activeQueried(QDBusPendingCallWatcher *watcher); + void serviceOwnerChanged(const QString &serviceName, const QString &oldOwner, const QString &newOwner); + void serviceRegisteredQueried(); + void serviceOwnerQueried(); +private: + OrgFreedesktopScreenSaverInterface *m_interface; + QDBusServiceWatcher *m_serviceWatcher; + bool m_locked; +}; +} + +#endif