From 94a3bbdcffb67017660808c261823d3bf4986eca Mon Sep 17 00:00:00 2001
From: David Maciejak <david.maciejak@gmail.com>
Date: Mon, 1 Sep 2014 12:48:36 +0700
Subject: [PATCH] wmaker: improve key shortcut labelling

This patch is improving the key shortcut labelling in the root menu.
It modifies the GetShortcutString function to save some cycles
as wXModifierFromKey is already doing all the string comparisons.
This patch introduces a new function called wXModifierToShortcutLabel
that is checking the return value from wXModifierFromKey.
Not sure why Control was set as a special key, as keyboards could
have 2 controls but also 2 shift keys.
---
 src/misc.c      | 33 ++++++---------------------------
 src/xmodifier.c | 28 ++++++++++++++++++++++++++++
 src/xmodifier.h |  1 +
 3 files changed, 35 insertions(+), 27 deletions(-)

diff --git a/src/misc.c b/src/misc.c
index 3d78c93..6856baf 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -731,49 +731,28 @@ static char *keysymToString(KeySym keysym, unsigned int state)
 char *GetShortcutString(const char *shortcut)
 {
 	char *buffer = NULL;
-	char *k;
-	int control = 0;
-	char *tmp, *text;
+	char *k, *tmp, *text;
 
 	tmp = text = wstrdup(shortcut);
 
 	/* get modifiers */
 	while ((k = strchr(text, '+')) != NULL) {
 		int mod;
+		char *lbl;
 
 		*k = 0;
 		mod = wXModifierFromKey(text);
 		if (mod < 0) {
 			return wstrdup("bug");
 		}
-
-		if (strcasecmp(text, "Meta") == 0) {
-			buffer = wstrappend(buffer, "M+");
-		} else if (strcasecmp(text, "Alt") == 0) {
-			buffer = wstrappend(buffer, "A+");
-		} else if (strcasecmp(text, "Shift") == 0) {
-			buffer = wstrappend(buffer, "Sh+");
-		} else if (strcasecmp(text, "Mod1") == 0) {
-			buffer = wstrappend(buffer, "M1+");
-		} else if (strcasecmp(text, "Mod2") == 0) {
-			buffer = wstrappend(buffer, "M2+");
-		} else if (strcasecmp(text, "Mod3") == 0) {
-			buffer = wstrappend(buffer, "M3+");
-		} else if (strcasecmp(text, "Mod4") == 0) {
-			buffer = wstrappend(buffer, "M4+");
-		} else if (strcasecmp(text, "Mod5") == 0) {
-			buffer = wstrappend(buffer, "M5+");
-		} else if (strcasecmp(text, "Control") == 0) {
-			control = 1;
-		} else {
+		lbl = wXModifierToShortcutLabel(mod);
+		if (lbl)
+			buffer = wstrappend(buffer, lbl);
+		else
 			buffer = wstrappend(buffer, text);
-		}
 		text = k + 1;
 	}
 
-	if (control) {
-		buffer = wstrappend(buffer, "^");
-	}
 	buffer = wstrappend(buffer, text);
 	wfree(tmp);
 
diff --git a/src/xmodifier.c b/src/xmodifier.c
index e114f65..d876408 100644
--- a/src/xmodifier.c
+++ b/src/xmodifier.c
@@ -262,6 +262,34 @@ static void x_reset_modifier_mapping(Display * display)
 	XFreeModifiermap(x_modifier_keymap);
 }
 
+char *wXModifierToShortcutLabel(int mask)
+{
+	if (mask < 0)
+		return NULL;
+
+	if (mask == ShiftMask)
+		return "Sh+";
+	if (mask ==  ControlMask)
+		return "^";
+	if (mask ==  AltMask)
+		return "A+";
+	if (mask ==  Mod1Mask)
+		return "M1+";
+	if (mask ==  Mod2Mask)
+		return "M2+";
+	if (mask ==  Mod3Mask)
+		return "M3+";
+	if (mask ==  Mod4Mask)
+		return "M4+";
+	if (mask ==  Mod5Mask)
+		return "M5+";
+	if (mask ==  MetaMask)
+		return "M+";
+
+	wwarning("Can't convert keymask to shortcut label");
+	return NULL;
+}
+
 int wXModifierFromKey(const char *key)
 {
 	if (strcasecmp(key, "SHIFT") == 0 && ShiftMask != 0)
diff --git a/src/xmodifier.h b/src/xmodifier.h
index 89e6757..757b190 100644
--- a/src/xmodifier.h
+++ b/src/xmodifier.h
@@ -22,5 +22,6 @@
 
 void wXModifierInitialize(void);
 int  wXModifierFromKey(const char *key);
+char *wXModifierToShortcutLabel(int mask);
 
 #endif /* _XMODIFIER_H_INCLUDED */
-- 
1.8.3.2

