summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2014-01-20 19:06:04 +0000
committerokan <okan>2014-01-20 19:06:04 +0000
commit7263fb4c8457631a921c20a93bb339dfe638bb34 (patch)
tree0f1a5620e88d120daf830ba2e1e4368e3c0700b5
parent720b5452aa13bf27740a2b923617188fde8814ed (diff)
downloadcwm-7263fb4c8457631a921c20a93bb339dfe638bb34.tar.gz
cwm-7263fb4c8457631a921c20a93bb339dfe638bb34.tar.xz
cwm-7263fb4c8457631a921c20a93bb339dfe638bb34.zip
- remove redundant range check for buttons in conf_bind_mouse.
 - make conf_bind_kbd return error on non-matches to match what
   conf_bind_mouse does.
 - rename some variables while here for clarity.
 - constify bind and cmd.

from Tiago Cunha.
-rw-r--r--calmwm.h6
-rw-r--r--conf.c112
-rw-r--r--parse.y7
3 files changed, 61 insertions, 64 deletions
diff --git a/calmwm.h b/calmwm.h
index 4c90239..f575a78 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -515,8 +515,10 @@ int			 parse_config(const char *, struct conf *);
 
 void			 conf_atoms(void);
 void			 conf_autogroup(struct conf *, int, char *);
-void			 conf_bind_kbd(struct conf *, char *, char *);
-int			 conf_bind_mouse(struct conf *, char *, char *);
+int			 conf_bind_kbd(struct conf *, const char *,
+    			     const char *);
+int			 conf_bind_mouse(struct conf *, const char *,
+    			     const char *);
 void			 conf_clear(struct conf *);
 void			 conf_client(struct client_ctx *);
 void			 conf_cmd_add(struct conf *, char *, char *);
diff --git a/conf.c b/conf.c
index f9d0f72..edf7c7e 100644
--- a/conf.c
+++ b/conf.c
@@ -472,48 +472,50 @@ conf_bind_getmask(const char *name, unsigned int *mask)
 	return (dash + 1);
 }
 
