From 9c71a4107d9bf90bf2dd948f0d1c5cd13ed9ec92 Mon Sep 17 00:00:00 2001
From: Alexander Golubev <fatzer2@gmail.com>
Date: Fri, 27 Mar 2026 20:37:49 +0300
Subject: kdesktop: fix crash in KBackgroundManager

The crash in KBackgroundManager::slotCrossFadeTimeout() sporadically
appeared on monitor switching on/off. Because a pointer to mOldScreen
was used after being freed.

Since TQPixmaps are implicitly shared it's ok to make a copy of it there
isn't an additional severe cost for it.

Signed-off-by: Alexander Golubev <fatzer2@gmail.com>
---
 kdesktop/bgmanager.cpp | 12 +++++++-----
 kdesktop/bgmanager.h   |  3 ++-
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/kdesktop/bgmanager.cpp b/kdesktop/bgmanager.cpp
index 8446a5729..7edd15485 100644
--- a/kdesktop/bgmanager.cpp
+++ b/kdesktop/bgmanager.cpp
@@ -606,12 +606,13 @@ void KBackgroundManager::slotCrossFadeTimeout()
         m_crossTimer->stop();
         KPixmap pixm(mNextScreen);
         setPixmap(&pixm, r->hash(), fadeDesk);
+        mOldScreen = TQPixmap();
         return;
     }
     // Reset Timer
     mBenchmark.start();
 
-    TQPixmap dst = crossFade(*mOldScreen, mNextScreen, mAlpha, crossInit);
+    TQPixmap dst = crossFade(mOldScreen, mNextScreen, mAlpha, crossInit);
     KPixmap pixm(dst);
     setPixmap(&pixm, r->hash(), fadeDesk);
 
@@ -658,15 +659,16 @@ void KBackgroundManager::slotImageDone(int desk)
                 mNextScreen = TQPixmap(*pm);
             }
 
+            const TQPixmap *pPix;
             if (m_pDesktop){
-                mOldScreen = const_cast<TQPixmap *>( m_pDesktop->backgroundPixmap() );
+                pPix = m_pDesktop->backgroundPixmap();
             }else{
-                mOldScreen = const_cast<TQPixmap *>(
-                TQApplication::desktop()->screen()->backgroundPixmap() );
+                pPix = TQApplication::desktop()->screen()->backgroundPixmap();
             }
 
             //TODO Find a way to discover if CrossFade effect needs to run
-            if (mOldScreen){
+            if (pPix){
+                mOldScreen = *pPix;
                 crossInit = true;
                 m_crossTimer->start(70);
             } else{
diff --git a/kdesktop/bgmanager.h b/kdesktop/bgmanager.h
index 0c7722311..6742fa62e 100644
--- a/kdesktop/bgmanager.h
+++ b/kdesktop/bgmanager.h
@@ -12,6 +12,7 @@
 
 #include <tqstring.h>
 #include <tqptrvector.h>
+#include <tqpixmap.h>
 
 #include <tqdatetime.h>
 #include <KBackgroundIface.h>
@@ -138,7 +139,7 @@ private:
     TQTimer * m_crossTimer;
     double mAlpha;
     TQPixmap  mNextScreen;
-    TQPixmap  * mOldScreen;
+    TQPixmap  mOldScreen;
     int fadeDesk;
     TQTime mBenchmark;
     bool crossInit;
-- 
cgit v1.2.3

