diff options
Diffstat (limited to 'redhat/tdebase/kdebase-3.5.13-fix_multihead_desktop_lock.patch')
-rw-r--r-- | redhat/tdebase/kdebase-3.5.13-fix_multihead_desktop_lock.patch | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/redhat/tdebase/kdebase-3.5.13-fix_multihead_desktop_lock.patch b/redhat/tdebase/kdebase-3.5.13-fix_multihead_desktop_lock.patch new file mode 100644 index 000000000..f2aed5a2d --- /dev/null +++ b/redhat/tdebase/kdebase-3.5.13-fix_multihead_desktop_lock.patch @@ -0,0 +1,297 @@ +Index: kdesktop/lock/lockdlg.cc +=================================================================== +--- kdesktop/lock/lockdlg.cc (revision 1261452) ++++ kdesktop/lock/lockdlg.cc (working copy) +@@ -115,7 +115,7 @@ + frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); + frame->setLineWidth( 2 ); + +- TQLabel *pixLabel; ++ TQLabel *pixLabel = NULL; + if (!trinity_desktop_lock_use_system_modal_dialogs) { + pixLabel = new TQLabel( frame, "pixlabel" ); + pixLabel->setPixmap(DesktopIcon("lock")); +@@ -134,7 +134,7 @@ + i18n("<nobr><b>The session was locked by %1</b><br>").arg( user.fullName() ), frame ); + } + +- TQLabel *lockDTLabel; ++ TQLabel *lockDTLabel = NULL; + if ((trinity_desktop_lock_use_system_modal_dialogs) && (!m_lockStartDT.isNull())) { + lockDTLabel = new TQLabel(i18n("This session has been locked since %1").arg(m_lockStartDT.toString()), frame); + } +Index: kdesktop/lock/lockprocess.cc +=================================================================== +--- kdesktop/lock/lockprocess.cc (revision 1261452) ++++ kdesktop/lock/lockprocess.cc (working copy) +@@ -173,6 +173,7 @@ + mDialogControlLock(false), + mForceReject(false), + currentDialog(NULL), ++ mEnsureScreenHiddenTimer(NULL), + mForceContinualLockDisplayTimer(NULL), + mEnsureVRootWindowSecurityTimer(NULL), + mHackDelayStartupTimer(NULL), +@@ -288,6 +289,10 @@ + hackResumeTimer->stop(); + delete hackResumeTimer; + } ++ if (mEnsureScreenHiddenTimer != NULL) { ++ mEnsureScreenHiddenTimer->stop(); ++ delete mEnsureScreenHiddenTimer; ++ } + if (mForceContinualLockDisplayTimer != NULL) { + mForceContinualLockDisplayTimer->stop(); + delete mForceContinualLockDisplayTimer; +@@ -410,7 +415,7 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + 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 @@ + { + 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 @@ + 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 @@ + + if (!grabKeyboard()) + { +- sleep(1); ++ usleep(100000); + if (!grabKeyboard()) + { + return false; +@@ -1073,7 +1089,7 @@ + + if (!grabMouse()) + { +- sleep(1); ++ usleep(100000); + if (!grabMouse()) + { + XUngrabKeyboard(qt_xdisplay(), CurrentTime); +@@ -1117,7 +1133,7 @@ + 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 @@ + 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 @@ + if (!mHackProc.isRunning()) { + if (backingPixmap.isNull()) { + setBackgroundColor(black); ++ setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); + } + else { +@@ -1298,6 +1322,7 @@ + setBackgroundColor(black); + else + setBackgroundPixmap(backingPixmap); ++ setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); + return false; + } +@@ -1344,6 +1369,7 @@ + setBackgroundColor(black); + else + setBackgroundPixmap(backingPixmap); ++ setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); + mSuspended = false; + } +@@ -1377,7 +1403,10 @@ + 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 @@ + 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 @@ + setBackgroundColor(black); + else + setBackgroundPixmap(backingPixmap); ++ setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); + return; + } +@@ -1597,10 +1630,13 @@ + } + 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 @@ + 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 @@ + 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 @@ + 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; +Index: kdesktop/lock/lockprocess.h +=================================================================== +--- kdesktop/lock/lockprocess.h (revision 1261452) ++++ kdesktop/lock/lockprocess.h (working copy) +@@ -74,6 +74,7 @@ + void doDesktopResizeFinish(); + void doFunctionKeyBroadcast(); + void slotPaintBackground(const TQPixmap &pm); ++ void slotForcePaintBackground(); + + protected: + virtual bool x11Event(XEvent *); +@@ -181,6 +182,7 @@ + bool mForceReject; + TQDialog *currentDialog; + ++ TQTimer* mEnsureScreenHiddenTimer; + TQTimer* mForceContinualLockDisplayTimer; + TQTimer* mEnsureVRootWindowSecurityTimer; + TQTimer* mHackDelayStartupTimer; |