optimization. don't need a glist where a simple pointer will suffice.

This commit is contained in:
Dana Jansens 2003-09-04 15:35:56 +00:00
parent 88f83fc927
commit 8617f504a7

View file

@ -17,7 +17,7 @@ typedef struct _ObMenuParseState ObMenuParseState;
struct _ObMenuParseState struct _ObMenuParseState
{ {
GSList *menus; ObMenu *parent;
ObMenu *pipe_creator; ObMenu *pipe_creator;
}; };
@ -78,7 +78,7 @@ void menu_startup(gboolean reconfig)
menu_parse_inst = parse_startup(); menu_parse_inst = parse_startup();
menu_parse_state.menus = NULL; menu_parse_state.parent = NULL;
menu_parse_state.pipe_creator = NULL; menu_parse_state.pipe_creator = NULL;
parse_register(menu_parse_inst, "menu", parse_menu, &menu_parse_state); parse_register(menu_parse_inst, "menu", parse_menu, &menu_parse_state);
parse_register(menu_parse_inst, "item", parse_menu_item, parse_register(menu_parse_inst, "item", parse_menu_item,
@ -100,7 +100,7 @@ void menu_startup(gboolean reconfig)
} }
} }
g_assert(menu_parse_state.menus == NULL); g_assert(menu_parse_state.parent == NULL);
if (!reconfig) if (!reconfig)
client_add_destructor(client_dest); client_add_destructor(client_dest);
@ -149,13 +149,9 @@ void menu_pipe_execute(ObMenu *self)
menu_clear_entries(self); menu_clear_entries(self);
menu_parse_state.pipe_creator = self; menu_parse_state.pipe_creator = self;
menu_parse_state.menus = g_slist_prepend(NULL, self); menu_parse_state.parent = self;
parse_tree(menu_parse_inst, doc, node->xmlChildrenNode); parse_tree(menu_parse_inst, doc, node->xmlChildrenNode);
menu_parse_state.menus = g_slist_remove(menu_parse_state.menus, self);
menu_parse_state.pipe_creator = NULL;
xmlFreeDoc(doc); xmlFreeDoc(doc);
g_assert(menu_parse_state.menus == NULL);
} else { } else {
g_warning("Invalid output from pipe-menu: %s", self->execute); g_warning("Invalid output from pipe-menu: %s", self->execute);
} }
@ -179,14 +175,14 @@ static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
ObMenuParseState *state = data; ObMenuParseState *state = data;
gchar *label; gchar *label;
if (state->menus) { if (state->parent) {
if (parse_attr_string("label", node, &label)) { if (parse_attr_string("label", node, &label)) {
GSList *acts = NULL; GSList *acts = NULL;
for (node = node->xmlChildrenNode; node; node = node->next) for (node = node->xmlChildrenNode; node; node = node->next)
if (!xmlStrcasecmp(node->name, (const xmlChar*) "action")) if (!xmlStrcasecmp(node->name, (const xmlChar*) "action"))
acts = g_slist_append(acts, action_parse(i, doc, node)); acts = g_slist_append(acts, action_parse(i, doc, node));
menu_add_normal(state->menus->data, -1, label, acts); menu_add_normal(state->parent, -1, label, acts);
g_free(label); g_free(label);
} }
} }
@ -198,8 +194,8 @@ static void parse_menu_separator(ObParseInst *i,
{ {
ObMenuParseState *state = data; ObMenuParseState *state = data;
if (state->menus) if (state->parent)
menu_add_separator(state->menus->data, -1); menu_add_separator(state->parent, -1);
} }
static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
@ -221,15 +217,18 @@ static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
if (parse_attr_string("execute", node, &script)) { if (parse_attr_string("execute", node, &script)) {
menu->execute = ob_expand_tilde(script); menu->execute = ob_expand_tilde(script);
} else { } else {
state->menus = g_slist_prepend(state->menus, menu); ObMenu *old;
old = state->parent;
state->parent = menu;
parse_tree(i, doc, node->xmlChildrenNode); parse_tree(i, doc, node->xmlChildrenNode);
state->menus = g_slist_delete_link(state->menus, state->menus); state->parent = old;
} }
} }
} }
if (state->menus) if (state->parent)
menu_add_submenu(state->menus->data, -1, name); menu_add_submenu(state->parent, -1, name);
parse_menu_fail: parse_menu_fail:
g_free(name); g_free(name);