Branch: master

da8993ff 2014-10-25 21:47:51 Timothy Pearson
Make kdesktop_lock and ksmserver ARGB screen blanking more efficient and improve multi-head support in same
Fix kdesktop_lock busy cursor appearing over active screen saver after GUI-driven VT switch and delayed return to original VT
Repair kdesktop_lock invalid password delay bypass with Cancel button
M kdesktop/lock/lockdlg.cc
M kdesktop/lock/lockprocess.cc
M kdesktop/lock/lockprocess.h
M ksmserver/shutdowndlg.cpp
diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc
index 7b53484..763d7bf 100644
--- a/kdesktop/lock/lockdlg.cc
+++ b/kdesktop/lock/lockdlg.cc
@@ -349,6 +349,7 @@
         mUnlockingFailed = false;
         updateLabel();
         ok->setEnabled(true);
+        if (cancel) cancel->setEnabled(true);
         mNewSessButton->setEnabled( true );
         greet->revive();
         greet->start();
@@ -463,6 +464,7 @@
                 updateLabel();
                 mFailedTimerId = startTimer(1500);
                 ok->setEnabled(false);
+                if (cancel) cancel->setEnabled(false);
                 mNewSessButton->setEnabled( false );
                 return;
             case AuthAbort:
diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc
index 1de0b67..3dacc7f 100644
--- a/kdesktop/lock/lockprocess.cc
+++ b/kdesktop/lock/lockprocess.cc
@@ -359,6 +359,7 @@
     XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr);
     mRootWidth = rootAttr.width;
     mRootHeight = rootAttr.height;
+    generateBackingImages();
 
     // Connect all signals
     connect( mForceContinualLockDisplayTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(displayLockDialogIfNeeded()) );
@@ -988,6 +989,7 @@
     }
     mRootWidth = rootAttr.width;
     mRootHeight = rootAttr.height;
+    generateBackingImages();
 
     mBusy = true;
     mHackDelayStartupTimer->stop();
@@ -1281,24 +1283,27 @@
 
 //---------------------------------------------------------------------------
 //
+// Generate requisite backing images for ARGB mode
+//
+void LockProcess::generateBackingImages()
+{
+	if (argb_visual) {
+		mArgbTransparentBackgroundPixmap.resize(mRootWidth, mRootHeight);
+		TQPainter p;
+		p.begin( &mArgbTransparentBackgroundPixmap );
+		p.fillRect( 0, 0, mArgbTransparentBackgroundPixmap.width(), mArgbTransparentBackgroundPixmap.height(), TQBrush(tqRgba(0, 0, 0, 0)) );
+		p.end();
+	}
+}
+
+//---------------------------------------------------------------------------
+//
 // Set a fully transparent ARGB background image.
 //
 void LockProcess::setTransparentBackgroundARGB()
 {
 	// eliminate nasty flicker on first show
-	TQImage m_grayImage = TQImage( TQApplication::desktop()->width(), TQApplication::desktop()->height(), 32 );
-	m_grayImage = m_grayImage.convertDepth(32);
-	m_grayImage.setAlphaBuffer(false);
-	m_grayImage.fill(0);	// Set the alpha buffer to 0 (fully transparent)
-	m_grayImage.setAlphaBuffer(true);
-	TQPixmap m_root;
-	m_root.resize(mRootWidth, mRootHeight);
-	TQPainter p;
-	p.begin( &m_root );
-	m_grayImage.setAlphaBuffer(false);
-	p.drawImage( 0, 0, m_grayImage );
-	p.end();
-	setBackgroundPixmap( m_root );
+	setBackgroundPixmap( mArgbTransparentBackgroundPixmap );
 }
 
 void LockProcess::saverReadyIfNeeded()
@@ -1635,6 +1640,7 @@
 			mSuspended = false;
 		}
 
+		XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqblankCursor).handle(), CurrentTime);
 		if (mHackProc.start() == true)
 		{
 #ifdef HAVE_SETPRIORITY
@@ -1965,8 +1971,7 @@
     if (mDialogs.isEmpty())
     {
         suspend();
-        XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS,
-                TQCursor(tqarrowCursor).handle(), CurrentTime);
+        XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqarrowCursor).handle(), CurrentTime);
     }
     mDialogs.prepend( dlg );
     fakeFocusIn( dlg->winId());
@@ -1996,8 +2001,7 @@
         else {
            cursorHandle = TQCursor(tqbusyCursor).handle();
         }
-        XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS,
-                cursorHandle, CurrentTime);
+        XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, cursorHandle, CurrentTime);
         if (trinity_desktop_lock_use_system_modal_dialogs) {
             // Slight delay before screensaver resume to allow the dialog window to fully disappear
             if (hackResumeTimer == NULL) {
diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h
index dc14aa6..85e9cdd 100644
--- a/kdesktop/lock/lockprocess.h
+++ b/kdesktop/lock/lockprocess.h
@@ -157,6 +157,7 @@
     void windowAdded( WId window, bool managed );
     void resume( bool force );
     static TQVariant getConf(void *ctx, const char *key, const TQVariant &dflt);
+    void generateBackingImages();
     void fullyOnline();
 
     bool        mLocked;
@@ -228,6 +229,7 @@
     TQPixmap    backingPixmap;
     KRootPixmap  *m_rootPixmap;
     int         mBackingStartupDelayTimer;
+    TQPixmap    mArgbTransparentBackgroundPixmap;
 
     KSMModalDialog* m_startupStatusDialog;
 
diff --git a/ksmserver/shutdowndlg.cpp b/ksmserver/shutdowndlg.cpp
index d4881ad..5c50602 100644
--- a/ksmserver/shutdowndlg.cpp
+++ b/ksmserver/shutdowndlg.cpp
@@ -543,17 +543,17 @@
 		system("krootbacking &");
 	}
 
+	m_screenGeometry = TQApplication::desktop()->geometry();
+
 	// eliminate nasty flicker on first show
-	m_root.resize( kapp->desktop()->width(), kapp->desktop()->height() );
-	TQImage blendedImage = TQImage( kapp->desktop()->width(), kapp->desktop()->height(), 32 );
+	m_root.resize(m_screenGeometry.width(), m_screenGeometry.height());
 	TQPainter p;
 	p.begin( &m_root );
-	blendedImage.setAlphaBuffer(false);
-	p.drawImage( 0, 0, blendedImage );
+	p.fillRect( 0, 0, m_root.width(), m_root.height(), TQBrush(tqRgba(0, 0, 0, 0)) );
 	p.end();
 
 	setBackgroundPixmap( m_root );
-	setGeometry( TQApplication::desktop()->geometry() );
+	setGeometry( m_screenGeometry );
 	setBackgroundMode( TQWidget::NoBackground );
 }