diff options
Diffstat (limited to 'opensuse/core/tdebase/kmenu-search-slowdown-fix.diff')
-rw-r--r-- | opensuse/core/tdebase/kmenu-search-slowdown-fix.diff | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/opensuse/core/tdebase/kmenu-search-slowdown-fix.diff b/opensuse/core/tdebase/kmenu-search-slowdown-fix.diff new file mode 100644 index 000000000..83c771db2 --- /dev/null +++ b/opensuse/core/tdebase/kmenu-search-slowdown-fix.diff @@ -0,0 +1,129 @@ +Index: kicker/kicker/ui/k_mnu.cpp +=================================================================== +--- kicker/kicker/ui/k_mnu.cpp.orig ++++ kicker/kicker/ui/k_mnu.cpp +@@ -771,6 +771,7 @@ void PanelKMenu::updateRecent() + insertSeparator(RecentlyLaunchedApps::the().m_nNumMenuItems); + } + } ++ iconsLoaded_ = false; + } + + void PanelKMenu::clearRecentMenuItems() +Index: kicker/kicker/ui/service_mnu.cpp +=================================================================== +--- kicker/kicker/ui/service_mnu.cpp.orig ++++ kicker/kicker/ui/service_mnu.cpp +@@ -63,13 +63,20 @@ PanelServiceMenu::PanelServiceMenu(const + 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 @@ void PanelServiceMenu::initialize() + clearSubmenus(); + searchSubMenuIDs.clear(); + searchMenuItems.clear(); ++ iconsLoaded_ = false; + doInitialize(); + } + +@@ -289,15 +297,13 @@ void PanelServiceMenu::fillMenu(KService + 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::doInitialize() + + 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 @@ void PanelServiceMenu::insertMenuItem(KS + + 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)); + } + +@@ -1003,3 +1015,23 @@ bool PanelServiceMenu::hasSearchResults( + { + 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; ++ } ++} +Index: kicker/kicker/ui/service_mnu.h +=================================================================== +--- kicker/kicker/ui/service_mnu.h.orig ++++ kicker/kicker/ui/service_mnu.h +@@ -124,9 +124,12 @@ protected: + 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, |