--- /dev/null
+diff -urN aa/desktop-file-utils-0.6/src/menu-entries.c desktop-file-utils-0.6/src/menu-entries.c
+--- aa/desktop-file-utils-0.6/src/menu-entries.c 2004-07-22 01:37:57.796843632 +0200
++++ desktop-file-utils-0.6/src/menu-entries.c 2004-07-23 00:12:03.519828512 +0200
+@@ -1226,6 +1226,7 @@
+ int refcount;
+ CachedDir *root_dir;
+ char *only_show_in_name;
++ char *no_show_in_name;
+ GHashTable *atoms_by_name;
+ GHashTable *names_by_atom;
+ unsigned int next_atom;
+@@ -1832,6 +1833,47 @@
+ }
+ }
+
++ if (cache->no_show_in_name)
++ {
++ char *noshowin;
++
++ show = TRUE;
++
++ noshowin = find_value (str, "NoShowIn");
++
++ if (noshowin != NULL)
++ {
++ char **split;
++ int i;
++
++ split = string_list_from_desktop_value (noshowin);
++ i = 0;
++ while (split[i] != NULL)
++ {
++ if (strcmp (split[i], cache->no_show_in_name) == 0)
++ {
++ show = FALSE;
++ break;
++ }
++
++ ++i;
++ }
++
++ if (!show)
++ menu_verbose ("Not showing \"%s\" due to NoShowIn=%s\n",
++ filename, noshowin);
++
++ g_strfreev (split);
++ g_free (noshowin);
++ }
++
++ if (!show)
++ {
++ g_free (str);
++ return NULL;
++ }
++ }
++
+ e = entry_new (ENTRY_DESKTOP, basename, filename);
+
+ categories = find_value (str, "Categories");
+@@ -2258,6 +2300,7 @@
+ g_hash_table_destroy (cache->atoms_by_name);
+
+ g_free (cache->only_show_in_name);
++ g_free (cache->no_show_in_name);
+ g_free (cache);
+ }
+ }
+@@ -2276,6 +2319,21 @@
+ cache->only_show_in_name = g_strdup (name);
+ }
+
++void
++entry_cache_set_no_show_in_name (EntryCache *cache,
++ const char *name)
++{
++ g_return_if_fail (cache != NULL);
++
++ /* Really you're screwed if you do this after stuff has
++ * already been loaded...
++ */
++
++ g_free (cache->no_show_in_name);
++ cache->no_show_in_name = g_strdup (name);
++}
++
++
+ static void
+ cached_dir_invalidate (CachedDir *dir)
+ {
+diff -urN aa/desktop-file-utils-0.6/src/menu-entries.h desktop-file-utils-0.6/src/menu-entries.h
+--- aa/desktop-file-utils-0.6/src/menu-entries.h 2004-07-22 01:22:29.208010592 +0200
++++ desktop-file-utils-0.6/src/menu-entries.h 2004-07-23 00:03:18.085706640 +0200
+@@ -60,6 +60,8 @@
+ void entry_cache_unref (EntryCache *cache);
+ void entry_cache_set_only_show_in_name (EntryCache *cache,
+ const char *name);
++void entry_cache_set_no_show_in_name (EntryCache *cache,
++ const char *name);
+ void entry_cache_invalidate (EntryCache *cache,
+ const char *dir);
+
+diff -urN aa/desktop-file-utils-0.6/src/menu-layout.c desktop-file-utils-0.6/src/menu-layout.c
+--- aa/desktop-file-utils-0.6/src/menu-layout.c 2004-07-22 01:43:43.405303160 +0200
++++ desktop-file-utils-0.6/src/menu-layout.c 2004-07-23 00:06:03.359581192 +0200
+@@ -1645,6 +1645,9 @@
+ case MENU_NODE_MENU_ONLY_SHOW_IN:
+ append_simple (node, depth, "OnlyShowIn", str);
+ break;
++ case MENU_NODE_MENU_NO_SHOW_IN:
++ append_simple (node, depth, "NoShowIn", str);
++ break;
+ case MENU_NODE_MENU_NO_DISPLAY:
+ append_simple (node, depth, "NoDisplay", str);
+ break;
+diff -urN aa/desktop-file-utils-0.6/src/menu-layout.h desktop-file-utils-0.6/src/menu-layout.h
+--- aa/desktop-file-utils-0.6/src/menu-layout.h 2004-07-22 01:43:10.477308976 +0200
++++ desktop-file-utils-0.6/src/menu-layout.h 2004-07-23 00:05:36.061731096 +0200
+@@ -37,6 +37,7 @@
+ MENU_NODE_PASSTHROUGH,
+ MENU_NODE_MENU,
+ MENU_NODE_MENU_ONLY_SHOW_IN,
++ MENU_NODE_MENU_NO_SHOW_IN,
+ MENU_NODE_MENU_NO_DISPLAY,
+ MENU_NODE_APP_DIR,
+ MENU_NODE_DEFAULT_APP_DIRS,
+diff -urN aa/desktop-file-utils-0.6/src/menu-method.c desktop-file-utils-0.6/src/menu-method.c
+--- aa/desktop-file-utils-0.6/src/menu-method.c 2004-07-22 01:22:29.218009072 +0200
++++ desktop-file-utils-0.6/src/menu-method.c 2004-07-23 00:00:32.837828136 +0200
+@@ -747,6 +747,7 @@
+ {
+ desktop_entry_tree_diradd_callback_set (directory_add_callback);
+ desktop_set_only_show_in ("GNOME");
++ desktop_set_no_show_in ("GNOME");
+ return &vtable;
+ }
+
+diff -urN aa/desktop-file-utils-0.6/src/menu-parser.c desktop-file-utils-0.6/src/menu-parser.c
+--- aa/desktop-file-utils-0.6/src/menu-parser.c 2004-07-22 01:45:04.482977480 +0200
++++ desktop-file-utils-0.6/src/menu-parser.c 2004-07-23 00:06:54.961736472 +0200
+@@ -338,6 +338,10 @@
+ {
+ push_node (parser, MENU_NODE_MENU_ONLY_SHOW_IN);
+ }
++ if (ELEMENT_IS ("NoShowIn"))
++ {
++ push_node (parser, MENU_NODE_MENU_NO_SHOW_IN);
++ }
+ else if (ELEMENT_IS ("NoDisplay"))
+ {
+ push_node (parser, MENU_NODE_MENU_NO_DISPLAY);
+@@ -789,6 +793,7 @@
+ switch (menu_node_get_type (parser->stack_top))
+ {
+ case MENU_NODE_MENU_ONLY_SHOW_IN:
++ case MENU_NODE_MENU_NO_SHOW_IN:
+ case MENU_NODE_MENU_NO_DISPLAY:
+ case MENU_NODE_APP_DIR:
+ case MENU_NODE_DIRECTORY_DIR:
+@@ -878,6 +883,7 @@
+ switch (menu_node_get_type (parser->stack_top))
+ {
+ case MENU_NODE_MENU_ONLY_SHOW_IN:
++ case MENU_NODE_MENU_NO_SHOW_IN:
+ case MENU_NODE_MENU_NO_DISPLAY:
+ case MENU_NODE_APP_DIR:
+ case MENU_NODE_DIRECTORY_DIR:
+diff -urN aa/desktop-file-utils-0.6/src/menu-process.c desktop-file-utils-0.6/src/menu-process.c
+--- aa/desktop-file-utils-0.6/src/menu-process.c 2004-07-22 01:49:07.279066864 +0200
++++ desktop-file-utils-0.6/src/menu-process.c 2004-07-23 00:08:59.312832232 +0200
+@@ -38,6 +38,11 @@
+ */
+ static char * only_show_in_desktop = NULL;
+
++/* Global NoShowIn variable, works for both
++ * DesktopEntryTrees and Menus.
++ */
++static char * no_show_in_desktop = NULL;
++
+ static void menu_node_resolve_files (MenuCache *menu_cache,
+ EntryCache *entry_cache,
+ MenuNode *node);
+@@ -1103,6 +1108,10 @@
+ if (only_show_in_desktop)
+ entry_cache_set_only_show_in_name (entry_cache,
+ only_show_in_desktop);
++
++ if (no_show_in_desktop)
++ entry_cache_set_no_show_in_name (entry_cache,
++ no_show_in_desktop);
+
+ resolved_node = menu_node_deep_copy (orig_node);
+ menu_node_resolve_files (menu_cache, entry_cache, resolved_node);
+@@ -1995,6 +2004,14 @@
+ }
+ break;
+
++ case MENU_NODE_MENU_NO_SHOW_IN:
++ {
++ if (no_show_in_desktop)
++ if (strcmp (no_show_in_desktop, menu_node_get_content (child)) == 0)
++ deleted = TRUE;
++ }
++ break;
++
+ case MENU_NODE_MENU_NO_DISPLAY:
+ {
+ if (strcasecmp (menu_node_get_content (child), "True") == 0)
+@@ -3262,3 +3279,12 @@
+
+ only_show_in_desktop = g_strdup (only_show_in);
+ }
++
++void
++desktop_set_no_show_in (const char *no_show_in)
++{
++ if (no_show_in_desktop)
++ g_free (no_show_in_desktop);
++
++ no_show_in_desktop = g_strdup (no_show_in);
++}
+diff -urN aa/desktop-file-utils-0.6/src/menu-process.h desktop-file-utils-0.6/src/menu-process.h
+--- aa/desktop-file-utils-0.6/src/menu-process.h 2004-07-22 01:22:29.209010440 +0200
++++ desktop-file-utils-0.6/src/menu-process.h 2004-07-22 23:59:56.010426752 +0200
+@@ -174,4 +174,7 @@
+ /* Set OnlyShowIn globally */
+ void desktop_set_only_show_in (const char *only_show_in);
+
++/* Set NoShowIn globally */
++void desktop_set_no_show_in (const char *no_show_in);
++
+ #endif /* MENU_PROCESS_H */