Hello community,

here is the log from the commit of package kdebase4-workspace for 
openSUSE:Factory checked in at 2011-11-16 17:18:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kdebase4-workspace (Old)
 and      /work/SRC/openSUSE:Factory/.kdebase4-workspace.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kdebase4-workspace", Maintainer is "[email protected]"

Changes:
--------
--- /work/SRC/openSUSE:Factory/kdebase4-workspace/kdebase4-workspace.changes    
2011-11-14 11:55:31.000000000 +0100
+++ 
/work/SRC/openSUSE:Factory/.kdebase4-workspace.new/kdebase4-workspace.changes   
    2011-11-16 17:18:28.000000000 +0100
@@ -1,0 +2,5 @@
+Mon Nov  14 11:19:00 CET 2011 - [email protected]
+
+- Add changeset_r639155a5493a28ca9460d60fa0c078ec65c3bb96.diff to fix 
bko#272495 
+
+-------------------------------------------------------------------

New:
----
  changeset_r639155a5493a28ca9460d60fa0c078ec65c3bb96.diff

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ kdebase4-workspace.spec ++++++
--- /var/tmp/diff_new_pack.I9X4ij/_old  2011-11-16 17:18:44.000000000 +0100
+++ /var/tmp/diff_new_pack.I9X4ij/_new  2011-11-16 17:18:44.000000000 +0100
@@ -106,6 +106,10 @@
 Patch202:       plasma-disable-networkmanager.diff
 Patch211:       disable-python-support.diff
 Patch212:       plasma-detect-gpsd-correctly.diff
+#Subject: Use a QWeakPointer to track the lifespan of the task (patch from 4.7 
branch)
+#From: René Krell
+#Bug: bko#272495
+Patch213:       changeset_r639155a5493a28ca9460d60fa0c078ec65c3bb96.diff
 Requires:       kde4-kgreeter-plugins = %version
 Requires:       kdebase4-workspace-liboxygenstyle = %version
 %kde4_runtime_requires
@@ -183,6 +187,7 @@
 %patch202 -p1
 %patch211
 %patch212 -p1
+%patch213 -p1
 cp %{SOURCE3} kwin/effects/cube/data/cubecap.png
 
 %build

++++++ changeset_r639155a5493a28ca9460d60fa0c078ec65c3bb96.diff ++++++
commit 639155a5493a28ca9460d60fa0c078ec65c3bb96
Author: Aaron Seigo <[email protected]>
Date:   Thu Nov 10 13:01:37 2011 +0100

    use a QWeakPointer to track the lifespan of the task
    
    the itemRemoved signal from TaskGroup has dangling pointers, apparently
    by design (the next thing on my list to investigate), and the signal is
    delayed. so between the actual deletion of the task and the signal, there
    pointer is a dangler. easy solution is to just track it in the 
WindowTaskItem
    itself with a cheap QWeakPointer.
    
    BUG:272495

diff --git a/plasma/desktop/applets/tasks/abstracttaskitem.cpp 
b/plasma/desktop/applets/tasks/abstracttaskitem.cpp
index 00140ef..48ba172 100644
--- a/plasma/desktop/applets/tasks/abstracttaskitem.cpp
+++ b/plasma/desktop/applets/tasks/abstracttaskitem.cpp
@@ -203,6 +203,10 @@ QIcon AbstractTaskItem::icon() const
     return QIcon();
 }
 
+void AbstractTaskItem::close()
+{
+}
+
 void AbstractTaskItem::setTaskFlags(const TaskFlags flags)
 {
     if (((m_flags & TaskWantsAttention) != 0) != ((flags & TaskWantsAttention) 
!= 0)) {
diff --git a/plasma/desktop/applets/tasks/abstracttaskitem.h 
b/plasma/desktop/applets/tasks/abstracttaskitem.h
index 9520e1f..a527881 100644
--- a/plasma/desktop/applets/tasks/abstracttaskitem.h
+++ b/plasma/desktop/applets/tasks/abstracttaskitem.h
@@ -103,7 +103,7 @@ public:
     /** Returns the current icon for this task. */
     QIcon icon() const;
 
-    virtual void close() = 0;
+    virtual void close();
 
     /** Tells the window manager the minimized task's geometry. */
     virtual void publishIconGeometry() const;
diff --git a/plasma/desktop/applets/tasks/windowtaskitem.cpp 
b/plasma/desktop/applets/tasks/windowtaskitem.cpp
index 1ddca2c..1c33476 100644
--- a/plasma/desktop/applets/tasks/windowtaskitem.cpp
+++ b/plasma/desktop/applets/tasks/windowtaskitem.cpp
@@ -56,7 +56,6 @@
 
 WindowTaskItem::WindowTaskItem(QGraphicsWidget *parent, Tasks *applet)
     : AbstractTaskItem(parent, applet),
-      m_task(0),
       m_busyWidget(0)
 {
 }
@@ -77,8 +76,8 @@ void WindowTaskItem::activate()
     // in a widget such as a line edit which does accept the focus)
     // this needs to be implemented for Plasma's own panels.
     //kDebug();
-    if (m_task && m_task->task()) {
-        m_task->task()->activateRaiseOrIconify();
+    if (m_task && m_task.data()->task()) {
+        m_task.data()->task()->activateRaiseOrIconify();
        // emit windowSelected(this);
     }
 }
@@ -108,27 +107,20 @@ void WindowTaskItem::keyPressEvent(QKeyEvent *event)
     }
 }
 
