From b700be764a6c0d725653f67a220a1586354cd838 Mon Sep 17 00:00:00 2001 From: oga Date: Sun, 18 May 2008 19:47:19 +0000 Subject: [PATCH] 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@ --- conf.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/conf.c b/conf.c index f595ff1..7d59e2f 100644 --- a/conf.c +++ b/conf.c @@ -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); + } } }