]> Dogcows Code - chaz/openbox/commitdiff
adjust for changes to the parsing api.
authorDana Jansens <danakj@orodu.net>
Tue, 12 Aug 2003 19:18:21 +0000 (19:18 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 12 Aug 2003 19:18:21 +0000 (19:18 +0000)
split the menu into its own file.

17 files changed:
Makefile.am
data/menu [new file with mode: 0644]
data/rc3
openbox/config.c
openbox/config.h
openbox/menu.c
openbox/menu.h
openbox/mouse.c
openbox/openbox.c
openbox/plugin.c
openbox/plugin.h
plugins/interface.h
plugins/menu/fifo_menu.c
plugins/menu/include_menu.c
plugins/menu/timed_menu.c
plugins/placement/placement.c
plugins/resistance/resistance.c

index cb82d10f9c523865e1e2d4ca631ebdd263f250b0..b4aeea1952395bfaacd75a5b8f47910dccead66b 100644 (file)
@@ -414,7 +414,8 @@ dist_om4ob_theme_DATA = \
 ## data ##
 
 dist_rc_DATA = \
-       data/rc3
+       data/rc3 \
+       data/menu
 
 dist_desktopfiles_DATA = \
        data/openbox.desktop
diff --git a/data/menu b/data/menu
new file mode 100644 (file)
index 0000000..c3b69fd
--- /dev/null
+++ b/data/menu
@@ -0,0 +1,38 @@
+<openbox_menu>
+
+<menu id="root" label="Openbox 3">
+  <menu id="apps" label="Applications">
+    <item label="Xterm">
+      <action name="execute"><execute>xterm</execute></action>
+    </item>
+    <item label="Mozilla">
+      <action name="execute"><execute>mozilla</execute></action>
+    </item>
+    <item label="Gaim">
+      <action name="execute"><execute>gaim</execute></action>
+    </item>
+    <item label="Quark">
+      <action name="execute"><execute>strange-quark</execute></action>
+    </item>
+  </menu>
+  <menu id="games" label="Games">
+    <item label="Crack-Attack">
+      <action name="execute"><execute>crack-attack</execute></action>
+    </item>
+    <item label="XFRisk">
+      <action name="execute"><execute>xfrisk</execute></action>
+    </item>
+    <item label="Quake III">
+      <action name="execute"><execute>quake3</execute></action>
+    </item>
+  </menu>
+  <item label="--" /> <!-- separator -->
+  <item label="Restart">
+    <action name="restart" />
+  </item>
+  <item label="Exit">
+    <action name="exit" />
+  </item>
+</menu>
+
+</openbox_menu>
index ae3263a034b2ddb53bc875893d1a94c915665e29..bd56233cf1d1af9951480009bcc5bca9f1145a8d 100644 (file)
--- a/data/rc3
+++ b/data/rc3
   </context>
 </mouse>
 
-<menu id="root" label="Openbox 3">
-  <menu id="apps" label="Applications">
-    <item label="Xterm">
-      <action name="execute"><execute>xterm</execute></action>
-    </item>
-    <item label="Mozilla">
-      <action name="execute"><execute>mozilla</execute></action>
-    </item>
-    <item label="Gaim">
-      <action name="execute"><execute>gaim</execute></action>
-    </item>
-    <item label="Quark">
-      <action name="execute"><execute>strange-quark</execute></action>
-    </item>
-  </menu>
-  <menu id="games" label="Games">
-    <item label="Crack-Attack">
-      <action name="execute"><execute>crack-attack</execute></action>
-    </item>
-    <item label="XFRisk">
-      <action name="execute"><execute>xfrisk</execute></action>
-    </item>
-    <item label="Quake III">
-      <action name="execute"><execute>quake3</execute></action>
-    </item>
-  </menu>
-  <item label="--" /> <!-- separator -->
-  <item label="Restart">
-    <action name="restart" />
-  </item>
-  <item label="Exit">
-    <action name="exit" />
-  </item>
+<menu>
+  <location>~/.openbox/menu</location>
 </menu>
 
 </openbox_config>
index 9e32609d55dd8ec0e77408d83a7a8381508d96e5..a3c236fc2cbd96415c3122d72efb48ff69845eb3 100644 (file)
@@ -36,6 +36,18 @@ guint config_keyboard_reset_state;
 gint config_mouse_threshold;
 gint config_mouse_dclicktime;
 
+gchar *config_menu_path;
+
+gchar *expand_tilde(const gchar *f)
+{
+    if (!f)
+        return NULL;
+    else if (f[0] != '~')
+        return g_strdup(f);
+    else
+        return g_strconcat(g_get_home_dir(), f+1, NULL);
+}
+
 /*
 
 <keybind key="C-x">
@@ -46,7 +58,8 @@ gint config_mouse_dclicktime;
 
 */
 
-static void parse_key(xmlDocPtr doc, xmlNodePtr node, GList *keylist)
+static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                      GList *keylist)
 {
     char *key;
     ObAction *action;
@@ -57,6 +70,7 @@ static void parse_key(xmlDocPtr doc, xmlNodePtr node, GList *keylist)
         key = parse_string(doc, n);
         translate_key(key, &config_keyboard_reset_state,
                       &config_keyboard_reset_keycode);
+        g_free(key);
     }
 
     n = parse_find_node("keybind", node);
