[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