};
/* menu_create - create menu */
-void menu_init(struct server *server, struct menu *menu);
+void menu_init_rootmenu(struct server *server, struct menu *menu);
void menu_finish(struct menu *menu);
/* menu_move - move to position (x, y) */
/* menu_action_selected - select item at (x, y) */
void menu_action_selected(struct server *server, struct menu *menu);
+/* menu_reconfigure - reload theme and content */
+void menu_reconfigure(void);
+
#endif /* __LABWC_MENU_H */
static const char font[] = "Sans 8";
static struct server *g_server;
-static struct menu *g_menu;
/* state-machine variables for processing <item></item> */
static bool in_item = false;
* </item>
*/
if (!strcmp(nodename, "label")) {
- current_item = menuitem_create(g_server, g_menu, content);
+ current_item = menuitem_create(
+ g_server, g_server->rootmenu, content);
}
assert(current_item);
if (!strcmp(nodename, "name.action")) {
}
static void
-parse_xml(struct buf *b)
-{
- xmlDoc *d = xmlParseMemory(b->buf, b->len);
- if (!d) {
- warn("xmlParseMemory()");
- exit(EXIT_FAILURE);
- }
- xml_tree_walk(xmlDocGetRootElement(d));
- xmlFreeDoc(d);
- xmlCleanupParser();
-}
-
-static void
-menu_read(void)
+parse_xml(const char *filename)
{
FILE *stream;
char *line = NULL;
if (!strlen(config_dir())) {
return;
}
- snprintf(menuxml, sizeof(menuxml), "%s/menu.xml", config_dir());
+ snprintf(menuxml, sizeof(menuxml), "%s/%s", config_dir(), filename);
stream = fopen(menuxml, "r");
if (!stream) {
}
free(line);
fclose(stream);
- parse_xml(&b);
+ xmlDoc *d = xmlParseMemory(b.buf, b.len);
+ if (!d) {
+ warn("xmlParseMemory()");
+ exit(EXIT_FAILURE);
+ }
+ xml_tree_walk(xmlDocGetRootElement(d));
+ xmlFreeDoc(d);
+ xmlCleanupParser();
free(b.buf);
}
void
-menu_init(struct server *server, struct menu *menu)
+menu_init_rootmenu(struct server *server, struct menu *menu)
{
static bool has_run;
- if (has_run) {
- goto not_first_run;
+ if (!has_run) {
+ LIBXML_TEST_VERSION
+ wl_list_init(&menu->menuitems);
+ g_server = server;
+ server->rootmenu = menu;
}
- LIBXML_TEST_VERSION
- wl_list_init(&menu->menuitems);
- g_server = server;
- g_menu = menu;
-not_first_run:
- menu_read();
+ parse_xml("menu.xml");
+
/* Default menu if no menu.xml found */
- if (!current_item) {
+ if (wl_list_empty(&menu->menuitems)) {
current_item = menuitem_create(server, menu, "Reconfigure");
current_item->action = strdup("Reconfigure");
current_item = menuitem_create(server, menu, "Exit");
}
}
}
+
+void
+menu_reconfigure(void)
+{
+ menu_finish(g_server->rootmenu);
+ menu_init_rootmenu(g_server, g_server->rootmenu);
+}
static struct wl_event_source *sigint_source;
static struct wl_event_source *sigterm_source;
+static struct server *g_server;
+
static void
reload_config_and_theme(void)
{
/* TODO: use rc.config_path */
rcxml_read(NULL);
theme_read(rc.theme_name);
+ menu_reconfigure();
+ damage_all_outputs(g_server);
}
static int
image->hotspot_y);
}
#endif
+
+ /* used when handling SIGHUP */
+ g_server = server;
}
void