]> Dogcows Code - chaz/openbox/blobdiff - plugins/menu/fifo_menu.c
s/Shade/Roll up\/down/
[chaz/openbox] / plugins / menu / fifo_menu.c
index fc5ed0e1e3e07105f3f205efae9559ec8dd5c6a3..c096a9d3ac7975143d180e20f415c1051c82eef3 100644 (file)
@@ -1,3 +1,25 @@
+/*
+ * $Header$
+ *
+ * FFIO menu plugin
+ * Provides a menu from a FIFO located in ~/.openbox/fifo_menu/id
+ * Example:
+ * rc3:
+ *   <menu id="fonk" label="fonk" plugin="fifo_menu"></menu>
+ * Menu format
+ * <fifo_menu>
+ *    <item label="GLOVE.png">
+ *       <action name="execute">
+ *          <execute>
+ *             bsetbg "/home/woodblock/.openbox/backgrounds/GLOVE.png"
+ *          </execute>
+ *       </action>
+ *    </item>
+ *  </fifo_menu>
+ *
+ * If the attribute pid="true" is in the <menu>
+ */
+
 #include <glib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -79,22 +101,24 @@ void fifo_menu_handler(int fd, void *d) {
                         num_realloc);
 
         if (num_read == 0) { /* eof */
+            ObParseInst *i;
+            xmlDocPtr doc;
+            xmlNodePtr node;
+
             menu->invalid = TRUE;
             menu_clear(menu);
 
             FIFO_MENU_DATA(menu)->buf[FIFO_MENU_DATA(menu)->buflen] = '\0';
 
-            xmlDocPtr doc = xmlParseMemory(FIFO_MENU_DATA(menu)->buf,
-                                           FIFO_MENU_DATA(menu)->buflen);
+            i = parse_startup();
+
+            if (parse_load_mem(FIFO_MENU_DATA(menu)->buf,
+                               FIFO_MENU_DATA(menu)->buflen,
+                               "fifo_menu", &doc, &node))
+                parse_menu_full(i, doc, node, menu, FALSE);
+
+            parse_shutdown(i);
 
-            xmlNodePtr 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);
@@ -130,6 +154,11 @@ void plugin_destroy (ObMenu *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);
@@ -159,9 +188,11 @@ void *plugin_create(PluginMenuCreateData *data)
     m = menu_new( (label != NULL ? label : ""),
                   (id != NULL ? id : PLUGIN_NAME),
                   data->parent);
-    menu_add_entry(data->parent, menu_entry_new_submenu(
-                       (label != NULL ? label : ""),
-                       m));
+
+    if (data->parent)
+        menu_add_entry(data->parent, menu_entry_new_submenu(
+                           (label != NULL ? label : ""),
+                           m));
 
     g_free(label);
     g_free(id);
This page took 0.021244 seconds and 4 git commands to generate.