[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebase/workspace/powerdevil
From: Dario Freddi <drf54321 () gmail ! com>
Date: 2008-09-30 21:33:03
Message-ID: 1222810383.742387.6748.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 866447 by dafre:
Moving most stuff from PowerManagementConnector to the new SuspensionLockHandler.
Result? Now inhibiting suspension works.
Application developers, you can now easily prevent the PC from suspending. It's \
enough to call the method "Inhibit" on org.kde.Solid.PowerManagement.Inhibit, \
specifying your application name and the reason why you want to inhibit. PowerDevil \
will take care of the rest, including notifying the user when the system tries to \
suspend. The method returns an int, that you can use as argument when calling \
"Uninhibit" on the same interface to get suspension back working.
I'm forwarding this to kde-devel since it might interest someone.
P.S.: Kevin, I definitely love when a plan comes together too :)
-- Dario
CCMAIL: ervin@kde.org
CCMAIL: kde-devel@kde.org
M +4 -6 daemon/PowerDevilDaemon.cpp
M +7 -3 daemon/PowerDevilDaemon.h
M +10 -20 daemon/PowerManagementConnector.cpp
M +2 -9 daemon/PowerManagementConnector.h
M +44 -4 daemon/SuspensionLockHandler.cpp
M +21 -1 daemon/SuspensionLockHandler.h
M +7 -0 powerdevil.notifyrc
--- trunk/KDE/kdebase/workspace/powerdevil/daemon/PowerDevilDaemon.cpp #866446:866447
@@ -151,6 +151,10 @@
QDBusConnection::sessionBus(), this);
connect(m_notifier, SIGNAL(buttonPressed(int)), this, SLOT(buttonPressed(int)));
+ connect(m_lockHandler, SIGNAL(streamCriticalNotification(const QString&, const \
QString&, + const char*, const QString&)),
+ SLOT(emitCriticalNotification(const QString&, const QString&,
+ const char*, const QString&)));
/* Those slots are relevant only if we're on a system that has a battery. If \
not, we simply don't care
* about them.
@@ -648,14 +652,8 @@
void PowerDevilDaemon::shutdownDialog()
{
- if (!m_lockHandler->setJobLock()) {
- return;
- }
-
m_ksmServerIface->logout((int)KWorkSpace::ShutdownConfirmYes, \
(int)KWorkSpace::ShutdownTypeNone, (int)KWorkSpace::ShutdownModeDefault);
-
- m_lockHandler->releaseAllLocks();
}
void PowerDevilDaemon::suspendToDisk()
--- trunk/KDE/kdebase/workspace/powerdevil/daemon/PowerDevilDaemon.h #866446:866447
@@ -70,6 +70,10 @@
QVariantMap getSupportedSuspendMethods();
QVariantMap getSupportedPollingSystems();
+ SuspensionLockHandler *lockHandler() {
+ return m_lockHandler;
+ };
+
private Q_SLOTS:
void acAdapterStateChanged(int state, bool forced = false);
void batteryChargePercentChanged(int percent, const QString &udi);
@@ -110,6 +114,9 @@
void setUpDPMS();
+ void emitCriticalNotification(const QString &evid, const QString &message = \
QString(), + const char *slot = 0, const QString \
&iconname = "dialog-error"); +
Q_SIGNALS:
void lidClosed(int code, const QString &action);
void errorTriggered(const QString &error);
@@ -125,9 +132,6 @@
void setUpNextTimeout(int idle, int minDimEvent);
- void emitCriticalNotification(const QString &evid, const QString &message = \
QString(),
- const char *slot = 0, const QString &iconname = \
"dialog-error");
-
void profileFirstLoad();
void restoreDefaultProfiles();
--- trunk/KDE/kdebase/workspace/powerdevil/daemon/PowerManagementConnector.cpp \
#866446:866447 @@ -1,5 +1,6 @@
/***************************************************************************
* Copyright (C) 2008 by Kevin Ottens <ervin@kde.org> *
+ * Copyright (C) 2008 by Dario Freddi <drf@kdemod.ath.cx> *
* *
* 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 *
@@ -19,13 +20,15 @@
#include "PowerManagementConnector.h"
+#include "SuspensionLockHandler.h"
+
#include <solid/control/powermanager.h>
#include "powermanagementadaptor.h"
#include "powermanagementinhibitadaptor.h"
PowerManagementConnector::PowerManagementConnector(PowerDevilDaemon *parent)
- : QObject(parent), m_daemon(parent), m_latestInhibitCookie(0)
+ : QObject(parent), m_daemon(parent)
{
new PowerManagementAdaptor(this);
new PowerManagementInhibitAdaptor(this);
@@ -65,45 +68,32 @@
void PowerManagementConnector::Suspend()
{
- if (!HasInhibit()) {
- m_daemon->suspend(PowerDevilDaemon::S2Ram);
- }
- //TODO: Notify the user in case of inhibit?
+ m_daemon->suspend(PowerDevilDaemon::S2Ram);
}
void PowerManagementConnector::Hibernate()
{
- if (!HasInhibit()) {
- m_daemon->suspend(PowerDevilDaemon::S2Disk);
- }
- //TODO: Notify the user in case of inhibit?
+ m_daemon->suspend(PowerDevilDaemon::S2Disk);
}
bool PowerManagementConnector::HasInhibit()
{
- return !m_inhibitRequests.isEmpty();
+ return m_daemon->lockHandler()->hasInhibit();
}
int PowerManagementConnector::Inhibit(const QString &application, const QString \
&reason) {
- m_latestInhibitCookie++;
-
- InhibitRequest req;
- //TODO: Keep track of the service name too, to cleanup cookie in case of a \
crash.
- req.application = application;
- req.reason = reason;
- m_inhibitRequests[m_latestInhibitCookie] = req;
-
- return m_latestInhibitCookie;
+ return m_daemon->lockHandler()->inhibit(application, reason);
}
void PowerManagementConnector::UnInhibit(int cookie)
{
- m_inhibitRequests.remove(cookie);
+ return m_daemon->lockHandler()->releaseInhibiton(cookie);
}
void PowerManagementConnector::_k_stateChanged(int battery, bool plugged)
{
+ Q_UNUSED(battery)
emit PowerSaveStatusChanged(!plugged);
}
--- trunk/KDE/kdebase/workspace/powerdevil/daemon/PowerManagementConnector.h \
#866446:866447 @@ -1,5 +1,6 @@
/***************************************************************************
* Copyright (C) 2008 by Kevin Ottens <ervin@kde.org> *
+ * Copyright (C) 2008 by Dario Freddi <drf@kdemod.ath.cx> *
* *
* 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 *
@@ -28,13 +29,6 @@
#include "PowerDevilDaemon.h"
-class InhibitRequest
-{
-public:
- QString application;
- QString reason;
-};
-
class PowerManagementConnector : public QObject
{
Q_OBJECT
@@ -68,8 +62,7 @@
private:
PowerDevilDaemon *m_daemon;
- int m_latestInhibitCookie;
- QMap<int, InhibitRequest> m_inhibitRequests;
+
};
#endif /*POWERMANAGEMENTCONNECTOR_H*/
--- trunk/KDE/kdebase/workspace/powerdevil/daemon/SuspensionLockHandler.cpp \
#866446:866447 @@ -1,5 +1,6 @@
/***************************************************************************
* Copyright (C) 2008 by Dario Freddi <drf@kdemod.ath.cx> *
+ * Copyright (C) 2008 by Kevin Ottens <ervin@kde.org> *
* *
* 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 *
@@ -20,11 +21,13 @@
#include "SuspensionLockHandler.h"
#include <KDebug>
+#include <klocalizedstring.h>
SuspensionLockHandler::SuspensionLockHandler(QObject *parent)
: QObject(parent),
m_isJobOngoing(false),
- m_isOnNotification(false)
+ m_isOnNotification(false),
+ m_latestInhibitCookie(0)
{
}
@@ -34,11 +37,19 @@
bool SuspensionLockHandler::canStartSuspension()
{
+ if (hasInhibit()) {
+ return false;
+ }
+
return !m_isJobOngoing;
}
bool SuspensionLockHandler::canStartNotification()
{
+ if (hasInhibit()) {
+ return false;
+ }
+
if (!m_isJobOngoing && !m_isOnNotification) {
return true;
} else {
@@ -46,6 +57,22 @@
}
}
+bool SuspensionLockHandler::hasInhibit()
+{
+ if (m_inhibitRequests.isEmpty()) {
+ return false;
+ } else {
+ kDebug() << "Inhibition detected!!";
+ // TODO: uhm... maybe a better notification here?
+ emit streamCriticalNotification("inhibition", i18n("The application %1 "
+ "is inhibiting suspension for the following \
reason:\n%2", + \
m_inhibitRequests[m_latestInhibitCookie].application, + \
m_inhibitRequests[m_latestInhibitCookie].reason), + \
0, "dialog-cancel"); + return true;
+ }
+}
+
bool SuspensionLockHandler::setNotificationLock()
{
if (!canStartNotification()) {
@@ -70,6 +97,19 @@
return true;
}
+int SuspensionLockHandler::inhibit(const QString &application, const QString \
&reason) +{
+ m_latestInhibitCookie++;
+
+ InhibitRequest req;
+ //TODO: Keep track of the service name too, to cleanup cookie in case of a \
crash. + req.application = application;
+ req.reason = reason;
+ m_inhibitRequests[m_latestInhibitCookie] = req;
+
+ return m_latestInhibitCookie;
+}
+
void SuspensionLockHandler::releaseNotificationLock()
{
kDebug() << "Releasing notification lock";
@@ -85,12 +125,12 @@
void SuspensionLockHandler::releaseAllInhibitions()
{
-
+ m_inhibitRequests.clear();
}
-void SuspensionLockHandler::releaseInhibiton(const QString &id)
+void SuspensionLockHandler::releaseInhibiton(int cookie)
{
-
+ m_inhibitRequests.remove(cookie);
}
#include "SuspensionLockHandler.moc"
--- trunk/KDE/kdebase/workspace/powerdevil/daemon/SuspensionLockHandler.h \
#866446:866447 @@ -1,5 +1,6 @@
/***************************************************************************
* Copyright (C) 2008 by Dario Freddi <drf@kdemod.ath.cx> *
+ * Copyright (C) 2008 by Kevin Ottens <ervin@kde.org> *
* *
* 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 *
@@ -21,7 +22,15 @@
#define SUSPENSIONLOCKHANDLER_H
#include <QObject>
+#include <QMap>
+class InhibitRequest
+{
+public:
+ QString application;
+ QString reason;
+};
+
class SuspensionLockHandler : public QObject
{
Q_OBJECT
@@ -34,17 +43,28 @@
bool canStartSuspension();
bool canStartNotification();
+ bool hasInhibit();
+
bool setNotificationLock();
bool setJobLock();
+ int inhibit(const QString &application, const QString &reason);
+
void releaseAllLocks();
void releaseNotificationLock();
void releaseAllInhibitions();
- void releaseInhibiton(const QString &id = QString());
+ void releaseInhibiton(int cookie);
+signals:
+ void streamCriticalNotification(const QString &evid, const QString &message,
+ const char *slot, const QString &iconname);
+
private:
bool m_isJobOngoing;
bool m_isOnNotification;
+
+ int m_latestInhibitCookie;
+ QMap<int, InhibitRequest> m_inhibitRequests;
};
#endif /* SUSPENSIONLOCKHANDLER_H */
--- trunk/KDE/kdebase/workspace/powerdevil/powerdevil.notifyrc #866446:866447
@@ -478,3 +478,10 @@
Contexts=criticalnot
Sound=KDE-Sys-App-Error-Critical.ogg
Action=Sound|Popup
+
+[Event/inhibition]
+Name=Suspension inhibited
+Comment=The suspension has been inhibited because an application requested it
+Contexts=criticalnot
+Sound=KDE-Sys-App-Error-Critical.ogg
+Action=Sound|Popup
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic