File klipper.patch of Package kdebase4-workspace

Subject: fix performance issue with Klipper
From: Filip Wieladek <fwi@tribogna.(none)>
Signed-Off-By: <name, optionally email>
Bug: kde#238084
Patch-upstream: no


From 2d1cd043101b71c102d747c760a78fe85c17488a Mon Sep 17 00:00:00 2001
From: Filip Wieladek <fwi@tribogna.(none)>
Date: Mon, 4 Jun 2012 08:37:24 +0200
Subject: [PATCH 1/2] Fix flickering
---
 klipper/klipperpopup.cpp |   24 +++++++++++-------------
 klipper/popupproxy.cpp   |   12 ++++++++----
 klipper/popupproxy.h     |    2 +-
 3 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/klipper/klipperpopup.cpp b/klipper/klipperpopup.cpp
index bff2c25..ebdfdd6 100644
--- a/klipper/klipperpopup.cpp
+++ b/klipper/klipperpopup.cpp
@@ -163,12 +163,15 @@ void KlipperPopup::buildFromScratch() {
 }
 
 void KlipperPopup::rebuild( const QString& filter ) {
+    setFixedSize(size());
     if (actions().isEmpty()) {
         buildFromScratch();
     } else {
         for ( int i=0; i<m_nHistoryItems; i++ ) {
             Q_ASSERT(TOP_HISTORY_ITEM_INDEX < actions().count());
-            removeAction(actions().at(TOP_HISTORY_ITEM_INDEX));
+            QAction* action= actions().at(TOP_HISTORY_ITEM_INDEX);
+            removeAction(action);
+            delete action;
         }
     }
 
@@ -177,11 +180,7 @@ void KlipperPopup::rebuild( const QString& filter ) {
     QRegExp filterexp( filter, caseSens );
 
     QPalette palette = m_filterWidget->palette();
-    if ( filterexp.isValid() ) {
-        palette.setColor( m_filterWidget->foregroundRole(), palette.color(foregroundRole()) );
-    } else {
-        palette.setColor( m_filterWidget->foregroundRole(), Qt::red );
-    }
+    palette.setColor( m_filterWidget->foregroundRole(), filterexp.isValid() ? palette.color(foregroundRole()) : Qt::red  );
     m_nHistoryItems = m_popupProxy->buildParent( TOP_HISTORY_ITEM_INDEX, filterexp );
     if ( m_nHistoryItems == 0 ) {
         if ( m_history->empty() ) {
@@ -199,6 +198,7 @@ void KlipperPopup::rebuild( const QString& filter ) {
     }
     m_filterWidget->setPalette( palette );
     m_dirty = false;
+    setFixedSize(sizeHint());
 }
 
 void KlipperPopup::plugAction( QAction* action ) {
@@ -269,13 +269,11 @@ void KlipperPopup::keyPressEvent( QKeyEvent* e ) {
         QString lastString = m_filterWidget->text();
         QApplication::sendEvent(m_filterWidget, e);
 
-        if (m_filterWidget->text().isEmpty()) {
-            if (m_filterWidgetAction->isVisible())
-                m_filterWidget->setVisible(false);
-                m_filterWidgetAction->setVisible(false);
-        }
-        else if (!m_filterWidgetAction->isVisible() )
-            m_filterWidgetAction->setVisible(true);
+        bool visible= !m_filterWidget->text().isEmpty();
+        if (m_filterWidgetAction->isVisible() != visible) {
+            m_filterWidget->setVisible(visible);
+            m_filterWidgetAction->setVisible(visible);
+         }
 
         if (m_filterWidget->text() != lastString) {
             m_dirty = true;
diff --git a/klipper/popupproxy.cpp b/klipper/popupproxy.cpp
index 555f383..53042a6 100644
--- a/klipper/popupproxy.cpp
+++ b/klipper/popupproxy.cpp
@@ -48,11 +48,11 @@ PopupProxy::PopupProxy( KlipperPopup* parent, int menu_height, int menu_width )
 }
 
 void PopupProxy::slotHistoryChanged() {
-    deleteMoreMenus();
+    deleteMoreMenus(true);
 
 }
 
-void PopupProxy::deleteMoreMenus() {
+void PopupProxy::deleteMoreMenus(bool delayed) {
     const KMenu* myParent = parent();
     if ( myParent != m_proxy_for_menu ) {
         KMenu* delme = m_proxy_for_menu;
@@ -63,12 +63,16 @@ void PopupProxy::deleteMoreMenus() {
         }
         // We are called probably from within the menus event-handler (triggered=>slotMoveToTop=>changed=>slotHistoryChanged=>deleteMoreMenus)
         // what can result in a crash if we just delete the menu here (#155196 and #165154) So, delay the delete.
-        delme->deleteLater();
+        if ( delayed ) {
+            delme->deleteLater();
+        } else {
+            delete delme;
+        }
     }
 }
 
 int PopupProxy::buildParent( int index, const QRegExp& filter ) {
-    deleteMoreMenus();
+    deleteMoreMenus(false);
     // Start from top of  history (again)
     m_spill_uuid = parent()->history()->empty() ? QByteArray() : parent()->history()->first()->uuid();
     if ( filter.isValid() ) {
diff --git a/klipper/popupproxy.h b/klipper/popupproxy.h
index 910bd6e..c24bab4 100644
--- a/klipper/popupproxy.h
+++ b/klipper/popupproxy.h
@@ -76,7 +76,7 @@ private:
     /**
      * Delete all "More..." menus current created.
      */
-    void deleteMoreMenus();
+    void deleteMoreMenus(bool delayed = false);
 
 private:
     KMenu* m_proxy_for_menu;
-- 
1.7.9.5


From bab521d32564a61c50c8ea7722d9ecdf77bfb219 Mon Sep 17 00:00:00 2001
From: Filip Wieladek <fwi@tribogna.(none)>
Date: Mon, 4 Jun 2012 09:08:42 +0200
Subject: [PATCH 2/2] Fix flickering and add delay before rebuilding the popup
 x

---
 klipper/klipperpopup.cpp |   17 +++++++++++++++--
 klipper/klipperpopup.h   |    3 +++
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/klipper/klipperpopup.cpp b/klipper/klipperpopup.cpp
index ebdfdd6..b4cad63 100644
--- a/klipper/klipperpopup.cpp
+++ b/klipper/klipperpopup.cpp
@@ -37,6 +37,7 @@
 
 namespace {
     static const int TOP_HISTORY_ITEM_INDEX = 2;
+    static const int REBUILD_DELAY = 350;
 }
 
 // #define DEBUG_EVENTS__
@@ -105,7 +106,10 @@ KlipperPopup::KlipperPopup( History* history )
     int menuWidth = ( screen.width() )  * 1/3;
 
     m_popupProxy = new PopupProxy( this, menuHeight, menuWidth );
-
+    m_delayTimer = new QTimer( this );
+    
+    m_delayTimer->setSingleShot( true );
+    connect( m_delayTimer, SIGNAL(timeout()), SLOT(timedRebuild()) );
     connect( this, SIGNAL(aboutToShow()), SLOT(slotAboutToShow()) );
 }
 
@@ -198,6 +202,7 @@ void KlipperPopup::rebuild( const QString& filter ) {
     }
     m_filterWidget->setPalette( palette );
     m_dirty = false;
+    setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
     setFixedSize(sizeHint());
 }
 
@@ -277,7 +282,10 @@ void KlipperPopup::keyPressEvent( QKeyEvent* e ) {
 
         if (m_filterWidget->text() != lastString) {
             m_dirty = true;
-            rebuild(m_filterWidget->text());
+            QPalette palette = m_filterWidget->palette();
+            palette.setColor(m_filterWidget->foregroundRole(), palette.color(QPalette::Disabled, QPalette::WindowText) );
+            m_filterWidget->setPalette(palette);
+            m_delayTimer->start( REBUILD_DELAY );
         }
 
         break;
@@ -285,6 +293,11 @@ void KlipperPopup::keyPressEvent( QKeyEvent* e ) {
     } //case
 }
 
+void KlipperPopup::timedRebuild()
+{
+  rebuild(m_filterWidget->text());
+}
+
 
 void KlipperPopup::slotSetTopActive()
 {
diff --git a/klipper/klipperpopup.h b/klipper/klipperpopup.h
index 31beff2..bdc7548 100644
--- a/klipper/klipperpopup.h
+++ b/klipper/klipperpopup.h
@@ -20,6 +20,7 @@
 #define KLIPPERPOPUP_H
 
 #include <QtCore/QList>
+#include <QTimer>
 
 #include <KMenu>
 
@@ -62,6 +63,7 @@ public Q_SLOTS:
      * set the top history item active, to easy kb navigation
      */
     void slotSetTopActive();
+    void timedRebuild();
 
 private:
     void rebuild( const QString& filter = QString() );
@@ -119,6 +121,7 @@ private:
      */
     int m_nHistoryItems;
 
+    QTimer* m_delayTimer;
 };
 
 #endif
-- 
1.7.9.5