about summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2013-07-08 16:10:55 +0000
committerokan <okan>2013-07-08 16:10:55 +0000
commit912ec90ea1f6e25b33a2bb0d6d7a1138622bd099 (patch)
treef600b3ca953c91529868b650eb5a6750f169178c
parentfe439f2b965b9ee6e9dc9a6d8e2ecb443f86e788 (diff)
downloadcwm-912ec90ea1f6e25b33a2bb0d6d7a1138622bd099.tar.gz
cwm-912ec90ea1f6e25b33a2bb0d6d7a1138622bd099.tar.xz
cwm-912ec90ea1f6e25b33a2bb0d6d7a1138622bd099.zip
move duplicate kbd and mouse modifier parsing to a generic function;
from Tiago Cunha
-rw-r--r--conf.c64
1 files changed, 30 insertions, 34 deletions
diff --git a/conf.c b/conf.c
index a771963..d84bc4f 100644
--- a/conf.c
+++ b/conf.c
@@ -31,8 +31,9 @@
 
 #include "calmwm.h"
 
-static void	 conf_mouseunbind(struct conf *, struct mousebinding *);
-static void	 conf_unbind(struct conf *, struct keybinding *);
+static const char	*conf_bind_getmask(const char *, u_int *);
+static void	 	 conf_mouseunbind(struct conf *, struct mousebinding *);
+static void	 	 conf_unbind(struct conf *, struct keybinding *);
 
 /* Add an command menu entry to the end of the menu */
 void
@@ -442,27 +443,35 @@ static struct {
 	{ 'S',	ShiftMask },
 };
 
+static const char *
+conf_bind_getmask(const char *name, u_int *mask)
+{
+	char		*dash;
+	const char	*ch;
+	u_int	 	 i;
+
+	*mask = 0;
+	if ((dash = strchr(name, '-')) == NULL)
+		return (name);
+	for (i = 0; i < nitems(bind_mods); i++) {
+		if ((ch = strchr(name, bind_mods[i].chr)) != NULL && ch < dash)
+			*mask |= bind_mods[i].mask;
+	}
+
+	/* Skip past modifiers. */
+	return (dash + 1);
+}
+
 void
 conf_bindname(struct conf *c, char *name, char *binding)
 {
 	struct keybinding	*current_binding;
-	char			*substring, *tmp;
-	u_int			 i;
+	const char		*substring;
+	u_int			 i, mask;
 
 	current_binding = xcalloc(1, sizeof(*current_binding));
-
-	if ((substring = strchr(name, '-')) != NULL) {
-		for (i = 0; i < nitems(bind_mods); i++) {
-			if ((tmp = strchr(name, bind_mods[i].chr)) !=
-			    NULL && tmp < substring) {
-				current_binding->modmask |= bind_mods[i].mask;
-			}
-		}
-
-		/* skip past the modifiers */
-		substring++;
-	} else
-		substring = name;
+	substring = conf_bind_getmask(name, &mask);
+	current_binding->modmask |= mask;
 
 	if (substring[0] == '[' &&
 	    substring[strlen(substring)-1] == ']') {
@@ -551,25 +560,12 @@ int
 conf_mousebind(struct conf *c, char *name, char *binding)
 {
 	struct mousebinding	*current_binding;
-	char			*substring, *tmp;
-	u_int			 button;
-	const char		*errstr;
-	u_int			 i;
+	const char		*errstr, *substring;
+	u_int			 button, i, mask;
 
 	current_binding = xcalloc(1, sizeof(*current_binding));
-
-	if ((substring = strchr(name, '-')) != NULL) {
-		for (i = 0; i < nitems(bind_mods); i++) {
-			if ((tmp = strchr(name, bind_mods[i].chr)) !=
-			    NULL && tmp < substring) {
-				current_binding->modmask |= bind_mods[i].mask;
-			}
-		}
-
-		/* skip past the modifiers */
-		substring++;
-	} else
-		substring = name;
+	substring = conf_bind_getmask(name, &mask);
+	current_binding->modmask |= mask;
 
 	button = strtonum(substring, 1, 5, &errstr);
 	if (errstr)