Fix two problems with conf_unbind():

1) it used TAILQ_FOREACH() when it's removing entrys from the list, this
   is bad.
2) We didn't free key, so there was a small memleak too.

also rework conf_bindname's logic slightly to be more simple.

ok okan@
This commit is contained in:
oga 2008-05-18 19:47:19 +00:00
parent 27b023ebcb
commit b700be764a

16
conf.c
View File

@ -348,11 +348,8 @@ conf_bindname(struct conf *c, char *name, char *binding)
current_binding->flags = name_to_kbfunc[iter].flags;
current_binding->argument = name_to_kbfunc[iter].argument;
TAILQ_INSERT_TAIL(&c->keybindingq, current_binding, entry);
break;
}
if (name_to_kbfunc[iter].tag != NULL)
return;
}
current_binding->callback = kbfunc_cmdexec;
current_binding->argument = xstrdup(binding);
@ -363,15 +360,20 @@ conf_bindname(struct conf *c, char *name, char *binding)
void conf_unbind(struct conf *c, struct keybinding *unbind)
{
struct keybinding *key = NULL;
struct keybinding *key = NULL, *keynxt;
for (key = TAILQ_FIRST(&c->keybindingq);
key != TAILQ_END(&c->keybindingq); key = keynxt) {
keynxt = TAILQ_NEXT(key, entry);
TAILQ_FOREACH(key, &c->keybindingq, entry) {
if (key->modmask != unbind->modmask)
continue;
if ((key->keycode != 0 && key->keysym == NoSymbol &&
key->keycode == unbind->keycode) ||
key->keysym == unbind->keysym)
key->keysym == unbind->keysym) {
TAILQ_REMOVE(&c->keybindingq, key, entry);
xfree(key);
}
}
}