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 #include #include +#include #include #include #include #include #include +#include #include #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( "

Turn Off Computer

Log out of the current session and turn off the computer

" ) ); 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( "

Restart Computer

Log out of the current session and restart the computer

" ) ); - } + 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(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