From 3df918cc405b2449b5c98479a0dbd0eb1a23cbe5 Mon Sep 17 00:00:00 2001
From: tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>
Date: Sun, 18 Sep 2011 07:57:55 +0000
Subject: Use krootpixmap instead of the external krootbacking executable in
 kdesktop_lock

git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1254228 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
---
 kdesktop/lock/lockprocess.cc | 92 +++++++++++++++++++++++++++-----------------
 kdesktop/lock/lockprocess.h  |  5 ++-
 kdesktop/lock/securedlg.cc   | 25 +++++++++---
 kdesktop/lock/securedlg.h    |  2 +
 4 files changed, 81 insertions(+), 43 deletions(-)

diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc
index 3ec3ad74b..271581dff 100644
--- a/kdesktop/lock/lockprocess.cc
+++ b/kdesktop/lock/lockprocess.cc
@@ -162,21 +162,23 @@ LockProcess::LockProcess(bool child, bool useBlankOnly)
       mRestoreXF86Lock(false),
       mForbidden(false),
       mAutoLogout(false),
+      resizeTimer(NULL),
+      hackResumeTimer(NULL),
       mVkbdProcess(NULL),
       mKWinModule(NULL),
       mPipeOpen(false),
       mPipeOpen_out(false),
       mInfoMessageDisplayed(false),
-      mForceReject(false),
       mDialogControlLock(false),
+      mForceReject(false),
       currentDialog(NULL),
-      resizeTimer(NULL),
-      hackResumeTimer(NULL),
       mForceContinualLockDisplayTimer(NULL),
       mEnsureVRootWindowSecurityTimer(NULL),
       mHackDelayStartupTimer(NULL),
       mHackDelayStartupTimeout(0),
       mHackStartupEnabled(true),
+      m_rootPixmap(NULL),
+      mBackingStartupDelayTimer(0),
       m_startupStatusDialog(NULL)
 {
     setupSignals();
@@ -301,6 +303,11 @@ LockProcess::~LockProcess()
         greetPlugin.library->unload();
     }
 
+    if (m_rootPixmap) {
+        m_rootPixmap->stop();
+        delete m_rootPixmap;
+    }
+
     mPipeOpen = false;
     mPipeOpen_out = false;
 }
@@ -310,13 +317,17 @@ static int signal_pipe[2];
 static void sigterm_handler(int)
 {
     char tmp = 'T';
-    ::write( signal_pipe[1], &tmp, 1);
+    if (::write( signal_pipe[1], &tmp, 1) == -1) {
+        // Error handler to shut up gcc warnings
+    }
 }
 
 static void sighup_handler(int)
 {
     char tmp = 'H';
-    ::write( signal_pipe[1], &tmp, 1);
+    if (::write( signal_pipe[1], &tmp, 1) == -1) {
+        // Error handler to shut up gcc warnings
+    }
 }
 
 bool LockProcess::closeCurrentWindow()
@@ -418,7 +429,7 @@ void LockProcess::checkPipe()
                 InfoDlg inDlg( this );
                 inDlg.updateLabel(to_display);
                 inDlg.setUnlockIcon();
-                int ret = execDialog( &inDlg );
+                execDialog( &inDlg );
                 mForceReject = false;
                 return;
             }
@@ -442,7 +453,7 @@ void LockProcess::checkPipe()
                 if (readbuf[0] == 'I') inDlg.setInfoIcon();
                 if (readbuf[0] == 'W') inDlg.setWarningIcon();
                 if (readbuf[0] == 'E') inDlg.setErrorIcon();
-                int ret = execDialog( &inDlg );
+                execDialog( &inDlg );
                 mForceReject = false;
                 return;
             }
@@ -464,13 +475,17 @@ void LockProcess::checkPipe()
                 qryDlg.updateLabel(to_display);
                 qryDlg.setUnlockIcon();
                 mForceReject = false;