@@ -64,7 +78,7 @@ static void parse_key(xmlDocPtr doc, xmlNodePtr node, GList *keylist)
         if (parse_attr_string("key", n, &key)) {
             keylist = g_list_append(keylist, key);
 
-            parse_key(doc, n->xmlChildrenNode, keylist);
+            parse_key(i, doc, n->xmlChildrenNode, keylist);
 
             it = g_list_last(keylist);
             g_free(it->data);
@@ -94,9 +108,10 @@ static void parse_key(xmlDocPtr doc, xmlNodePtr node, GList *keylist)
     }
 }
 
-static void parse_keyboard(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                           void *d)
 {
-    parse_key(doc, node->xmlChildrenNode, NULL);
+    parse_key(i, doc, node->xmlChildrenNode, NULL);
 }
 
 /*
@@ -109,7 +124,8 @@ static void parse_keyboard(xmlDocPtr doc, xmlNodePtr node, void *d)
 
 */
 
-static void parse_mouse(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                        void *d)
 {
     xmlNodePtr n, nbut, nact;
     char *buttonstr;
@@ -182,7 +198,8 @@ static void parse_mouse(xmlDocPtr doc, xmlNodePtr node, void *d)
     }
 }
 
-static void parse_focus(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                        void *d)
 {
     xmlNodePtr n;
 
@@ -200,7 +217,8 @@ static void parse_focus(xmlDocPtr doc, xmlNodePtr node, void *d)
         config_focus_popup = parse_bool(doc, n);
 }
 
-static void parse_theme(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                        void *d)
 {
     xmlNodePtr n;
 
@@ -216,7 +234,8 @@ static void parse_theme(xmlDocPtr doc, xmlNodePtr node, void *d)
     }
 }
 
-static void parse_desktops(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                           void *d)
 {
     xmlNodePtr n;
 
@@ -244,7 +263,8 @@ static void parse_desktops(xmlDocPtr doc, xmlNodePtr node, void *d)
         config_desktop_popup = parse_bool(doc, n);
 }
 
-static void parse_resize(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                         void *d)
 {
     xmlNodePtr n;
 
@@ -254,7 +274,7 @@ static void parse_resize(xmlDocPtr doc, xmlNodePtr node, void *d)
         config_redraw_resize = parse_bool(doc, n);
 }
 
-static void parse_dock(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, void *d)
 {
     xmlNodePtr n;
 
@@ -314,7 +334,21 @@ static void parse_dock(xmlDocPtr doc, xmlNodePtr node, void *d)
         config_dock_hide_timeout = parse_int(doc, n);
 }
 
