Fix kdesktop lock process

Enable the new codepaths by default
This does change user visible behaviour, however it also repairs severe problems with the lock dialog appearing UNDER the xscreensaver hack, as well as many of the OpenGL xhacks failing.


git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1253074 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
v3.5.13-sru
tpearson 13 years ago
parent af216eb5f2
commit a278c295b0

@ -304,6 +304,20 @@
<!-- /home/paco/cvsroot/kdebase/kdesktop/lock/lockprocess.cc:336 --> <!-- /home/paco/cvsroot/kdebase/kdesktop/lock/lockprocess.cc:336 -->
<!-- mSaver = config.readEntry("Saver"); --> <!-- mSaver = config.readEntry("Saver"); -->
</entry> </entry>
<entry key="UseUnmanagedLockWindows" type="Bool">
<default>false</default>
<label></label>
<whatsthis></whatsthis>
<!-- /home/paco/cvsroot/kdebase/kdesktop/lock/lockprocess.cc:336 -->
<!-- mSaver = config.readEntry("UseUnmanagedLockWindows"); -->
</entry>
<entry key="DelaySaverStart" type="Bool">
<default>true</default>
<label></label>
<whatsthis></whatsthis>
<!-- /home/paco/cvsroot/kdebase/kdesktop/lock/lockprocess.cc:336 -->
<!-- mSaver = config.readEntry("UseUnmanagedLockWindows"); -->
</entry>
<entry key="PluginsUnlock" type="StringList"> <entry key="PluginsUnlock" type="StringList">
<default></default> <default></default>
<label></label> <label></label>

