File clever-menu.diff of Package kdelibs3

Index: kio/kio/kservice.cpp
===================================================================
--- kio/kio/kservice.cpp.orig
+++ kio/kio/kservice.cpp
@@ -725,6 +725,20 @@ QString KService::untranslatedGenericNam
   return v.isValid() ? v.toString() : QString::null;
 }
 
+bool KService::SuSEunimportant() const {
+  QMap<QString,QVariant>::ConstIterator it = m_mapProps.find( "X-SuSE-Unimportant" );
+  if ( (it == m_mapProps.end()) || (!it.data().isValid()))
+  {
+     return false;
+  }
+
+  QString aValue = it.data().toString();
+  if (aValue == "true" || aValue == "on" || aValue == "yes")
+     return true;
+  else
+     return false;
+}
+
 QString KService::parentApp() const {
   QMap<QString,QVariant>::ConstIterator it = m_mapProps.find( "X-KDE-ParentApp" );
   if ( (it == m_mapProps.end()) || (!it.data().isValid()))
Index: kio/kio/kservice.h
===================================================================
--- kio/kio/kservice.h.orig
+++ kio/kio/kservice.h
@@ -327,6 +327,10 @@ public:
    * @return true to suppress this service
    */
   bool noDisplay() const;
+  /**
+   * check if the application entry is important
+   */
+  bool SuSEunimportant() const;
 
   /**
    * Name of the application this service belongs to.
Index: kio/kio/kservicegroup.cpp
===================================================================
--- kio/kio/kservicegroup.cpp.orig
+++ kio/kio/kservicegroup.cpp
@@ -31,8 +31,10 @@
 class KServiceGroup::Private
 {
 public:
-    Private() { m_bNoDisplay = false; m_bShowEmptyMenu = false;m_bShowInlineHeader=false;m_bInlineAlias=false; m_bAllowInline = false;m_inlineValue = 4;}
+    Private() { m_bNoDisplay = false; m_bShowEmptyMenu = false;m_bShowInlineHeader=false;m_bInlineAlias=false; m_bAllowInline = false; m_inlineValue = 4; m_bShortMenu = false; m_bGeneralDescription = false;}
   bool m_bNoDisplay;
+    bool m_bShortMenu;
+    bool m_bGeneralDescription;
     bool m_bShowEmptyMenu;
     bool m_bShowInlineHeader;
     bool m_bInlineAlias;
@@ -73,6 +75,11 @@ KServiceGroup::KServiceGroup( const QStr
   m_strComment = config.readEntry( "Comment" );
   m_bDeleted = config.readBoolEntry( "Hidden", false );
   d->m_bNoDisplay = config.readBoolEntry( "NoDisplay", false );
+  if (d->directoryEntryPath.startsWith(QDir::homeDirPath()))
+    d->m_bShortMenu = false;
+  else
+    d->m_bShortMenu = config.readBoolEntry( "X-SuSE-AutoShortMenu", true );
+  d->m_bGeneralDescription = config.readBoolEntry( "X-SuSE-GeneralDescription", false );
   QStringList tmpList;
   if (config.hasKey("OnlyShowIn"))
   {
@@ -120,6 +127,10 @@ int KServiceGroup::childCount()
 {
   if (m_childCount == -1)
   {
+     KConfig global("kdeglobals");
+     global.setGroup("KDE");
+     bool showUnimportant = global.readBoolEntry("showUnimportant", false);
+
      m_childCount = 0;
 
      for( List::ConstIterator it = m_serviceList.begin();
@@ -130,7 +141,8 @@ int KServiceGroup::childCount()
         {
            KService *service = static_cast<KService *>(p);
            if (!service->noDisplay())
-              m_childCount++;
+             if ( showUnimportant || !service->SuSEunimportant() )
+               m_childCount++;
         }
         else if (p->isType(KST_KServiceGroup))
         {
@@ -203,6 +215,16 @@ QStringList KServiceGroup::suppressGener
   return d->suppressGenericNames;
 }
 
+bool KServiceGroup::SuSEgeneralDescription() const
+{
+    return d->m_bGeneralDescription;
+}
+
+bool KServiceGroup::SuSEshortMenu() const
+{
+    return d->m_bShortMenu;
+}
+
 void KServiceGroup::load( QDataStream& s )
 {
   QStringList groupList;
@@ -214,7 +236,8 @@ void KServiceGroup::load( QDataStream& s
   s >> m_strCaption >> m_strIcon >>
       m_strComment >> groupList >> m_strBaseGroupName >> m_childCount >>
       noDisplay >> d->suppressGenericNames >> d->directoryEntryPath >>
-      d->sortOrder >> _showEmptyMenu >> inlineHeader >> _inlineAlias >> _allowInline;
+      d->sortOrder >> _showEmptyMenu >> inlineHeader >> _inlineAlias >>
+      _allowInline >> d->m_bShortMenu >> d->m_bGeneralDescription;
 
   d->m_bNoDisplay = (noDisplay != 0);
   d->m_bShowEmptyMenu = ( _showEmptyMenu != 0 );
@@ -286,7 +309,8 @@ void KServiceGroup::save( QDataStream& s
   s << m_strCaption << m_strIcon <<
       m_strComment << groupList << m_strBaseGroupName << m_childCount <<
       noDisplay << d->suppressGenericNames << d->directoryEntryPath <<
-      d->sortOrder <<_showEmptyMenu <<inlineHeader<<_inlineAlias<<_allowInline;
+      d->sortOrder <<_showEmptyMenu <<inlineHeader<<_inlineAlias<<_allowInline << 
+      d->m_bShortMenu << d->m_bGeneralDescription;
 }
 
 KServiceGroup::List
@@ -312,6 +336,12 @@ static void addItem(KServiceGroup::List
 KServiceGroup::List
 KServiceGroup::entries(bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName)
 {
+   return SuSEentries(sort, excludeNoDisplay, allowSeparators, sortByGenericName);
+}
+
+KServiceGroup::List
+KServiceGroup::SuSEentries(bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName, bool excludeSuSEunimportant)
+{
     KServiceGroup *group = this;
 
     // If the entries haven't been loaded yet, we have to reload ourselves
@@ -338,11 +368,18 @@ KServiceGroup::entries(bool sort, bool e
     for (List::ConstIterator it(group->m_serviceList.begin()); it != group->m_serviceList.end(); ++it)
     {
         KSycocaEntry *p = (*it);
+        if( !p->isType(KST_KServiceGroup) && !p->isType(KST_KService))
+            continue;
 	bool noDisplay = p->isType(KST_KServiceGroup) ?
                                    static_cast<KServiceGroup *>(p)->noDisplay() :
                                    static_cast<KService *>(p)->noDisplay();
         if (excludeNoDisplay && noDisplay)
            continue;
+	bool SuSEunimportant = p->isType(KST_KService) &&
+                                   static_cast<KService *>(p)->SuSEunimportant();
+        if (excludeSuSEunimportant && SuSEunimportant)
+           continue;
+
         // Choose the right list
         KSortableValueList<SPtr,QCString> & list = p->isType(KST_KServiceGroup) ? glist : slist;
         QString name;
@@ -374,6 +411,15 @@ KServiceGroup::entries(bool sort, bool e
         }
         list.insert(key,SPtr(*it));
     }
+
+    return group->SuSEsortEntries( slist, glist, excludeNoDisplay, allowSeparators );
+}
+
+KServiceGroup::List
+KServiceGroup::SuSEsortEntries( KSortableValueList<SPtr,QCString> slist, KSortableValueList<SPtr,QCString> glist, bool excludeNoDisplay, bool allowSeparators )
+{
+    KServiceGroup *group = this;
+
     // Now sort
     slist.sort();
     glist.sort();
@@ -415,6 +461,8 @@ KServiceGroup::entries(bool sort, bool e
            // TODO: This prevents duplicates
           for(KSortableValueList<SPtr,QCString>::Iterator it2 = slist.begin(); it2 != slist.end(); ++it2)
           {
+            if (!(*it2).value()->isType(KST_KService))
+                continue;
              KService *service = (KService *)((KSycocaEntry *)((*it2).value()));
              if (service->menuId() == item)
              {
Index: kio/kio/kservicegroup.h
===================================================================
--- kio/kio/kservicegroup.h.orig
+++ kio/kio/kservicegroup.h
@@ -26,6 +26,7 @@
 #include <qvariant.h>
 
 #include <kdesktopfile.h>
+#include <ksortablevaluelist.h>
 
 #include "ksycocaentry.h"
 #include "ksycocatype.h"
@@ -201,6 +202,12 @@ public:
   void setLayoutInfo(const QStringList &layout);
 
   /**
+   * SuSE special, not part of KDE API
+   */
+  bool SuSEshortMenu() const;
+  bool SuSEgeneralDescription() const;
+
+  /**
    * @internal
    * Returns information related to the layout of services in this group.
    */
@@ -238,6 +245,12 @@ public:
    */
   virtual List entries(bool sorted = false);
 
+  /*
+   * UNOFFICIAL SuSE special
+   */
+  virtual List SuSEentries(bool sort, bool excludeNoDisplay, bool allowSeparators, bool sortByGenericName, bool excludeSuSEunimportant = true);
+  virtual List SuSEsortEntries( KSortableValueList<SPtr,QCString> slist, KSortableValueList<SPtr,QCString> glist, bool excludeNoDisplay, bool allowSeparators );
+
   /**
    * Returns a non-empty string if the group is a special base group.
    * By default, "Settings/" is the kcontrol base group ("settings")
openSUSE Build Service is sponsored by