summaryrefslogtreecommitdiffstats
path: root/opensuse/core/tdebase/ksmserver-suspend.diff
diff options
context:
space:
mode:
Diffstat (limited to 'opensuse/core/tdebase/ksmserver-suspend.diff')
-rw-r--r--opensuse/core/tdebase/ksmserver-suspend.diff233
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