diff options
Diffstat (limited to 'tdecore/tdehw/tderootsystemdevice.cpp')
-rw-r--r-- | tdecore/tdehw/tderootsystemdevice.cpp | 161 |
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; |