File kmenu-search-slowdown-fix.diff of Package kdebase3

--- kicker/kicker/ui/k_mnu.cpp
+++ kicker/kicker/ui/k_mnu.cpp
@@ -774,6 +774,7 @@
             insertSeparator(RecentlyLaunchedApps::the().m_nNumMenuItems);
         }
     }
+    iconsLoaded_ = false;
 }
 
 void PanelKMenu::clearRecentMenuItems()
--- kicker/kicker/ui/service_mnu.cpp
+++ kicker/kicker/ui/service_mnu.cpp
@@ -63,13 +63,20 @@
       insertInlineHeader_( insertInlineHeader ),
       clearOnClose_(false),
       addmenumode_(addmenumode),
-      popupMenu_(0)
+      popupMenu_(0),
+      iconsLoaded_(false)
 {
     excludeNoDisplay_=true;
 
     connect(KSycoca::self(), SIGNAL(databaseChanged()),
             SLOT(slotClearOnClose()));
     connect(this, SIGNAL(aboutToHide()), this, SLOT(slotClose()));
+
+    const int iconSize = KickerSettings::menuEntryHeight();
+    QPixmap pix(iconSize,iconSize);
+    QBitmap map(iconSize,iconSize,true);
+    pix.setMask(map);
+    emptyiconset = QIconSet(pix,pix);
 }
 
 PanelServiceMenu::~PanelServiceMenu()
@@ -103,6 +110,7 @@
     clearSubmenus();
     searchSubMenuIDs.clear();
     searchMenuItems.clear();
+    iconsLoaded_ = false;
     doInitialize();
 }
 
@@ -289,15 +297,13 @@
                 newSubMenu(g->name(), g->relPath(), this, g->name().utf8(), inlineHeaderName);
             m->setCaption(groupCaption);
 
-            QIconSet iconset = KickerLib::menuIconSet(g->icon());
-
             if (separatorNeeded)
             {
                 insertSeparator();
                 separatorNeeded = false;
             }
 
-            int newId = insertItem(iconset, groupCaption, m, id++);
+            int newId = insertItem(emptyiconset,groupCaption, m, id++);
             entryMap_.insert(newId, static_cast<KSycocaEntry*>(g));
             // This submenu will be searched when applying a search string
             searchSubMenuIDs[m] = newId;
@@ -392,6 +398,12 @@
 
 void PanelServiceMenu::configChanged()
 {
+    const int iconSize = KickerSettings::menuEntryHeight();
+    QPixmap pix(iconSize,iconSize);
+    QBitmap map(iconSize,iconSize,true);
+    pix.setMask(map);
+    emptyiconset = QIconSet(pix,pix);
+
     deinitialize();
 }
 
@@ -456,9 +468,9 @@
 
     int newId;
     if ( label.isEmpty() )
-       newId = insertItem(KickerLib::menuIconSet(s->icon()), serviceName, nId, nIndex);
+       newId = insertItem(emptyiconset, serviceName, nId, nIndex);       
     else
-       newId = insertItem(KickerLib::menuIconSet(s->icon()), label, nId, nIndex);
+       newId = insertItem(emptyiconset, label, nId, nIndex);
     entryMap_.insert(newId, static_cast<KSycocaEntry*>(s));
 }
 
@@ -1001,3 +1013,23 @@
 {
     return hasSearchResults_;
 }
+
+void PanelServiceMenu::slotAboutToShow()
+{
+   KPanelMenu::slotAboutToShow();
+
+   if (!iconsLoaded_) {
+     EntryMap::Iterator mapIt;
+     for ( mapIt = entryMap_.begin(); mapIt != entryMap_.end(); ++mapIt ) {
+        KService *s = dynamic_cast<KService *>(static_cast<KSycocaEntry*>(mapIt.data()));
+        if (s)
+          changeItem(mapIt.key(),KickerLib::menuIconSet(s->icon()),text(mapIt.key()));
+        else {
+          KServiceGroup *g = dynamic_cast<KServiceGroup *>(static_cast<KSycocaEntry*>(mapIt.data()));
+          if (g)
+            changeItem(mapIt.key(),KickerLib::menuIconSet(g->icon()),text(mapIt.key()));
+        }
+     }
+     iconsLoaded_ = true;
+ }
+}
--- kicker/kicker/ui/service_mnu.h
+++ kicker/kicker/ui/service_mnu.h
@@ -124,9 +124,12 @@
     PanelServiceMenuMap searchSubMenuIDs;
     bool hasSearchResults_;
     std::set<int> searchMenuItems;
+    QIconSet emptyiconset;
+    bool iconsLoaded_;
 
 private slots:
     void slotContextMenu(int);
+    void slotAboutToShow();
 
 private:
     enum ContextMenuEntry { AddItemToPanel, EditItem, AddMenuToPanel, EditMenu,
openSUSE Build Service is sponsored by