Fix desktop lock not engaging on suspend

This closes Bug 1003
pull/2/head
Timothy Pearson 12 years ago
parent 2f2f32d31c
commit 193d9afcdb

@ -331,6 +331,10 @@ int main( int argc, char **argv )
} }
else { else {
pid_t kdesktop_pid = atoi(args->getOption( "internal" )); pid_t kdesktop_pid = atoi(args->getOption( "internal" ));
if (kill(kdesktop_pid, SIGUSR2) < 0) {
// The controlling kdesktop process probably died. Commit suicide...
return 12;
}
app.exec(); app.exec();
if (kill(kdesktop_pid, SIGUSR1) < 0) { if (kill(kdesktop_pid, SIGUSR1) < 0) {
// The controlling kdesktop process probably died. Commit suicide... // The controlling kdesktop process probably died. Commit suicide...

@ -37,6 +37,12 @@ static void sigusr1_handler(int)
m_masterSaverEngine->slotLockProcessWaiting(); m_masterSaverEngine->slotLockProcessWaiting();
} }
} }
static void sigusr2_handler(int)
{
if (m_masterSaverEngine) {
m_masterSaverEngine->slotLockProcessFullyActivated();
}
}
//=========================================================================== //===========================================================================
// //
@ -61,6 +67,14 @@ SaverEngine::SaverEngine()
act.sa_flags = 0; act.sa_flags = 0;
sigaction(SIGUSR1, &act, 0L); sigaction(SIGUSR1, &act, 0L);
// handle SIGUSR2
m_masterSaverEngine = this;
act.sa_handler= sigusr2_handler;
sigemptyset(&(act.sa_mask));
sigaddset(&(act.sa_mask), SIGUSR2);
act.sa_flags = 0;
sigaction(SIGUSR2, &act, 0L);
// Save X screensaver parameters // Save X screensaver parameters
XGetScreenSaver(tqt_xdisplay(), &mXTimeout, &mXInterval, XGetScreenSaver(tqt_xdisplay(), &mXTimeout, &mXInterval,
&mXBlanking, &mXExposures); &mXBlanking, &mXExposures);
@ -118,7 +132,7 @@ SaverEngine::~SaverEngine()
void SaverEngine::lock() void SaverEngine::lock()
{ {
bool ok = true; bool ok = true;
if (mState == Waiting) if (mState != Saving)
{ {
mSAKProcess->kill(SIGTERM); mSAKProcess->kill(SIGTERM);
ok = startLockProcess( ForceLock ); ok = startLockProcess( ForceLock );
@ -237,6 +251,27 @@ bool SaverEngine::isBlanked()
return (mState != Waiting); return (mState != Waiting);
} }
void SaverEngine::enableExports()
{
#ifdef Q_WS_X11
kdDebug(270) << k_lineinfo << "activating background exports.\n";
DCOPClient *client = kapp->dcopClient();
if (!client->isAttached()) {
client->attach();
}
TQByteArray data;
TQDataStream args( data, IO_WriteOnly );
args << 1;
TQCString appname( "kdesktop" );
int screen_number = DefaultScreen(tqt_xdisplay());
if ( screen_number )
appname.sprintf("kdesktop-screen-%d", screen_number );
client->send( appname, "KBackgroundIface", "setExport(int)", data );
#endif
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void SaverEngine::handleSecureDialog() void SaverEngine::handleSecureDialog()
{ {
@ -316,9 +351,11 @@ void SaverEngine::setBlankOnly( bool blankOnly )
// //
bool SaverEngine::startLockProcess( LockType lock_type ) bool SaverEngine::startLockProcess( LockType lock_type )
{ {
if (mState != Waiting) if (mState == Saving)
return true; return true;
enableExports();
kdDebug(1204) << "SaverEngine: starting saver" << endl; kdDebug(1204) << "SaverEngine: starting saver" << endl;
emitDCOPSignal("KDE_start_screensaver()", TQByteArray()); emitDCOPSignal("KDE_start_screensaver()", TQByteArray());
@ -452,6 +489,11 @@ void SaverEngine::slotLockProcessWaiting()
TQTimer::singleShot(0, this, SLOT(lockProcessWaiting())); TQTimer::singleShot(0, this, SLOT(lockProcessWaiting()));
} }
void SaverEngine::slotLockProcessFullyActivated()
{
mState = Saving;
}
void SaverEngine::lockProcessWaiting() void SaverEngine::lockProcessWaiting()
{ {
kdDebug(1204) << "SaverEngine: lock exited" << endl; kdDebug(1204) << "SaverEngine: lock exited" << endl;

@ -80,6 +80,7 @@ public:
public slots: public slots:
void slotLockProcessWaiting(); void slotLockProcessWaiting();
void slotLockProcessFullyActivated();
protected slots: protected slots:
void idleTimeout(); void idleTimeout();
@ -90,6 +91,11 @@ private slots:
void handleSecureDialog(); void handleSecureDialog();
void slotSAKProcessExited(); void slotSAKProcessExited();
/**
* Enable wallpaper exports
*/
void enableExports();
protected: protected:
enum LockType { DontLock, DefaultLock, ForceLock, SecureDialog }; enum LockType { DontLock, DefaultLock, ForceLock, SecureDialog };
bool startLockProcess( LockType lock_type ); bool startLockProcess( LockType lock_type );

@ -83,6 +83,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <libkrsync/krsync.h> #include <libkrsync/krsync.h>
#ifdef WITH_UPOWER
#include <tqdbusdata.h>
#include <tqdbusmessage.h>
#include <tqdbusproxy.h>
#include <tqdbusvariant.h>
#endif
#include "server.h" #include "server.h"
#include "global.h" #include "global.h"
#include "shutdowndlg.h" #include "shutdowndlg.h"
@ -169,14 +176,48 @@ void KSMServer::shutdownInternal( KApplication::ShutdownConfirm confirm,
dialogActive = true; dialogActive = true;
if ( !logoutConfirmed ) { if ( !logoutConfirmed ) {
int selection;
KSMShutdownFeedback::start(); // make the screen gray KSMShutdownFeedback::start(); // make the screen gray
logoutConfirmed = logoutConfirmed =
KSMShutdownDlg::confirmShutdown( maysd, sdtype, bopt ); KSMShutdownDlg::confirmShutdown( maysd, sdtype, bopt, &selection );
// ###### We can't make the screen remain gray while talking to the apps, // ###### We can't make the screen remain gray while talking to the apps,
// because this prevents interaction ("do you want to save", etc.) // because this prevents interaction ("do you want to save", etc.)
// TODO: turn the feedback widget into a list of apps to be closed, // TODO: turn the feedback widget into a list of apps to be closed,
// with an indicator of the current status for each. // with an indicator of the current status for each.
KSMShutdownFeedback::stop(); // make the screen become normal again KSMShutdownFeedback::stop(); // make the screen become normal again
if (selection != 0) {
// respect lock on resume & disable suspend/hibernate settings
// from power-manager
KConfig config("power-managerrc");
bool lockOnResume = config.readBoolEntry("lockOnResume", true);
if (lockOnResume) {
DCOPRef("kdesktop", "KScreensaverIface").send("lock");
}
#ifdef WITH_UPOWER
TQT_DBusConnection dbusConn;
dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
if (selection == 1) { // Suspend
if ( dbusConn.isConnected() ) {
TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
"org.freedesktop.UPower",
"/org/freedesktop/UPower",
"org.freedesktop.UPower",
"Suspend");
dbusConn.sendWithReply(msg);
}
}
if (selection == 2) { // Hibernate
if( dbusConn.isConnected() ) {
TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
"org.freedesktop.UPower",
"/org/freedesktop/UPower",
"org.freedesktop.UPower",
"Hibernate");
dbusConn.sendWithReply(msg);
}
}
#endif // WITH_UPOWER
}
} }
if ( logoutConfirmed ) { if ( logoutConfirmed ) {

@ -674,14 +674,17 @@ void KSMShutdownIPFeedback::slotPaintEffect()
////// //////
KSMShutdownDlg::KSMShutdownDlg( TQWidget* parent, KSMShutdownDlg::KSMShutdownDlg( TQWidget* parent,
bool maysd, KApplication::ShutdownType sdtype ) bool maysd, KApplication::ShutdownType sdtype, int* selection )
: TQDialog( parent, 0, TRUE, (WFlags)WType_Popup ), targets(0) : TQDialog( parent, 0, TRUE, (WFlags)WType_Popup ), targets(0), m_selection(selection)
// this is a WType_Popup on purpose. Do not change that! Not // this is a WType_Popup on purpose. Do not change that! Not
// having a popup here has severe side effects. // having a popup here has severe side effects.
{ {
TQVBoxLayout* vbox = new TQVBoxLayout( this ); TQVBoxLayout* vbox = new TQVBoxLayout( this );
if (m_selection) {
*m_selection = 0;
}
TQFrame* frame = new TQFrame( this ); TQFrame* frame = new TQFrame( this );
frame->setFrameStyle( TQFrame::StyledPanel | TQFrame::Raised ); frame->setFrameStyle( TQFrame::StyledPanel | TQFrame::Raised );
@ -1104,27 +1107,12 @@ void KSMShutdownDlg::slotHalt()
void KSMShutdownDlg::slotSuspend() void KSMShutdownDlg::slotSuspend()
{ {
#ifdef WITH_UPOWER *m_selection = 1; // Suspend
if (m_lockOnResume) {
DCOPRef("kdesktop", "KScreensaverIface").send("lock");
}
if( m_dbusConn.isConnected() ) { #ifdef WITH_UPOWER
TQT_DBusMessage msg = TQT_DBusMessage::methodCall( // Handled in shutdown.cpp
"org.freedesktop.UPower",
"/org/freedesktop/UPower",
"org.freedesktop.UPower",
"Suspend");
m_dbusConn.sendWithReply(msg);
}
reject(); // continue on resume
#else #else
#ifdef COMPILE_HALBACKEND #ifdef COMPILE_HALBACKEND
if (m_lockOnResume) {
DCOPRef("kdesktop", "KScreensaverIface").send("lock");
}
if (m_dbusConn) if (m_dbusConn)
{ {
DBusMessage *msg = dbus_message_new_method_call( DBusMessage *msg = dbus_message_new_method_call(
@ -1140,35 +1128,19 @@ void KSMShutdownDlg::slotSuspend()
dbus_message_unref(msg); dbus_message_unref(msg);
} }
reject(); // continue on resume
#endif #endif
#endif // WITH_UPOWER #endif // WITH_UPOWER
reject(); // continue on resume
} }
void KSMShutdownDlg::slotHibernate() void KSMShutdownDlg::slotHibernate()
{ {
#ifdef WITH_UPOWER *m_selection = 2; // Hibernate
if (m_lockOnResume) {
DCOPRef("kdesktop", "KScreensaverIface").send("lock");
}
if( m_dbusConn.isConnected() ) {
TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
"org.freedesktop.UPower",
"/org/freedesktop/UPower",
"org.freedesktop.UPower",
"Hibernate");
m_dbusConn.sendWithReply(msg);
}
reject(); // continue on resume #ifdef WITH_UPOWER
// Handled in shutdown.cpp
#else #else
#ifdef COMPILE_HALBACKEND #ifdef COMPILE_HALBACKEND
if (m_lockOnResume) {
DCOPRef("kdesktop", "KScreensaverIface").send("lock");
}
if (m_dbusConn) if (m_dbusConn)
{ {
DBusMessage *msg = dbus_message_new_method_call( DBusMessage *msg = dbus_message_new_method_call(
@ -1181,18 +1153,17 @@ void KSMShutdownDlg::slotHibernate()
dbus_message_unref(msg); dbus_message_unref(msg);
} }
reject(); // continue on resume
#endif #endif
#endif // WITH_UPOWER #endif // WITH_UPOWER
reject(); // continue on resume
} }
bool KSMShutdownDlg::confirmShutdown( bool maysd, KApplication::ShutdownType& sdtype, TQString& bootOption ) bool KSMShutdownDlg::confirmShutdown( bool maysd, KApplication::ShutdownType& sdtype, TQString& bootOption, int* selection )
{ {
kapp->enableStyles(); kapp->enableStyles();
KSMShutdownDlg* l = new KSMShutdownDlg( 0, KSMShutdownDlg* l = new KSMShutdownDlg( 0,
//KSMShutdownFeedback::self(), //KSMShutdownFeedback::self(),
maysd, sdtype ); maysd, sdtype, selection );
// Show dialog (will save the background in showEvent) // Show dialog (will save the background in showEvent)
TQSize sh = l->sizeHint(); TQSize sh = l->sizeHint();

@ -129,7 +129,7 @@ class KSMShutdownDlg : public TQDialog
Q_OBJECT Q_OBJECT
public: public:
static bool confirmShutdown( bool maysd, KApplication::ShutdownType& sdtype, TQString& bopt ); static bool confirmShutdown( bool maysd, KApplication::ShutdownType& sdtype, TQString& bopt, int* selection=0 );
public slots: public slots:
void slotLogout(); void slotLogout();
@ -143,7 +143,7 @@ protected:
~KSMShutdownDlg(); ~KSMShutdownDlg();
private: private:
KSMShutdownDlg( TQWidget* parent, bool maysd, KApplication::ShutdownType sdtype ); KSMShutdownDlg( TQWidget* parent, bool maysd, KApplication::ShutdownType sdtype, int* selection=0 );
KApplication::ShutdownType m_shutdownType; KApplication::ShutdownType m_shutdownType;
TQString m_bootOption; TQString m_bootOption;
TQPopupMenu *targets; TQPopupMenu *targets;
@ -157,6 +157,7 @@ private:
#endif #endif
#endif // WITH_UPOWER #endif // WITH_UPOWER
bool m_lockOnResume; bool m_lockOnResume;
int* m_selection;
}; };
// The shutdown-in-progress dialog // The shutdown-in-progress dialog

Loading…
Cancel
Save