summaryrefslogtreecommitdiffstats
path: root/kdesktop
diff options
context:
space:
mode:
authorAlexander Golubev <fatzer2@gmail.com>2026-03-27 20:37:49 +0300
committerAlexander Golubev <fatzer2@gmail.com>2026-04-04 18:36:21 +0300
commit139a07d1d0ef7747df390e9488473dbba487de58 (patch)
tree358201bb22b07083560c1892ab7b559bd5af5831 /kdesktop
parent15a5c1acd335974c19a280be1a599c5c3c503e69 (diff)
downloadtdebase-r14.1.x.tar.gz
tdebase-r14.1.x.zip
kdesktop: fix crash in KBackgroundManagerr14.1.x
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> (cherry picked from commit 9c71a4107d9bf90bf2dd948f0d1c5cd13ed9ec92)
Diffstat (limited to 'kdesktop')
-rw-r--r--kdesktop/bgmanager.cpp12
-rw-r--r--kdesktop/bgmanager.h3
2 files changed, 9 insertions, 6 deletions
diff --git a/kdesktop/bgmanager.cpp b/kdesktop/bgmanager.cpp
index a7078f12e..2415c7a3f 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 d78ebebc3..f62a39a0e 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;