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 -->
<!-- mSaver = config.readEntry("Saver"); -->
</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">
<default></default>
<label></label>

@ -10,6 +10,7 @@
#include "lockprocess.h"
#include "lockdlg.h"
#include "kdesktopsettings.h"
#include <kcheckpass.h>
#include <dmctl.h>
@ -59,12 +60,14 @@
# define AF_LOCAL AF_UNIX
#endif
// [FIXME] This interval should be taken from the screensaver start delay of kdesktop
#define PASSDLG_HIDE_TIMEOUT 10000
#define PASSDLG_HIDE_TIMEOUT dialogHideTimeout
extern bool trinity_desktop_lock_autohide_lockdlg;
extern bool trinity_desktop_lock_delay_screensaver_start;
extern bool trinity_desktop_lock_use_system_modal_dialogs;
int dialogHideTimeout = 10*1000;
//===========================================================================
//
// Simple dialog for entering a password.
@ -75,6 +78,8 @@ PasswordDlg::PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin)
mCapsLocked(-1),
mUnlockingFailed(false)
{
dialogHideTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000;
if (trinity_desktop_lock_use_system_modal_dialogs) {
// Signal that we do not want any window controls to be shown at all
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()) );
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 = 10*1000;
mHackDelayStartupTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000;
// Get root window size
XWindowAttributes rootAttr;
@ -971,8 +970,11 @@ bool LockProcess::startSaver()
XSync(qt_xdisplay(), False);
setVRoot( winId(), winId() );
if (!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced)) {
setBackgroundColor(black);
erase();
if (backingPixmap.isNull())
setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
erase();
}
if (trinity_desktop_lock_use_system_modal_dialogs) {
// Try to get the root pixmap
@ -984,7 +986,7 @@ bool LockProcess::startSaver()
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
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()
{
if (currentDialog)
{
return false;
}
if (mSaverExec.isEmpty())
{
return false;
@ -1124,9 +1141,12 @@ bool LockProcess::startHack()
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!
setBackgroundColor(black);
if (backingPixmap.isNull())
setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
erase();
mSuspended = false;
}
@ -1154,10 +1174,17 @@ bool LockProcess::startHack()
{
usleep(100);
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();
else bitBlt(this, 0, 0, &backingPixmap);
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
if (trinity_desktop_lock_use_system_modal_dialogs) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
}
}
}
return false;
@ -1185,12 +1212,19 @@ void LockProcess::hackExited(KProcess *)
// Make sure the saver window is black.
usleep(100);
TQApplication::syncX();
if (!trinity_desktop_lock_use_system_modal_dialogs) setBackgroundColor(black);
if (backingPixmap.isNull()) erase();
else bitBlt(this, 0, 0, &backingPixmap);
if (!mSuspended) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
}
if (!trinity_desktop_lock_use_system_modal_dialogs) {
if (backingPixmap.isNull())
setBackgroundColor(black);
else
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()
@ -1216,7 +1250,6 @@ void LockProcess::suspend()
if (trinity_desktop_lock_use_system_modal_dialogs) {
mSuspended = true;
stopHack();
mSuspended = false;
}
else {
TQString hackStatus;
@ -1257,11 +1290,11 @@ void LockProcess::resume( bool force )
bitBlt( this, 0, 0, &mSavedScreen );
TQApplication::syncX();
mHackProc.kill(SIGCONT);
mSuspended = false;
}
else if (mSuspended && trinity_desktop_lock_use_system_modal_dialogs) {
startHack();
}
mSuspended = false;
}
//---------------------------------------------------------------------------
@ -1473,20 +1506,39 @@ bool LockProcess::x11Event(XEvent *event)
return true; // filter out
// fall through
case KeyPress:
if ((mHackDelayStartupTimer) && ((trinity_desktop_lock_autohide_lockdlg == FALSE) && (mHackDelayStartupTimer->isActive())))
if ((mHackDelayStartupTimer) && (mHackDelayStartupTimer->isActive())) {
mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
}
if (mBusy || !mDialogs.isEmpty())
break;
mBusy = true;
if (!mLocked || checkPass())
{
stopSaver();
kapp->quit();
if (trinity_desktop_lock_delay_screensaver_start) {
if (mLocked) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
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
{
killTimer(mAutoLogoutTimerId);
mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout);
else {
if (!mLocked || checkPass())
{
stopSaver();
kapp->quit();
}
else if (mAutoLogout) // we need to restart the auto logout countdown
{
killTimer(mAutoLogoutTimerId);
mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout);
}
}
mBusy = false;
return true;

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

@ -34,7 +34,7 @@
#include <X11/Xlib.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_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
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" ));
if (!child)
process.setChildren(child_sockets);

Loading…
Cancel
Save