summary refs log tree commit diff
path: root/conf.c
diff options
context:
space:
mode:
authoroga <oga>2008-05-18 19:47:19 +0000
committeroga <oga>2008-05-18 19:47:19 +0000
commitb700be764a6c0d725653f67a220a1586354cd838 (patch)
treef95586239139fdd28b51aaa2e61f340a9b9e814e /conf.c
parent27b023ebcbe1f4ec24c6044fee51c22c55d5993b (diff)
downloadcwm-b700be764a6c0d725653f67a220a1586354cd838.tar.gz
cwm-b700be764a6c0d725653f67a220a1586354cd838.tar.xz
cwm-b700be764a6c0d725653f67a220a1586354cd838.zip
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@
Diffstat (limited to 'conf.c')
-rw-r--r--conf.c16
1 files 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);
+		}
 	}
 }