summaryrefslogtreecommitdiffstats
path: root/kdesktop/lock/lockprocess.cc
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-12-27 19:46:47 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-12-27 19:46:47 -0600
commit4ea3979393d7ae160810a56fe965f0b25630b2ba (patch)
treeb126e6cdae87b3c9645b2e47d05bf3d148bfcecb /kdesktop/lock/lockprocess.cc
parenta2146f655c7ca3b10cf50833eefd483e635e1f4a (diff)
downloadtdebase-4ea3979393d7ae160810a56fe965f0b25630b2ba.tar.gz
tdebase-4ea3979393d7ae160810a56fe965f0b25630b2ba.zip
Fix desktop lock process not hiding secondary screens
This closes Bug 669
Diffstat (limited to 'kdesktop/lock/lockprocess.cc')
-rw-r--r--kdesktop/lock/lockprocess.cc77
1 files changed, 62 insertions, 15 deletions
diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc
index 2c46a91ec..6bd18f771 100644
--- a/kdesktop/lock/lockprocess.cc
+++ b/kdesktop/lock/lockprocess.cc
@@ -173,6 +173,7 @@ LockProcess::LockProcess(bool child, bool useBlankOnly)
mDialogControlLock(false),
mForceReject(false),
currentDialog(NULL),
+ mEnsureScreenHiddenTimer(NULL),
mForceContinualLockDisplayTimer(NULL),
mEnsureVRootWindowSecurityTimer(NULL),
mHackDelayStartupTimer(NULL),
@@ -288,6 +289,10 @@ LockProcess::~LockProcess()
hackResumeTimer->stop();
delete hackResumeTimer;
}
+ if (mEnsureScreenHiddenTimer != NULL) {
+ mEnsureScreenHiddenTimer->stop();
+ delete mEnsureScreenHiddenTimer;
+ }
if (mForceContinualLockDisplayTimer != NULL) {
mForceContinualLockDisplayTimer->stop();
delete mForceContinualLockDisplayTimer;
@@ -410,7 +415,7 @@ void LockProcess::checkPipe()
if (numread > 0) {
if (readbuf[0] == 'C') {
mInfoMessageDisplayed=false;
- while (mDialogControlLock == true) sleep(1);
+ while (mDialogControlLock == true) usleep(100000);
mDialogControlLock = true;
if (currentDialog != NULL) {
mForceReject = true;
@@ -423,7 +428,7 @@ void LockProcess::checkPipe()
to_display = to_display.remove(0,1);
// Lock out password dialogs and close any active dialog
mInfoMessageDisplayed=true;
- while (mDialogControlLock == true) sleep(1);
+ while (mDialogControlLock == true) usleep(100000);
mDialogControlLock = true;
if (currentDialog != NULL) {
mForceReject = true;
@@ -444,7 +449,7 @@ void LockProcess::checkPipe()
to_display = to_display.remove(0,1);
// Lock out password dialogs and close any active dialog
mInfoMessageDisplayed=true;
- while (mDialogControlLock == true) sleep(1);
+ while (mDialogControlLock == true) usleep(100000);
mDialogControlLock = true;
if (currentDialog != NULL) {
mForceReject = true;
@@ -468,7 +473,7 @@ void LockProcess::checkPipe()
to_display = to_display.remove(0,1);
// Lock out password dialogs and close any active dialog
mInfoMessageDisplayed=true;
- while (mDialogControlLock == true) sleep(1);
+ while (mDialogControlLock == true) usleep(100000);
mDialogControlLock = true;
if (currentDialog != NULL) {
mForceReject = true;
@@ -887,8 +892,13 @@ void LockProcess::desktopResized()
mRootWidth = rootAttr.width;
mRootHeight = rootAttr.height;
+ // Resize the background widget
setGeometry(0, 0, mRootWidth, mRootHeight);
+ // Black out the background widget to hide ugly resize tiling artifacts
+ setBackgroundColor(black);
+ erase();
+
// This slot needs to be able to execute very rapidly so as to prevent the user's desktop from ever
// being displayed, so we finish the hack restarting/display prettying operations in a separate timed slot
if (resizeTimer == NULL) {
@@ -902,7 +912,7 @@ void LockProcess::doDesktopResizeFinish()
{
stopHack();
- while (mDialogControlLock == true) sleep(1);
+ while (mDialogControlLock == true) usleep(100000);
mDialogControlLock = true;
if (closeCurrentWindow()) {
TQTimer::singleShot( 0, this, SLOT(doDesktopResizeFinish()) );
@@ -911,7 +921,13 @@ void LockProcess::doDesktopResizeFinish()
mDialogControlLock = false;
// Restart the hack as the window size is now different
- startHack();
+ if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) {
+ ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
+ if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
+ }
+ else {
+ startHack();
+ }
mBusy = false;
}
@@ -1064,7 +1080,7 @@ bool LockProcess::grabInput()
if (!grabKeyboard())
{
- sleep(1);
+ usleep(100000);
if (!grabKeyboard())
{
return false;
@@ -1073,7 +1089,7 @@ bool LockProcess::grabInput()
if (!grabMouse())
{
- sleep(1);
+ usleep(100000);
if (!grabMouse())
{
XUngrabKeyboard(qt_xdisplay(), CurrentTime);
@@ -1117,7 +1133,7 @@ bool LockProcess::startSaver()
m_grayImage.fill(0); // Set the alpha buffer to 0 (fully transparent)
m_grayImage.setAlphaBuffer(true);
TQPixmap m_root;
- m_root.resize( TQApplication::desktop()->geometry().width(), TQApplication::desktop()->geometry().height() );
+ m_root.resize(mRootWidth, mRootHeight);
TQPainter p;
p.begin( &m_root );
m_grayImage.setAlphaBuffer(false);
@@ -1144,14 +1160,21 @@ bool LockProcess::startSaver()
setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
+ setGeometry(0, 0, mRootWidth, mRootHeight);
erase();
}
if (trinity_desktop_lock_use_system_modal_dialogs) {
// Try to get the root pixmap
- m_rootPixmap = new KRootPixmap(this);
+ if (!m_rootPixmap) m_rootPixmap = new KRootPixmap(this);
m_rootPixmap->setCustomPainting(true);
connect(m_rootPixmap, TQT_SIGNAL(backgroundUpdated(const TQPixmap &)), this, TQT_SLOT(slotPaintBackground(const TQPixmap &)));
m_rootPixmap->start();
+ // Sometimes KRootPixmap fails...make sure the desktop is hidden regardless
+ if (!mEnsureScreenHiddenTimer) {
+ mEnsureScreenHiddenTimer = new TQTimer( this );
+ connect( mEnsureScreenHiddenTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotForcePaintBackground()) );
+ }
+ mEnsureScreenHiddenTimer->start(2000, true);
}
if (trinity_desktop_lock_in_sec_dlg == FALSE) {
@@ -1275,6 +1298,7 @@ void LockProcess::repaintRootWindowIfNeeded()
if (!mHackProc.isRunning()) {
if (backingPixmap.isNull()) {
setBackgroundColor(black);
+ setGeometry(0, 0, mRootWidth, mRootHeight);
erase();
}
else {
@@ -1298,6 +1322,7 @@ bool LockProcess::startHack()
setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
+ setGeometry(0, 0, mRootWidth, mRootHeight);
erase();
return false;
}
@@ -1344,6 +1369,7 @@ bool LockProcess::startHack()
setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
+ setGeometry(0, 0, mRootWidth, mRootHeight);
erase();
mSuspended = false;
}
@@ -1377,7 +1403,10 @@ bool LockProcess::startHack()
else
setBackgroundPixmap(backingPixmap);
}
- if (backingPixmap.isNull()) erase();
+ if (backingPixmap.isNull()) {
+ setGeometry(0, 0, mRootWidth, mRootHeight);
+ erase();
+ }
else bitBlt(this, 0, 0, &backingPixmap);
if (trinity_desktop_lock_use_system_modal_dialogs) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
@@ -1416,7 +1445,10 @@ void LockProcess::hackExited(KProcess *)
else
setBackgroundPixmap(backingPixmap);
}
- if (backingPixmap.isNull()) erase();
+ if (backingPixmap.isNull()) {
+ setGeometry(0, 0, mRootWidth, mRootHeight);
+ erase();
+ }
else bitBlt(this, 0, 0, &backingPixmap);
if (!mSuspended) {
if (trinity_desktop_lock_use_system_modal_dialogs) {
@@ -1492,6 +1524,7 @@ void LockProcess::resume( bool force )
setBackgroundColor(black);
else
setBackgroundPixmap(backingPixmap);
+ setGeometry(0, 0, mRootWidth, mRootHeight);
erase();
return;
}
@@ -1597,10 +1630,13 @@ int LockProcess::execDialog( TQDialog *dlg )
}
mDialogs.prepend( dlg );
fakeFocusIn( dlg->winId());
- if (backingPixmap.isNull() && trinity_desktop_lock_use_system_modal_dialogs) erase();
+ if (backingPixmap.isNull() && trinity_desktop_lock_use_system_modal_dialogs) {
+ setGeometry(0, 0, mRootWidth, mRootHeight);
+ erase();
+ }
else bitBlt(this, 0, 0, &backingPixmap);
int rt = dlg->exec();
- while (mDialogControlLock == true) sleep(1);
+ while (mDialogControlLock == true) usleep(100000);
currentDialog = NULL;
mDialogs.remove( dlg );
if( mDialogs.isEmpty() ) {
@@ -1624,8 +1660,18 @@ int LockProcess::execDialog( TQDialog *dlg )
return rt;
}
+void LockProcess::slotForcePaintBackground()
+{
+ TQPixmap blankPixmap(mRootWidth, mRootHeight);
+ blankPixmap.fill(Qt::black);
+ slotPaintBackground(blankPixmap);
+ printf("[WARNING] Unable to obtain desktop wallpaper in a timely manner. High system load or possibly a TDE bug!\n\r"); fflush(stdout);
+}
+
void LockProcess::slotPaintBackground(const TQPixmap &rpm)
{
+ mEnsureScreenHiddenTimer->stop();
+
TQPixmap pm = rpm;
if (TQPaintDevice::x11AppDepth() == 32) {
@@ -1652,6 +1698,7 @@ void LockProcess::slotPaintBackground(const TQPixmap &rpm)
backingPixmap = pm;
if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced) {
setBackgroundPixmap(backingPixmap);
+ setGeometry(0, 0, mRootWidth, mRootHeight);
erase();
}
}
@@ -1677,7 +1724,7 @@ void LockProcess::doFunctionKeyBroadcast() {
mBusy=true;
TQTimer::singleShot(1000, this, TQT_SLOT(slotDeadTimePassed()));
if (mkeyCode == XKeysymToKeycode(qt_xdisplay(), XF86XK_Display)) {
- while (mDialogControlLock == true) sleep(1);
+ while (mDialogControlLock == true) usleep(100000);
mDialogControlLock = true;
currentDialog->close(); // DO NOT use closeCurrentWindow() here!
mDialogControlLock = false;