From 70421b12071dddbb2ba71b1ec4bc67eeeff9f5f0 Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Thu, 11 Aug 2022 18:43:51 +0100 Subject: [PATCH] menu: do not require label attribute for highest level menu definition Allow highest level menu definitions - typically used for root-menu and client-menu - to be defined like this: Previously this required a label attribute (which was not used for anything and could be an empty string) as show below: Closes issue #472 --- docs/labwc-menu.5.scd | 2 +- docs/menu.xml | 6 ++++-- src/menu/menu.c | 36 ++++++++++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/docs/labwc-menu.5.scd b/docs/labwc-menu.5.scd index 716e00b8..f6e96129 100644 --- a/docs/labwc-menu.5.scd +++ b/docs/labwc-menu.5.scd @@ -15,7 +15,7 @@ A menu file must be entirely enclosed within and tags. Inside these tags, menus are specified as follows: ``` - + diff --git a/docs/menu.xml b/docs/menu.xml index b61dd85a..1bb42788 100644 --- a/docs/menu.xml +++ b/docs/menu.xml @@ -1,7 +1,8 @@ - + + @@ -31,7 +32,8 @@ - + + firefox diff --git a/src/menu/menu.c b/src/menu/menu.c index a2677c8b..fa4d2609 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -51,7 +51,7 @@ menu_create(struct server *server, const char *id, const char *label) nr_menus++; wl_list_init(&menu->menuitems); menu->id = strdup(id); - menu->label = strdup(label); + menu->label = label ? strdup(label) : strdup(id); menu->parent = current_menu; menu->server = server; menu->size.width = MENUWIDTH; @@ -299,6 +299,17 @@ traverse(xmlNode *n, struct server *server) xml_tree_walk(n->children, server); } +static int +nr_parents(xmlNode *n) +{ + assert(n); + int i = 0; + for (xmlNode *node = n->parent; node && i < INT_MAX; ++i) { + node = node->parent; + } + return i; +} + /* * elements have three different roles: * * Definition of (sub)menu - has ID, LABEL and CONTENT @@ -314,7 +325,24 @@ handle_menu_element(xmlNode *n, struct server *server) if (execute) { wlr_log(WLR_ERROR, "we do not support pipemenus"); - } else if (label && id) { + } else if ((label && id) || (id && nr_parents(n) == 2)) { + /* + * (label && id) refers to which is an + * inline menu definition. + * + * (id && nr_parents(n) == 2) refers to: + * + * + * + * + * + * which is the highest level a menu can be defined at. + * + * Openbox spec requires a label="" defined here, but it is + * actually pointless so we handle it with or without the label + * attritute to make it easier for users to define "root-menu" + * and "client-menu". + */ struct menu **submenu = NULL; if (menu_level > 0) { /* @@ -337,6 +365,10 @@ handle_menu_element(xmlNode *n, struct server *server) current_menu = current_menu->parent; --menu_level; } else if (id) { + /* + * creates an entry which points to a menu + * defined elsewhere + */ struct menu *menu = menu_get_by_id(id); if (menu) { current_item = item_create(current_menu, menu->label); -- 2.52.0