diff -urN aa/desktop-file-utils-0.7/src/menu-entries.c desktop-file-utils-0.7/src/menu-entries.c --- aa/desktop-file-utils-0.7/src/menu-entries.c 2004-07-28 15:19:30.490876392 +0200 +++ desktop-file-utils-0.7/src/menu-entries.c 2004-07-28 21:28:13.552659792 +0200 @@ -42,6 +42,7 @@ char *absolute_path; unsigned int *categories; /* 0-terminated array of atoms */ + gboolean show; guint type : 4; guint refcount : 24; @@ -82,7 +83,8 @@ static Entry* entry_new (EntryType type, const char *relative_path, - const char *absolute_path) + const char *absolute_path, + gboolean show) { Entry *e; @@ -93,6 +95,7 @@ e->relative_path = g_strdup (relative_path); e->absolute_path = g_strdup (absolute_path); e->refcount = 1; + e->show=show; return e; } @@ -150,6 +153,11 @@ return entry->relative_path; } +gboolean entry_get_show (Entry *entry) +{ + return entry->show; +} + gboolean entry_has_category (Entry *entry, EntryCache *cache, @@ -371,7 +379,7 @@ return src; } - e = entry_new (src->type, relative_path, src->absolute_path); + e = entry_new (src->type, relative_path, src->absolute_path, src->show); n_categories_to_copy = 0; if (src->categories) @@ -441,7 +449,7 @@ if (src->type != ENTRY_DIRECTORY) return NULL; - e = entry_new (src->type, relative_path, src->absolute_path); + e = entry_new (src->type, relative_path, src->absolute_path, src->show); return e; } @@ -1874,7 +1882,7 @@ } } - e = entry_new (ENTRY_DESKTOP, basename, filename); + e = entry_new (ENTRY_DESKTOP, basename, filename, TRUE); categories = find_value (str, "Categories"); if (categories != NULL) @@ -1893,7 +1901,48 @@ entry_new_directory_from_file (const char *filename, const char *basename) { - return entry_new (ENTRY_DIRECTORY, basename, filename); + char *str; + gsize len; + GError *err; + Entry *e; + gboolean show; + + str = NULL; + len = 0; + err = NULL; + + if (!g_file_get_contents (filename, &str, &len, &err)) + { + menu_verbose ("Could not get contents of \"%s\": %s\n", + filename, err->message); + g_error_free (err); + return NULL; + } + + /* Check for NoDisplay */ + char *nodisplay; + + show = TRUE; + + nodisplay = find_value (str, "NoDisplay"); + + if (nodisplay != NULL) + if (strcasecmp (nodisplay, "True") == 0) + show = FALSE; + + if (!show) + menu_verbose ("Not showing \"%s\" due to NoDisplay=%s\n", + filename, nodisplay); + + g_free (nodisplay); + + /* End checking for NoDisplay */ + + e = entry_new (ENTRY_DIRECTORY, basename, filename, show); + + g_free (str); + + return e; } static void diff -urN aa/desktop-file-utils-0.7/src/menu-entries.h desktop-file-utils-0.7/src/menu-entries.h --- aa/desktop-file-utils-0.7/src/menu-entries.h 2004-07-28 15:19:30.491876240 +0200 +++ desktop-file-utils-0.7/src/menu-entries.h 2004-07-28 20:09:57.515565944 +0200 @@ -131,6 +131,7 @@ const char* entry_get_absolute_path (Entry *entry); const char* entry_get_relative_path (Entry *entry); const char* entry_get_name (Entry *entry); +gboolean entry_get_show (Entry *entry); gboolean entry_has_category (Entry *entry, EntryCache *cache, const char *category); diff -urN aa/desktop-file-utils-0.7/src/menu-process.c desktop-file-utils-0.7/src/menu-process.c --- aa/desktop-file-utils-0.7/src/menu-process.c 2004-07-28 15:19:30.501874720 +0200 +++ desktop-file-utils-0.7/src/menu-process.c 2004-07-28 21:42:52.369059392 +0200 @@ -1062,6 +1062,7 @@ GHashTable *allocated, const DesktopEntryTree *tree); static void remove_empty_submenus (TreeNode * node); +static void remove_no_display_submenus (TreeNode * node); static void process_only_unallocated (TreeNode *node, GHashTable *allocated); @@ -1238,6 +1239,7 @@ tree->root = new_node; process_only_unallocated (tree->root, allocated); remove_empty_submenus (tree->root); + remove_no_display_submenus(tree->root); /* Update the modification time for the tree, so the * panel knows to reload the VFS directory. @@ -2254,6 +2256,30 @@ } } +static void remove_no_display_submenus (TreeNode * node) +{ + GSList *subdir; + + subdir = node->subdirs; + while (subdir != NULL) + { + TreeNode *subdir_node = subdir->data; + GSList *next = subdir->next; + + if (subdir_node->dir_entry && + entry_get_show (subdir_node->dir_entry) == FALSE) + { + node->subdirs = g_slist_remove_link (node->subdirs, subdir); + tree_node_free (subdir_node); + } + else + remove_no_display_submenus (subdir_node); + + subdir = next; + } +} + + static void build_tree (DesktopEntryTree *tree) { @@ -2271,8 +2297,10 @@ if (tree->root) process_only_unallocated (tree->root, allocated); - if (tree->root) + if (tree->root){ remove_empty_submenus (tree->root); + remove_no_display_submenus (tree->root); + } g_hash_table_destroy (allocated);