-                int ret = execDialog( &qryDlg );
+                execDialog( &qryDlg );
                 if (mForceReject == false) {
                     pin_entry = qryDlg.getEntry();
                     mInfoMessageDisplayed=false;
                     if (mPipeOpen_out == true) {
-                        write(mPipe_fd_out, pin_entry, strlen(pin_entry)+1);
-                        write(mPipe_fd_out, "\n\r", 3);
+                        if (write(mPipe_fd_out, pin_entry, strlen(pin_entry)+1) == -1) {
+                            // Error handler to shut up gcc warnings
+                        }
+                        if (write(mPipe_fd_out, "\n\r", 3) == -1) {
+                            // Error handler to shut up gcc warnings
+                        }
                     }
                 }
                 mForceReject = false;
@@ -509,7 +524,9 @@ void LockProcess::setupSignals()
     act.sa_flags = 0;
     sigaction(SIGHUP, &act, 0L);
 
-    pipe(signal_pipe);
+    if (pipe(signal_pipe) == -1) {
+        // Error handler to shut up gcc warnings
+    }
     TQSocketNotifier* notif = new TQSocketNotifier(signal_pipe[0],
 	TQSocketNotifier::Read, TQT_TQOBJECT(this) );
     connect( notif, TQT_SIGNAL(activated(int)), TQT_SLOT(signalPipeSignal()));