-void config_startup()
+static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, void *d)
+{
+    xmlNodePtr n;
+
+    node = node->xmlChildrenNode;
+    if ((n = parse_find_node("location", node))) {
+        gchar *c;
+
+        c = parse_string(doc, n);
+        config_menu_path = expand_tilde(c);
+        g_free(c);
+    }
+}
+   
+void config_startup(ObParseInst *i)
 {
     config_focus_new = TRUE;
     config_focus_follow = FALSE;
@@ -322,23 +356,23 @@ void config_startup()
     config_focus_last_on_desktop = TRUE;
     config_focus_popup = TRUE;
 
-    parse_register("focus", parse_focus, NULL);
+    parse_register(i, "focus", parse_focus, NULL);
 
     config_theme = NULL;
 
     config_title_layout = g_strdup("NLIMC");
 
-    parse_register("theme", parse_theme, NULL);
+    parse_register(i, "theme", parse_theme, NULL);
 
     config_desktops_num = 4;
     config_desktops_names = NULL;
     config_desktop_popup = TRUE;
 
-    parse_register("desktops", parse_desktops, NULL);
+    parse_register(i, "desktops", parse_desktops, NULL);
 
     config_redraw_resize = TRUE;
 
-    parse_register("resize", parse_resize, NULL);
+    parse_register(i, "resize", parse_resize, NULL);
 
     config_dock_layer = OB_STACKING_LAYER_TOP;
     config_dock_pos = OB_DIRECTION_NORTHEAST;
@@ -349,17 +383,21 @@ void config_startup()
     config_dock_hide = FALSE;
     config_dock_hide_timeout = 3000;
 
-    parse_register("dock", parse_dock, NULL);
+    parse_register(i, "dock", parse_dock, NULL);
 
     translate_key("C-g", &config_keyboard_reset_state,
                   &config_keyboard_reset_keycode);
 
-    parse_register("keyboard", parse_keyboard, NULL);
+    parse_register(i, "keyboard", parse_keyboard, NULL);
 
     config_mouse_threshold = 3;
     config_mouse_dclicktime = 200;
 
-    parse_register("mouse", parse_mouse, NULL);
+    parse_register(i, "mouse", parse_mouse, NULL);
+
+    config_menu_path = NULL;
+
+    parse_register(i, "menu", parse_menu, NULL);
 }
 
 void config_shutdown()
index fe4fb605107fb9c61d952f27ccf67ce977cf63a3..ab1b7493a683531b4b22498106ae2f38d9ab5853 100644 (file)
@@ -6,6 +6,8 @@
 
 #include <glib.h>
 
+struct _ObParseInst;
+
 /*! Should new windows be focused */
 extern gboolean config_focus_new;
 /*! Focus windows when the mouse enters them */
@@ -65,7 +67,10 @@ extern gint config_mouse_threshold;
   double-click */
 extern gint config_mouse_dclicktime;
 
-void config_startup();
+/*! User-specified path to the menu file */
+extern gchar *config_menu_path;
+
+void config_startup(struct _ObParseInst *i);
 void config_shutdown();
 
 #endif
index 0f2eff429925e1f4744415c32f43e995d0013611..b29594d75434c2ac0c2c67acab579008691c8571 100644 (file)
@@ -4,10 +4,12 @@
 #include "stacking.h"
 #include "client.h"
 #include "grab.h"
+#include "config.h"
 #include "screen.h"
 #include "geom.h"
 #include "plugin.h"
 #include "misc.h"
+#include "parser/parse.h"
 
 GHashTable *menu_hash = NULL;
 GList *menu_visible = NULL;
@@ -18,14 +20,16 @@ GList *menu_visible = NULL;
 #define ENTRY_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
                          ButtonPressMask | ButtonReleaseMask)
 
-static void parse_menu(xmlDocPtr doc, xmlNodePtr node, void *data)
+static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                       gpointer data)
 {
-    parse_menu_full(doc, node, data, TRUE);
+    g_message("%s", __FUNCTION__);
+    parse_menu_full(i, doc, node, data, TRUE);
 }
 
 