-//destroy this item
-void WindowTaskItem::close()
-{
-    //kDebug();
-    m_task = 0;
-}
-
 void WindowTaskItem::publishIconGeometry() const
 {
-    if (!m_task || !m_task->task()) {
+    if (!m_task || !m_task.data()->task()) {
         return;
     }
 
     QRect rect = iconGeometry();
-    m_task->task()->publishIconGeometry(rect);
+    m_task.data()->task()->publishIconGeometry(rect);
 }
 
 void WindowTaskItem::publishIconGeometry(const QRect &rect) const
 {
-    if (m_task && m_task->task()) {
-        m_task->task()->publishIconGeometry(rect);
+    if (m_task && m_task.data()->task()) {
+        m_task.data()->task()->publishIconGeometry(rect);
     }
 }
 
@@ -142,7 +134,7 @@ void WindowTaskItem::updateTask(::TaskManager::TaskChanges 
changes)
     TaskFlags flags = m_flags;
 
     if (changes & TaskManager::StateChanged) {
-        if (m_task->isActive()) {
+        if (m_task.data()->isActive()) {
             flags |= TaskHasFocus;
             if (!(m_flags & TaskHasFocus)) {
                 emit activated(this);
@@ -151,7 +143,7 @@ void WindowTaskItem::updateTask(::TaskManager::TaskChanges 
changes)
             flags &= ~TaskHasFocus;
         }
 
-        if (m_task->isMinimized()) {
+        if (m_task.data()->isMinimized()) {
             flags |= TaskIsMinimized;
         } else {
             flags &= ~TaskIsMinimized;
@@ -160,7 +152,7 @@ void WindowTaskItem::updateTask(::TaskManager::TaskChanges 
changes)
     }
 
     if (changes & TaskManager::AttentionChanged) {
-        if (m_task->demandsAttention()) {
+        if (m_task.data()->demandsAttention()) {
             flags |= TaskWantsAttention;
         } else {
             flags &= ~TaskWantsAttention;
@@ -191,14 +183,14 @@ void 
WindowTaskItem::updateTask(::TaskManager::TaskChanges changes)
 
     if (needsUpdate) {
         //redraw
-        //kDebug() << m_task->name();
+        //kDebug() << m_task.data()->name();
         queueUpdate();
     }
 }
 
 void WindowTaskItem::updateToolTip()
 {
-    if (!m_task || !m_task->task()) {
+    if (!m_task || !m_task.data()->task()) {
         return;
     }
 
@@ -219,19 +211,19 @@ void WindowTaskItem::updateToolTip()
     }
 
     if (showToolTip) {
-        QPixmap p = m_task->task()->icon(KIconLoader::SizeLarge, 
KIconLoader::SizeLarge, false);
+        QPixmap p = m_task.data()->task()->icon(KIconLoader::SizeLarge, 
KIconLoader::SizeLarge, false);
         if (p.height() > KIconLoader::SizeLarge) {
             p = p.scaled(QSize(KIconLoader::SizeLarge, KIconLoader::SizeLarge),
                                 Qt::KeepAspectRatio, Qt::SmoothTransformation);
         }
 
-        Plasma::ToolTipContent data(Qt::escape(m_task->name()), QString(), p);
-        if (m_task->desktop() != 0 && 
-            (!m_applet->groupManager().showOnlyCurrentDesktop() || 
!m_task->isOnCurrentDesktop())) {
+        Plasma::ToolTipContent data(Qt::escape(m_task.data()->name()), 
QString(), p);
+        if (m_task.data()->desktop() != 0 && 
+            (!m_applet->groupManager().showOnlyCurrentDesktop() || 
!m_task.data()->isOnCurrentDesktop())) {
             data.setSubText(i18nc("Which virtual desktop a window is currently 
on", "On %1",
-                                  
KWindowSystem::desktopName(m_task->desktop())));
+                                  
KWindowSystem::desktopName(m_task.data()->desktop())));
         }
-        data.setWindowToPreview(m_task->task()->window());
+        data.setWindowsToPreview(QList<WId>() << 
m_task.data()->task()->window());
         data.setClickable(true);
         data.setInstantPopup(true);
         data.setHighlightWindows(m_applet->highlightWindows());
@@ -285,8 +277,9 @@ void WindowTaskItem::gotTaskPointer()
 void WindowTaskItem::setWindowTask(TaskManager::TaskItem* taskItem)
 {
     if (m_task) {
-        disconnect(m_task->task().constData(), 0, this, 0);
+        disconnect(m_task.data()->task().constData(), 0, this, 0);
     }
+
     m_task = taskItem;
     m_abstractItem = qobject_cast<TaskManager::AbstractGroupableItem 
*>(taskItem);
 
@@ -294,8 +287,10 @@ void WindowTaskItem::setWindowTask(TaskManager::TaskItem* 
taskItem)
         connect(m_abstractItem, SIGNAL(destroyed(QObject*)), this, 
SLOT(clearAbstractItem()));
     }
 
-    connect(m_task, SIGNAL(changed(::TaskManager::TaskChanges)),
-            this, SLOT(updateTask(::TaskManager::TaskChanges)));
+    if (m_task) {
+        connect(m_task.data(), SIGNAL(changed(::TaskManager::TaskChanges)),
+                this, SLOT(updateTask(::TaskManager::TaskChanges)));
+    }
 
     updateTask(::TaskManager::EverythingChanged);
     publishIconGeometry();
@@ -319,7 +314,7 @@ void WindowTaskItem::setTask(TaskManager::TaskItem* 
taskItem)
 
 TaskManager::TaskPtr WindowTaskItem::windowTask() const
 {
-    return m_task ? m_task->task() : TaskManager::TaskPtr();
+    return m_task ? m_task.data()->task() : TaskManager::TaskPtr();
 }
 
 void WindowTaskItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *e)
@@ -331,10 +326,10 @@ void 
WindowTaskItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *e)
 
     QList <QAction*> actionList;
     QAction *a(0);
-    if (m_task->isGrouped()) {
+    if (m_task.data()->isGrouped()) {
         a = new QAction(i18n("Collapse Parent Group"), 0);
         actionList.append(a);
-        TaskGroupItem *group = 
qobject_cast<TaskGroupItem*>(m_applet->rootGroupItem()->abstractTaskItem(m_task->parentGroup()));
+        TaskGroupItem *group = 
qobject_cast<TaskGroupItem*>(m_applet->rootGroupItem()->abstractTaskItem(m_task.data()->parentGroup()));
         connect(a, SIGNAL(triggered()), group, SLOT(collapse()));
     }
 
@@ -343,7 +338,7 @@ void 
WindowTaskItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *e)
         actionList.append(configAction);
     }
 
-    TaskManager::BasicMenu menu(0, m_task, &m_applet->groupManager(), 
actionList);
+    TaskManager::BasicMenu menu(0, m_task.data(), &m_applet->groupManager(), 
actionList);
     menu.adjustSize();
 
     if (m_applet->formFactor() != Plasma::Vertical) {
@@ -364,18 +359,13 @@ bool WindowTaskItem::isWindowItem() const
 
 bool WindowTaskItem::isActive() const
 {
-    if (!m_task) {
-        //kDebug() << "no task set";
-        return false;
-    }
-
-    return m_task->isActive();
+    return m_task ? m_task.data()->isActive() : false;
 }
 
 void WindowTaskItem::setAdditionalMimeData(QMimeData* mimeData)
 {
     if (m_task) {
-        m_task->addMimeData(mimeData);
+        m_task.data()->addMimeData(mimeData);
     }
 }
 
diff --git a/plasma/desktop/applets/tasks/windowtaskitem.h 
b/plasma/desktop/applets/tasks/windowtaskitem.h
index a5b698a..4db9d43 100644
--- a/plasma/desktop/applets/tasks/windowtaskitem.h
+++ b/plasma/desktop/applets/tasks/windowtaskitem.h
@@ -63,7 +63,6 @@ signals:
 
 public slots:
     void activate();
-    void close();
 
 protected:
     void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
@@ -82,7 +81,7 @@ private:
     /** Sets the window represented by this task. */
     void setWindowTask(TaskManager::TaskItem* taskItem);
 
-    TaskManager::TaskItem *m_task;
+    QWeakPointer<TaskManager::TaskItem> m_task;
     Plasma::BusyWidget *m_busyWidget;
 };
 


-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to