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.
332 lines
11 KiB
332 lines
11 KiB
Index: kdm/backend/ctrl.c
|
|
===================================================================
|
|
--- kdm/backend/ctrl.c.orig
|
|
+++ kdm/backend/ctrl.c
|
|
@@ -483,6 +483,10 @@ processCtrl( const char *string, int len
|
|
Reply( "nuke\t" );
|
|
}
|
|
}
|
|
+ if (d->allowSuspend != SHUT_NONE) {
|
|
+ Reply( "suspend\t" );
|
|
+ }
|
|
+
|
|
if ((d->displayType & d_location) == dLocal &&
|
|
AnyReserveDisplays())
|
|
Writer( fd, cbuf, sprintf( cbuf, "reserve %d\t",
|
|
Index: kdm/backend/greet.h
|
|
===================================================================
|
|
--- kdm/backend/greet.h.orig
|
|
+++ kdm/backend/greet.h
|
|
@@ -125,6 +125,7 @@ from the copyright holder.
|
|
# define SHUT_REBOOT 1 /* how */
|
|
# define SHUT_HALT 2
|
|
# define SHUT_CONSOLE -1 /* pseudo-code */
|
|
+# define SHUT_SUSPEND -2 /* pseudo-code */
|
|
# define SHUT_SCHEDULE 0 /* when; config only */
|
|
# define SHUT_TRYNOW 1
|
|
# define SHUT_FORCENOW 2
|
|
Index: kdm/config.def
|
|
===================================================================
|
|
--- kdm/config.def.orig
|
|
+++ kdm/config.def
|
|
@@ -1799,6 +1799,19 @@ Description:
|
|
Who is allowed to shut down the system. This applies both to the
|
|
greeter and to the command <acronym>FiFo</acronym>.
|
|
|
|
+Key: AllowSuspend
|
|
+Type: enum
|
|
+ None/SHUT_NONE: no <guilabel>Suspend...</guilabel> menu entry is shown at all
|
|
+ Root/SHUT_ROOT: the <systemitem class="username">root</systemitem> password must be entered to suspend
|
|
+ All/SHUT_ALL: everybody can suspend the machine
|
|
+Default: Root
|
|
+User: greeter
|
|
+User: core
|
|
+Instance: #:0/All
|
|
+Comment: &
|
|
+Description:
|
|
+ If the user should have an option to suspend the system if configured to (also in the desktop)
|
|
+
|
|
Key: AllowSdForceNow
|
|
Type: enum
|
|
None: no forced shutdown is allowed at all
|
|
Index: kdm/kfrontend/kdmshutdown.cpp
|
|
===================================================================
|
|
--- kdm/kfrontend/kdmshutdown.cpp.orig
|
|
+++ kdm/kfrontend/kdmshutdown.cpp
|
|
@@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fi
|
|
|
|
*/
|
|
|
|
+#include <liblazy.h>
|
|
#include "kdmshutdown.h"
|
|
#include "kdm_greet.h"
|
|
|
|
@@ -34,6 +35,7 @@ Foundation, Inc., 51 Franklin Street, Fi
|
|
#include <kdialog.h>
|
|
#include <kstandarddirs.h>
|
|
#include <kuser.h>
|
|
+#include <kdebug.h>
|
|
|
|
#include <qcombobox.h>
|
|
#include <qvbuttongroup.h>
|
|
@@ -57,6 +59,10 @@ Foundation, Inc., 51 Franklin Street, Fi
|
|
int KDMShutdownBase::curPlugin = -1;
|
|
PluginList KDMShutdownBase::pluginList;
|
|
|
|
+#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"
|
|
+
|
|
KDMShutdownBase::KDMShutdownBase( int _uid, QWidget *_parent )
|
|
: inherited( _parent )
|
|
, box( new QVBoxLayout( this, KDmh, KDsh ) )
|
|
@@ -71,6 +77,7 @@ KDMShutdownBase::KDMShutdownBase( int _u
|
|
, verify( 0 )
|
|
, needRoot( -1 )
|
|
, uid( _uid )
|
|
+ , willSuspend( false )
|
|
{
|
|
}
|
|
|
|
@@ -87,6 +94,7 @@ KDMShutdownBase::complete( QWidget *prev
|
|
|
|
if (uid &&
|
|
((willShut && _allowShutdown == SHUT_ROOT) ||
|
|
+ ( willSuspend && _allowSuspend == SHUT_ROOT ) ||
|
|
(mayNuke && _allowNuke == SHUT_ROOT)))
|
|
{
|
|
rootlab = new QLabel( i18n("Root authorization required."), this );
|
|
@@ -169,6 +177,7 @@ KDMShutdownBase::updateNeedRoot()
|
|
{
|
|
int nNeedRoot = uid &&
|
|
(((willShut && _allowShutdown == SHUT_ROOT) ||
|
|
+ ( willSuspend && _allowSuspend == SHUT_ROOT ) ||
|
|
(_allowNuke == SHUT_ROOT && doesNuke)));
|
|
if (verify && nNeedRoot != needRoot) {
|
|
if (needRoot == 1)
|
|
@@ -425,7 +434,7 @@ KDMRadioButton::mouseDoubleClickEvent( Q
|
|
|
|
|
|
KDMDelayedPushButton::KDMDelayedPushButton( const KGuiItem &item,
|
|
- QWidget *parent,
|
|
+ QWidget *parent,
|
|
const char *name )
|
|
: inherited( item, parent, name )
|
|
, pop( 0 )
|
|
@@ -490,6 +499,57 @@ KDMSlimShutdown::KDMSlimShutdown( QWidge
|
|
buttonlay->addWidget( btnReboot );
|
|
connect( btnReboot, SIGNAL(clicked()), SLOT(slotReboot()) );
|
|
|
|
+ if ( _allowSuspend != SHUT_NONE )
|
|
+ {
|
|
+ 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_polkit_is_user_allowed_by_uid(0, "hal-power-hibernate", NULL) != 1)
|
|
+ suspend_disk = false;
|
|
+ if (liblazy_polkit_is_user_allowed_by_uid(0, "hal-power-suspend", NULL) != 1)
|
|
+ suspend_ram = false;
|
|
+ if (liblazy_polkit_is_user_allowed_by_uid(0, "hal-power-standby", NULL) != 1)
|
|
+ standby = false;
|
|
+*/
|
|
+ int sum = standby + suspend_ram + suspend_disk;
|
|
+ if ( sum ) {
|
|
+ buttonlay->addSpacing( KDialog::spacingHint() );
|
|
+
|
|
+ QButton *btnSuspend;
|
|
+ if (sum > 1) {
|
|
+ btnSuspend = new KDMDelayedPushButton( KGuiItem( i18n("&Suspend Computer"), "player_pause"), this );
|
|
+ QPopupMenu *suspends = new QPopupMenu(this);
|
|
+ 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<KDMDelayedPushButton*>(btnSuspend)->setPopup(suspends);
|
|
+ } else {
|
|
+ btnSuspend = new KPushButton( KGuiItem( i18n("&Suspend Computer"), "player_pause"), this );
|
|
+ }
|
|
+ buttonlay->addWidget( btnSuspend );
|
|
+ connect(btnSuspend, SIGNAL(clicked()), SLOT(slotSuspend()));
|
|
+ }
|
|
+ }
|
|
+
|
|
GSet( 1 );
|
|
GSendInt( G_ListBootOpts );
|
|
if (GRecvInt() == BO_OK) {
|
|
@@ -536,6 +596,65 @@ KDMSlimShutdown::~KDMSlimShutdown()
|
|
freeStrArr( targetList );
|
|
}
|
|
|
|
+void KDMSlimShutdown::slotSuspend()
|
|
+{
|
|
+ if (suspend_disk)
|
|
+ slotSuspend( 1 );
|
|
+ else if (suspend_ram)
|
|
+ slotSuspend( 2 );
|
|
+ else if ( standby )
|
|
+ slotSuspend( 3 );
|
|
+ else
|
|
+ reject();
|
|
+}
|
|
+
|
|
+void KDMSlimShutdown::slotSuspend(int id)
|
|
+{
|
|
+ reject();
|
|
+ // dpySpec *sess = fetchSessions( lstRemote | lstTTY );
|
|
+ // it would be nice to show the sessions to suspend, but it
|
|
+ // would require string changes (coolo)
|
|
+ dpySpec *sess = 0;
|
|
+ kdDebug() << "slotSuspend " << _allowSuspend << endl;
|
|
+ if (sess || _allowSuspend == SHUT_ROOT)
|
|
+ {
|
|
+ int ret = KDMConfShutdown( -1, sess, SHUT_SUSPEND, 0 ).exec();
|
|
+ if ( !ret )
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ 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;
|
|
+ }
|
|
+}
|
|
+
|
|
void
|
|
KDMSlimShutdown::slotSched()
|
|
{
|
|
@@ -601,16 +720,27 @@ KDMConfShutdown::KDMConfShutdown( int _u
|
|
if (type == SHUT_CONSOLE)
|
|
willShut = false;
|
|
#endif
|
|
+ QString title;
|
|
+ if ( type == SHUT_HALT)
|
|
+ title = i18n("Turn Off Computer");
|
|
+ else {
|
|
+#ifdef HAVE_VTS
|
|
+ if ( type == SHUT_CONSOLE)
|
|
+ title = i18n("Switch to Console");
|
|
+ else
|
|
+#endif
|
|
+ if ( type == SHUT_SUSPEND ) {
|
|
+ willSuspend = true;
|
|
+ title = i18n( "Suspend Computer" );
|
|
+ }
|
|
+ else
|
|
+ title = i18n("Restart Computer");
|
|
+ }
|
|
+
|
|
box->addWidget( new QLabel( QString( "<qt><center><b><nobr>"
|
|
"%1%2"
|
|
"</nobr></b></center><br></qt>" )
|
|
- .arg( (type == SHUT_HALT) ?
|
|
- i18n("Turn Off Computer") :
|
|
-#ifdef HAVE_VTS
|
|
- (type == SHUT_CONSOLE) ?
|
|
- i18n("Switch to Console") :
|
|
-#endif
|
|
- i18n("Restart Computer") )
|
|
+ .arg( title )
|
|
.arg( os ?
|
|
i18n("<br>(Next boot: %1)")
|
|
.arg( QString::fromLocal8Bit( os ) ) :
|
|
Index: kdm/kfrontend/kdmshutdown.h
|
|
===================================================================
|
|
--- kdm/kfrontend/kdmshutdown.h.orig
|
|
+++ kdm/kfrontend/kdmshutdown.h
|
|
@@ -67,7 +67,7 @@ class KDMShutdownBase : public FDialog,
|
|
#else
|
|
static const bool willShut = true;
|
|
#endif
|
|
- bool mayNuke, doesNuke, mayOk, maySched;
|
|
+ bool mayNuke, doesNuke, mayOk, maySched, willSuspend;
|
|
|
|
private slots:
|
|
void slotSched();
|
|
@@ -118,7 +118,6 @@ class KDMShutdown : public KDMShutdownBa
|
|
QComboBox *targets;
|
|
int oldTarget;
|
|
int sch_st, sch_to;
|
|
-
|
|
};
|
|
|
|
class KDMRadioButton : public QRadioButton {
|
|
@@ -168,10 +167,13 @@ class KDMSlimShutdown : public FDialog {
|
|
void slotReboot();
|
|
void slotReboot( int );
|
|
void slotSched();
|
|
+ void slotSuspend();
|
|
+ void slotSuspend(int);
|
|
|
|
private:
|
|
bool checkShutdown( int type, const char *os );
|
|
char **targetList;
|
|
+ bool suspend_disk, suspend_ram, standby;
|
|
|
|
};
|
|
|
|
Index: kdm/kfrontend/Makefile.am
|
|
===================================================================
|
|
--- kdm/kfrontend/Makefile.am.orig
|
|
+++ kdm/kfrontend/Makefile.am
|
|
@@ -4,7 +4,7 @@ GENKDMCONF_FLAGS =
|
|
SUBDIRS = themer themes pics sessions
|
|
|
|
AM_CPPFLAGS = -I$(srcdir)/../backend -I.. -I$(top_srcdir)/kcontrol/background \
|
|
- -I$(top_srcdir)/kdmlib $(all_includes)
|
|
+ -I$(top_srcdir)/kdmlib $(all_includes) $(DBUS_INCS)
|
|
|
|
bin_PROGRAMS = kdm_config kdm_greet krootimage genkdmconf kdmctl
|
|
|
|
@@ -25,7 +25,7 @@ kdm_greet_SOURCES = \
|
|
kgreeter.cpp \
|
|
kgapp.cpp
|
|
kdm_greet_LDFLAGS = $(all_libraries) $(KDE_RPATH)
|
|
-kdm_greet_LDADD = themer/libkdmthemer.a $(LIB_KDEUI) $(XTESTLIB) $(LIBPOSIX4)
|
|
+kdm_greet_LDADD = themer/libkdmthemer.a $(LIB_KDEUI) $(XTESTLIB) $(LIBPOSIX4) -llazy $(DBUS_LIBS)
|
|
|
|
krootimage_SOURCES = krootimage.cpp
|
|
krootimage_LDFLAGS = $(all_libraries) $(KDE_RPATH)
|