diff --git a/include/labwc.h b/include/labwc.h
index 84d39d4f..6f295cfa 100644
--- a/include/labwc.h
+++ b/include/labwc.h
@@ -320,6 +320,7 @@ struct server {
struct theme *theme;
struct menu *menu_current;
+ struct wl_list menus;
};
#define LAB_NR_LAYERS (4)
diff --git a/include/menu/menu.h b/include/menu/menu.h
index e2a1d512..914fa186 100644
--- a/include/menu/menu.h
+++ b/include/menu/menu.h
@@ -60,6 +60,7 @@ struct menu {
/* Used to match a window-menu to the view that triggered it. */
struct view *triggered_by_view; /* may be NULL */
+ struct wl_list link; /* server.menus */
};
/* For keyboard support */
@@ -70,14 +71,14 @@ void menu_submenu_leave(struct server *server);
bool menu_call_selected_actions(struct server *server);
void menu_init(struct server *server);
-void menu_finish(void);
+void menu_finish(struct server *server);
/**
* menu_get_by_id - get menu by id
*
* @id id string defined in menu.xml like "root-menu"
*/
-struct menu *menu_get_by_id(const char *id);
+struct menu *menu_get_by_id(struct server *server, const char *id);
/**
* menu_open - open menu on position (x, y)
diff --git a/src/action.c b/src/action.c
index 414c8492..43c3ddec 100644
--- a/src/action.c
+++ b/src/action.c
@@ -493,7 +493,7 @@ show_menu(struct server *server, struct view *view, const char *menu_name)
}
bool force_menu_top_left = false;
- struct menu *menu = menu_get_by_id(menu_name);
+ struct menu *menu = menu_get_by_id(server, menu_name);
if (!menu) {
return;
}
diff --git a/src/main.c b/src/main.c
index 3cc82e81..8aeffc7e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -180,7 +180,7 @@ main(int argc, char *argv[])
server_finish(&server);
- menu_finish();
+ menu_finish(&server);
theme_finish(&theme);
rcxml_finish();
font_finish();
diff --git a/src/menu/menu.c b/src/menu/menu.c
index 5c7712f1..e6ce5b39 100644
--- a/src/menu/menu.c
+++ b/src/menu/menu.c
@@ -33,22 +33,14 @@ static struct action *current_item_action;
static int menu_level;
static struct menu *current_menu;
-/* vector for