26 #include <QtCore/QCoreApplication>
31 : managerIface("org.freedesktop.PowerManagement",
32 "/org/freedesktop/PowerManagement",
33 QDBusConnection::sessionBus()),
34 policyAgentIface("org.kde.Solid.PowerManagement.PolicyAgent",
35 "/org/kde/Solid/PowerManagement/PolicyAgent",
36 QDBusConnection::sessionBus()),
37 inhibitIface("org.freedesktop.PowerManagement.Inhibit",
38 "/org/freedesktop/PowerManagement/Inhibit",
39 QDBusConnection::sessionBus()),
40 serviceWatcher("org.kde.Solid.PowerManagement",
41 QDBusConnection::sessionBus(),
42 QDBusServiceWatcher::WatchForRegistration | QDBusServiceWatcher::WatchForUnregistration),
43 powerSaveStatus(false)
45 serviceWatcher.addWatchedService(QLatin1String(
"org.freedesktop.PowerManagement"));
47 connect(&managerIface, SIGNAL(CanSuspendChanged(
bool)),
48 this, SLOT(slotCanSuspendChanged(
bool)));
49 connect(&managerIface, SIGNAL(CanHibernateChanged(
bool)),
50 this, SLOT(slotCanHibernateChanged(
bool)));
51 connect(&managerIface, SIGNAL(PowerSaveStatusChanged(
bool)),
52 this, SLOT(slotPowerSaveStatusChanged(
bool)));
53 connect(&serviceWatcher, SIGNAL(serviceRegistered(QString)),
54 this, SLOT(slotServiceRegistered(QString)));
55 connect(&serviceWatcher, SIGNAL(serviceUnregistered(QString)),
56 this, SLOT(slotServiceUnregistered(QString)));
59 if (QDBusConnection::sessionBus().interface()->isServiceRegistered(
"org.kde.Solid.PowerManagement")) {
60 slotServiceRegistered(
"org.kde.Solid.PowerManagement");
62 if (QDBusConnection::sessionBus().interface()->isServiceRegistered(QLatin1String(
"org.freedesktop.PowerManagement"))) {
63 slotServiceRegistered(QLatin1String(
"org.freedesktop.PowerManagement"));
77 return globalPowerManager->managerIface.GetPowerSaveStatus();
82 return globalPowerManager->supportedSleepStates;
90 if (!globalPowerManager->supportedSleepStates.contains(state)) {
99 globalPowerManager->managerIface.Suspend();
102 globalPowerManager->managerIface.Hibernate();
109 QDBusReply<uint> reply;
110 if (globalPowerManager->policyAgentIface.isValid()) {
111 reply = globalPowerManager->policyAgentIface.AddInhibition(
113 QCoreApplication::applicationName(), reason);
116 reply = globalPowerManager->inhibitIface.Inhibit(QCoreApplication::applicationName(), reason);
127 if (globalPowerManager->policyAgentIface.isValid()) {
128 return globalPowerManager->policyAgentIface.ReleaseInhibition(cookie).isValid();
131 return globalPowerManager->inhibitIface.UnInhibit(cookie).isValid();
137 if (globalPowerManager->policyAgentIface.isValid()) {
138 QDBusReply<uint> reply = globalPowerManager->policyAgentIface.AddInhibition(
140 QCoreApplication::applicationName(), reason);
142 if (reply.isValid()) {
143 QDBusMessage message = QDBusMessage::createMethodCall(
"org.freedesktop.ScreenSaver",
"/ScreenSaver",
144 "org.freedesktop.ScreenSaver",
"Inhibit");
145 message << QCoreApplication::applicationName();
148 QDBusPendingReply<uint> ssReply = QDBusConnection::sessionBus().asyncCall(message);
149 ssReply.waitForFinished();
150 if (ssReply.isValid()) {
151 globalPowerManager->screensaverCookiesForPowerDevilCookies.insert(reply, ssReply.value());
166 if (globalPowerManager->policyAgentIface.isValid()) {
167 bool result = globalPowerManager->policyAgentIface.ReleaseInhibition(cookie).isValid();
169 if (globalPowerManager->screensaverCookiesForPowerDevilCookies.contains(cookie)) {
170 QDBusMessage message = QDBusMessage::createMethodCall(
"org.freedesktop.ScreenSaver",
"/ScreenSaver",
171 "org.freedesktop.ScreenSaver",
"UnInhibit");
172 message << globalPowerManager->screensaverCookiesForPowerDevilCookies.take(cookie);
173 QDBusConnection::sessionBus().asyncCall(message);
185 return globalPowerManager;
216 if (powerSaveStatus == newState) {
220 powerSaveStatus = newState;
221 emit appShouldConserveResourcesChanged(powerSaveStatus);
226 if (serviceName == QLatin1String(
"org.freedesktop.PowerManagement")) {
228 QDBusPendingReply<bool> suspendReply = managerIface.CanSuspend();
229 suspendReply.waitForFinished();
230 slotCanSuspendChanged(suspendReply.isValid() ? suspendReply.value() :
false);
232 QDBusPendingReply<bool> hibernateReply = managerIface.CanHibernate();
233 hibernateReply.waitForFinished();
234 slotCanHibernateChanged(hibernateReply.isValid() ? hibernateReply.value() :
false);
236 QDBusPendingReply<bool> saveStatusReply = managerIface.GetPowerSaveStatus();
237 saveStatusReply.waitForFinished();
238 slotPowerSaveStatusChanged(saveStatusReply.isValid() ? saveStatusReply.value() :
false);
241 QDBusMessage call = QDBusMessage::createMethodCall(
"org.kde.Solid.PowerManagement",
242 "/org/kde/Solid/PowerManagement",
243 "org.kde.Solid.PowerManagement",
244 "backendCapabilities");
245 QDBusPendingReply< uint > reply = QDBusConnection::sessionBus().asyncCall(call);
246 reply.waitForFinished();
248 if (reply.isValid() && reply.value() > 0) {
250 QDBusConnection::sessionBus().connect(
"org.kde.Solid.PowerManagement",
251 "/org/kde/Solid/PowerManagement",
252 "org.kde.Solid.PowerManagement",
253 "resumingFromSuspend",
255 SIGNAL(resumingFromSuspend()));
262 if (serviceName == QLatin1String(
"org.freedesktop.PowerManagement")) {
264 slotCanSuspendChanged(
false);
265 slotCanHibernateChanged(
false);
266 slotPowerSaveStatusChanged(
false);
269 QDBusConnection::sessionBus().disconnect(QLatin1String(
"org.kde.Solid.PowerManagement"),
270 QLatin1String(
"/org/kde/Solid/PowerManagement"),
271 QLatin1String(
"org.kde.Solid.PowerManagement"),
272 QLatin1String(
"resumingFromSuspend"),
274 SIGNAL(resumingFromSuspend()));
278 #include "powermanagement_p.moc"
279 #include "powermanagement.moc"