Index: ChangeLog =================================================================== RCS file: /cvs/gnome/gnome-menus/ChangeLog,v retrieving revision 1.152 diff -u -p -r1.152 ChangeLog --- ChangeLog 1 Nov 2005 09:17:43 -0000 1.152 +++ ChangeLog 8 Dec 2005 08:32:08 -0000 @@ -0,0 +1,20 @@ +2005-12-08 Mark McLoughlin + + Add GMENU_TREE_FLAGS_INCLUDE_NODISPLAY, gmenu_tree_entry_get_nodisplay() + and gmenu_tree_directory_get_nodisplay() in order to allow fix for + bug #323476 + + * libmenu/gmenu-tree.[ch]: + (gmenu_tree_directory_get_is_nodisplay), + (gmenu_tree_entry_get_is_nodisplay): add new API + (gmenu_tree_directory_new), + (gmenu_tree_entry_new): add is_nodisplay flag on entries + and directories + (entries_listify_foreach), + (excluded_entries_listify_foreach): set the flag here + (process_layout): don't remove if is_nodisplay and the + INCLUDE_NODISPLAY tree flag is set. + + * util/test-menu-spec.c: (main): add -n arg to allow + testing. + Index: libmenu/gmenu-tree.c =================================================================== RCS file: /cvs/gnome/gnome-menus/libmenu/gmenu-tree.c,v retrieving revision 1.38 diff -u -p -r1.38 gmenu-tree.c --- libmenu/gmenu-tree.c 1 Nov 2005 09:17:44 -0000 1.38 +++ libmenu/gmenu-tree.c 8 Dec 2005 08:32:10 -0000 @@ -100,6 +100,7 @@ struct GMenuTreeDirectory guint only_unallocated : 1; guint is_root : 1; + guint is_nodisplay : 1; }; typedef struct @@ -117,6 +118,7 @@ struct GMenuTreeEntry char *desktop_file_id; guint is_excluded : 1; + guint is_nodisplay : 1; }; struct GMenuTreeSeparator @@ -1009,6 +1011,14 @@ gmenu_tree_directory_get_tree (GMenuTree return gmenu_tree_ref (root->tree); } +gboolean +gmenu_tree_directory_get_is_nodisplay (GMenuTreeDirectory *directory) +{ + g_return_val_if_fail (directory != NULL, FALSE); + + return directory->is_nodisplay; +} + static void append_directory_path (GMenuTreeDirectory *directory, GString *path) @@ -1101,6 +1111,14 @@ gmenu_tree_entry_get_is_excluded (GMenuT return entry->is_excluded; } +gboolean +gmenu_tree_entry_get_is_nodisplay (GMenuTreeEntry *entry) +{ + g_return_val_if_fail (entry != NULL, FALSE); + + return entry->is_nodisplay; +} + GMenuTreeDirectory * gmenu_tree_header_get_directory (GMenuTreeHeader *header) { @@ -1160,6 +1178,7 @@ gmenu_tree_directory_new (GMenuTreeDirec retval->layout_info = NULL; retval->contents = NULL; retval->only_unallocated = FALSE; + retval->is_nodisplay = FALSE; if (parent != NULL) { @@ -1324,7 +1343,8 @@ static GMenuTreeEntry * gmenu_tree_entry_new (GMenuTreeDirectory *parent, DesktopEntry *desktop_entry, const char *desktop_file_id, - gboolean is_excluded) + gboolean is_excluded, + gboolean is_nodisplay) { GMenuTreeEntry *retval; @@ -1337,6 +1357,7 @@ gmenu_tree_entry_new (GMenuTreeDirectory retval->desktop_entry = desktop_entry_ref (desktop_entry); retval->desktop_file_id = g_strdup (desktop_file_id); retval->is_excluded = is_excluded != FALSE; + retval->is_nodisplay = is_nodisplay != FALSE; return retval; } @@ -3006,9 +3027,10 @@ entries_listify_foreach (const char directory->entries = g_slist_prepend (directory->entries, gmenu_tree_entry_new (directory, - desktop_entry, - desktop_file_id, - FALSE)); + desktop_entry, + desktop_file_id, + FALSE, + desktop_entry_get_no_display (desktop_entry))); } static void @@ -3021,7 +3043,8 @@ excluded_entries_listify_foreach (const gmenu_tree_entry_new (directory, desktop_entry, desktop_file_id, - TRUE)); + TRUE, + desktop_entry_get_no_display (desktop_entry))); } static GMenuTreeDirectory * @@ -3239,9 +3262,14 @@ process_layout (GMenuTree *tree { if (desktop_entry_get_no_display (directory->directory_entry)) { - menu_verbose ("Not showing menu %s because NoDisplay=true\n", + directory->is_nodisplay = TRUE; + + if (!(tree->flags & GMENU_TREE_FLAGS_INCLUDE_NODISPLAY)) + { + menu_verbose ("Not showing menu %s because NoDisplay=true\n", desktop_entry_get_name (directory->directory_entry)); - deleted = TRUE; + deleted = TRUE; + } } if (!desktop_entry_get_show_in_gnome (directory->directory_entry)) @@ -3288,7 +3316,8 @@ process_layout (GMenuTree *tree delete = TRUE; } - if (desktop_entry_get_no_display (entry->desktop_entry)) + if (!(tree->flags & GMENU_TREE_FLAGS_INCLUDE_NODISPLAY) && + desktop_entry_get_no_display (entry->desktop_entry)) { menu_verbose ("Deleting %s because NoDisplay=true\n", desktop_entry_get_name (entry->desktop_entry)); Index: libmenu/gmenu-tree.h =================================================================== RCS file: /cvs/gnome/gnome-menus/libmenu/gmenu-tree.h,v retrieving revision 1.9 diff -u -p -r1.9 gmenu-tree.h --- libmenu/gmenu-tree.h 5 May 2005 07:43:58 -0000 1.9 +++ libmenu/gmenu-tree.h 8 Dec 2005 08:32:10 -0000 @@ -58,10 +58,11 @@ typedef enum typedef enum { - GMENU_TREE_FLAGS_NONE = 0, - GMENU_TREE_FLAGS_INCLUDE_EXCLUDED = 1 << 0, - GMENU_TREE_FLAGS_SHOW_EMPTY = 1 << 1, - GMENU_TREE_FLAGS_MASK = 0x03 + GMENU_TREE_FLAGS_NONE = 0, + GMENU_TREE_FLAGS_INCLUDE_EXCLUDED = 1 << 0, + GMENU_TREE_FLAGS_SHOW_EMPTY = 1 << 1, + GMENU_TREE_FLAGS_INCLUDE_NODISPLAY = 1 << 2, + GMENU_TREE_FLAGS_MASK = 0x07 } GMenuTreeFlags; GMenuTree *gmenu_tree_lookup (const char *menu_file, @@ -101,6 +102,8 @@ const char *gmenu_tree_directory_get_ico const char *gmenu_tree_directory_get_menu_id (GMenuTreeDirectory *directory); GMenuTree *gmenu_tree_directory_get_tree (GMenuTreeDirectory *directory); +gboolean gmenu_tree_directory_get_is_nodisplay (GMenuTreeDirectory *directory); + char *gmenu_tree_directory_make_path (GMenuTreeDirectory *directory, GMenuTreeEntry *entry); @@ -113,7 +116,8 @@ const char *gmenu_tree_entry_get_exec const char *gmenu_tree_entry_get_desktop_file_path (GMenuTreeEntry *entry); const char *gmenu_tree_entry_get_desktop_file_id (GMenuTreeEntry *entry); -gboolean gmenu_tree_entry_get_is_excluded (GMenuTreeEntry *entry); +gboolean gmenu_tree_entry_get_is_excluded (GMenuTreeEntry *entry); +gboolean gmenu_tree_entry_get_is_nodisplay (GMenuTreeEntry *entry); GMenuTreeDirectory *gmenu_tree_header_get_directory (GMenuTreeHeader *header); Index: util/test-menu-spec.c =================================================================== RCS file: /cvs/gnome/gnome-menus/util/test-menu-spec.c,v retrieving revision 1.11 diff -u -p -r1.11 test-menu-spec.c --- util/test-menu-spec.c 25 Jul 2005 10:53:55 -0000 1.11 +++ util/test-menu-spec.c 8 Dec 2005 08:32:10 -0000 @@ -27,11 +27,13 @@ static char *menu_file = NULL; static gboolean monitor = FALSE; static gboolean include_excluded = FALSE; +static gboolean include_nodisplay = FALSE; static GOptionEntry options[] = { - { "file", 'f', 0, G_OPTION_ARG_STRING, &menu_file, N_("Menu file"), N_("MENU_FILE") }, - { "monitor", 'm', 0, G_OPTION_ARG_NONE, &monitor, N_("Monitor for menu changes"), NULL }, - { "include-excluded", 'i', 0, G_OPTION_ARG_NONE, &include_excluded, N_("Include d entries"), NULL }, + { "file", 'f', 0, G_OPTION_ARG_STRING, &menu_file, N_("Menu file"), N_("MENU_FILE") }, + { "monitor", 'm', 0, G_OPTION_ARG_NONE, &monitor, N_("Monitor for menu changes"), NULL }, + { "include-excluded", 'i', 0, G_OPTION_ARG_NONE, &include_excluded, N_("Include d entries"), NULL }, + { "include-nodisplay", 'n', 0, G_OPTION_ARG_NONE, &include_nodisplay, N_("Include NoDisplay=true entries"), NULL }, { NULL } }; @@ -178,6 +180,7 @@ main (int argc, char **argv) GOptionContext *options_context; GMenuTree *tree; GMenuTreeDirectory *root; + GMenuTreeFlags flags; bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); @@ -188,8 +191,13 @@ main (int argc, char **argv) g_option_context_parse (options_context, &argc, &argv, NULL); g_option_context_free (options_context); - tree = gmenu_tree_lookup (menu_file ? menu_file : "applications.menu", - include_excluded ? GMENU_TREE_FLAGS_INCLUDE_EXCLUDED : GMENU_TREE_FLAGS_NONE); + flags = GMENU_TREE_FLAGS_NONE; + if (include_excluded) + flags |= GMENU_TREE_FLAGS_INCLUDE_EXCLUDED; + if (include_nodisplay) + flags |= GMENU_TREE_FLAGS_INCLUDE_NODISPLAY; + + tree = gmenu_tree_lookup (menu_file ? menu_file : "applications.menu", flags); g_assert (tree != NULL); root = gmenu_tree_get_root_directory (tree);