public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] gentoo-x86 commit in kde-base/kdelibs/files: kdelibs-4.6.3-use_QWeakPointer.patch
@ 2011-05-09 18:19 Tomas Chvatal (scarabeus)
  0 siblings, 0 replies; only message in thread
From: Tomas Chvatal (scarabeus) @ 2011-05-09 18:19 UTC (permalink / raw
  To: gentoo-commits

scarabeus    11/05/09 18:19:11

  Added:                kdelibs-4.6.3-use_QWeakPointer.patch
  Log:
  Apply upstream patch to fix plasma crash when removing icons from systray. Thanks to Ian (thev00d00) for the pointer.
  
  (Portage version: 2.2.0_alpha32/cvs/Linux x86_64)

Revision  Changes    Path
1.1                  kde-base/kdelibs/files/kdelibs-4.6.3-use_QWeakPointer.patch

file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/kde-base/kdelibs/files/kdelibs-4.6.3-use_QWeakPointer.patch?rev=1.1&view=markup
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/kde-base/kdelibs/files/kdelibs-4.6.3-use_QWeakPointer.patch?rev=1.1&content-type=text/plain

Index: kdelibs-4.6.3-use_QWeakPointer.patch
===================================================================
From: Aaron Seigo <aseigo@kde.org>
Date: Fri, 06 May 2011 13:19:09 +0000
Subject: use a QWeakPointer on the KIconLoader passed in as there are no lifetime guarantees
X-Git-Url: http://quickgit.kde.org/?p=kdelibs.git&amp;a=commitdiff&amp;h=a8d16682c31ef523ffebba6e19283a19cd5f5627
---
use a QWeakPointer on the KIconLoader passed in as there are no lifetime guarantees

usually KGlobal::iconLoader() is used, so this isn't an issue seen very often.
however, when a local KIconLoader is created, it is easy to get QIcons with a
KIconEngine that has a bad KIconLoader pointer in them. particularly as QIcon
is implicitly shared and easily passed around. the StatusNotifier Plasma DataEngine
was triggering this, though it would be trivial to run into this problem again
anytime a KIconLoader is created locally

thankfully, QWeakPointer does the job and is very fast and light. (confirmed
both with my own testing and confirmation from Thiago).

massive thanks to Michael Pyne for detecting the cause of the problem via Valgrind.

BUG:258706
---


--- a/kdeui/icons/kiconengine.cpp
+++ b/kdeui/icons/kiconengine.cpp
@@ -27,16 +27,16 @@
 
 
 KIconEngine::KIconEngine(const QString& iconName, KIconLoader* iconLoader, const QStringList& overlays)
+    : mIconName(iconName),
+      mIconLoader(iconLoader),
+      mOverlays(overlays)
 {
-    mIconName = iconName;
-    mIconLoader = iconLoader;
-    mOverlays = overlays;
 }
 
 KIconEngine::KIconEngine(const QString& iconName, KIconLoader* iconLoader)
+    : mIconName(iconName),
+      mIconLoader(iconLoader)
 {
-    mIconName = iconName;
-    mIconLoader = iconLoader;
 }
 
 static inline int qIconModeToKIconState( QIcon::Mode mode )
@@ -65,8 +65,12 @@ QSize KIconEngine::actualSize( const QSi
     return QSize(iconSize, iconSize);
 }
 
-void KIconEngine::paint( QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state )
+void KIconEngine::paint(QPainter * painter, const QRect & rect, QIcon::Mode mode, QIcon::State state)
 {
+    if (!mIconLoader) {
+        return;
+    }
+
     Q_UNUSED(state)
 
     const int kstate = qIconModeToKIconState(mode);
@@ -80,20 +84,27 @@ void KIconEngine::paint( QPainter * pain
     }
 
     const int iconSize = qMin(rect.width(), rect.height());
-    const QPixmap pix = mIconLoader->loadIcon(mIconName, group, iconSize, kstate, mOverlays);
+    const QPixmap pix = mIconLoader.data()->loadIcon(mIconName, group, iconSize, kstate, mOverlays);
     painter->drawPixmap(rect, pix);
 }
 
-QPixmap KIconEngine::pixmap( const QSize & size, QIcon::Mode mode, QIcon::State state )
+QPixmap KIconEngine::pixmap(const QSize & size, QIcon::Mode mode, QIcon::State state)
 {
     Q_UNUSED(state)
 
+    if (!mIconLoader) {
+        QPixmap pm(size);
+        pm.fill(Qt::transparent);
+        return pm;
+    }
+
     const int kstate = qIconModeToKIconState(mode);
     const int iconSize = qMin(size.width(), size.height());
-    QPixmap pix = mIconLoader->loadIcon(mIconName, KIconLoader::Desktop, iconSize, kstate, mOverlays);
+    QPixmap pix = mIconLoader.data()->loadIcon(mIconName, KIconLoader::Desktop, iconSize, kstate, mOverlays);
 
-    if(pix.size() == size)
+    if (pix.size() == size) {
         return pix;
+    }
 
     QPixmap pix2(size);
     pix2.fill(QColor(0,0,0,0));
@@ -111,7 +122,7 @@ QString KIconEngine::key() const
 
 QIconEngineV2 *KIconEngine::clone() const
 {
-    return new KIconEngine(mIconName, mIconLoader, mOverlays);
+    return new KIconEngine(mIconName, mIconLoader.data(), mOverlays);
 }
 
 bool KIconEngine::read(QDataStream &in)

--- a/kdeui/icons/kiconengine_p.h
+++ b/kdeui/icons/kiconengine_p.h
@@ -75,7 +75,7 @@ class KIconEngine : public QIconEngineV2
   private:
     QString mIconName;
     QStringList mOverlays;
-    KIconLoader* mIconLoader;
+    QWeakPointer<KIconLoader> mIconLoader;
 };
 
 inline KIconEngine::~KIconEngine()







^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-05-09 18:19 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-09 18:19 [gentoo-commits] gentoo-x86 commit in kde-base/kdelibs/files: kdelibs-4.6.3-use_QWeakPointer.patch Tomas Chvatal (scarabeus)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox