Updating branch refs/heads/master to b66e39c727817d6ce6cc4de89d3caeee643008fc (commit) from b8d44bd58d20ec2c16dc9620db3cb9e8776c6bc8 (commit)
commit b66e39c727817d6ce6cc4de89d3caeee643008fc Author: Jannis Pohlmann <jan...@xfce.org> Date: Sat Dec 4 15:00:18 2010 +0100 Add workaround to fix empty <DefaultLayout> elements (bug #6882). For more information see my comment on the bug on http://bugzilla.xfce.org/show_bug.cgi?id=6882#c2 NEWS | 1 + garcon/garcon-menu-merger.c | 33 +++++++++++++++++++++++++---- tests/test-menu-parser.c | 48 +++++++++++++++++++----------------------- 3 files changed, 51 insertions(+), 31 deletions(-) diff --git a/NEWS b/NEWS index 38b9d37..8a636f7 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ - Add support for XDG_MENU_PREFIX; use applications.menu as a fallback (bug #5980). - Explicitly link against gobject, add other missing libs (bug #6405). +- Add workaround to fix empty <DefaultLayout> elements (bug #6882). 0.1.3 diff --git a/garcon/garcon-menu-merger.c b/garcon/garcon-menu-merger.c index 81dfb8c..07bc8b0 100644 --- a/garcon/garcon-menu-merger.c +++ b/garcon/garcon-menu-merger.c @@ -332,6 +332,7 @@ garcon_menu_merger_run (GarconMenuMerger *merger, garcon_menu_merger_clean_up_elements (merger->priv->menu, GARCON_MENU_NODE_TYPE_ONLY_UNALLOCATED); garcon_menu_merger_prepend_default_layout (merger->priv->menu); + garcon_menu_merger_clean_up_elements (merger->priv->menu, GARCON_MENU_NODE_TYPE_DEFAULT_LAYOUT); garcon_menu_merger_clean_up_elements (merger->priv->menu, GARCON_MENU_NODE_TYPE_LAYOUT); g_list_foreach (context.file_stack, (GFunc) g_object_unref, NULL); @@ -910,9 +911,10 @@ static void garcon_menu_merger_clean_up_elements (GNode *node, GarconMenuNodeType type) { - GNode *child; - GNode *remaining_node = NULL; - GList *destroy_list = NULL; + GarconMenuNode *node_; + GNode *child; + GNode *remaining_node = NULL; + GList *destroy_list = NULL; for (child = g_node_last_child (node); child != NULL; child = g_node_prev_sibling (child)) { @@ -937,7 +939,13 @@ garcon_menu_merger_clean_up_elements (GNode *node, } if (type == GARCON_MENU_NODE_TYPE_LAYOUT - && garcon_menu_node_tree_get_node_type (child) != GARCON_MENU_NODE_TYPE_LAYOUT) + && garcon_menu_node_tree_get_node_type (child) != type) + { + continue; + } + + if (type == GARCON_MENU_NODE_TYPE_DEFAULT_LAYOUT + && garcon_menu_node_tree_get_node_type (child) != type) { continue; } @@ -951,12 +959,27 @@ garcon_menu_merger_clean_up_elements (GNode *node, g_list_foreach (destroy_list, (GFunc) garcon_menu_node_tree_free, NULL); g_list_free (destroy_list); - if (type == GARCON_MENU_NODE_TYPE_LAYOUT + if (type == GARCON_MENU_NODE_TYPE_LAYOUT && remaining_node != NULL && G_NODE_IS_LEAF (remaining_node)) { garcon_menu_node_tree_free (remaining_node); } + + if (type == GARCON_MENU_NODE_TYPE_DEFAULT_LAYOUT + && remaining_node != NULL + && G_NODE_IS_LEAF (remaining_node)) + { + /* FIXME Fix empty <DefaultLayout> elements created due to a bug in + * alacarte. See http://bugzilla.xfce.org/show_bug.cgi?id=6882#c2 + * for more information */ + node_ = garcon_menu_node_create (GARCON_MENU_NODE_TYPE_MERGE, + GUINT_TO_POINTER (GARCON_MENU_LAYOUT_MERGE_MENUS)); + g_node_append_data (remaining_node, node_); + node_ = garcon_menu_node_create (GARCON_MENU_NODE_TYPE_MERGE, + GUINT_TO_POINTER (GARCON_MENU_LAYOUT_MERGE_FILES)); + g_node_append_data (remaining_node, node_); + } } diff --git a/tests/test-menu-parser.c b/tests/test-menu-parser.c index 792dc4b..ee4da65 100644 --- a/tests/test-menu-parser.c +++ b/tests/test-menu-parser.c @@ -53,6 +53,7 @@ node_name (GNode *node) case GARCON_MENU_NODE_TYPE_AND: return "And"; break; case GARCON_MENU_NODE_TYPE_NOT: return "Not"; break; case GARCON_MENU_NODE_TYPE_MOVE: return "Move"; break; + case GARCON_MENU_NODE_TYPE_DEFAULT_LAYOUT: return "DefaultLayout"; break; case GARCON_MENU_NODE_TYPE_LAYOUT: return "Layout"; break; default: return NULL; break; } @@ -83,14 +84,15 @@ print_node (GNode *node, #define INDENT {for (i = 0; i < depth; ++i) g_print (" ");} - if (G_UNLIKELY (garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_MENU || - garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_INCLUDE || - garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_EXCLUDE || - garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_OR || - garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_AND || - garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_NOT || - garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_MOVE || - garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_LAYOUT)) + if (garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_MENU || + garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_INCLUDE || + garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_EXCLUDE || + garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_OR || + garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_AND || + garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_NOT || + garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_MOVE || + garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_DEFAULT_LAYOUT || + garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_LAYOUT) { INDENT; g_print ("<%s>\n", node_name (node)); print_child_nodes (node, depth); @@ -206,27 +208,18 @@ print_tree (GarconMenuTreeProvider *provider) -static const gchar ROOT_SPECS[][30] = -{ - "menus/applications.menu", - "menus/xfce-applications.menu", - "menus/gnome-applications.menu", - "menus/kde-applications.menu", -}; - - - int main (int argc, char **argv) { GarconMenuParser *parser; GarconMenuMerger *merger; + const gchar *prefix; GError *error = NULL; GFile *file = NULL; gchar *filename; + gchar *relative_filename; gint result = EXIT_SUCCESS; - gint n; g_type_init (); @@ -239,14 +232,15 @@ main (int argc, file = g_file_new_for_path (argv[1]); else { - /* Search for a usable root menu file */ - for (n = 0; n < G_N_ELEMENTS (ROOT_SPECS) && file == NULL; ++n) + prefix = g_getenv ("XDG_MENU_PREFIX"); + relative_filename = g_strconcat ("menus", G_DIR_SEPARATOR_S, + prefix != NULL ? prefix : "", "applications.menu", + NULL); + + /* Search for the menu file */ + filename = garcon_config_lookup (relative_filename); + if (G_UNLIKELY (filename != NULL)) { - /* Search for the root menu file */ - filename = garcon_config_lookup (ROOT_SPECS[n]); - if (G_UNLIKELY (filename == NULL)) - continue; - /* Try to load the root menu from this file */ file = g_file_new_for_path (filename); g_free (filename); @@ -257,6 +251,8 @@ main (int argc, file = NULL; } } + + g_free (relative_filename); } parser = garcon_menu_parser_new (file); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits