summaryrefslogtreecommitdiffstats
path: root/redhat/tdebase/kdebase-3.5.13-fix_multihead_desktop_lock.patch
diff options
context:
space:
mode:
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.patch297
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;