adjust for changes to the parsing api. split the menu into its own file.
jump to
@@ -414,7 +414,8 @@
## data ## dist_rc_DATA = \ - data/rc3 + data/rc3 \ + data/menu dist_desktopfiles_DATA = \ data/openbox.desktop
@@ -310,39 +310,8 @@ </mousebind>
</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>
@@ -36,6 +36,18 @@
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 @@ </keybind>
*/ -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 @@ if ((n = parse_find_node("chainQuitKey", node))) {
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 @@ while (n) {
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_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 @@ </context>
*/ -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 @@ n = parse_find_node("context", n->next);
} } -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 @@ if ((n = parse_find_node("cyclingDialog", node)))
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 @@ config_title_layout = parse_string(doc, n);
} } -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 @@ if ((n = parse_find_node("cyclingDialog", node)))
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 @@ if ((n = parse_find_node("drawContents", node)))
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 @@ if ((n = parse_find_node("hideTimeout", node)))
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 @@ config_focus_last = TRUE;
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 @@ config_dock_orient = OB_ORIENTATION_VERT;
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()
@@ -6,6 +6,8 @@ #include "stacking.h"
#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 @@ /*! Number of milliseconds within which 2 clicks must occur to be a
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
@@ -83,9 +83,9 @@ g_slist_free(bound_contexts[i]);
} } -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 @@ if (b->state == state && b->button == button)
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 @@
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 @@ if (b->state == state && b->button == button)
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 @@
act->func(&act->data); } } + return TRUE; } static guint32 pick_corner(int x, int y, int cx, int cy, int cw, int ch)
@@ -210,8 +210,10 @@ /* save stuff that we can use to restore state */
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 @@ focus_startup();
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);
@@ -1,4 +1,5 @@
#include "plugins/interface.h" +#include "parser/parse.h" #include <glib.h> #include <gmodule.h>@@ -92,7 +93,7 @@ {
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 @@ if (p == NULL) {
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 @@ {
g_datalist_foreach(&plugins, (GDataForeachFunc)foreach_start, NULL); } -void plugin_loadall() +void plugin_loadall(ObParseInst *i) { GIOChannel *io; GError *err;@@ -156,18 +157,18 @@ }
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);
@@ -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 */
@@ -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);
@@ -10,7 +10,7 @@ #include <glib.h>
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 @@ if ((n = parse_find_node("remember", node)))
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)
@@ -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 @@ if ((n = parse_find_node("screen_edge_strength", node)))
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)