You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-packaging/opensuse/tdebase/suspend-kpowersave.diff

179 lines
5.6 KiB

Subject: Use KPowersave for suspend if available
From: Lubos Lunak
Bug: bnc#326848
Patch-upstream: No
--- kicker/kicker/ui/k_new_mnu.cpp.sav 2008-11-20 10:12:42.000000000 +0100
+++ kicker/kicker/ui/k_new_mnu.cpp 2008-11-20 13:49:20.000000000 +0100
@@ -3691,6 +3691,9 @@ int KMenu::max_items(int category) const
#ifdef KDELIBS_SUSE
#include <liblazy.h>
+
+#include <X11/Xlib.h>
+#include <fixx11h.h>
#endif
void KMenu::insertSuspendOption( int &nId, int &index )
@@ -3699,6 +3702,14 @@ void KMenu::insertSuspendOption( int &nI
int supported = -1;
bool suspend_ram, suspend_disk, standby;
+ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" );
+ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" );
+ if( reply.isValid()) {
+ QStringList supported = reply;
+ suspend_ram = supported.contains( "suspendToRAM" );
+ suspend_disk = supported.contains( "suspendToDisk" );
+ standby = supported.contains( "standBy" );
+ } else {
liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported);
if (supported == 1)
suspend_ram = true;
@@ -3721,6 +3732,7 @@ void KMenu::insertSuspendOption( int &nI
suspend_ram = false;
if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.standby") != 1)
standby = false;
+ }
if ( ! ( standby + suspend_ram + suspend_disk ) )
return;
@@ -3745,6 +3757,25 @@ void KMenu::slotSuspend(int id)
{
#ifdef KDELIBS_SUSE
int error = 0;
+
+ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" );
+ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" );
+ if( reply.isValid()) {
+ bool ok;
+ extern Time qt_x_time;
+ XUngrabKeyboard( qt_xdisplay(), qt_x_time );
+ XUngrabPointer( qt_xdisplay(), qt_x_time );
+ XSync( qt_xdisplay(), False );
+ if( id == 1 )
+ ok = kpowersave.call( "do_suspendToDisk" );
+ else if( id == 2 )
+ ok = kpowersave.call( "do_suspendToRAM" );
+ else if( id == 3 )
+ ok = kpowersave.call( "do_standBy" );
+ else
+ return;
+ error = ok ? 0 : 1;
+ } else {
int wake = 0;
DBusMessage *reply = 0;
@@ -3773,6 +3804,8 @@ void KMenu::slotSuspend(int id)
DBUS_TYPE_INVALID);
else
return;
+ }
+
if (error)
#endif
KMessageBox::error(this, i18n("Suspend failed"));
--- ksmserver/shutdowndlg.cpp.sav 2008-11-20 10:12:41.000000000 +0100
+++ ksmserver/shutdowndlg.cpp 2008-11-20 13:34:19.000000000 +0100
@@ -40,6 +40,7 @@ Copyright (C) 2000 Matthias Ettrich <ett
#include <kdialog.h>
#include <kseparator.h>
#include <kmessagebox.h>
+#include <dcopref.h>
#include <sys/types.h>
#include <sys/utsname.h>
@@ -264,6 +265,14 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget*
} else
QToolTip::add( btnReboot, i18n( "<qt><h3>Restart Computer</h3><p>Log out of the current session and restart the computer</p></qt>" ) );
+ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" );
+ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" );
+ if( reply.isValid()) {
+ QStringList supported = reply;
+ suspend_ram = supported.contains( "suspendToRAM" );
+ suspend_disk = supported.contains( "suspendToDisk" );
+ standby = supported.contains( "standBy" );
+ } else {
int supported = -1;
liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported);
if (supported == 1)
@@ -287,6 +296,7 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget*
suspend_ram = false;
if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.standby") != 1)
standby = false;
+ }
int sum = standby + suspend_ram + suspend_disk;
if ( sum ) {
@@ -325,6 +335,24 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget*
void KSMShutdownDlg::slotSuspend()
{
int error = 0;
+ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" );
+ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" );
+ if( reply.isValid()) {
+ bool ok;
+ // so that screen locking can take place
+ extern Time qt_x_time;
+ XUngrabKeyboard( qt_xdisplay(), qt_x_time );
+ XUngrabPointer( qt_xdisplay(), qt_x_time );
+ XSync( qt_xdisplay(), False );
+ if( suspend_disk )
+ ok = kpowersave.call( "do_suspendToDisk" );
+ else if( suspend_ram )
+ ok = kpowersave.call( "do_suspendToRAM" );
+ else
+ ok = kpowersave.call( "do_standBy" );
+ error = ok ? 0 : 1;
+ } else {
+
int wake = 0;
DBusMessage *reply;
@@ -351,6 +379,7 @@ void KSMShutdownDlg::slotSuspend()
"Standby",
&reply,
DBUS_TYPE_INVALID);
+ }
if (error)
KMessageBox::error(this, i18n("Suspend failed"));
@@ -362,6 +391,27 @@ void KSMShutdownDlg::slotSuspend()
void KSMShutdownDlg::slotSuspend(int id)
{
int error = 0;
+
+ DCOPRef kpowersave( "kpowersave", "KPowersaveIface" );
+ DCOPReply reply = kpowersave.call( "allowed_sleepingStates" );
+ if( reply.isValid()) {
+ bool ok;
+ extern Time qt_x_time;
+ XUngrabKeyboard( qt_xdisplay(), qt_x_time );
+ XUngrabPointer( qt_xdisplay(), qt_x_time );
+ XSync( qt_xdisplay(), False );
+ if( suspend_disk && id == 1 )
+ ok = kpowersave.call( "do_suspendToDisk" );
+ else if( suspend_ram && id == 2 )
+ ok = kpowersave.call( "do_suspendToRAM" );
+ else if( standby && id == 3 )
+ ok = kpowersave.call( "do_standBy" );
+ else
+ return;
+ error = ok ? 0 : 1;
+ } else {
+
+
int wake = 0;
DBusMessage *reply;
@@ -390,6 +440,8 @@ void KSMShutdownDlg::slotSuspend(int id)
DBUS_TYPE_INVALID);
else
return;
+ }
+
if (error)
KMessageBox::error(this, i18n("Suspend failed"));