diff options
| author | Alexander Golubev <fatzer2@gmail.com> | 2026-03-27 20:37:49 +0300 |
|---|---|---|
| committer | Alexander Golubev <fatzer2@gmail.com> | 2026-04-04 18:36:21 +0300 |
| commit | 139a07d1d0ef7747df390e9488473dbba487de58 (patch) | |
| tree | 358201bb22b07083560c1892ab7b559bd5af5831 /kdesktop | |
| parent | 15a5c1acd335974c19a280be1a599c5c3c503e69 (diff) | |
| download | tdebase-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.cpp | 12 | ||||
| -rw-r--r-- | kdesktop/bgmanager.h | 3 |
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; |
