Added config option so can force 'bad categories' into Other using freedesktop list
authorskeezix <skeezix@flotsam-vm.(none)>
Wed, 26 Jan 2011 17:36:36 +0000 (12:36 -0500)
committerskeezix <skeezix@flotsam-vm.(none)>
Wed, 26 Jan 2011 17:36:36 +0000 (12:36 -0500)
Makefile
minimenu/freedesktop_cats.c [new file with mode: 0644]
minimenu/freedesktop_cats.h [new file with mode: 0644]
minimenu/mmcat.c
minimenu/mmconf.c
minimenu/mmenu.c
minimenu/mmenu.h

index 114189f..46032f4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -26,7 +26,7 @@ ALLOBJ = pnd_conf.o pnd_container.o pnd_discovery.o pnd_pxml.o pnd_notify.o pnd_
 all: ${SOLIB} ${LIB} conftest discotest evdevtest notifytest pndnotifyd rawpxmltest pndvalidator loggertest dbusnotifytest pnd_run pndevmapperd pnd_info evtest mmenu mmwrapper
 
 clean:
-       ${RM} -f ${ALLOBJ} ${XMLOBJ} ${LIB} ${SOLIB1} locatetest.o bin/locatetest conftest.o bin/conftest discotest.o evdevtest.o bin/evdevtest bin/discotest dbusnotifytest.o bin/dbusnotifytest loggertest.o bin/loggertest bin/notifytest notifytest.o bin/rawpxmltest rawpxmltest.o bin/pnd_run pnd_run.o pnd_info.o bin/pnd_info bin/pndevmapperd pndevmapperd.o bin/pndnotifyd pndnotifyd.o ${SOLIB} testdata/dotdesktop/*.desktop testdata/menu/*.desktop testdata/apps/*.pnd testdata/dotdesktop/*.png deployment/usr/lib/libpnd* deployment/usr/bin/pndnotifyd deployment/usr/bin/pnd_run deployment/usr/bin/pnd_info deployment/usr/pandora/scripts/* deployment/etc/sudoers deployment/etc/init.d/pndnotifyd bin/pndvalidator pndvalidator.o deployment/usr/bin/pndevmapperd testdata/menuicons/* evtest.o bin/evtest bin/mmenu bin/mmwrapper mmenu.o mmwrapper.o deployment/usr/bin/mmenu deployment/usr/bin/mmwrapper mmcache.o mmui.o mmcat.o mmconf.o
+       ${RM} -f ${ALLOBJ} ${XMLOBJ} ${LIB} ${SOLIB1} locatetest.o bin/locatetest conftest.o bin/conftest discotest.o evdevtest.o bin/evdevtest bin/discotest dbusnotifytest.o bin/dbusnotifytest loggertest.o bin/loggertest bin/notifytest notifytest.o bin/rawpxmltest rawpxmltest.o bin/pnd_run pnd_run.o pnd_info.o bin/pnd_info bin/pndevmapperd pndevmapperd.o bin/pndnotifyd pndnotifyd.o ${SOLIB} testdata/dotdesktop/*.desktop testdata/menu/*.desktop testdata/apps/*.pnd testdata/dotdesktop/*.png deployment/usr/lib/libpnd* deployment/usr/bin/pndnotifyd deployment/usr/bin/pnd_run deployment/usr/bin/pnd_info deployment/usr/pandora/scripts/* deployment/etc/sudoers deployment/etc/init.d/pndnotifyd bin/pndvalidator pndvalidator.o deployment/usr/bin/pndevmapperd testdata/menuicons/* evtest.o bin/evtest bin/mmenu bin/mmwrapper mmenu.o mmwrapper.o deployment/usr/bin/mmenu deployment/usr/bin/mmwrapper mmcache.o mmui.o mmcat.o mmconf.o freedsktop_cats.o
        ${RM} -rf deployment/media deployment/etc/pandora/mmenu
        find . -name "*~*" -exec rm {} \; -print
 
@@ -60,8 +60,8 @@ pnd_info:     pnd_info.o ${SOLIB1}
 pndevmapperd:  pndevmapperd.o ${SOLIB1}
        ${CC} -lstdc++ -o bin/pndevmapperd pndevmapperd.o ${SOLIB1}
 
-mmenu: mmenu.o mmui.o mmcache.o mmcat.o mmconf.o ${SOLIB1}
-       ${CC} -lstdc++ -o bin/mmenu mmenu.o mmui.o mmcache.o mmcat.o mmconf.o ${SOLIB1} -L${PNDSTUFF}/usr/lib -lSDL -lSDL_image -lSDL_ttf -lSDL_gfx
+mmenu: mmenu.o mmui.o mmcache.o mmcat.o mmconf.o freedesktop_cats.o ${SOLIB1}
+       ${CC} -lstdc++ -o bin/mmenu mmenu.o mmui.o mmcache.o mmcat.o mmconf.o freedesktop_cats.o ${SOLIB1} -L${PNDSTUFF}/usr/lib -lSDL -lSDL_image -lSDL_ttf -lSDL_gfx
 mmwrapper:     mmwrapper.o ${SOLIB1}
        ${CC} -lstdc++ -o bin/mmwrapper mmwrapper.o ${SOLIB1}
 
diff --git a/minimenu/freedesktop_cats.c b/minimenu/freedesktop_cats.c
new file mode 100644 (file)
index 0000000..b90341f
--- /dev/null
@@ -0,0 +1,175 @@
+
+#include <stdio.h>
+#include <strings.h>
+
+#include "freedesktop_cats.h"
+
+// folks want to limit categories to official ones, so okay.
+// http://standards.freedesktop.org/menu-spec/latest/apa.html
+//
+
+char *freedesktop_approved_cats[] = {
+  "AudioVideo",
+  "Audio",
+  "Video",
+  "Development",
+  "Education",
+  "Game",
+  "Graphics",
+  "Network",
+  "Office",
+  "Settings",
+  "System",
+  "Utility",
+  "Building",
+  "Debugger",
+  "IDE",
+  "GUIDesigner",
+  "Profiling",
+  "RevisionControl",
+  "Translation",
+  "Calendar",
+  "ContactManagement",
+  "Database",
+  "Dictionary",
+  "Chart",
+  "Email",
+  "Finance",
+  "FlowChart",
+  "PDA",
+  "ProjectManagement",
+  "Presentation",
+  "Spreadsheet",
+  "WordProcessor",
+  "2DGraphics",
+  "VectorGraphics",
+  "RasterGraphics",
+  "3DGraphics",
+  "Scanning",
+  "OCR",
+  "Photography",
+  "Publishing",
+  "Viewer",
+  "TextTools",
+  "DesktopSettings",
+  "HardwareSettings",
+  "Printing",
+  "PackageManager",
+  "Dialup",
+  "InstantMessaging",
+  "Chat",
+  "IRCClient",
+  "FileTransfer",
+  "HamRadio",
+  "News",
+  "P2P",
+  "RemoteAccess",
+  "Telephony",
+  "TelephonyTools",
+  "VideoConference",
+  "WebBrowser",
+  "WebDevelopment",
+  "Midi",
+  "Mixer",
+  "Sequencer",
+  "Tuner",
+  "TV",
+  "AudioVideoEditing",
+  "Player",
+  "Recorder",
+  "DiscBurning",
+  "ActionGame",
+  "AdventureGame",
+  "ArcadeGame",
+  "BoardGame",
+  "BlocksGame",
+  "CardGame",
+  "KidsGame",
+  "LogicGame",
+  "RolePlaying",
+  "Simulation",
+  "SportsGame",
+  "StrategyGame",
+  "Art",
+  "Construction",
+  "Music",
+  "Languages",
+  "Science",
+  "ArtificialIntelligence",
+  "Astronomy",
+  "Biology",
+  "Chemistry",
+  "ComputerScience",
+  "DataVisualization",
+  "Economy",
+  "Electricity",
+  "Geography",
+  "Geology",
+  "Geoscience",
+  "History",
+  "ImageProcessing",
+  "Literature",
+  "Math",
+  "NumericalAnalysis",
+  "MedicalSoftware",
+  "Physics",
+  "Robotics",
+  "Sports",
+  "ParallelComputing",
+  "Amusement",
+  "Archiving",
+  "Compression",
+  "Electronics",
+  "Emulator",
+  "Engineering",
+  "FileTools",
+  "FileManager",
+  "TerminalEmulator",
+  "Filesystem",
+  "Monitor",
+  "Security",
+  "Accessibility",
+  "Calculator",
+  "Clock",
+  "TextEditor",
+  "Documentation",
+  "Core",
+  "KDE",
+  "GNOME",
+  "GTK",
+  "Qt",
+  "Motif",
+  "Java",
+  "ConsoleOnly",
+  "Screensaver",
+  "TrayIcon",
+  "Applet",
+  "Shell",
+  NULL
+};
+
+unsigned char freedesktop_check_cat ( char *name ) {
+  char **p = freedesktop_approved_cats;
+
+  while ( *p ) {
+
+    if ( strcasecmp ( *p, name ) == 0 ) {
+      return ( 1 );
+    }
+
+    p++;
+  }
+
+  return ( 0 );
+}
+
+#if 0
+int main ( void ) {
+
+  printf ( "check Applet (should be 1) -> %d\n", freedesktop_check_cat ( "Applet" ) );
+  printf ( "check Education (should be 1) -> %d\n", freedesktop_check_cat ( "Education" ) );
+  printf ( "check Mofo (should be 0) -> %d\n", freedesktop_check_cat ( "Mofo" ) );
+
+  return ( 0 );
+}
+#endif
diff --git a/minimenu/freedesktop_cats.h b/minimenu/freedesktop_cats.h
new file mode 100644 (file)
index 0000000..54bdae2
--- /dev/null
@@ -0,0 +1,11 @@
+
+#ifndef h_freedesktop_cats_h
+#define h_freedesktop_cats_h
+
+unsigned char freedesktop_check_cat ( char *name );
+
+extern char *freedesktop_approved_cats[];
+
+#define BADCATNAME "Other" /* irony: Other is itself not a freedesktop category */
+
+#endif
index 3a72d46..267507e 100644 (file)
@@ -18,6 +18,7 @@
 #include "mmenu.h"
 #include "mmcache.h"
 #include "mmcat.h"
