summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-14 00:55:22 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-01-14 00:55:22 -0600
commitd3264970c374983ec6f7b55f468334e80513fae3 (patch)
tree07379c8ad25171a1ac55461ee237c6c00c38df37
parent4c9ff70f806c4e8f2f6197b94db39b5bef8c71f2 (diff)
downloadtdelibs-d3264970c374983ec6f7b55f468334e80513fae3.tar.gz
tdelibs-d3264970c374983ec6f7b55f468334e80513fae3.zip
Use upower for suspend and hibernate if direct access to sysfs is not allowed
-rw-r--r--CMakeLists.txt1
-rw-r--r--tdecore/CMakeLists.txt7
-rw-r--r--tdecore/tdehardwaredevices.cpp81
3 files changed, 88 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 74f783b02..37a05bf5c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -83,6 +83,7 @@ OPTION( WITH_PCRE "Enable pcre regex support for kjs" ON )
OPTION( WITH_GCC_VISIBILITY "Enable fvisibility and fvisibility-inlines-hidden" ${WITH_ALL_OPTIONS} )
OPTION( WITH_INOTIFY "Enable inotify support for kio" ON )
OPTION( WITH_GAMIN "Enable FAM/GAMIN support" ${WITH_ALL_OPTIONS} )
+option( WITH_UPOWER "Enable UPOWER support" ${WITH_ALL_OPTIONS} )
OPTION( WITH_NETWORK_MANAGER_BACKEND "Enable network-manager support" OFF )
OPTION( WITH_SUDO_TDESU_BACKEND "Use sudo as backend for tdesu (default is su)" OFF )
diff --git a/tdecore/CMakeLists.txt b/tdecore/CMakeLists.txt
index 2e00d6afa..f0ea3b5b4 100644
--- a/tdecore/CMakeLists.txt
+++ b/tdecore/CMakeLists.txt
@@ -14,6 +14,13 @@ add_subdirectory( network )
add_subdirectory( kconfig_compiler )
add_subdirectory( hwlibdata )
+if( NOT DBUS_SYSTEM_BUS )
+ set( DBUS_SYSTEM_BUS "unix:path=/var/run/dbus/system_bus_socket" CACHE INTERNAL "" FORCE )
+endif()
+
+if( WITH_UPOWER )
+ add_definitions( -DWITH_UPOWER )
+endif( )
if( WITH_LIBART )
add_subdirectory( svgicons )
diff --git a/tdecore/tdehardwaredevices.cpp b/tdecore/tdehardwaredevices.cpp
index c0c97679a..b69c40d45 100644
--- a/tdecore/tdehardwaredevices.cpp
+++ b/tdecore/tdehardwaredevices.cpp
@@ -63,7 +63,16 @@
#include "config.h"
#ifdef WITH_NETWORK_MANAGER_BACKEND
-#include "networkbackends/network-manager/network-manager.h"
+ #include "networkbackends/network-manager/network-manager.h"
+#endif // WITH_NETWORK_MANAGER_BACKEND
+
+// uPower integration
+#ifdef WITH_UPOWER
+ #include <tqdbusdata.h>
+ #include <tqdbusmessage.h>
+ #include <tqdbusproxy.h>
+ #include <tqdbusvariant.h>
+ #include <tqdbusconnection.h>
#endif // WITH_NETWORK_MANAGER_BACKEND
// BEGIN BLOCK
@@ -1113,7 +1122,25 @@ bool TDERootSystemDevice::canSuspend() {
}
}
else {
+#ifdef WITH_UPOWER
+ TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
+ if (dbusConn.isConnected()) {
+ TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn);
+
+ // can suspend?
+ TQValueList<TQT_DBusData> params;
+ params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend");
+ TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params);
+ if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
+ return reply[0].toVariant().value.toBool();
+ }
+ }
+ else {
+ return FALSE;
+ }
+#else // WITH_UPOWER
return FALSE;
+#endif// WITH_UPOWER
}
}
@@ -1129,7 +1156,25 @@ bool TDERootSystemDevice::canHibernate() {
}
}
else {
+#ifdef WITH_UPOWER
+ TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
+ if (dbusConn.isConnected()) {
+ TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn);
+
+ // can hibernate?
+ TQValueList<TQT_DBusData> params;
+ params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
+ TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params);
+ if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
+ return reply[0].toVariant().value.toBool();
+ }
+ }
+ else {
+ return FALSE;
+ }
+#else // WITH_UPOWER
return FALSE;
+#endif// WITH_UPOWER
}
}
@@ -1196,6 +1241,40 @@ bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState
file.close();
return true;
}
+ else {
+#ifdef WITH_UPOWER
+ TQT_DBusConnection dbusConn;
+ dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
+ if ( dbusConn.isConnected() ) {
+ if (ps == TDESystemPowerState::Suspend) {
+ TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
+ "org.freedesktop.UPower",
+ "/org/freedesktop/UPower",
+ "org.freedesktop.UPower",
+ "Suspend");
+ dbusConn.sendWithReply(msg);
+ return true;
+ }
+ else if (ps == TDESystemPowerState::Hibernate) {
+ TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
+ "org.freedesktop.UPower",
+ "/org/freedesktop/UPower",
+ "org.freedesktop.UPower",
+ "Hibernate");
+ dbusConn.sendWithReply(msg);
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+ else {
+ return false;
+ }
+#else // WITH_UPOWER
+ return false;
+#endif // WITH_UPOWER
+ }
}
else if (ps == TDESystemPowerState::PowerOff) {
// Power down the system using a DCOP command