@ -10,6 +10,7 @@
#include "lockprocess.h" #include "lockprocess.h"
#include "lockdlg.h" #include "lockdlg.h"
#include "kdesktopsettings.h"
#include <kcheckpass.h> #include <kcheckpass.h>
#include <dmctl.h> #include <dmctl.h>
@ -59,12 +60,14 @@
# define AF_LOCAL AF_UNIX # define AF_LOCAL AF_UNIX
#endif #endif
// [FIXME] This interval should be taken from the screensaver start delay of kdesktop #define PASSDLG_HIDE_TIMEOUT dialogHideTimeout
#define PASSDLG_HIDE_TIMEOUT 10000
extern bool trinity_desktop_lock_autohide_lockdlg; extern bool trinity_desktop_lock_autohide_lockdlg;
extern bool trinity_desktop_lock_delay_screensaver_start;
extern bool trinity_desktop_lock_use_system_modal_dialogs; extern bool trinity_desktop_lock_use_system_modal_dialogs;
int dialogHideTimeout = 10*1000;
//=========================================================================== //===========================================================================
// //
// Simple dialog for entering a password. // Simple dialog for entering a password.
@ -75,6 +78,8 @@ PasswordDlg::PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin)
mCapsLocked(-1), mCapsLocked(-1),
mUnlockingFailed(false) mUnlockingFailed(false)
{ {
dialogHideTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000;
if (trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_use_system_modal_dialogs) {
// Signal that we do not want any window controls to be shown at all // Signal that we do not want any window controls to be shown at all
Atom kde_wm_system_modal_notification; Atom kde_wm_system_modal_notification;

@ -177,10 +177,9 @@ LockProcess::LockProcess(bool child, bool useBlankOnly)
connect( mForceContinualLockDisplayTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(displayLockDialogIfNeeded()) ); connect( mForceContinualLockDisplayTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(displayLockDialogIfNeeded()) );
mHackDelayStartupTimer = new TQTimer( this ); mHackDelayStartupTimer = new TQTimer( this );
connect( mHackDelayStartupTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(startHack()) ); connect( mHackDelayStartupTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(closeDialogAndStartHack()) );
// [FIXME] This interval should be taken from the screensaver start delay of kdesktop mHackDelayStartupTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000;
mHackDelayStartupTimeout = 10*1000;
// Get root window size // Get root window size
XWindowAttributes rootAttr; XWindowAttributes rootAttr;
@ -971,8 +970,11 @@ bool LockProcess::startSaver()
XSync(qt_xdisplay(), False); XSync(qt_xdisplay(), False);
setVRoot( winId(), winId() ); setVRoot( winId(), winId() );
if (!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced)) { if (!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced)) {
setBackgroundColor(black); if (backingPixmap.isNull())
erase(); setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
erase();
} }
if (trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_use_system_modal_dialogs) {
// Try to get the root pixmap // Try to get the root pixmap
@ -984,7 +986,7 @@ bool LockProcess::startSaver()
TQTimer::singleShot( 0, this, SLOT(slotPaintBackground()) ); TQTimer::singleShot( 0, this, SLOT(slotPaintBackground()) );
} }
if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced) { if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
} }
@ -1085,9 +1087,24 @@ bool LockProcess::startLock()
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
void LockProcess::closeDialogAndStartHack()
{
// Close any active dialogs
DISABLE_CONTINUOUS_LOCKDLG_DISPLAY
mSuspended = true;
if (currentDialog != NULL) {
mForceReject = true;
currentDialog->close();
}
}
bool LockProcess::startHack() bool LockProcess::startHack()
{ {
if (currentDialog)
{
return false;
}
if (mSaverExec.isEmpty()) if (mSaverExec.isEmpty())
{ {
return false; return false;
@ -1124,9 +1141,12 @@ bool LockProcess::startHack()
if (!mForbidden) if (!mForbidden)
{ {
if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced) { if (trinity_desktop_lock_use_system_modal_dialogs) {
// Make sure we have a nice clean display to start with! // Make sure we have a nice clean display to start with!
setBackgroundColor(black); if (backingPixmap.isNull())
setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
erase(); erase();
mSuspended = false; mSuspended = false;
} }
@ -1154,10 +1174,17 @@ bool LockProcess::startHack()
{ {
usleep(100); usleep(100);
TQApplication::syncX(); TQApplication::syncX();
if (!trinity_desktop_lock_use_system_modal_dialogs) setBackgroundColor(black); if (!trinity_desktop_lock_use_system_modal_dialogs) {
if (backingPixmap.isNull())
setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
}
if (backingPixmap.isNull()) erase(); if (backingPixmap.isNull()) erase();
else bitBlt(this, 0, 0, &backingPixmap); else bitBlt(this, 0, 0, &backingPixmap);
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY if (trinity_desktop_lock_use_system_modal_dialogs) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
}
} }
} }
return false; return false;
@ -1185,12 +1212,19 @@ void LockProcess::hackExited(KProcess *)
// Make sure the saver window is black. // Make sure the saver window is black.
usleep(100); usleep(100);
TQApplication::syncX(); TQApplication::syncX();
if (!trinity_desktop_lock_use_system_modal_dialogs) setBackgroundColor(black); if (!trinity_desktop_lock_use_system_modal_dialogs) {
if (backingPixmap.isNull()) erase(); if (backingPixmap.isNull())
else bitBlt(this, 0, 0, &backingPixmap); setBackgroundColor(black);
if (!mSuspended) { else
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY setBackgroundPixmap(backingPixmap);
} }
if (backingPixmap.isNull()) erase();
else bitBlt(this, 0, 0, &backingPixmap);
if (!mSuspended) {
if (trinity_desktop_lock_use_system_modal_dialogs) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
}
}
} }
void LockProcess::displayLockDialogIfNeeded() void LockProcess::displayLockDialogIfNeeded()
@ -1216,7 +1250,6 @@ void LockProcess::suspend()
if (trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_use_system_modal_dialogs) {
mSuspended = true; mSuspended = true;
stopHack(); stopHack();
mSuspended = false;
} }
else { else {
TQString hackStatus; TQString hackStatus;
@ -1257,11 +1290,11 @@ void LockProcess::resume( bool force )
bitBlt( this, 0, 0, &mSavedScreen ); bitBlt( this, 0, 0, &mSavedScreen );
TQApplication::syncX(); TQApplication::syncX();
mHackProc.kill(SIGCONT); mHackProc.kill(SIGCONT);
mSuspended = false;
} }
else if (mSuspended && trinity_desktop_lock_use_system_modal_dialogs) { else if (mSuspended && trinity_desktop_lock_use_system_modal_dialogs) {
startHack(); startHack();
} }
mSuspended = false;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -1473,20 +1506,39 @@ bool LockProcess::x11Event(XEvent *event)
return true; // filter out return true; // filter out
// fall through // fall through
case KeyPress: case KeyPress:
if ((mHackDelayStartupTimer) && ((trinity_desktop_lock_autohide_lockdlg == FALSE) && (mHackDelayStartupTimer->isActive()))) if ((mHackDelayStartupTimer) && (mHackDelayStartupTimer->isActive())) {
mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
}
if (mBusy || !mDialogs.isEmpty()) if (mBusy || !mDialogs.isEmpty())
break; break;
mBusy = true; mBusy = true;
if (!mLocked || checkPass()) if (trinity_desktop_lock_delay_screensaver_start) {
{ if (mLocked) {
stopSaver(); ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
kapp->quit(); mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
}
if (!mLocked)
{
stopSaver();
kapp->quit();
}
if (mAutoLogout) // we need to restart the auto logout countdown
{
killTimer(mAutoLogoutTimerId);
mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout);
}
} }
else if (mAutoLogout) // we need to restart the auto logout countdown else {
{ if (!mLocked || checkPass())
killTimer(mAutoLogoutTimerId); {
mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout); stopSaver();
kapp->quit();
}
else if (mAutoLogout) // we need to restart the auto logout countdown
{
killTimer(mAutoLogoutTimerId);
mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout);
}
} }
mBusy = false; mBusy = false;
return true; return true;

