]> git.mdlowis.com Git - proto/labwc.git/commitdiff
menu: reload on SIGHUP
authorJohan Malm <jgm323@gmail.com>
Fri, 19 Feb 2021 23:05:14 +0000 (23:05 +0000)
committerJohan Malm <jgm323@gmail.com>
Fri, 19 Feb 2021 23:05:14 +0000 (23:05 +0000)
include/menu/menu.h
src/main.c
src/menu/menu.c
src/server.c

index 2054c338cf7d2e01aad4857f19050eea4c10905a..c2cd51c6b03fa39673ecdfe712ac198e24f7e32d 100644 (file)
@@ -21,7 +21,7 @@ struct menu {
 };
 
 /* 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) */
@@ -33,4 +33,7 @@ void menu_set_selected(struct menu *menu, int x, int 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 */
index bd2b3ec5966e8b2a876fbb4a7d635c1a815f54eb..190fe01651d8d83110ec118c4fe41c2c04bd8a51 100644 (file)
@@ -80,8 +80,7 @@ main(int argc, char *argv[])
        xbm_load(server.renderer);
 
        struct menu rootmenu = { 0 };
-       menu_init(&server, &rootmenu);
-       server.rootmenu = &rootmenu;
+       menu_init_rootmenu(&server, &rootmenu);
 
        session_autostart_init();
        if (startup_cmd) {
index 213ccfa3b7ec80be29afe1e1b1f0cd4f81df2767..d8cc527a4e9f8d56c44991ecb27d726777cfaf01 100644 (file)
@@ -21,7 +21,6 @@
 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;
@@ -107,7 +106,8 @@ static void fill_item(char *nodename, char *content)
         * </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")) {
@@ -187,20 +187,7 @@ xml_tree_walk(xmlNode *node)
 }
 
 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;
@@ -211,7 +198,7 @@ menu_read(void)
        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) {
@@ -228,27 +215,33 @@ menu_read(void)
        }
        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");
@@ -311,3 +304,10 @@ menu_action_selected(struct server *server, struct menu *menu)
                }
        }
 }
+
+void
+menu_reconfigure(void)
+{
+       menu_finish(g_server->rootmenu);
+       menu_init_rootmenu(g_server, g_server->rootmenu);
+}
index b19f803644ced21b43bfd09d95fd3a143b34fe27..1d5ceb02219648db91581dc4745f362e8f3d8d7d 100644 (file)
@@ -18,6 +18,8 @@ static struct wl_event_source *sighup_source;
 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)
 {
@@ -25,6 +27,8 @@ 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
@@ -212,6 +216,9 @@ server_init(struct server *server)
                                        image->hotspot_y);
        }
 #endif
+
+       /* used when handling SIGHUP */
+       g_server = server;
 }
 
 void