-void parse_menu_full(xmlDocPtr doc, xmlNodePtr node, void *data,
-                       gboolean newmenu)
+void parse_menu_full(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                     gpointer data, gboolean newmenu)
 {
     ObAction *act;
     xmlNodePtr nact;
@@ -42,11 +46,12 @@ void parse_menu_full(xmlDocPtr doc, xmlNodePtr node, void *data,
 
         if (parse_attr_string("plugin", node, &plugin)) {
             PluginMenuCreateData data;
+            data.parse_inst = i;
             data.doc = doc;
             data.node = node;
             data.parent = menu;
 
-            if (plugin_open_reopen(plugin))
+            if (plugin_open_reopen(plugin, i))
                 parent = plugin_create(plugin, &data);
             g_free(plugin);
         } else
@@ -67,12 +72,12 @@ void parse_menu_full(xmlDocPtr doc, xmlNodePtr node, void *data,
                 data.doc = doc;
                 data.node = node;
                 data.parent = menu;
-                if (plugin_open_reopen(plugin))
+                if (plugin_open_reopen(plugin, i))
                     parent = plugin_create(plugin, &data);
                 g_free(plugin);
             } else {
                 parent = menu;
-                parse_menu(doc, node, &parent);
+                parse_menu(i, doc, node, &parent);
                 menu_add_entry(menu, menu_entry_new_submenu(parent->label,
                                                             parent));
             }
@@ -147,15 +152,12 @@ void menu_entry_free(ObMenuEntry *self)
     XDestroyWindow(ob_display, self->submenu_pic);
     g_free(self);
 }
-    
-void menu_startup()
+void menu_startup(ObParseInst *i)
 {
     menu_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                       (GDestroyNotify)menu_destroy_hash_key,
                                       (GDestroyNotify)menu_destroy_hash_value);
-
-    parse_register("menu", parse_menu, NULL);
-
 }
 
 void menu_shutdown()
@@ -163,6 +165,43 @@ void menu_shutdown()
     g_hash_table_destroy(menu_hash);
 }
 
+void menu_parse()
+{
+    ObParseInst *i;
+    xmlDocPtr doc;
+    xmlNodePtr node;
+    gchar *p;
+    gboolean loaded = FALSE;
+
+    i = parse_startup();
+
+    if (config_menu_path)
+        if (!(loaded =
+              parse_load(config_menu_path, "openbox_menu", &doc, &node)))
+            g_warning("Failed to load menu from '%s'", config_menu_path);
+    if (!loaded) {
+        p = g_build_filename(g_get_home_dir(), ".openbox", "menu", NULL);
+        if (!(loaded =
+              parse_load(p, "openbox_menu", &doc, &node)))
+            g_warning("Failed to load menu from '%s'", p);
+        g_free(p);
+    }
+    if (!loaded) {
+        p = g_build_filename(RCDIR, "menu", NULL);
+        if (!(loaded =
+              parse_load(p, "openbox_menu", &doc, &node)))
+            g_warning("Failed to load menu from '%s'", p);
+        g_free(p);
+    }
+
+    if (loaded) {
+        parse_register(i, "menu", parse_menu, NULL);
+        parse_tree(i, doc, node->xmlChildrenNode);
+    }
+
+    parse_shutdown(i);
+}
+
 static Window createWindow(Window parent, unsigned long mask,
                           XSetWindowAttributes *attrib)
 {
index 2ecbb5cdef846ab2c0b62210c51a303026fdbaf6..1adac022e10e12d2e97992cd6eafc8a81fe2ebd1 100644 (file)
@@ -9,6 +9,7 @@
 #include <glib.h>
 
 struct _ObClient;
+struct _ObParseInst;
 
 typedef struct _ObMenu ObMenu;
 typedef struct _ObMenuEntry ObMenuEntry;
@@ -125,6 +126,7 @@ struct _ObMenuEntry
 } MenuEntry;
 
 typedef struct PluginMenuCreateData{
+    struct _ObParseInst *parse_inst;
     xmlDocPtr doc;
     xmlNodePtr node;
     ObMenu *parent;
@@ -134,6 +136,8 @@ typedef struct PluginMenuCreateData{
 void menu_startup();
 void menu_shutdown();
 
+void menu_parse();
+
 void menu_noop();
 
 #define menu_new(l, n, p) \
@@ -190,7 +194,8 @@ void menu_render(ObMenu *self);
 void menu_render_full(ObMenu *self);
 
 /*so plugins can call it? */
-void parse_menu_full(xmlDocPtr doc, xmlNodePtr node, void *data, gboolean new);
+void parse_menu_full(struct _ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
+                     void *data, gboolean new);
 void menu_control_mouseover(ObMenuEntry *entry, gboolean enter);
 void menu_control_keyboard_nav(unsigned int key);
 #endif
index 216124847919a23807efacc722185b1b068f3084..bb7689281f06c60129be6e430ad0dc4385d041bd 100644 (file)
@@ -83,9 +83,9 @@ static void clearall()
     }
 }
 
