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/core/tdebase/ksmserver-suspend.diff

234 lines
7.2 KiB

Index: ksmserver/Makefile.am
===================================================================
--- ksmserver/Makefile.am.orig
+++ ksmserver/Makefile.am
@@ -17,7 +17,7 @@
SUBDIRS = .
-INCLUDES= -I$(top_srcdir)/kdmlib $(all_includes)
+INCLUDES= -I$(top_srcdir)/kdmlib $(all_includes) $(DBUS_INCS)
bin_PROGRAMS =
lib_LTLIBRARIES =
@@ -31,7 +31,7 @@ ksmserver_la_SOURCES = main.cpp server.c
KSMServerInterface.skel server.skel
ksmserver_la_LDFLAGS = $(all_libraries) -avoid-version -module
-ksmserver_la_LIBADD = ../kdmlib/libdmctl.la $(LIB_KDEUI)
+ksmserver_la_LIBADD = ../kdmlib/libdmctl.la $(LIB_KDEUI) -llazy $(DBUS_LIBS)
picsdir = $(kde_datadir)/ksmserver/pics
pics_DATA = shutdownkonq.png
@@ -44,7 +44,7 @@ updatedir = $(kde_datadir)/kconf_update
EXTRA_PROGRAMS = testsh
testsh_SOURCES = test.cpp
testsh_LDFLAGS = $(all_libraries) $(KDE_RPATH)
-testsh_LDADD = $(LIB_KDEUI) shutdowndlg.lo ../kdmlib/libdmctl.la
+testsh_LDADD = $(LIB_KDEUI) shutdowndlg.lo ../kdmlib/libdmctl.la -llazy $(DBUS_LIBS)
messages:
$(XGETTEXT) *.cpp -o $(podir)/ksmserver.pot
Index: ksmserver/shutdowndlg.cpp
===================================================================
--- ksmserver/shutdowndlg.cpp.orig
+++ ksmserver/shutdowndlg.cpp
@@ -38,17 +38,23 @@ Copyright (C) 2000 Matthias Ettrich <ett
#include <kpixmapeffect.h>
#include <kdialog.h>
#include <kseparator.h>
+#include <kmessagebox.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <stdlib.h>
#include <dmctl.h>
+#include <liblazy.h>
#include <X11/Xlib.h>
#include "shutdowndlg.moc"
+#define DBUS_HAL_INTERFACE "org.freedesktop.Hal"
+#define DBUS_HAL_SYSTEM_POWER_INTERFACE "org.freedesktop.Hal.Device.SystemPowerManagement"
+#define HAL_UDI_COMPUTER "/org/freedesktop/Hal/devices/computer"
+
static const int max_faded = 2300;
static const int slice = 20;
@@ -215,8 +221,8 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget*
connect(btnLogout, SIGNAL(clicked()), SLOT(slotLogout()));
if (maysd) {
-
- // Shutdown
+
+ // Shutdown
KPushButton* btnHalt = new KPushButton( KGuiItem( i18n("&Turn Off Computer"), "exit"), frame );
QToolTip::add( btnHalt, i18n( "<qt><h3>Turn Off Computer</h3><p>Log out of the current session and turn off the computer</p></qt>" ) );
btnHalt->setFont( btnFont );
@@ -251,13 +257,58 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget*
else
targets->insertItem( label, index );
}
-
+
btnReboot->setPopup(targets);
connect( targets, SIGNAL(activated(int)), SLOT(slotReboot(int)) );
} else
QToolTip::add( btnReboot, i18n( "<qt><h3>Restart Computer</h3><p>Log out of the current session and restart the computer</p></qt>" ) );
- }
+ int supported = -1;
+ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_suspend", &supported);
+ if (supported == 1)
+ suspend_ram = true;
+ else
+ suspend_ram = false;
+ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_standby", &supported);
+ if (supported == 1)
+ standby = true;
+ else
+ standby = false;
+ liblazy_hal_get_property_bool(HAL_UDI_COMPUTER, "power_management.can_hibernate", &supported);
+ if (supported == 1)
+ suspend_disk = true;
+ else
+ suspend_disk = false;
+
+ if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.hibernate") != 1)
+ suspend_disk = false;
+ if (liblazy_hal_is_caller_privileged("org.freedesktop.hal.power-management.suspend") != 1)
+ 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 ) {
+ QButton *btnSuspend;
+ if (sum > 1) {
+ btnSuspend = new KSMDelayedPushButton( KGuiItem( i18n("&Suspend Computer"), "player_pause"), frame );
+ QPopupMenu *suspends = new QPopupMenu(frame);
+ if (suspend_disk)
+ suspends->insertItem(i18n("Suspend to Disk"), 1);
+ if (suspend_ram)
+ suspends->insertItem(i18n("Suspend to RAM"), 2);
+ if (standby)
+ suspends->insertItem(i18n("Standby"), 3);
+ connect(suspends, SIGNAL(activated(int)), SLOT(slotSuspend(int)));
+ static_cast<KSMDelayedPushButton*>(btnSuspend)->setPopup(suspends);
+ } else {
+ btnSuspend = new KPushButton( KGuiItem( i18n("&Suspend Computer"), "player_pause"), frame );
+ }
+ btnSuspend->setFont( btnFont );
+ buttonlay->addWidget( btnSuspend );
+ connect(btnSuspend, SIGNAL(clicked()), SLOT(slotSuspend()));
+ }
+ }
buttonlay->addStretch( 1 );
// Separator
@@ -270,6 +321,80 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget*
}
+void KSMShutdownDlg::slotSuspend()
+{
+ int error = 0;
+ int wake = 0;
+ DBusMessage *reply;
+
+ if (suspend_disk)
+ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE,
+ HAL_UDI_COMPUTER,
+ DBUS_HAL_SYSTEM_POWER_INTERFACE,
+ "Hibernate",
+ &reply,
+ DBUS_TYPE_INVALID);
+ else if (suspend_ram)
+ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE,
+ HAL_UDI_COMPUTER,
+ DBUS_HAL_SYSTEM_POWER_INTERFACE,
+ "Suspend",
+ &reply,
+ DBUS_TYPE_INT32,
+ &wake,
+ DBUS_TYPE_INVALID);
+ else
+ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE,
+ HAL_UDI_COMPUTER,
+ DBUS_HAL_SYSTEM_POWER_INTERFACE,
+ "Standby",
+ &reply,
+ DBUS_TYPE_INVALID);
+
+ if (error)
+ KMessageBox::error(this, i18n("Suspend failed"));
+
+ // possibly after resume :)
+ reject();
+}
+
+void KSMShutdownDlg::slotSuspend(int id)
+{
+ int error = 0;
+ int wake = 0;
+ DBusMessage *reply;
+
+ if (suspend_disk && id == 1) {
+ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE,
+ HAL_UDI_COMPUTER,
+ DBUS_HAL_SYSTEM_POWER_INTERFACE,
+ "Hibernate",
+ &reply,
+ DBUS_TYPE_INVALID);
+ } else if (suspend_ram && id == 2)
+ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE,
+ HAL_UDI_COMPUTER,
+ DBUS_HAL_SYSTEM_POWER_INTERFACE,
+ "Suspend",
+ &reply,
+ DBUS_TYPE_INT32,
+ &wake,
+ DBUS_TYPE_INVALID);
+ else if (standby && id == 3)
+ error = liblazy_dbus_system_send_method_call(DBUS_HAL_INTERFACE,
+ HAL_UDI_COMPUTER,
+ DBUS_HAL_SYSTEM_POWER_INTERFACE,
+ "Standby",
+ &reply,
+ DBUS_TYPE_INVALID);
+ else
+ return;
+ if (error)
+ KMessageBox::error(this, i18n("Suspend failed"));
+
+ // possibly after resume :)
+ reject();
+}
void KSMShutdownDlg::slotLogout()
{
Index: ksmserver/shutdowndlg.h
===================================================================
--- ksmserver/shutdowndlg.h.orig
+++ ksmserver/shutdowndlg.h
@@ -60,6 +60,8 @@ public slots:
void slotHalt();
void slotReboot();
void slotReboot(int);
+ void slotSuspend();
+ void slotSuspend(int);
protected:
~KSMShutdownDlg() {};
@@ -70,6 +72,7 @@ private:
QString m_bootOption;
QPopupMenu *targets;
QStringList rebootOptions;
+ bool suspend_disk, suspend_ram, standby;
};
class KSMDelayedPushButton : public KPushButton