diff options
Diffstat (limited to 'opensuse/core/tdebase/ksmserver-suspend.diff')
-rw-r--r-- | opensuse/core/tdebase/ksmserver-suspend.diff | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/opensuse/core/tdebase/ksmserver-suspend.diff b/opensuse/core/tdebase/ksmserver-suspend.diff new file mode 100644 index 000000000..ef7a88036 --- /dev/null +++ b/opensuse/core/tdebase/ksmserver-suspend.diff @@ -0,0 +1,233 @@ +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 |