-static void fire_button(ObMouseAction a, ObFrameContext context,
-                        ObClient *c, guint state,
-                        guint button, int x, int y)
+static gboolean fire_button(ObMouseAction a, ObFrameContext context,
+                            ObClient *c, guint state,
+                            guint button, int x, int y)
 {
     GSList *it;
     ObMouseBinding *b;
@@ -96,7 +96,7 @@ static void fire_button(ObMouseAction a, ObFrameContext context,
             break;
     }
     /* if not bound, then nothing to do! */
-    if (it == NULL) return;
+    if (it == NULL) return FALSE;
 
     for (it = b->actions[a]; it; it = it->next) {
         ObAction *act = it->data;
@@ -131,11 +131,12 @@ static void fire_button(ObMouseAction a, ObFrameContext context,
             act->func(&act->data);
         }
     }
+    return TRUE;
 }
 
-static void fire_motion(ObMouseAction a, ObFrameContext context, ObClient *c,
-                        guint state, guint button, int x_root, int y_root,
-                        guint32 corner)
+static gboolean fire_motion(ObMouseAction a, ObFrameContext context,
+                            ObClient *c, guint state, guint button,
+                            int x_root, int y_root, guint32 corner)
 {
     GSList *it;
     ObMouseBinding *b;
@@ -146,7 +147,7 @@ static void fire_motion(ObMouseAction a, ObFrameContext context, ObClient *c,
                break;
     }
     /* if not bound, then nothing to do! */
-    if (it == NULL) return;
+    if (it == NULL) return FALSE;
 
     for (it = b->actions[a]; it; it = it->next) {
         ObAction *act = it->data;
@@ -170,6 +171,7 @@ static void fire_motion(ObMouseAction a, ObFrameContext context, ObClient *c,
             act->func(&act->data);
         }
     }
+    return TRUE;
 }
 
 static guint32 pick_corner(int x, int y, int cx, int cy, int cw, int ch)
index 631395cc826b522c428d113bf149f1070e1e5085..5c28fcf626d2c45f48c20df1b053a7103cc112fa 100644 (file)
@@ -210,8 +210,10 @@ int main(int argc, char **argv)
     startup_save();
 
     if (screen_annex()) { /* it will be ours! */
+        ObParseInst *i;
+
         /* startup the parsing so everything can register sections of the rc */
-        parse_startup();
+        i = parse_startup();
 
         /* anything that is going to read data from the rc file needs to be 
            in this group */
@@ -224,16 +226,18 @@ int main(int argc, char **argv)
         window_startup();
         plugin_startup();
         /* load the plugins specified in the pluginrc */
-        plugin_loadall();
+        plugin_loadall(i);
 
         /* set up the kernel config shit */
-        config_startup();
-        menu_startup();
+        config_startup(i);
+        menu_startup(i);
         /* parse/load user options */
         if (parse_load_rc(&doc, &node))
-            parse_tree(doc, node->xmlChildrenNode, NULL);
+            parse_tree(i, doc, node->xmlChildrenNode);
         /* we're done with parsing now, kill it */
-        parse_shutdown();
+        parse_shutdown(i);
+
+        menu_parse();
 
         /* load the theme specified in the rc file */
         ob_rr_theme = RrThemeNew(ob_rr_inst, config_theme);
index e95d03e9444a4100ce8f64552766e9352ef4cb3f..9b8e2d596c640b42cf6d74e7fcdd0b393c352ef8 100644 (file)
@@ -1,4 +1,5 @@
 #include "plugins/interface.h"
+#include "parser/parse.h"
 
 #include <glib.h>
 #include <gmodule.h>
@@ -92,7 +93,7 @@ void plugin_shutdown()
     g_datalist_clear(&plugins);
 }
 
-gboolean plugin_open_full(char *name, gboolean reopen)
+gboolean plugin_open_full(char *name, gboolean reopen, ObParseInst *i)
 {
     Plugin *p;
 
@@ -107,18 +108,18 @@ gboolean plugin_open_full(char *name, gboolean reopen)
         g_warning("failed to load plugin '%s'", name);
         return FALSE;
     }
-    p->config();
+    p->config(i);
 
     g_datalist_set_data_full(&plugins, name, p, (GDestroyNotify) plugin_free);
     return TRUE;
 }
 