+#include "freedesktop_cats.h"
 
 // all categories known -- visible, hidden, subcats, whatever.
 pnd_box_handle m_categories = NULL;
@@ -292,6 +293,43 @@ unsigned char category_meta_push ( char *catname, char *parentcatname, pnd_disco
 
   //fprintf ( stderr, "meta push: '%s'\n", catname );
 
+  // push bad categories into Other (if we're not targeting All right now)
+  if ( pnd_conf_get_as_int_d ( g_conf, "categories.good_cats_only", 1 ) ) {
+
+    // don't audit All
+    if ( strncmp ( catname, "All ", 4 ) != 0 ) {
+
+      // if this is a parent cat..
+      if ( catname && ! parentcatname ) {
+
+       // if bad, shove it to Other
+       if ( ! freedesktop_check_cat ( catname ) ) {
+         parentcatname = NULL;
+         catname = BADCATNAME;
+         visiblep = cat_is_visible ( g_conf, catname );
+       }
+
+      } else if ( catname && parentcatname ) {
+       // this is a subcat
+
+       // if parent is bad, then we probably already pushed it over, so don't do it again.
+       // if its parent is okay, but subcat is bad, push it to other. (ie: lets avoid duplication in Other)
+       if ( ! freedesktop_check_cat ( parentcatname ) ) {
+         // skip
+         return ( 1 );
+
+       } else if ( ! freedesktop_check_cat ( catname ) ) {
+         parentcatname = NULL;
+         catname = BADCATNAME;
+         visiblep = cat_is_visible ( g_conf, catname );
+       }
+
+      } // parent or child cat?
+
+    } // not All
+
+  } // good cats only?
+
   // if invisible, and a parent category name is known, prepend it for ease of use
   if ( ! visiblep && parentcatname ) {
     snprintf ( catnamebuffer, 500, "%s.%s", parentcatname, catname );
index 2b40ce6..d0db0ba 100644 (file)
@@ -34,6 +34,7 @@ confitem_t page_general[] = {
   { "Sub-categories as folders?",    "If no, uses tabs instead of folders within tabs.",        "1",                "tabs.subcat_as_folders",  ct_boolean },
   { "Start with app selected",       "Whethor selection is placed by default or not",           "0",                "minimenu.start_selected", ct_boolean },
   { "Auto discover pnd apps?",       "If no, turn on diectory browser to manually find apps",   "1",                "filesystem.do_pnd_disco", ct_boolean },
+  { "Keep bad categories in Other?", "Lazy dev! Put broken categories into Other to keep clean", "1",               "categories.good_cats_only", ct_boolean },
   { "Set CPU speed when leaving",    "Whether the next setting is applied or not",              "0",                "minimenu.use_run_speed",  ct_boolean },
   { "CPU speed when leaving",        "Before running app, set this speed; app may override.",   "500",              "minimenu.run_speed",      ct_cpu_speed },
   { "Wrap tab change",               "Changing tab left or right, does it wrap around?",        "0",                "tabs.wraparound",         ct_boolean },
index 7c2392e..83743bc 100644 (file)
@@ -80,7 +80,6 @@ char *g_skinpath = NULL; // where 'skin_selected' is located .. the fullpath inc
 pnd_conf_handle g_skinconf = NULL;
 
 void sigquit_handler ( int n );
-unsigned char cat_is_visible ( pnd_conf_handle h, char *catname );
 unsigned char app_is_visible ( pnd_conf_handle h, char *uniqueid );
 
 int main ( int argc, char *argv[] ) {
index 4a5ea36..9682ea6 100644 (file)
@@ -28,4 +28,6 @@ void applications_scan ( void );
 
 void setup_notifications ( void );
 
+unsigned char cat_is_visible ( pnd_conf_handle h, char *catname );
+
 #endif