@@ -519,7 +536,9 @@ void LockProcess::setupSignals()
 void LockProcess::signalPipeSignal()
 {
     char tmp;
-    ::read( signal_pipe[0], &tmp, 1);
+    if (::read( signal_pipe[0], &tmp, 1) == -1) {
+        // Error handler to shut up gcc warnings
+    }
     if( tmp == 'T' )
         quitSaver();
     else if( tmp == 'H' ) {
@@ -531,11 +550,13 @@ void LockProcess::signalPipeSignal()
 //---------------------------------------------------------------------------
 bool LockProcess::lock()
 {
+#ifdef USE_SECURING_DESKTOP_NOTIFICATION
 	m_startupStatusDialog = new KSMModalDialog(this);
 	m_startupStatusDialog->setStatusMessage(i18n("Securing desktop session").append("..."));
 	m_startupStatusDialog->show();
 	m_startupStatusDialog->setActiveWindow();
 	tqApp->processEvents();
+#endif
 
 	if (startSaver()) {
 		// In case of a forced lock we don't react to events during
@@ -589,6 +610,12 @@ void LockProcess::quitSaver()
 //---------------------------------------------------------------------------
 void LockProcess::startSecureDialog()
 {
+	if ((backingPixmap.isNull()) && (mBackingStartupDelayTimer < 100)) {
+		TQTimer::singleShot(10, this, TQT_SLOT(startSecureDialog()));
+		mBackingStartupDelayTimer++;
+		return;
+	}
+
 	int ret;
 	SecureDlg inDlg( this );
 	inDlg.setRetInt(&ret);
@@ -620,7 +647,9 @@ void LockProcess::startSecureDialog()
 		mBusy = false;
 	}
 	if (ret == 2) {
-		system("ksysguard &");
+		if (system("ksysguard &") == -1) {
+                    // Error handler to shut up gcc warnings
+                }
 		kapp->quit();
 	}
 	// FIXME
@@ -630,14 +659,17 @@ void LockProcess::startSecureDialog()
 
 bool LockProcess::runSecureDialog()
 {
+#ifdef USE_SECURING_DESKTOP_NOTIFICATION
 	m_startupStatusDialog = new KSMModalDialog(this);
 	m_startupStatusDialog->setStatusMessage(i18n("Securing desktop session").append("..."));
 	m_startupStatusDialog->show();
 	m_startupStatusDialog->setActiveWindow();
 	tqApp->processEvents();
+#endif
 
 	trinity_desktop_lock_in_sec_dlg = true;
 	if (startSaver()) {
+		mBackingStartupDelayTimer = 0;
 		TQTimer::singleShot(0, this, TQT_SLOT(startSecureDialog()));
 		return true;
 	}
@@ -1105,12 +1137,10 @@ bool LockProcess::startSaver()
 	}
 	if (trinity_desktop_lock_use_system_modal_dialogs) {
 		// Try to get the root pixmap
-		TQString filename = getenv("USER");
-		filename.prepend("/tmp/kde-");
-		filename.append("/krootbacking.png");
-		remove(filename.ascii());
-		system("krootbacking &");
-		TQTimer::singleShot( 0, this, SLOT(slotPaintBackground()) );
+		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();
 	}
 
 	if (trinity_desktop_lock_in_sec_dlg == FALSE) {
@@ -1143,7 +1173,9 @@ void LockProcess::stopSaver()
         ungrabInput();
         const char *out = "GOAWAY!";
         for (TQValueList<int>::ConstIterator it = child_sockets.begin(); it != child_sockets.end(); ++it)
-            write(*it, out, sizeof(out));
+            if (write(*it, out, sizeof(out)) == -1) {
+                // Error handler to shut up gcc warnings
+            }
     }
 }
 
@@ -1479,7 +1511,7 @@ bool LockProcess::checkPass()
         if (trinity_desktop_lock_use_sak) {
             // Wait for SAK press before continuing...
             SAKDlg inDlg( this );
-            int ret = execDialog( &inDlg );
+            execDialog( &inDlg );
             if (trinity_desktop_lock_closing_windows)
                 return 0;
         }
@@ -1576,21 +1608,9 @@ int LockProcess::execDialog( TQDialog *dlg )
     return rt;
 }
 
-void LockProcess::slotPaintBackground()
+void LockProcess::slotPaintBackground(const TQPixmap &rpm)
 {
-	TQPixmap pm;
-	TQString filename = getenv("USER");
-	filename.prepend("/tmp/kde-");
-	filename.append("/krootbacking.png");
-	bool success = pm.load(filename, "PNG");
-	if (!success) {
-		sleep(1);
-		success = pm.load(filename, "PNG");
-		if (!success) {
-			pm = TQPixmap(kapp->desktop()->width(), kapp->desktop()->height());
-			pm.fill(Qt::black);
-		}
-	}
+	TQPixmap pm = rpm;
 
 	if (TQPaintDevice::x11AppDepth() == 32) {
 		// Remove the alpha components from the image
@@ -1695,7 +1715,7 @@ bool LockProcess::x11Event(XEvent *event)
                     ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
                     if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
                 }
-                if (!mLocked)
+                if ((!mLocked) && (!trinity_desktop_lock_in_sec_dlg))
                 {
                     stopSaver();
                     kapp->quit();
diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h
index 1b5fa9fbf..a986d42c4 100644
--- a/kdesktop/lock/lockprocess.h
+++ b/kdesktop/lock/lockprocess.h
@@ -13,6 +13,7 @@
 
 #include <kprocess.h>
 #include <kpixmap.h>
+#include <krootpixmap.h>
 
 #include <tqwidget.h>
 #include <tqtimer.h>
@@ -71,7 +72,7 @@ public slots:
     void desktopResized();
     void doDesktopResizeFinish();
     void doFunctionKeyBroadcast();
-    void slotPaintBackground();
+    void slotPaintBackground(const TQPixmap &pm);
 
 protected:
     virtual bool x11Event(XEvent *);
@@ -186,6 +187,8 @@ private:
     bool        mHackStartupEnabled;
 
     TQPixmap    backingPixmap;
+    KRootPixmap  *m_rootPixmap;
+    int         mBackingStartupDelayTimer;
 
     KSMModalDialog* m_startupStatusDialog;
 };
diff --git a/kdesktop/lock/securedlg.cc b/kdesktop/lock/securedlg.cc
index ac3d3d113..4577f5784 100644
--- a/kdesktop/lock/securedlg.cc
+++ b/kdesktop/lock/securedlg.cc
@@ -104,28 +104,34 @@ SecureDlg::SecureDlg(LockProcess *parent)
     mShutdownButton->setText(i18n("Logoff Menu"));
     mShutdownButton->setEnabled(false); // FIXME
 
+    mSwitchButton = new TQPushButton( frame );
+    mSwitchButton->setText(i18n("Switch User"));
+    mSwitchButton->setEnabled(false); // FIXME
+
     TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this );
     unlockDialogLayout->addWidget( frame );
 
     TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint());
     layStatus->addWidget( mLogonStatus );
 
-    TQHBoxLayout *layPBRow1 = new TQHBoxLayout( 0, 0, KDialog::spacingHint());
-    layPBRow1->addWidget( mLockButton );
-    layPBRow1->addWidget( mTaskButton );
-    layPBRow1->addWidget( mShutdownButton );
-    layPBRow1->addWidget( mCancelButton );
+    TQGridLayout *layPBGrid = new TQGridLayout( 0, 0, KDialog::spacingHint());
+    layPBGrid->addWidget( mLockButton, 0, 0 );
+    layPBGrid->addWidget( mTaskButton, 0, 1 );
+    layPBGrid->addWidget( mShutdownButton, 0, 2 );
+    layPBGrid->addWidget( mCancelButton, 0, 3 );
+    layPBGrid->addWidget( mSwitchButton, 1, 0 );
 
     frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() );
     frameLayout->addMultiCellWidget( theader, 0, 0, 0, 1, AlignTop | AlignLeft );
     frameLayout->addMultiCellLayout( layStatus, 1, 1, 0, 1, AlignLeft | AlignVCenter);
     frameLayout->addMultiCellWidget( sep, 2, 2, 0, 1 );
