summary refs log tree commit diff
diff options
context:
space:
mode:
authoroga <oga>2009-08-25 01:44:39 +0000
committeroga <oga>2009-08-25 01:44:39 +0000
commit1968561fcc1520c97a7b994e11a5dbf58721e1fe (patch)
treee2786eb0244d5c5aa801caeb7e3388b7ca83b83e
parent95f65b8be6a012fab3233b5e468c1b2763e652a9 (diff)
downloadcwm-1968561fcc1520c97a7b994e11a5dbf58721e1fe.tar.gz
cwm-1968561fcc1520c97a7b994e11a5dbf58721e1fe.tar.xz
cwm-1968561fcc1520c97a7b994e11a5dbf58721e1fe.zip
Reduce duplciation of code for checking modifiers in key/mouse bindings.
shaves a bunch of bytes.

ok okan@
-rw-r--r--conf.c76
1 files changed, 37 insertions, 39 deletions
diff --git a/conf.c b/conf.c
index b5903bd..7109152 100644
--- a/conf.c
+++ b/conf.c
@@ -437,36 +437,40 @@ conf_ungrab(struct conf *c, struct keybinding *kb)
 		xu_key_ungrab(sc->rootwin, kb->modmask, kb->keysym);
 }
 
+struct {
+	char	chr;
+	int	mask;
+} bind_mods[] = {
+	{ 'C',	ControlMask },
+	{ 'M',	Mod1Mask },
+	{ '4',	Mod4Mask },
+	{ 'S',	ShiftMask },
+};
+
 void
 conf_bindname(struct conf *c, char *name, char *binding)
 {
 	struct keybinding	*current_binding;
-	char			*substring;
+	char			*substring, *tmp;
 	int			 iter;
 
 	current_binding = xcalloc(1, sizeof(*current_binding));
 
-	if (strchr(name, 'C') != NULL &&
-	    strchr(name, 'C') < strchr(name, '-'))
-		current_binding->modmask |= ControlMask;
-
-	if (strchr(name, 'M') != NULL &&
-	    strchr(name, 'M') < strchr(name, '-'))
-		current_binding->modmask |= Mod1Mask;
-
-	if (strchr(name, '4') != NULL &&
-	    strchr(name, '4') < strchr(name, '-'))
-		current_binding->modmask |= Mod4Mask;
-
-	if (strchr(name, 'S') != NULL &&
-	    strchr(name, 'S') < strchr(name, '-'))
-		current_binding->modmask |= ShiftMask;
-
-	substring = strchr(name, '-') + 1;
+	if ((substring = strchr(name, '-')) != NULL) {
+		for (iter = 0; iter < (sizeof(bind_mods) /
+		    sizeof(bind_mods[0])); iter++) {
+			if ((tmp = strchr(name, bind_mods[iter].chr)) !=
+			    NULL && tmp < substring) {
+				current_binding->modmask |=
+				    bind_mods[iter].mask;
+			}
+		}
 
-	/* If there is no '-' in name, continue as is */
-	if (strchr(name, '-') == NULL)
+		/* skip past the modifiers */
+		substring++;
+	} else {
 		substring = name;
+	}
 
 	if (substring[0] == '[' &&
 	    substring[strlen(substring)-1] == ']') {
@@ -552,31 +556,25 @@ void
 conf_mousebind(struct conf *c, char *name, char *binding)
 {
 	struct mousebinding	*current_binding;
-	char			*substring;
+	char			*substring, *tmp;
 	const char		*errstr;
 	int			 iter;
 
 	current_binding = xcalloc(1, sizeof(*current_binding));
 
-	if (strchr(name, 'C') != NULL &&
-	    strchr(name, 'C') < strchr(name, '-'))
-		current_binding->modmask |= ControlMask;
-
-	if (strchr(name, 'M') != NULL &&
-	    strchr(name, 'M') < strchr(name, '-'))
-		current_binding->modmask |= Mod1Mask;
-
-	if (strchr(name, 'S') != NULL &&
-	    strchr(name, 'S') < strchr(name, '-'))
-		current_binding->modmask |= ShiftMask;
-
-	if (strchr(name, '4') != NULL &&
-	    strchr(name, '4') < strchr(name, '-'))
-		current_binding->modmask |= Mod4Mask;
-
-	substring = strchr(name, '-') + 1;
+	if ((substring = strchr(name, '-')) != NULL) {
+		for (iter = 0; iter < (sizeof(bind_mods) /
+		    sizeof(bind_mods[0])); iter++) {
+			if ((tmp = strchr(name, bind_mods[iter].chr)) !=
+			    NULL && tmp < substring) {
+				current_binding->modmask |=
+				    bind_mods[iter].mask;
+			}
+		}
 
-	if (strchr(name, '-') == NULL)
+		/* skip past the modifiers */
+		substring++;
+	} else
 		substring = name;
 
 	current_binding->button = strtonum(substring, 1, 3, &errstr);