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.
234 lines
7.2 KiB
234 lines
7.2 KiB
14 years ago
|
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
|