@ -84,7 +84,7 @@ private slots:
void windowAdded( WId ); void windowAdded( WId );
void resumeUnforced(); void resumeUnforced();
void displayLockDialogIfNeeded(); void displayLockDialogIfNeeded();
bool startHack(); void closeDialogAndStartHack();
private: private:
void configure(); void configure();
@ -101,6 +101,7 @@ private:
void cantLock(const TQString &reason); void cantLock(const TQString &reason);
bool startSaver(); bool startSaver();
void stopSaver(); void stopSaver();
bool startHack();
void stopHack(); void stopHack();
void setupSignals(); void setupSignals();
void setupPipe(); void setupPipe();

@ -34,7 +34,7 @@
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <fixx11h.h> #include <fixx11h.h>
// [FIXME] These two settings should be user configurable! // [FIXME] Add GUI configuration checkboxes for these two settings (see kdesktoprc [ScreenSaver] UseUnmanagedLockWindows and DelaySaverStart)
bool trinity_desktop_lock_use_system_modal_dialogs = FALSE; bool trinity_desktop_lock_use_system_modal_dialogs = FALSE;
bool trinity_desktop_lock_delay_screensaver_start = FALSE; bool trinity_desktop_lock_delay_screensaver_start = FALSE;
@ -151,6 +151,9 @@ int main( int argc, char **argv )
// we need to read from the right rc file - possibly taking screen number in account // we need to read from the right rc file - possibly taking screen number in account
KDesktopSettings::instance("kdesktoprc"); KDesktopSettings::instance("kdesktoprc");
trinity_desktop_lock_use_system_modal_dialogs = !KDesktopSettings::useUnmanagedLockWindows();
trinity_desktop_lock_delay_screensaver_start = KDesktopSettings::delaySaverStart();
LockProcess process(child, args->isSet( "blank" )); LockProcess process(child, args->isSet( "blank" ));
if (!child) if (!child)
process.setChildren(child_sockets); process.setChildren(child_sockets);

Loading…
Cancel
Save