-    frameLayout->addMultiCellLayout( layPBRow1, 3, 3, 0, 1, AlignLeft | AlignVCenter);
+    frameLayout->addMultiCellLayout( layPBGrid, 3, 3, 0, 1, AlignLeft | AlignVCenter);
 
     connect(mCancelButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnCancel()));
     connect(mLockButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnLock()));
     connect(mTaskButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnTask()));
     connect(mShutdownButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnShutdown()));
+    connect(mSwitchButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnSwitchUser()));
 
     TQSize dlgSz = sizeHint();
     int btnSize = dlgSz.width();
@@ -135,6 +141,7 @@ SecureDlg::SecureDlg(LockProcess *parent)
     mTaskButton->setFixedWidth(btnSize);
     mCancelButton->setFixedWidth(btnSize);
     mShutdownButton->setFixedWidth(btnSize);
+    mSwitchButton->setFixedWidth(btnSize);
 
     installEventFilter(this);
 }
@@ -168,6 +175,12 @@ void SecureDlg::slotBtnShutdown()
     hide();
 }
 
+void SecureDlg::slotBtnSwitchUser()
+{
+    if (retInt) *retInt = 4;
+    hide();
+}
+
 void SecureDlg::setRetInt(int *i)
 {
     retInt = i;
diff --git a/kdesktop/lock/securedlg.h b/kdesktop/lock/securedlg.h
index b9278d8d7..d616bf2e7 100644
--- a/kdesktop/lock/securedlg.h
+++ b/kdesktop/lock/securedlg.h
@@ -42,6 +42,7 @@ private slots:
     void slotBtnLock();
     void slotBtnTask();
     void slotBtnShutdown();
+    void slotBtnSwitchUser();
 
 protected slots:
     virtual void reject();
@@ -54,6 +55,7 @@ private:
     TQButton     *mLockButton;
     TQButton     *mTaskButton;
     TQButton     *mShutdownButton;
+    TQButton     *mSwitchButton;
     int         mCapsLocked;
     bool        mUnlockingFailed;
     TQStringList layoutsList;
-- 
cgit v1.2.3