-gboolean plugin_open(char *name) {
-    return plugin_open_full(name, FALSE);
+gboolean plugin_open(char *name, ObParseInst *i) {
+    return plugin_open_full(name, FALSE, i);
 }
 
-gboolean plugin_open_reopen(char *name) {
-    return plugin_open_full(name, TRUE);
+gboolean plugin_open_reopen(char *name, ObParseInst *i) {
+    return plugin_open_full(name, TRUE, i);
 }
 
 void plugin_close(char *name)
@@ -136,7 +137,7 @@ void plugin_startall()
     g_datalist_foreach(&plugins, (GDataForeachFunc)foreach_start, NULL);
 }
 
-void plugin_loadall()
+void plugin_loadall(ObParseInst *i)
 {
     GIOChannel *io;
     GError *err;
@@ -156,18 +157,18 @@ void plugin_loadall()
 
     if (io == NULL) {
         /* load the default plugins */
-        plugin_open("placement");
-        plugin_open("resistance");
+        plugin_open("placement", i);
+        plugin_open("resistance", i);
 
         /* XXX rm me when the parser loads me magically */
-        plugin_open("client_menu");
+        plugin_open("client_menu", i);
     } else {
         /* load the plugins in the rc file */
         while (g_io_channel_read_line(io, &name, NULL, NULL, &err) ==
                G_IO_STATUS_NORMAL) {
             g_strstrip(name);
             if (name[0] != '\0' && name[0] != '#')
-                plugin_open(name);
+                plugin_open(name, i);
             g_free(name);
         }
         g_io_channel_unref(io);
index 38da20867f36d312489ebf86044a83133ce1aad5..6d14c64c44986703faabbbbdf5dd6da375220a4c 100644 (file)
@@ -1,16 +1,18 @@
 #ifndef __plugin_h
 #define __plugin_h
 
+struct _ObParseInst;
+
 void plugin_startup();
 void plugin_shutdown();
 
-void plugin_loadall();
+void plugin_loadall(struct _ObParseInst *i);
 void plugin_startall();
 
 /* default plugin */
-gboolean plugin_open(char *name);
+gboolean plugin_open(char *name, struct _ObParseInst *i);
 /* load a plugin, but don't warn about reopens. for menus */
-gboolean plugin_open_reopen(char *name);
+gboolean plugin_open_reopen(char *name, struct _ObParseInst *i);
 void plugin_close(char *name);
 
 /* call plugin's generic constructor */
index 8c5c6458b18544c9aaf52b1de3a2b83402342639..52b46f32803cb0aa76fff8de1a8deb90c373030f 100644 (file)
@@ -1,8 +1,10 @@
 #ifndef __plugins_interface_h
 #define __plugins_interface_h
 
+struct _ObParseInst;
+
 /* plugin_setup_config() */
-typedef void (*PluginSetupConfig)(void);
+typedef void (*PluginSetupConfig)(struct _ObParseInst *i);
 
 /* plugin_startup() */
 typedef void (*PluginStartup)(void);
index cb35579e549ef156710bcb59714be2aad5635264..c096a9d3ac7975143d180e20f415c1051c82eef3 100644 (file)
@@ -101,6 +101,7 @@ void fifo_menu_handler(int fd, void *d) {
                         num_realloc);
 
         if (num_read == 0) { /* eof */
+            ObParseInst *i;
             xmlDocPtr doc;
             xmlNodePtr node;
 
@@ -109,16 +110,15 @@ void fifo_menu_handler(int fd, void *d) {
 
             FIFO_MENU_DATA(menu)->buf[FIFO_MENU_DATA(menu)->buflen] = '\0';
 
-            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);
 
-            node = xmlDocGetRootElement(doc);
-            
-            if (node &&
-                !xmlStrcasecmp(node->name, (const xmlChar*) "fifo_menu")) {
-                parse_menu_full(doc, node, menu, FALSE);
-            }
-            
             fifo_menu_clean_up(menu);
             
             event_remove_fd(FIFO_MENU_DATA(menu)->handler->fd);
index 2335f9e0e0a143b72364b1c1f9ddae7554a56fe3..2133e9d24071110522e882e348f418e06f85a9e7 100644 (file)
@@ -46,7 +46,7 @@ void *plugin_create(PluginMenuCreateData *data)
     if (doc) {
         xmlNodePtr node = xmlDocGetRootElement(doc);
         if (node) {
-            parse_menu_full(doc, node, m, FALSE);
+            parse_menu_full(data->parse_inst, doc, node, m, FALSE);
         }
         xmlFreeDoc(doc);
     }
index 38a20edc34cf7fbd35a530cf7e44c3eaa791ce31..83ae5aa87f7aa720de6ddc5a7d655f64800f329c 100644 (file)
@@ -125,6 +125,7 @@ void timed_menu_read_pipe(int fd, void *d)
                     TIMED_MENU_DATA(menu)->buf + TIMED_MENU_DATA(menu)->buflen,
                     num_realloc);
     if (num_read == 0) {
+        ObParseInst *i;
         xmlDocPtr doc;
         xmlNodePtr node;
 
@@ -133,15 +134,14 @@ void timed_menu_read_pipe(int fd, void *d)
 
         TIMED_MENU_DATA(menu)->buf[TIMED_MENU_DATA(menu)->buflen] = '\0';
 
-        doc = xmlParseMemory(TIMED_MENU_DATA(menu)->buf,
-                                       TIMED_MENU_DATA(menu)->buflen);
+        i = parse_startup();
 
-        node = xmlDocGetRootElement(doc);
+        if (parse_load_mem(TIMED_MENU_DATA(menu)->buf,
+                           TIMED_MENU_DATA(menu)->buflen,
+                           "timed_menu", &doc, &node))
+            parse_menu_full(i, doc, node, menu, FALSE);
 
-        if (node &&
-            !xmlStrcasecmp(node->name, (const xmlChar*) "timed_menu")) {
-            parse_menu_full(doc, node, menu, FALSE);
-        }
+        parse_shutdown(i);
 
         timed_menu_clean_up(menu);
     } else if (num_read > 0) {
@@ -205,6 +205,7 @@ void timed_menu_timeout_handler(ObTimer *t, void *d)
                 }
 
                 if (stat_buf.st_mtime > TIMED_MENU_DATA(data)->mtime) {
+                    ObParseInst *i;
                     xmlDocPtr doc;
                     xmlNodePtr node;
 
@@ -214,14 +215,13 @@ void timed_menu_timeout_handler(ObTimer *t, void *d)
                     data->invalid = TRUE;
                     menu_clear(data);
 
-                    doc = xmlParseFile(TIMED_MENU_DATA(data)->command);
+                    i = parse_startup();
 
-                    node = xmlDocGetRootElement(doc);
+                    if (parse_load(TIMED_MENU_DATA(data)->command,
+                                   "timed_menu", &doc, &node))
+                        parse_menu_full(i, doc, node, data, FALSE);
 
-                    if (node &&
-                        !xmlStrcasecmp(node->name, (const xmlChar*) "timed_menu")) {
-                        parse_menu_full(doc, node, data, FALSE);
-                    }
+                    parse_shutdown(i);
 
                     timed_menu_clean_up(data);
                 }
index e1c29df60a51bc07f172b5fdd7dbd3486af33809..18c9c39b615895cb9e4b3d0971dd83012269478a 100644 (file)
@@ -10,7 +10,7 @@
 
 static gboolean history;
 
-static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_xml(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, void *d)
 {
     xmlNodePtr n;
 
@@ -19,11 +19,11 @@ static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d)
         history = parse_bool(doc, n);
 }
 
-void plugin_setup_config()
+void plugin_setup_config(ObParseInst *i)
 {
     history = TRUE;
 
-    parse_register("placement", parse_xml, NULL);
+    parse_register(i, "placement", parse_xml, NULL);
 }
 
 static Rect* pick_head(ObClient *c)
index 8a787603e77db2a683e773222ad948f15393fb73..f5e68052051e795a5cee139729ebfab6c57ece98 100644 (file)
@@ -10,7 +10,7 @@
 static int win_resistance;
 static int edge_resistance;
 
-static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d)
+static void parse_xml(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, void *d)
 {
     xmlNodePtr n;
 
@@ -21,11 +21,11 @@ static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d)
         edge_resistance = parse_int(doc, n);
 }
 
-void plugin_setup_config()
+void plugin_setup_config(ObParseInst *i)
 {
     win_resistance = edge_resistance = DEFAULT_RESISTANCE;
 
-    parse_register("resistance", parse_xml, NULL);
+    parse_register(i, "resistance", parse_xml, NULL);
 }
 
 static void resist_move(ObClient *c, int *x, int *y)
This page took 0.055502 seconds and 4 git commands to generate.