summaryrefslogtreecommitdiffstats
path: root/tdecore/tdehw/tderootsystemdevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdecore/tdehw/tderootsystemdevice.cpp')
-rw-r--r--tdecore/tdehw/tderootsystemdevice.cpp161
1 files changed, 132 insertions, 29 deletions
diff --git a/tdecore/tdehw/tderootsystemdevice.cpp b/tdecore/tdehw/tderootsystemdevice.cpp
index bbbd63b10..e53342aee 100644
--- a/tdecore/tdehw/tderootsystemdevice.cpp
+++ b/tdecore/tdehw/tderootsystemdevice.cpp
@@ -21,6 +21,7 @@
#include "tdestoragedevice.h"
#include <unistd.h>
+#include <stdlib.h>
#include <tqfile.h>
@@ -657,41 +658,143 @@ void TDERootSystemDevice::setHibernationMethod(TDESystemHibernationMethod::TDESy
}
+bool check_CanSetSuspend(char* state, char* disk, char* mem) {
+ // check if required files are writable
+ bool files_writable = (access("/sys/power/state", W_OK) == 0);
+ if (disk)
+ {
+ files_writable &= (access("/sys/power/disk", W_OK) == 0);
+ }
+ if (mem)
+ {
+ files_writable &= (access("/sys/power/mem_sleep", W_OK) == 0);
+ }
+ if (!files_writable)
+ {
+ return false;
+ }
+
+ // check if method is supported
+ bool result = false;
+ // state
+ FILE *state_node = fopen("/sys/power/state", "r");
+ if (state_node) {
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t read = getline(&line, &len, state_node);
+ if (read > 0 && line) {
+ result = (strstr(line, state) != NULL);
+ free(line);
+ }
+ fclose(state_node);
+ }
+ if (!result)
+ {
+ return false;
+ }
+
+ // disk
+ if (disk)
+ {
+ FILE *disk_node = fopen("/sys/power/disk", "r");
+ if (disk_node) {
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t read = getline(&line, &len, disk_node);
+ if (read > 0 && line) {
+ result &= (strstr(line, disk) != NULL);
+ free(line);
+ }
+ fclose(disk_node);
+ }
+ }
+ if (!result)
+ {
+ return false;
+ }
+
+ // mem_sleep
+ if (mem)
+ {
+ FILE *mem_node = fopen("/sys/power/mem_sleep", "r");
+ if (mem_node) {
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t read = getline(&line, &len, mem_node);
+ if (read > 0 && line) {
+ result &= (strstr(line, mem) != NULL);
+ free(line);
+ }
+ fclose(mem_node);
+ }
+ }
+ return result;
+}
+
bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState ps) {
if ((ps == TDESystemPowerState::Freeze) || (ps == TDESystemPowerState::Standby) ||
(ps == TDESystemPowerState::Suspend) || (ps == TDESystemPowerState::Hibernate) ||
(ps == TDESystemPowerState::HybridSuspend)) {
TQString statenode = "/sys/power/state";
TQString disknode = "/sys/power/disk";
+ TQString memnode = "/sys/power/mem_sleep";
TQFile statefile( statenode );
TQFile diskfile( disknode );
- if ( statefile.open( IO_WriteOnly ) &&
- ((ps != TDESystemPowerState::Hibernate && ps != TDESystemPowerState::HybridSuspend) ||
- diskfile.open( IO_WriteOnly )) ) {
- TQString powerCommand;
- if (ps == TDESystemPowerState::Freeze) {
- powerCommand = "freeze";
+ TQFile memfile( memnode );
+ TQString stateCommand = TQString::null;
+ TQString diskCommand = TQString::null;
+ TQString memCommand = TQString::null;
+ if (ps == TDESystemPowerState::Freeze) {
+ if (check_CanSetSuspend("freeze", NULL, NULL)) {
+ stateCommand = "freeze";
}
- else if (ps == TDESystemPowerState::Standby) {
- powerCommand = "standby";
+ else {
+ stateCommand = "mem";
+ diskCommand = "s2idle";
}
- else if (ps == TDESystemPowerState::Suspend) {
- powerCommand = "mem";
+ }
+ else if (ps == TDESystemPowerState::Standby) {
+ if (check_CanSetSuspend("standby", NULL, NULL)) {
+ stateCommand = "standby";
}
- else if (ps == TDESystemPowerState::Hibernate) {
- powerCommand = "disk";
- TQTextStream diskstream( &diskfile );
- diskstream << "platform";
- diskfile.close();
+ else {
+ stateCommand = "mem";
+ diskCommand = "shallow";
}
- else if (ps == TDESystemPowerState::HybridSuspend) {
- powerCommand = "disk";
- TQTextStream diskstream( &diskfile );
- diskstream << "suspend";
- diskfile.close();
+ }
+ else if (ps == TDESystemPowerState::Suspend) {
+ stateCommand = "mem";
+ if (check_CanSetSuspend("mem", NULL, "deep")) {
+ diskCommand = "deep";
+ }
+ }
+ else if (ps == TDESystemPowerState::HybridSuspend) {
+ stateCommand = "disk";
+ diskCommand = "suspend";
+ }
+ else if (ps == TDESystemPowerState::Hibernate) {
+ stateCommand = "disk";
+ if (check_CanSetSuspend("disk", "shutdown", NULL)) {
+ diskCommand = "shutdown";
+ }
+ else {
+ diskCommand = "platform";
}
+ }
+
+ if (memCommand != TQString::null && memfile.open( IO_WriteOnly )) {
+ TQTextStream memstream( &memfile );
+ memstream << memCommand;
+ memfile.close();
+ }
+ if (diskCommand != TQString::null && diskfile.open( IO_WriteOnly )) {
+ TQTextStream diskstream( &diskfile );
+ diskstream << diskCommand;
+ diskfile.close();
+ }
+ if (stateCommand != TQString::null && statefile.open( IO_WriteOnly )) {
TQTextStream statestream( &statefile );
- statestream << powerCommand;
+ statestream << stateCommand;
statefile.close();
return true;
}
@@ -855,23 +958,23 @@ bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState
TQT_DBusConnection dbusConn;
dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
if ( dbusConn.isConnected() ) {
- if (ps == TDESystemPowerState::Standby) {
+ if (ps == TDESystemPowerState::Freeze) {
TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
"org.trinitydesktop.hardwarecontrol",
"/org/trinitydesktop/hardwarecontrol",
"org.trinitydesktop.hardwarecontrol.Power",
- "Standby");
+ "Freeze");
TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
if (reply.type() == TQT_DBusMessage::ReplyMessage) {
return true;
}
}
- else if (ps == TDESystemPowerState::Freeze) {
+ else if (ps == TDESystemPowerState::Standby) {
TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
"org.trinitydesktop.hardwarecontrol",
"/org/trinitydesktop/hardwarecontrol",
"org.trinitydesktop.hardwarecontrol.Power",
- "Freeze");
+ "Standby");
TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
if (reply.type() == TQT_DBusMessage::ReplyMessage) {
return true;
@@ -888,23 +991,23 @@ bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState
return true;
}
}
- else if (ps == TDESystemPowerState::Hibernate) {
+ else if (ps == TDESystemPowerState::HybridSuspend) {
TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
"org.trinitydesktop.hardwarecontrol",
"/org/trinitydesktop/hardwarecontrol",
"org.trinitydesktop.hardwarecontrol.Power",
- "Hibernate");
+ "HybridSuspend");
TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
if (reply.type() == TQT_DBusMessage::ReplyMessage) {
return true;
}
}
- else if (ps == TDESystemPowerState::HybridSuspend) {
+ else if (ps == TDESystemPowerState::Hibernate) {
TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
"org.trinitydesktop.hardwarecontrol",
"/org/trinitydesktop/hardwarecontrol",
"org.trinitydesktop.hardwarecontrol.Power",
- "HybridSuspend");
+ "Hibernate");
TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
if (reply.type() == TQT_DBusMessage::ReplyMessage) {
return true;