[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