X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plugins%2Fmenu%2Ffifo_menu.c;h=3443294e2ced983b66c85e424956c6a71056bfb2;hb=2603255b7453c5fe9a2caef2cbb5974f6145ff8d;hp=c4bc179e0fe6da7906dcb4a5ec4c375120921739;hpb=b46222c3d9b4b638b14647871d41249db9726422;p=chaz%2Fopenbox diff --git a/plugins/menu/fifo_menu.c b/plugins/menu/fifo_menu.c index c4bc179e..3443294e 100644 --- a/plugins/menu/fifo_menu.c +++ b/plugins/menu/fifo_menu.c @@ -12,19 +12,20 @@ static char *PLUGIN_NAME = "fifo_menu"; -typedef struct Fifo_Menu_Data{ +typedef struct Fifo_Menu_Data { char *fifo; char *buf; /* buffer to hold partially read menu */ unsigned long buflen; /* how many bytes are in the buffer */ int fd; /* file descriptor to read menu from */ + gboolean use_pid; event_fd_handler *handler; } Fifo_Menu_Data; -#define FIFO_MENU(m) ((Menu *)m) -#define FIFO_MENU_DATA(m) ((Fifo_Menu_Data *)((Menu *)m)->plugin_data) +#define FIFO_MENU(m) ((ObMenu *)m) +#define FIFO_MENU_DATA(m) ((Fifo_Menu_Data *)((ObMenu *)m)->plugin_data) -void fifo_menu_clean_up(Menu *m) { +void fifo_menu_clean_up(ObMenu *m) { if (FIFO_MENU_DATA(m)->buf != NULL) { g_free(FIFO_MENU_DATA(m)->buf); FIFO_MENU_DATA(m)->buf = NULL; @@ -42,12 +43,15 @@ void plugin_startup() { } void plugin_shutdown() { } -void fifo_menu_handler(int fd, Menu *menu) { +void fifo_menu_handler(int fd, void *d) { + ObMenu *menu = d; char *tmpbuf = NULL; unsigned long num_read; #ifdef DEBUG /* because gdb is dumb */ +#if 0 Fifo_Menu_Data *d = FIFO_MENU_DATA(menu); +#endif #endif /* if the menu is shown this will go into busy loop :( @@ -70,34 +74,37 @@ void fifo_menu_handler(int fd, Menu *menu) { FIFO_MENU_DATA(menu)->buf = tmpbuf; num_read = read(fd, - FIFO_MENU_DATA(menu)->buf + FIFO_MENU_DATA(menu)->buflen, + FIFO_MENU_DATA(menu)->buf + + FIFO_MENU_DATA(menu)->buflen, num_realloc); if (num_read == 0) { /* eof */ - unsigned long count = 0; - char *found = NULL; + xmlDocPtr doc; + xmlNodePtr node; menu->invalid = TRUE; menu_clear(menu); - /* TEMP: list them */ - while (NULL != - (found = strchr(&FIFO_MENU_DATA(menu)->buf[count], '\n'))) { - FIFO_MENU_DATA(menu)->buf - [found - FIFO_MENU_DATA(menu)->buf] = '\0'; - menu_add_entry(menu, - menu_entry_new_separator - (&FIFO_MENU_DATA(menu)->buf[count])); - count = found - FIFO_MENU_DATA(menu)->buf + 1; - } - FIFO_MENU_DATA(menu)->buf[FIFO_MENU_DATA(menu)->buflen] = '\0'; - fifo_menu_clean_up(menu); + doc = xmlParseMemory(FIFO_MENU_DATA(menu)->buf, + FIFO_MENU_DATA(menu)->buflen); + + node = xmlDocGetRootElement(doc); + + if (node && + !xmlStrcasecmp(node->name, (const xmlChar*) "fifo_menu")) { + if ((node = parse_find_node("item", node->xmlChildrenNode))) + parse_menu_full(doc, node, menu, FALSE); + } + + fifo_menu_clean_up(menu); + event_remove_fd(FIFO_MENU_DATA(menu)->handler->fd); if ((FIFO_MENU_DATA(menu)->fd = - open(FIFO_MENU_DATA(menu)->fifo, O_NONBLOCK | O_RDONLY)) == -1) { + open(FIFO_MENU_DATA(menu)->fifo, + O_NONBLOCK | O_RDONLY)) == -1) { g_warning("Can't reopen FIFO"); fifo_menu_clean_up(menu); return; @@ -113,7 +120,7 @@ void fifo_menu_handler(int fd, Menu *menu) { } } -void plugin_destroy (Menu *m) +void plugin_destroy (ObMenu *m) { fifo_menu_clean_up(m); if (FIFO_MENU_DATA(m)->handler != NULL) { @@ -126,20 +133,48 @@ void plugin_destroy (Menu *m) FIFO_MENU_DATA(m)->fifo = NULL; } + if (FIFO_MENU_DATA(m)->buf != NULL) { + g_free(FIFO_MENU_DATA(m)->buf); + FIFO_MENU_DATA(m)->buf = NULL; + } + g_free(m->plugin_data); menu_free(m->name); } -void *plugin_create() /* TODO: need config */ +void *plugin_create(PluginMenuCreateData *data) { char *fifo; char *dir; event_fd_handler *h; + Fifo_Menu_Data *d; + ObMenu *m; + char *label = NULL, *id = NULL; + char *attr_pid = NULL; + + d = g_new(Fifo_Menu_Data, 1); + + parse_attr_string("id", data->node, &id); + parse_attr_string("label", data->node, &label); + + if (parse_attr_string("pid", data->node, &attr_pid) && + g_strcasecmp(attr_pid, "true") == 0) { + d->use_pid = TRUE; + } else + d->use_pid = FALSE; - Fifo_Menu_Data *d = g_new(Fifo_Menu_Data, 1); - Menu *m = menu_new("", PLUGIN_NAME, NULL); + m = menu_new( (label != NULL ? label : ""), + (id != NULL ? id : PLUGIN_NAME), + data->parent); + if (data->parent) + menu_add_entry(data->parent, menu_entry_new_submenu( + (label != NULL ? label : ""), + m)); + + g_free(label); + g_free(id); d->fd = -1; d->buf = NULL; d->buflen = 0; @@ -151,7 +186,9 @@ void *plugin_create() /* TODO: need config */ m->plugin_data = (void *)d; - dir = g_build_filename(g_get_home_dir(), ".openbox", PLUGIN_NAME, NULL); + + dir = g_build_filename(g_get_home_dir(), ".openbox", + PLUGIN_NAME, NULL); if (mkdir(dir, S_IRWXU | S_IRWXG | S_IRWXO) == -1 && errno != EEXIST) { /* technically, if ~/.openbox/fifo_menu exists and isn't a directory @@ -163,8 +200,19 @@ void *plugin_create() /* TODO: need config */ return NULL; } - fifo = g_build_filename(g_get_home_dir(), ".openbox", PLUGIN_NAME, - m->name, NULL); + if (d->use_pid) + { + char *pid = g_strdup_printf("%s.%d", m->name, getpid()); + fifo = g_build_filename(g_get_home_dir(), ".openbox", + PLUGIN_NAME, + pid, NULL); + g_free(pid); + } else { + fifo = g_build_filename(g_get_home_dir(), ".openbox", + PLUGIN_NAME, + m->name, NULL); + } + if (mkfifo(fifo, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | /* let umask do its thing */ S_IROTH | S_IWOTH) == -1 && errno != EEXIST) {