[kde-workspace/f18] proper powerdevil systemd-login1 support (#859227, kde review#108407)

Rex Dieter rdieter at fedoraproject.org
Mon Jan 14 23:22:37 UTC 2013


commit 8f71eea323684dc918b02d4afbfb1b22e219d33b
Author: Rex Dieter <rdieter at math.unl.edu>
Date:   Mon Jan 14 17:23:02 2013 -0600

    proper powerdevil systemd-login1 support (#859227,kde review#108407)

 ...orkspace-4.9.97-powerdevil_systemd_login1.patch |  366 ++++++++++++++++++++
 kde-workspace.spec                                 |    8 +
 2 files changed, 374 insertions(+), 0 deletions(-)
---
diff --git a/kde-workspace-4.9.97-powerdevil_systemd_login1.patch b/kde-workspace-4.9.97-powerdevil_systemd_login1.patch
new file mode 100644
index 0000000..9b69956
--- /dev/null
+++ b/kde-workspace-4.9.97-powerdevil_systemd_login1.patch
@@ -0,0 +1,366 @@
+diff --git a/powerdevil/daemon/BackendConfig.cmake b/powerdevil/daemon/BackendConfig.cmake
+index 5dbe6f6..5344925 100644
+--- a/powerdevil/daemon/BackendConfig.cmake
++++ b/powerdevil/daemon/BackendConfig.cmake
+@@ -9,6 +9,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/backends/upower
+ 
+ set(powerdevilupowerbackend_SRCS
+     backends/upower/upowersuspendjob.cpp
++    backends/upower/login1suspendjob.cpp
+     backends/upower/powerdevilupowerbackend.cpp
+     backends/upower/xrandrbrightness.cpp
+ )
+diff --git a/powerdevil/daemon/backends/upower/login1suspendjob.h b/powerdevil/daemon/backends/upower/login1suspendjob.h
+new file mode 100644
+index 0000000..c7e33ba
+--- /dev/null
++++ b/powerdevil/daemon/backends/upower/login1suspendjob.h
+@@ -0,0 +1,54 @@
++/*  This file is part of the KDE project
++    Copyright (C) 2006 Kevin Ottens <ervin at kde.org>
++    Copyright (C) 2010 Alejandro Fiestas <alex at eyeos.org>
++    Copyright (C) 2013 Lukáš Tinkl <ltinkl at redhat.com>
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Library General Public
++    License version 2 as published by the Free Software Foundation.
++
++    This library 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
++    Library General Public License for more details.
++
++    You should have received a copy of the GNU Library General Public License
++    along with this library; see the file COPYING.LIB.  If not, write to
++    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++    Boston, MA 02110-1301, USA.
++
++*/
++
++#ifndef LOGIN1SUSPENDJOB_H
++#define LOGIN1SUSPENDJOB_H
++
++#include <kjob.h>
++#include <QtDBus/QDBusInterface>
++#include <QtDBus/QDBusMessage>
++#include <QtDBus/QDBusPendingCallWatcher>
++
++#include "powerdevilbackendinterface.h"
++
++class Login1SuspendJob : public KJob
++{
++    Q_OBJECT
++public:
++    Login1SuspendJob(QDBusInterface *login1Interface,
++                     PowerDevil::BackendInterface::SuspendMethod method,
++                     PowerDevil::BackendInterface::SuspendMethods supported);
++    virtual ~Login1SuspendJob();
++
++    void start();
++    void kill(bool quietly);
++
++private Q_SLOTS:
++    void doStart();
++    void sendResult(QDBusPendingCallWatcher* watcher);
++
++private:
++    QDBusInterface *m_login1Interface;
++    PowerDevil::BackendInterface::SuspendMethod m_method;
++    PowerDevil::BackendInterface::SuspendMethods m_supported;
++};
++
++#endif //LOGIN1SUSPENDJOB_H
+diff --git a/powerdevil/daemon/backends/upower/login1suspendjob.cpp b/powerdevil/daemon/backends/upower/login1suspendjob.cpp
+new file mode 100644
+index 0000000..1fe34bb
+--- /dev/null
++++ b/powerdevil/daemon/backends/upower/login1suspendjob.cpp
+@@ -0,0 +1,100 @@
++/*  This file is part of the KDE project
++    Copyright (C) 2006 Kevin Ottens <ervin at kde.org>
++    Copyright (C) 2010 Alejandro Fiestas <alex at eyeos.org>
++    Copyright (C) 2013 Lukáš Tinkl <ltinkl at redhat.com>
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Library General Public
++    License version 2 as published by the Free Software Foundation.
++
++    This library 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
++    Library General Public License for more details.
++
++    You should have received a copy of the GNU Library General Public License
++    along with this library; see the file COPYING.LIB.  If not, write to
++    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++    Boston, MA 02110-1301, USA.
++
++*/
++
++#include "login1suspendjob.h"
++
++#include <QtDBus/QDBusMessage>
++#include <QtDBus/QDBusReply>
++#include <QTimer>
++#include <KDebug>
++#include <KLocale>
++
++Login1SuspendJob::Login1SuspendJob(QDBusInterface *login1Interface,
++                                   PowerDevil::BackendInterface::SuspendMethod method,
++                                   PowerDevil::BackendInterface::SuspendMethods supported)
++    : KJob(), m_login1Interface(login1Interface)
++{
++    kDebug() << "Starting Login1 suspend job";
++    m_method = method;
++    m_supported = supported;
++}
++
++Login1SuspendJob::~Login1SuspendJob()
++{
++
++}
++
++void Login1SuspendJob::start()
++{
++    QTimer::singleShot(0, this, SLOT(doStart()));
++}
++
++void Login1SuspendJob::kill(bool /*quietly */)
++{
++
++}
++
++void Login1SuspendJob::doStart()
++{
++    if (m_supported & m_method)
++    {
++        QVariantList args;
++        args << true; // interactive, ie. with polkit dialogs
++
++        QDBusPendingReply<void> reply;
++        QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this);
++        connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(sendResult(QDBusPendingCallWatcher*)));
++
++        switch(m_method)
++        {
++        case PowerDevil::BackendInterface::ToRam:
++            reply = m_login1Interface->asyncCallWithArgumentList("Suspend", args);
++            break;
++        case PowerDevil::BackendInterface::ToDisk:
++            reply = m_login1Interface->asyncCallWithArgumentList("Hibernate", args);
++            break;
++        case PowerDevil::BackendInterface::HybridSuspend:
++            reply = m_login1Interface->asyncCallWithArgumentList("HybridSleep", args);
++            break;
++        default:
++            kDebug() << "Unsupported suspend method";
++            setError(1);
++            setErrorText(i18n("Unsupported suspend method"));
++            break;
++        }
++    }
++}
++
++void Login1SuspendJob::sendResult(QDBusPendingCallWatcher *watcher)
++{
++    const QDBusPendingReply<void> reply = *watcher;
++    if (!reply.isError()) {
++        emitResult();
++    }
++    else {
++        kWarning() << "Failed to start suspend job" << reply.error().name() << reply.error().message();
++    }
++
++    watcher->deleteLater();
++}
++
++
++#include "login1suspendjob.moc"
+diff --git a/powerdevil/daemon/backends/upower/powerdevilupowerbackend.h b/powerdevil/daemon/backends/upower/powerdevilupowerbackend.h
+index ba942bd..ae3d754 100644
+--- a/powerdevil/daemon/backends/upower/powerdevilupowerbackend.h
++++ b/powerdevil/daemon/backends/upower/powerdevilupowerbackend.h
+@@ -34,6 +34,7 @@
+ #include "upower_kbdbacklight_interface.h"
+ 
+ #define UPOWER_SERVICE "org.freedesktop.UPower"
++#define LOGIN1_SERVICE "org.freedesktop.login1"
+ 
+ class XRandrBrightness;
+ 
+@@ -63,6 +64,7 @@ private slots:
+     void slotDeviceRemoved(const QString &);
+     void slotDeviceChanged(const QString &);
+     void slotPropertyChanged();
++    void slotLogin1Resuming(bool active);
+ 
+ private:
+     // upower devices
+@@ -74,6 +76,9 @@ private:
+     OrgFreedesktopUPowerInterface *m_upowerInterface;
+     OrgFreedesktopUPowerKbdBacklightInterface *m_kbdBacklight;
+ 
++    // login1 interface
++    QWeakPointer<QDBusInterface> m_login1Interface;
++
+     // buttons
+     bool m_lidIsPresent;
+     bool m_lidIsClosed;
+diff --git a/powerdevil/daemon/backends/upower/powerdevilupowerbackend.cpp b/powerdevil/daemon/backends/upower/powerdevilupowerbackend.cpp
+index 97a409b..2c00ac0 100644
+--- a/powerdevil/daemon/backends/upower/powerdevilupowerbackend.cpp
++++ b/powerdevil/daemon/backends/upower/powerdevilupowerbackend.cpp
+@@ -2,7 +2,7 @@
+     Copyright (C) 2006 Kevin Ottens <ervin at kde.org>
+     Copyright (C) 2008-2010 Dario Freddi <drf at kde.org>
+     Copyright (C) 2010 Alejandro Fiestas <alex at eyeos.org>
+-    Copyright (C) 2010 Lukas Tinkl <ltinkl at redhat.com>
++    Copyright (C) 2010-2013 Lukáš Tinkl <ltinkl at redhat.com>
+ 
+     This library is free software; you can redistribute it and/or
+     modify it under the terms of the GNU Library General Public
+@@ -31,6 +31,7 @@
+ 
+ #include "xrandrbrightness.h"
+ #include "upowersuspendjob.h"
++#include "login1suspendjob.h"
+ 
+ #define HELPER_ID "org.kde.powerdevil.backlighthelper"
+ 
+@@ -39,6 +40,7 @@ PowerDevilUPowerBackend::PowerDevilUPowerBackend(QObject* parent)
+       m_brightnessControl(0),
+       m_lidIsPresent(false), m_lidIsClosed(false), m_onBattery(false)
+ {
++
+ }
+ 
+ PowerDevilUPowerBackend::~PowerDevilUPowerBackend()
+@@ -80,11 +82,19 @@ bool PowerDevilUPowerBackend::isAvailable()
+ void PowerDevilUPowerBackend::init()
+ {
+     // interfaces
++    if (!QDBusConnection::systemBus().interface()->isServiceRegistered(LOGIN1_SERVICE)) {
++        // Activate it.
++        QDBusConnection::systemBus().interface()->startService(LOGIN1_SERVICE);
++    }
++
+     if (!QDBusConnection::systemBus().interface()->isServiceRegistered(UPOWER_SERVICE)) {
+         // Activate it.
+         QDBusConnection::systemBus().interface()->startService(UPOWER_SERVICE);
+     }
+ 
++    if (QDBusConnection::systemBus().interface()->isServiceRegistered(LOGIN1_SERVICE)) {
++        m_login1Interface = new QDBusInterface(LOGIN1_SERVICE, "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QDBusConnection::systemBus(), this);
++    }
+     m_upowerInterface = new OrgFreedesktopUPowerInterface(UPOWER_SERVICE, "/org/freedesktop/UPower", QDBusConnection::systemBus(), this);
+     m_kbdBacklight = new OrgFreedesktopUPowerKbdBacklightInterface(UPOWER_SERVICE, "/org/freedesktop/UPower/KbdBacklight", QDBusConnection::systemBus(), this);
+     m_brightnessControl = new XRandrBrightness();
+@@ -113,7 +123,22 @@ void PowerDevilUPowerBackend::init()
+ 
+     // Supported suspend methods
+     SuspendMethods supported = UnknownSuspendMethod;
+-    {
++    if (m_login1Interface) {
++        QDBusPendingReply<QString> canSuspend = m_login1Interface.data()->asyncCall("CanSuspend");
++        canSuspend.waitForFinished();
++        if (canSuspend.isValid() && canSuspend.value() != "no")
++            supported |= ToRam;
++
++        QDBusPendingReply<QString> canHibernate = m_login1Interface.data()->asyncCall("CanHibernate");
++        canHibernate.waitForFinished();
++        if (canHibernate.isValid() && canHibernate.value() != "no")
++            supported |= ToDisk;
++
++        QDBusPendingReply<QString> canHybridSleep = m_login1Interface.data()->asyncCall("CanHybridSleep");
++        canHybridSleep.waitForFinished();
++        if (canHybridSleep.isValid() && canHybridSleep.value() != "no")
++            supported |= HybridSuspend;
++    } else {
+         if (m_upowerInterface->canSuspend() && m_upowerInterface->SuspendAllowed()) {
+             kDebug() << "Can suspend";
+             supported |= ToRam;
+@@ -125,7 +150,13 @@ void PowerDevilUPowerBackend::init()
+         }
+     }
+ 
+-    connect(m_upowerInterface, SIGNAL(Resuming()), this, SIGNAL(resumeFromSuspend()));
++    // CHECKME if login1 indeed has the resuming signal, it doesn't yet :/
++    // "resuming" signal
++    if (m_login1Interface) {
++        connect(m_login1Interface.data(), SIGNAL(PrepareForSleep(bool)), this, SLOT(slotLogin1Resuming(bool)));
++    } else {
++        connect(m_upowerInterface, SIGNAL(Resuming()), this, SIGNAL(resumeFromSuspend()));
++    }
+ 
+     // battery
+     QList<RecallNotice> recallList;
+@@ -246,7 +277,11 @@ bool PowerDevilUPowerBackend::setBrightness(float brightnessValue, PowerDevil::B
+ 
+ KJob* PowerDevilUPowerBackend::suspend(PowerDevil::BackendInterface::SuspendMethod method)
+ {
+-    return new UPowerSuspendJob(m_upowerInterface, method, supportedSuspendMethods());
++    if (m_login1Interface) {
++        return new Login1SuspendJob(m_login1Interface.data(), method, supportedSuspendMethods());
++    } else {
++        return new UPowerSuspendJob(m_upowerInterface, method, supportedSuspendMethods());
++    }
+ }
+ 
+ void PowerDevilUPowerBackend::enumerateDevices()
+@@ -337,4 +372,11 @@ void PowerDevilUPowerBackend::slotPropertyChanged()
+     m_onBattery = onBattery;
+ }
+ 
++void PowerDevilUPowerBackend::slotLogin1Resuming(bool active)
++{
++    if (!active) {
++        emit resumeFromSuspend();
++    }
++}
++
+ #include "powerdevilupowerbackend.moc"
+diff --git a/powerdevil/daemon/backends/upower/upowersuspendjob.h b/powerdevil/daemon/backends/upower/upowersuspendjob.h
+index bbe2f45..aac4b12 100644
+--- a/powerdevil/daemon/backends/upower/upowersuspendjob.h
++++ b/powerdevil/daemon/backends/upower/upowersuspendjob.h
+@@ -25,7 +25,7 @@
+ #include <QtDBus/QDBusInterface>
+ #include <QtDBus/QDBusMessage>
+ 
+-#include "powerdevilupowerbackend.h"
++#include "powerdevilbackendinterface.h"
+ 
+ class OrgFreedesktopUPowerInterface;
+ 
+@@ -34,8 +34,8 @@ class UPowerSuspendJob : public KJob
+     Q_OBJECT
+ public:
+     UPowerSuspendJob(OrgFreedesktopUPowerInterface *upowerInterface,
+-                  PowerDevil::BackendInterface::SuspendMethod method,
+-                  PowerDevil::BackendInterface::SuspendMethods supported);
++                     PowerDevil::BackendInterface::SuspendMethod method,
++                     PowerDevil::BackendInterface::SuspendMethods supported);
+     virtual ~UPowerSuspendJob();
+ 
+     void start();
+diff --git a/powerdevil/daemon/backends/upower/upowersuspendjob.cpp b/powerdevil/daemon/backends/upower/upowersuspendjob.cpp
+index fa64ab0..8b183e7 100644
+--- a/powerdevil/daemon/backends/upower/upowersuspendjob.cpp
++++ b/powerdevil/daemon/backends/upower/upowersuspendjob.cpp
+@@ -25,7 +25,6 @@
+ #include <QtDBus/QDBusMessage>
+ #include <QtDBus/QDBusReply>
+ #include <QTimer>
+-#include <KConfig>
+ #include <KDebug>
+ #include <KLocale>
+ 
+@@ -34,7 +33,7 @@ UPowerSuspendJob::UPowerSuspendJob(OrgFreedesktopUPowerInterface *upowerInterfac
+                                    PowerDevil::BackendInterface::SuspendMethods supported)
+     : KJob(), m_upowerInterface(upowerInterface)
+ {
+-    kDebug() << "Stancing Suspend job";
++    kDebug() << "Starting UPower suspend job";
+     m_method = method;
+     m_supported = supported;
+ 
diff --git a/kde-workspace.spec b/kde-workspace.spec
index 1fec256..ba9d603 100644
--- a/kde-workspace.spec
+++ b/kde-workspace.spec
@@ -102,6 +102,10 @@ Patch52: kde-workspace-4.8.2-bz#732830-login.patch
 # http://bugs.kde.org/242065
 Patch53: kde-workspace-4.7.95-kdm_xauth.patch
 
+# bring systemd-login1 power love to powerdevil
+# https://git.reviewboard.kde.org/r/108407/
+Patch54: kde-workspace-4.9.97-powerdevil_systemd_login1.patch
+
 # pam/systemd bogosity: kdm restart/shutdown does not work 
 # http://bugzilla.redhat.com/796969
 Patch57: kde-workspace-4.8.0-bug796969.patch
@@ -441,6 +445,7 @@ Requires: akonadi
 %patch51 -p1 -b .add_apper_to_kickoff_favorites
 %patch52 -p1 -b .bz#732830-login
 %patch53 -p1 -b .kdm_xauth
+%patch54 -p1 -b .powerdevil_systemd_login1
 %patch57 -p1 -b .bug796969
 %patch62 -p0 -b .systemd-displaymanager
 
@@ -993,6 +998,9 @@ fi
 
 
 %changelog
+* Mon Jan 14 2013 Rex Dieter <rdieter at fedoraproject.org> - 4.9.5-2
+- proper powerdevil systemd-login1 support (#859227,kde review#108407)
+
 * Sat Dec 29 2012 Rex Dieter <rdieter at fedoraproject.org> - 4.9.5-1
 - 4.9.5
 


More information about the scm-commits mailing list