You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-packaging/opensuse/tdebase/kmenu-search-slowdown-fix.diff

130 lines
4.3 KiB

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,