Added support for hybrid suspend (aka suspend to RAM + suspend to disk) to

Kickoff menu + some code improvements. This relates to bug 2601.

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
pull/2/head
Michele Calgaro 8 years ago
parent b49194171a
commit fb91cbd8db

@ -140,6 +140,17 @@
#define DOC_ID_BASE 10 + (IDS_PER_CATEGORY * 12)
#define OTHER_ID_BASE 10 + (IDS_PER_CATEGORY * 13)
namespace SuspendType {
enum SuspendType {
NotSpecified = 0,
Freeze,
Standby,
Suspend,
Hibernate,
HybridSuspend
};
};
static TQString calculate(const TQString &exp)
{
TQString result, cmd;
@ -2725,17 +2736,20 @@ void KMenu::slotStartURL(const TQString& u)
kapp->dcopClient()->send("ksmserver", "default", "logoutTimed(int,int,TQString)", params);
}
else if ( u == "kicker:/suspend_disk" ) {
slotSuspend( 1 );
else if ( u == "kicker:/suspend_freeze" ) {
slotSuspend( SuspendType::Freeze );
}
else if ( u == "kicker:/standby" ) {
slotSuspend( SuspendType::Standby );
}
else if ( u == "kicker:/suspend_ram" ) {
slotSuspend( 2 );
slotSuspend( SuspendType::Suspend );
}
else if ( u == "kicker:/suspend_freeze" ) {
slotSuspend( 4 );
else if ( u == "kicker:/suspend_disk" ) {
slotSuspend( SuspendType::Hibernate );
}
else if ( u == "kicker:/standby" ) {
slotSuspend( 3 );
else if ( u == "kicker:/hybrid_suspend" ) {
slotSuspend( SuspendType::HybridSuspend );
}
else if ( u == "kicker:/savesession" ) {
TQByteArray data;
@ -3800,6 +3814,7 @@ void KMenu::insertSuspendOption( int &nId, int &index )
bool suspend_freeze = false;
bool standby = false;
bool suspend_disk = false;
bool hybrid_suspend = false;
#if defined(COMPILE_HALBACKEND)
suspend_ram = libhal_device_get_property_bool(m_halCtx,
"/org/freedesktop/Hal/devices/computer",
@ -3815,6 +3830,11 @@ void KMenu::insertSuspendOption( int &nId, int &index )
"/org/freedesktop/Hal/devices/computer",
"power_management.can_hibernate",
NULL);
hybrid_suspend = libhal_device_get_property_bool(m_halCtx,
"/org/freedesktop/Hal/devices/computer",
"power_management.can_suspend_hybrid",
NULL);
#elif defined(__TDE_HAVE_TDEHWLIB) // COMPILE_HALBACKEND
TDERootSystemDevice* rootDevice = TDEGlobal::hardwareDevices()->rootSystemDevice();
if (rootDevice) {
@ -3822,20 +3842,31 @@ void KMenu::insertSuspendOption( int &nId, int &index )
suspend_freeze = rootDevice->canFreeze();
standby = rootDevice->canStandby();
suspend_disk = rootDevice->canHibernate();
hybrid_suspend = rootDevice->canHybridSuspend();
}
#endif
m_exitView->leftView()->insertSeparator( nId++, i18n("Suspend"), index++ );
// respect disable suspend/hibernate settings from power-manager
TDEConfig config("power-managerrc");
bool disableSuspend = config.readBoolEntry("disableSuspend", false);
bool disableHibernate = config.readBoolEntry("disableHibernate", false);
if ( suspend_disk && !disableHibernate ) {
if ( suspend_freeze && !disableSuspend ) {
m_exitView->leftView()->insertItem(
"suspend2disk",
i18n( "Suspend to Disk" ),
"suspend2ram",
i18n( "Freeze" ),
i18n( "Pause without logging out" ),
"kicker:/suspend_disk", nId++, index++ );
"kicker:/suspend_freeze", nId++, index++ );
}
if ( standby && !disableSuspend ) {
m_exitView->leftView()->insertItem(
"media-playback-pause",
i18n( "Standby" ),
i18n( "Pause without logging out" ),
"kicker:/standby", nId++, index++ );
}
if ( suspend_ram && !disableSuspend ) {
@ -3846,20 +3877,20 @@ void KMenu::insertSuspendOption( int &nId, int &index )
"kicker:/suspend_ram", nId++, index++ );
}
if ( suspend_freeze && !disableSuspend ) {
if ( suspend_disk && !disableHibernate ) {
m_exitView->leftView()->insertItem(
"suspend2ram",
i18n( "Freeze" ),
"suspend2disk",
i18n( "Suspend to Disk" ),
i18n( "Pause without logging out" ),
"kicker:/suspend_freeze", nId++, index++ );
"kicker:/suspend_disk", nId++, index++ );
}
if ( standby && !disableSuspend ) {
if ( hybrid_suspend && !disableSuspend && !disableHibernate ) {
m_exitView->leftView()->insertItem(
"media-playback-pause",
i18n( "Standby" ),
"suspend2disk",
i18n( "Suspend to RAM + Disk" ),
i18n( "Pause without logging out" ),
"kicker:/standby", nId++, index++ );
"kicker:/hybrid_suspend", nId++, index++ );
}
}
@ -3880,13 +3911,14 @@ void KMenu::slotSuspend(int id)
DBusMessage* msg = NULL;
if (m_dbusConn) {
if (id == 1) {
// No Freeze support in HAL
if (id == SuspendType::Standby) {
msg = dbus_message_new_method_call(
"org.freedesktop.Hal",
"/org/freedesktop/Hal/devices/computer",
"org.freedesktop.Hal.Device.SystemPowerManagement",
"Hibernate");
} else if (id == 2) {
"Standby");
} else if (id == SuspendType::Suspend) {
msg = dbus_message_new_method_call(
"org.freedesktop.Hal",
"/org/freedesktop/Hal/devices/computer",
@ -3894,12 +3926,20 @@ void KMenu::slotSuspend(int id)
"Suspend");
int wakeup=0;
dbus_message_append_args(msg, DBUS_TYPE_INT32, &wakeup, DBUS_TYPE_INVALID);
} else if (id == 3) {
} else if (id == SuspendType::Hibernate) {
msg = dbus_message_new_method_call(
"org.freedesktop.Hal",
"/org/freedesktop/Hal/devices/computer",
"org.freedesktop.Hal.Device.SystemPowerManagement",
"Standby");
"Hibernate");
} else if (id == SuspendType::HybridSuspend) {
msg = dbus_message_new_method_call(
"org.freedesktop.Hal",
"/org/freedesktop/Hal/devices/computer",
"org.freedesktop.Hal.Device.SystemPowerManagement",
"SuspendHybrid");
int wakeup=0;
dbus_message_append_args(msg, DBUS_TYPE_INT32, &wakeup, DBUS_TYPE_INVALID);
} else {
return;
}
@ -3912,14 +3952,16 @@ void KMenu::slotSuspend(int id)
#elif defined(__TDE_HAVE_TDEHWLIB) // COMPILE_HALBACKEND
TDERootSystemDevice* rootDevice = TDEGlobal::hardwareDevices()->rootSystemDevice();
if (rootDevice) {
if (id == 1) {
error = !rootDevice->setPowerState(TDESystemPowerState::Hibernate);
} else if (id == 2) {
error = !rootDevice->setPowerState(TDESystemPowerState::Suspend);
} else if (id == 3) {
error = !rootDevice->setPowerState(TDESystemPowerState::Standby);
} else if (id == 4) {
if (id == SuspendType::Freeze) {
error = !rootDevice->setPowerState(TDESystemPowerState::Freeze);
} else if (id == SuspendType::Standby) {
error = !rootDevice->setPowerState(TDESystemPowerState::Standby);
} else if (id == SuspendType::Suspend) {
error = !rootDevice->setPowerState(TDESystemPowerState::Suspend);
} else if (id == SuspendType::Hibernate) {
error = !rootDevice->setPowerState(TDESystemPowerState::Hibernate);
} else if (id == SuspendType::HybridSuspend) {
error = !rootDevice->setPowerState(TDESystemPowerState::HybridSuspend);
} else {
return;
}

Loading…
Cancel
Save