23 #include <sys/types.h>
35 #include <QtCore/QMap>
36 #include <QtCore/QFile>
37 #include <QtCore/QDir>
38 #include <QtCore/QRegExp>
39 #include <QtCore/QDirIterator>
46 if (it != dupeList.end())
48 kDebug(7021) << e.tagName() <<
"and" << s <<
"requires combining!";
50 docElem.removeChild(*it);
53 dupeList.insert(s, e);
58 for(QStringList::ConstIterator it = list.begin();
59 it != list.end(); ++it)
61 QDomElement e = docElem.ownerDocument().createElement(tag);
62 QDomText txt = docElem.ownerDocument().createTextNode(*it);
64 docElem.insertAfter(e, n);
67 QDomNode
next = n.nextSibling();
68 docElem.removeChild(n);
73 void VFolderMenu::registerFile(
const QString &file)
75 int i = file.lastIndexOf(
'/');
80 registerDirectory(dir);
83 void VFolderMenu::registerDirectory(
const QString &directory)
98 if ((*it).startsWith(previous))
112 track(
const QString &menuId,
const QString &menuName,
const QHash<QString,KService::Ptr>& includeList,
const QHash<QString,KService::Ptr>& excludeList,
const QHash<QString,KService::Ptr>& itemList,
const QString &comment)
114 if (itemList.contains(menuId))
115 printf(
"%s: %s INCL %d EXCL %d\n", qPrintable(menuName), qPrintable(comment), includeList.contains(menuId) ? 1 : 0, excludeList.contains(menuId) ? 1 : 0);
119 VFolderMenu::includeItems(QHash<QString,KService::Ptr>& items1,
const QHash<QString,KService::Ptr>& items2)
122 items1.insert(p->menuId(), p);
127 VFolderMenu::matchItems(QHash<QString,KService::Ptr>& items1,
const QHash<QString,KService::Ptr>& items2)
132 if (!items2.contains(
id))
138 VFolderMenu::excludeItems(QHash<QString,KService::Ptr>& items1,
const QHash<QString,KService::Ptr>& items2)
141 items1.remove(p->menuId());
145 VFolderMenu::takeSubMenu(SubMenu *parentMenu,
const QString &menuName)
147 const int i = menuName.indexOf(
'/');
148 const QString s1 = i > 0 ? menuName.left(i) : menuName;
149 const QString s2 = menuName.mid(i+1);
152 for (QList<SubMenu*>::Iterator it = parentMenu->subMenus.begin(); it != parentMenu->subMenus.end(); ++it)
155 if (menu->name == s1)
160 parentMenu->subMenus.erase(it);
165 return takeSubMenu(menu, s2);
173 VFolderMenu::mergeMenu(SubMenu *menu1, SubMenu *menu2,
bool reversePriority)
177 track(
m_trackId, menu1->name, menu1->items, menu1->excludeItems, menu2->items,
QString(
"Before MenuMerge w. %1 (incl)").arg(menu2->name));
178 track(
m_trackId, menu1->name, menu1->items, menu1->excludeItems, menu2->excludeItems,
QString(
"Before MenuMerge w. %1 (excl)").arg(menu2->name));
183 excludeItems(menu2->items, menu1->excludeItems);
184 includeItems(menu1->items, menu2->items);
185 excludeItems(menu2->excludeItems, menu1->items);
186 includeItems(menu1->excludeItems, menu2->excludeItems);
191 excludeItems(menu1->items, menu2->excludeItems);
192 includeItems(menu1->items, menu2->items);
193 includeItems(menu1->excludeItems, menu2->excludeItems);
194 menu1->isDeleted = menu2->isDeleted;
196 while (!menu2->subMenus.isEmpty())
198 SubMenu *subMenu = menu2->subMenus.takeFirst();
199 insertSubMenu(menu1, subMenu->name, subMenu, reversePriority);
205 if (menu1->directoryFile.isEmpty())
206 menu1->directoryFile = menu2->directoryFile;
207 if (menu1->defaultLayoutNode.isNull())
208 menu1->defaultLayoutNode = menu2->defaultLayoutNode;
209 if (menu1->layoutNode.isNull())
210 menu1->layoutNode = menu2->layoutNode;
215 if (!menu2->directoryFile.isEmpty())
216 menu1->directoryFile = menu2->directoryFile;
217 if (!menu2->defaultLayoutNode.isNull())
218 menu1->defaultLayoutNode = menu2->defaultLayoutNode;
219 if (!menu2->layoutNode.isNull())
220 menu1->layoutNode = menu2->layoutNode;
225 track(
m_trackId, menu1->name, menu1->items, menu1->excludeItems, menu2->items,
QString(
"After MenuMerge w. %1 (incl)").arg(menu2->name));
226 track(
m_trackId, menu1->name, menu1->items, menu1->excludeItems, menu2->excludeItems,
QString(
"After MenuMerge w. %1 (excl)").arg(menu2->name));
233 VFolderMenu::insertSubMenu(SubMenu *parentMenu,
const QString &menuName, SubMenu *newMenu,
bool reversePriority)
235 const int i = menuName.indexOf(
'/');
236 const QString s1 = menuName.left(i);
237 const QString s2 = menuName.mid(i+1);
240 foreach (SubMenu *menu, parentMenu->subMenus)
242 if (menu->name == s1)
246 mergeMenu(menu, newMenu, reversePriority);
251 insertSubMenu(menu, s2, newMenu, reversePriority);
259 newMenu->name = menuName;
260 parentMenu->subMenus.append(newMenu);
264 SubMenu *menu =
new SubMenu;
266 parentMenu->subMenus.append(menu);
267 insertSubMenu(menu, s2, newMenu);
274 const int i = name.indexOf(
'/');
279 parentMenu->items.insert(newService->menuId(), newService);
287 foreach (SubMenu *menu, parentMenu->subMenus)
289 if (menu->name == s1)
291 insertService(menu, s2, newService);
296 SubMenu *menu =
new SubMenu;
298 parentMenu->subMenus.append(menu);
299 insertService(menu, s2, newService);
305 m_serviceFactory(serviceFactory),
306 m_kbuildsycocaInterface(kbuildsycocaInterface)
319 #define FOR_ALL_APPLICATIONS(it) \
320 foreach (AppsInfo *info, m_appsInfoStack) \
322 QHashIterator<QString,KService::Ptr> it = info->applications; \
323 while (it.hasNext()) \
326 #define FOR_ALL_APPLICATIONS_END } }
328 #define FOR_CATEGORY(category, it) \
329 foreach (AppsInfo *info, m_appsInfoStack) \
331 const KService::List list = info->dictCategories.value(category); \
332 for(KService::List::ConstIterator it = list.constBegin(); \
333 it != list.constEnd(); ++it) \
335 #define FOR_CATEGORY_END } }
338 VFolderMenu::findApplication(
const QString &relPath)
342 if (info->applications.contains(relPath)) {
354 service->setMenuId(
id);
360 VFolderMenu::buildApplicationIndex(
bool unusedOnly)
364 info->dictCategories.clear();
365 QMutableHashIterator<QString,KService::Ptr> it = info->applications;
376 Q_FOREACH(
const QString& cat, s->categories()) {
377 info->dictCategories[cat].append(s);
384 VFolderMenu::createAppsInfo()
395 VFolderMenu::loadAppsInfo()
408 VFolderMenu::unloadAppsInfo()
424 VFolderMenu::absoluteDir(
const QString &_dir,
const QString &baseDir,
bool keepRelativeToCfg)
427 if (QDir::isRelativePath(dir))
431 if (!dir.endsWith(
'/'))
434 bool relative = QDir::isRelativePath(dir);
435 if (relative && !keepRelativeToCfg) {
448 QDomNodeList mergeFileList = doc.elementsByTagName(tag);
449 for(
int i = 0; i < (int)mergeFileList.count(); i++)
451 QDomAttr attr = doc.createAttribute(
"__BaseDir");
453 mergeFileList.item(i).toElement().setAttributeNode(attr);
459 QDomNodeList mergeFileList = doc.elementsByTagName(tag);
460 for(
int i = 0; i < (int)mergeFileList.count(); i++)
462 QDomAttr attr = doc.createAttribute(
"__BasePath");
464 mergeFileList.item(i).toElement().setAttributeNode(attr);
469 VFolderMenu::loadDoc()
477 if ( !file.open( QIODevice::ReadOnly ) )
485 if ( !doc.setContent( &file, &errorMsg, &errorRow, &errorCol ) ) {
486 kWarning(7021) <<
"Parse error in " <<
m_docInfo.
path <<
", line " << errorRow <<
", col " << errorCol <<
": " << errorMsg;
504 VFolderMenu::mergeFile(QDomElement &parent,
const QDomNode &mergeHere)
507 QDomDocument doc = loadDoc();
509 QDomElement docElem = doc.documentElement();
510 QDomNode n = docElem.firstChild();
511 QDomNode last = mergeHere;
514 QDomElement e = n.toElement();
515 QDomNode
next = n.nextSibling();
522 else if (e.tagName() !=
"Name")
524 parent.insertAfter(n, last);
528 docElem.removeChild(n);
535 VFolderMenu::mergeMenus(QDomElement &docElem,
QString &name)
542 QDomElement defaultLayoutNode;
543 QDomElement layoutNode;
545 QDomNode n = docElem.firstChild();
546 while( !n.isNull() ) {
547 QDomElement e = n.toElement();
551 else if( e.tagName() ==
"DefaultAppDirs") {
556 else if( e.tagName() ==
"DefaultDirectoryDirs") {
561 else if( e.tagName() ==
"DefaultMergeDirs") {
566 else if( e.tagName() ==
"AppDir") {
570 else if( e.tagName() ==
"DirectoryDir") {
572 foldNode(docElem, e, directoryDirNodes);
574 else if( e.tagName() ==
"LegacyDir") {
576 foldNode(docElem, e, legacyDirNodes);
578 else if( e.tagName() ==
"Directory") {
580 foldNode(docElem, e, directoryNodes);
582 else if( e.tagName() ==
"Move") {
585 QDomNode n2 = e.firstChild();
586 while( !n2.isNull() ) {
587 QDomElement e2 = n2.toElement();
588 if( e2.tagName() ==
"Old")
593 n2 = n2.nextSibling();
595 foldNode(docElem, e, appDirNodes, orig);
597 else if( e.tagName() ==
"Menu") {
601 if (it != menuNodes.end())
603 QDomElement docElem2 = *it;
604 QDomNode n2 = docElem2.firstChild();
605 QDomNode first = e.firstChild();
606 while( !n2.isNull() ) {
607 QDomElement e2 = n2.toElement();
608 QDomNode n3 = n2.nextSibling();
609 e.insertBefore(n2, first);
610 docElem2.removeChild(n2);
616 docElem.removeChild(docElem2);
619 menuNodes.insert(name, e);
621 else if( e.tagName() ==
"MergeFile") {
622 if ((e.attribute(
"type") ==
"parent"))
623 pushDocInfoParent(e.attribute(
"__BasePath"), e.attribute(
"__BaseDir"));
625 pushDocInfo(e.text(), e.attribute(
"__BaseDir"));
628 mergeFile(docElem, n);
633 docElem.removeChild(last);
636 else if( e.tagName() ==
"MergeDir") {
637 QString dir = absoluteDir(e.text(), e.attribute(
"__BaseDir"),
true);
640 for(QStringList::ConstIterator it=dirs.begin();
641 it != dirs.end(); ++it)
643 registerDirectory(*it);
647 if (!QDir::isRelativePath(dir))
659 for(QStringList::ConstIterator it=fileList.constBegin();
660 it != fileList.constEnd(); ++it)
663 mergeFile(docElem, n);
669 docElem.removeChild(last);
673 else if( e.tagName() ==
"Name") {
676 else if( e.tagName() ==
"DefaultLayout") {
677 if (!defaultLayoutNode.isNull())
678 docElem.removeChild(defaultLayoutNode);
679 defaultLayoutNode = e;
681 else if( e.tagName() ==
"Layout") {
682 if (!layoutNode.isNull())
683 docElem.removeChild(layoutNode);
691 VFolderMenu::pushDocInfo(
const QString &fileName,
const QString &baseDir)
694 if (!baseDir.isEmpty())
696 if (!QDir::isRelativePath(baseDir))
703 if (!QDir::isRelativePath(baseName))
704 registerFile(baseName);
713 kDebug(7021) <<
"Menu" << fileName <<
"not found.";
717 i = baseName.lastIndexOf(
'/');
731 VFolderMenu::pushDocInfoParent(
const QString &basePath,
const QString &baseDir)
737 QString fileName = basePath.mid(basePath.lastIndexOf(
'/')+1);
743 while( !result.isEmpty() && (result[0] != basePath))
744 result.erase(result.begin());
746 if (result.count() <= 1)
755 VFolderMenu::popDocInfo()
761 VFolderMenu::locateMenuFile(
const QString &fileName)
763 if (!QDir::isRelativePath(fileName))
772 QString xdgMenuPrefix = QString::fromLocal8Bit(qgetenv(
"XDG_MENU_PREFIX"));
773 if (!xdgMenuPrefix.isEmpty())
775 QFileInfo fileInfo(fileName);
777 QString fileNameOnly = fileInfo.fileName();
778 if (!fileNameOnly.startsWith(xdgMenuPrefix))
779 fileNameOnly = xdgMenuPrefix + fileNameOnly;
782 fileInfo.path() +
'/' + fileNameOnly);
786 if (result.isEmpty())
796 VFolderMenu::locateDirectoryFile(
const QString &fileName)
798 if (fileName.isEmpty())
801 if (!QDir::isRelativePath(fileName))
822 VFolderMenu::initDirs()
834 VFolderMenu::loadMenu(
const QString &fileName)
838 if (!fileName.endsWith(QLatin1String(
".menu")))
841 pushDocInfo(fileName);
855 QDomElement e =
m_doc.documentElement();
861 VFolderMenu::processCondition(QDomElement &domElem, QHash<QString,KService::Ptr>& items)
863 if (domElem.tagName() ==
"And")
865 QDomNode n = domElem.firstChild();
869 QDomElement e = n.toElement();
872 processCondition(e, items);
877 QHash<QString,KService::Ptr> andItems;
878 while( !n.isNull() ) {
879 QDomElement e = n.toElement();
880 if (e.tagName() ==
"Not")
883 QDomNode n2 = e.firstChild();
884 while( !n2.isNull() ) {
885 QDomElement e2 = n2.toElement();
887 processCondition(e2, andItems);
888 excludeItems(items, andItems);
889 n2 = n2.nextSibling();
895 processCondition(e, andItems);
896 matchItems(items, andItems);
901 else if (domElem.tagName() ==
"Or")
903 QDomNode n = domElem.firstChild();
907 QDomElement e = n.toElement();
910 processCondition(e, items);
915 QHash<QString,KService::Ptr> orItems;
916 while( !n.isNull() ) {
917 QDomElement e = n.toElement();
920 processCondition(e, orItems);
921 includeItems(items, orItems);
926 else if (domElem.tagName() ==
"Not")
931 items.insert(s->menuId(), s);
935 QHash<QString,KService::Ptr> notItems;
936 QDomNode n = domElem.firstChild();
937 while( !n.isNull() ) {
938 QDomElement e = n.toElement();
941 processCondition(e, notItems);
942 excludeItems(items, notItems);
947 else if (domElem.tagName() ==
"Category")
952 items.insert(s->menuId(), s);
956 else if (domElem.tagName() ==
"All")
961 items.insert(s->menuId(), s);
965 else if (domElem.tagName() ==
"Filename")
967 const QString filename = domElem.text();
971 items.insert(filename, s);
976 VFolderMenu::loadApplications(
const QString &dir,
const QString &prefix)
978 kDebug(7021) <<
"Looking up applications under" << dir;
980 QDirIterator it(dir);
981 while (it.hasNext()) {
983 const QFileInfo fi = it.fileInfo();
984 const QString fn = fi.fileName();
986 if(fn == QLatin1String(
".") || fn == QLatin1String(
".."))
988 loadApplications(fi.filePath(), prefix + fn +
'-');
992 if (!fn.endsWith(QLatin1String(
".desktop")))
996 addApplication(prefix + fn, service);
1002 VFolderMenu::processKDELegacyDirs()
1006 QHash<QString,KService::Ptr> items;
1016 for(QStringList::ConstIterator it = relFiles.constBegin();
1017 it != relFiles.constEnd(); ++it)
1022 if (!name.endsWith(QLatin1String(
"/.directory")))
1025 name = name.left(name.length()-11);
1027 SubMenu *newMenu =
new SubMenu;
1034 if ((*it).endsWith(QLatin1String(
".desktop")))
1043 int i =
id.lastIndexOf(
'/');
1050 addApplication(
id, service);
1051 items.insert(service->menuId(), service);
1052 if (service->categories().isEmpty())
1058 markUsedApplications(items);
1065 kDebug(7021).nospace() <<
"processLegacyDir(" << dir <<
", " << relDir <<
", " << prefix <<
")";
1067 QHash<QString,KService::Ptr> items;
1068 QDirIterator it(dir);
1069 while (it.hasNext()) {
1071 const QFileInfo fi = it.fileInfo();
1072 const QString fn = fi.fileName();
1074 if(fn == QLatin1String(
".") || fn == QLatin1String(
".."))
1084 processLegacyDir(fi.filePath(), relDir + fn +
'/', prefix);
1089 if (!fn.endsWith(QLatin1String(
".desktop")))
1094 const QString id = prefix + fn;
1097 addApplication(
id, service);
1098 items.insert(service->menuId(), service);
1100 if (service->categories().isEmpty())
1105 markUsedApplications(items);
1111 VFolderMenu::processMenu(QDomElement &docElem,
int pass)
1118 bool onlyUnallocated =
false;
1119 bool isDeleted =
false;
1120 bool kdeLegacyDirsDone =
false;
1121 QDomElement defaultLayoutNode;
1122 QDomElement layoutNode;
1125 QDomNode n = docElem.firstChild();
1126 while( !n.isNull() ) {
1127 QDomElement e = n.toElement();
1128 if (e.tagName() ==
"Name")
1132 else if (e.tagName() ==
"Directory")
1134 directoryFile = e.text();
1136 else if (e.tagName() ==
"DirectoryDir")
1138 QString dir = absoluteDir(e.text(), e.attribute(
"__BaseDir"));
1142 else if (e.tagName() ==
"OnlyUnallocated")
1144 onlyUnallocated =
true;
1146 else if (e.tagName() ==
"NotOnlyUnallocated")
1148 onlyUnallocated =
false;
1150 else if (e.tagName() ==
"Deleted")
1154 else if (e.tagName() ==
"NotDeleted")
1158 else if (e.tagName() ==
"DefaultLayout")
1160 defaultLayoutNode = e;
1162 else if (e.tagName() ==
"Layout")
1166 n = n.nextSibling();
1176 foreach (SubMenu *menu, parentMenu->subMenus)
1178 if (menu->name == name)
1197 if (directoryFile.isEmpty())
1199 kDebug(7021) <<
"Menu" << name <<
"does not specify a directory file.";
1203 QString tmp = locateDirectoryFile(directoryFile);
1204 if (! tmp.isEmpty())
1216 foreach (SubMenu *menu, parentMenu->subMenus)
1218 if (menu->name == name)
1235 QDomNode n = docElem.firstChild();
1236 while( !n.isNull() ) {
1237 QDomElement e = n.toElement();
1238 if (e.tagName() ==
"AppDir")
1241 QString dir = absoluteDir(e.text(), e.attribute(
"__BaseDir"));
1243 registerDirectory(dir);
1245 loadApplications(dir,
QString());
1247 else if (e.tagName() ==
"KDELegacyDirs")
1250 if (!kdeLegacyDirsDone)
1252 kDebug(7021) <<
"Processing KDE Legacy dirs for <KDE>";
1256 processKDELegacyDirs();
1261 kdeLegacyDirsDone =
true;
1264 else if (e.tagName() ==
"LegacyDir")
1267 QString dir = absoluteDir(e.text(), e.attribute(
"__BaseDir"));
1269 QString prefix = e.attributes().namedItem(
"prefix").toAttr().value();
1273 if (!kdeLegacyDirsDone)
1275 kDebug(7021) <<
"Processing KDE Legacy dirs for" << dir;
1279 processKDELegacyDirs();
1284 kdeLegacyDirsDone =
true;
1292 registerDirectory(dir);
1294 processLegacyDir(dir,
QString(), prefix);
1300 n = n.nextSibling();
1306 if (((pass == 1) && !onlyUnallocated) || ((pass == 2) && onlyUnallocated))
1308 n = docElem.firstChild();
1310 while( !n.isNull() ) {
1311 QDomElement e = n.toElement();
1312 if (e.tagName() ==
"Include")
1314 QHash<QString,KService::Ptr> items;
1316 QDomNode n2 = e.firstChild();
1317 while( !n2.isNull() ) {
1318 QDomElement e2 = n2.toElement();
1320 processCondition(e2, items);
1325 markUsedApplications(items);
1330 n2 = n2.nextSibling();
1334 else if (e.tagName() ==
"Exclude")
1336 QHash<QString,KService::Ptr> items;
1338 QDomNode n2 = e.firstChild();
1339 while( !n2.isNull() ) {
1340 QDomElement e2 = n2.toElement();
1342 processCondition(e2, items);
1349 n2 = n2.nextSibling();
1353 n = n.nextSibling();
1357 n = docElem.firstChild();
1358 while( !n.isNull() ) {
1359 QDomElement e = n.toElement();
1360 if (e.tagName() ==
"Menu")
1362 processMenu(e, pass);
1370 if (e.tagName() ==
"LegacyDir")
1373 QString dir = absoluteDir(e.text(), e.attribute(
"__BaseDir"));
1381 else if (e.tagName() ==
"KDELegacyDirs")
1392 n = n.nextSibling();
1397 n = docElem.firstChild();
1398 while( !n.isNull() ) {
1399 QDomElement e = n.toElement();
1400 if (e.tagName() ==
"Move")
1404 QDomNode n2 = e.firstChild();
1405 while( !n2.isNull() ) {
1406 QDomElement e2 = n2.toElement();
1407 if( e2.tagName() ==
"Old")
1409 if( e2.tagName() ==
"New")
1411 n2 = n2.nextSibling();
1413 kDebug(7021) <<
"Moving" << orig <<
"to" << dest;
1414 if (!orig.isEmpty() && !dest.isEmpty())
1423 n = n.nextSibling();
1441 if ( e.hasAttribute(
"show_empty" ) )
1443 QString str = e.attribute(
"show_empty" );
1446 else if ( str==
"false" )
1449 kDebug()<<
" Error in parsing show_empty attribute :"<<str;
1451 if ( e.hasAttribute(
"inline" ) )
1453 QString str = e.attribute(
"inline" );
1456 else if ( str==
"false" )
1459 kDebug()<<
" Error in parsing inline attribute :"<<str;
1461 if ( e.hasAttribute(
"inline_limit" ) )
1464 int value = e.attribute(
"inline_limit" ).toInt(&ok);
1466 option+=
QString(
"IL[%1] " ).arg( value );
1468 if ( e.hasAttribute(
"inline_header" ) )
1470 QString str = e.attribute(
"inline_header" );
1473 else if ( str ==
"false" )
1476 kDebug()<<
" Error in parsing of inline_header attribute :"<<str;
1479 if ( e.hasAttribute(
"inline_alias" ) && e.attribute(
"inline_alias" )==
"true")
1481 QString str = e.attribute(
"inline_alias" );
1484 else if ( str==
"false" )
1487 kDebug()<<
" Error in parsing inline_alias attribute :"<<str;
1489 if( !option.isEmpty())
1491 option = option.prepend(
":O");
1502 if( docElem.tagName()==
"DefaultLayout")
1504 if ( !optionDefaultLayout.isEmpty() )
1505 layout.append( optionDefaultLayout );
1507 bool mergeTagExists =
false;
1508 QDomNode n = docElem.firstChild();
1509 while( !n.isNull() ) {
1510 QDomElement e = n.toElement();
1511 if (e.tagName() ==
"Separator")
1513 layout.append(
":S");
1515 else if (e.tagName() ==
"Filename")
1517 layout.append(e.text());
1519 else if (e.tagName() ==
"Menuname")
1521 layout.append(
'/'+e.text());
1523 if( !option.isEmpty())
1524 layout.append( option );
1526 else if (e.tagName() ==
"Merge")
1528 QString type = e.attributeNode(
"type").value();
1529 if (type ==
"files")
1530 layout.append(
":F");
1531 else if (type ==
"menus")
1532 layout.append(
":M");
1533 else if (type ==
"all")
1534 layout.append(
":A");
1535 mergeTagExists =
true;
1538 n = n.nextSibling();
1541 if ( !mergeTagExists ) {
1542 layout.append(
":M");
1543 layout.append(
":F");
1544 kWarning() <<
"The menu spec file contains a Layout or DefaultLayout tag without the mandatory Merge tag inside. Please fix your file.";
1570 layoutMenu(subMenu, defaultLayout);
1575 VFolderMenu::markUsedApplications(
const QHash<QString,KService::Ptr>& items)
1589 for(QStringList::ConstIterator it=dirs.begin();
1590 it != dirs.end(); ++it)
1592 registerDirectory(*it);
1600 QDomElement docElem =
m_doc.documentElement();
1602 for (
int pass = 0; pass <= 2; pass++)
1607 processMenu(docElem, pass);
1613 buildApplicationIndex(
false);
1618 buildApplicationIndex(
true );
1623 defaultLayout <<
":M";
1624 defaultLayout <<
":F";
1636 processKDELegacyDirs();
1649 #include "vfolder_menu.moc"