-void
-conf_bind_kbd(struct conf *c, char *name, char *binding)
+int
+conf_bind_kbd(struct conf *c, const char *bind, const char *cmd)
 {
-	struct keybinding	*current_binding;
-	const char		*substring;
-	unsigned int			 i, mask;
-
-	current_binding = xcalloc(1, sizeof(*current_binding));
-	substring = conf_bind_getmask(name, &mask);
-	current_binding->modmask |= mask;
-
-	current_binding->keysym = XStringToKeysym(substring);
-	if (current_binding->keysym == NoSymbol) {
-		free(current_binding);
-		return;
+	struct keybinding	*kb;
+	const char		*key;
+	unsigned int		 i, mask;
+
+	kb = xcalloc(1, sizeof(*kb));
+	key = conf_bind_getmask(bind, &mask);
+	kb->modmask |= mask;
+
+	kb->keysym = XStringToKeysym(key);
+	if (kb->keysym == NoSymbol) {
+		warnx("unknown symbol: %s", key);
+		free(kb);
+		return (0);
 	}
 
 	/* We now have the correct binding, remove duplicates. */
-	conf_unbind_kbd(c, current_binding);
+	conf_unbind_kbd(c, kb);
 
-	if (strcmp("unmap", binding) == 0) {
-		free(current_binding);
-		return;
+	if (strcmp("unmap", cmd) == 0) {
+		free(kb);
+		return (1);
 	}
 
 	for (i = 0; i < nitems(name_to_kbfunc); i++) {
-		if (strcmp(name_to_kbfunc[i].tag, binding) != 0)
+		if (strcmp(name_to_kbfunc[i].tag, cmd) != 0)
 			continue;
 
-		current_binding->callback = name_to_kbfunc[i].handler;
-		current_binding->flags = name_to_kbfunc[i].flags;
-		current_binding->argument = name_to_kbfunc[i].argument;
-		current_binding->argtype |= ARG_INT;
-		TAILQ_INSERT_TAIL(&c->keybindingq, current_binding, entry);
-		return;
+		kb->callback = name_to_kbfunc[i].handler;
+		kb->flags = name_to_kbfunc[i].flags;
+		kb->argument = name_to_kbfunc[i].argument;
+		kb->argtype |= ARG_INT;
+		TAILQ_INSERT_TAIL(&c->keybindingq, kb, entry);
+		return (1);
 	}
 
-	current_binding->callback = kbfunc_cmdexec;
-	current_binding->flags = 0;
-	current_binding->argument.c = xstrdup(binding);
-	current_binding->argtype |= ARG_CHAR;
-	TAILQ_INSERT_TAIL(&c->keybindingq, current_binding, entry);
+	kb->callback = kbfunc_cmdexec;
+	kb->flags = 0;
+	kb->argument.c = xstrdup(cmd);
+	kb->argtype |= ARG_CHAR;
+	TAILQ_INSERT_TAIL(&c->keybindingq, kb, entry);
+	return (1);
 }
 
 static void
@@ -555,52 +557,40 @@ static struct {
 	{ "menu_cmd", mousefunc_menu_cmd, MOUSEBIND_CTX_ROOT, {0} },
 };
 
-static unsigned int mouse_btns[] = {
-	Button1, Button2, Button3, Button4, Button5
-};
-
 int
-conf_bind_mouse(struct conf *c, char *name, char *binding)
+conf_bind_mouse(struct conf *c, const char *bind, const char *cmd)
 {
-	struct mousebinding	*current_binding;
-	const char		*errstr, *substring;
-	unsigned int		 button, i, mask;
-
-	current_binding = xcalloc(1, sizeof(*current_binding));
-	substring = conf_bind_getmask(name, &mask);
-	current_binding->modmask |= mask;
+	struct mousebinding	*mb;
+	const char		*button, *errstr;
+	unsigned int		 i, mask;
 
-	button = strtonum(substring, 1, 5, &errstr);
-	if (errstr)
-		warnx("button number is %s: %s", errstr, substring);
+	mb = xcalloc(1, sizeof(*mb));
+	button = conf_bind_getmask(bind, &mask);
+	mb->modmask |= mask;
 
-	for (i = 0; i < nitems(mouse_btns); i++) {
-		if (button == mouse_btns[i]) {
-			current_binding->button = button;
-			break;
-		}
-	}
-	if (!current_binding->button || errstr) {
-		free(current_binding);
+	mb->button = strtonum(button, Button1, Button5, &errstr);
+	if (errstr) {
+		warnx("button number is %s: %s", errstr, button);
+		free(mb);
 		return (0);
 	}
 
 	/* We now have the correct binding, remove duplicates. */
-	conf_unbind_mouse(c, current_binding);
+	conf_unbind_mouse(c, mb);
 
-	if (strcmp("unmap", binding) == 0) {
-		free(current_binding);
+	if (strcmp("unmap", cmd) == 0) {
+		free(mb);
 		return (1);
 	}
 
 	for (i = 0; i < nitems(name_to_mousefunc); i++) {
-		if (strcmp(name_to_mousefunc[i].tag, binding) != 0)
+		if (strcmp(name_to_mousefunc[i].tag, cmd) != 0)
 			continue;
 
-		current_binding->callback = name_to_mousefunc[i].handler;
-		current_binding->flags = name_to_mousefunc[i].flags;
-		current_binding->argument = name_to_mousefunc[i].argument;
-		TAILQ_INSERT_TAIL(&c->mousebindingq, current_binding, entry);
+		mb->callback = name_to_mousefunc[i].handler;
+		mb->flags = name_to_mousefunc[i].flags;
+		mb->argument = name_to_mousefunc[i].argument;
+		TAILQ_INSERT_TAIL(&c->mousebindingq, mb, entry);
 		return (1);
 	}
 
diff --git a/parse.y b/parse.y
index f347f85..96f0b22 100644
--- a/parse.y
+++ b/parse.y
@@ -155,7 +155,12 @@ main		: FONTNAME STRING		{
 			free($2);
 		}
 		| BIND STRING string		{
-			conf_bind_kbd(conf, $2, $3);
+			if (!conf_bind_kbd(conf, $2, $3)) {
+				yyerror("invalid bind: %s %s", $2, $3);
+				free($2);
+				free($3);
+				YYERROR;
+			}
 			free($2);
 			free($3);
 		}