By having an array, it makes the code simpler in many places, thus easier
to maintain. Took opportunity to include a comment about the trick used to
have a value convenient for use.

It is the opportunity to log an error message to user instead of silently
accepting invalid values.

Signed-off-by: Christophe CURIS <christophe.cu...@free.fr>
---
 WPrefs.app/Icons.c | 78 ++++++++++++++++++++++++------------------------------
 1 file changed, 34 insertions(+), 44 deletions(-)

diff --git a/WPrefs.app/Icons.c b/WPrefs.app/Icons.c
index 764405f..0faaa5f 100644
--- a/WPrefs.app/Icons.c
+++ b/WPrefs.app/Icons.c
@@ -32,6 +32,25 @@ static const struct {
        { "none",  N_("None") }
 };
 
+/*
+ * The code is using a convenient trick to make the link between the icon
+ * position and its representing number:
+ *   bit[0] tell if the icon are arranged horizontally or vertically
+ *   bit[2:1] tell the corner to which they are starting from:
+ *     bit[2] is for Top or Bottom choice
+ *     bit[1] is for Left or Right choice
+ */
+static const char icon_position_dbvalue[][4] = {
+       /* 000: */ "tlv",
+       /* 001: */ "tlh",
+       /* 010: */ "trv",
+       /* 011: */ "trh",
+       /* 100: */ "blv",
+       /* 101: */ "blh",
+       /* 110: */ "brv",
+       /* 111: */ "brh"
+};
+
 typedef struct _Panel {
        WMBox *box;
 
@@ -47,7 +66,7 @@ typedef struct _Panel {
        WMFrame *posVF;
        WMFrame *posV;
 
-       WMButton *posB[8];
+       WMButton *posB[wlengthof_nocheck(icon_position_dbvalue)];
 
        WMFrame *animF;
        WMButton *animB[wlengthof_nocheck(icon_animation)];
@@ -71,7 +90,7 @@ static void showIconLayout(WMWidget * widget, void *data)
        int w, h;
        int i;
 
-       for (i = 0; i < 8; i++) {
+       for (i = 0; i < wlengthof(panel->posB); i++) {
                if (panel->posB[i] == widget) {
                        panel->iconPos = i;
                        break;
@@ -107,35 +126,24 @@ static void showData(_Panel * panel)
 {
        int i;
        char *str;
-       char *def = "blh";
 
        WMSetButtonSelected(panel->arrB, GetBoolForKey("AutoArrangeIcons"));
        WMSetButtonSelected(panel->omnB, GetBoolForKey("StickyIcons"));
        WMSetButtonSelected(panel->sclB, GetBoolForKey("SingleClickLaunch"));
 
        str = GetStringForKey("IconPosition");
-       if (!str)
-               str = def;
-       if (strlen(str) != 3) {
-               wwarning("bad value %s for option IconPosition. Using default 
blh", str);
-               str = def;
-       }
-
-       if (str[0] == 't' || str[0] == 'T') {
-               i = 0;
-       } else {
-               i = 4;
-       }
-       if (str[1] == 'r' || str[1] == 'R') {
-               i += 2;
-       }
-       if (str[2] == 'v' || str[2] == 'V') {
-               i += 0;
-       } else {
-               i += 1;
+       if (str != NULL) {
+               for (i = 0; i < wlengthof(icon_position_dbvalue); i++)
+                       if (strcmp(str, icon_position_dbvalue[i]) == 0) {
+                               panel->iconPos = i;
+                               goto found_position_value;
+                       }
+               wwarning(_("bad value \"%s\" for option %s, using default 
\"%s\""),
+                        str, "IconPosition", icon_position_dbvalue[5]);
        }
-       panel->iconPos = i;
-       WMPerformButtonClick(panel->posB[i]);
+       panel->iconPos = 5;
+ found_position_value:
+       WMPerformButtonClick(panel->posB[panel->iconPos]);
 
        i = GetIntegerForKey("IconSize");
        i = (i - 24) / 8;
@@ -179,7 +187,7 @@ static void createPanel(Panel * p)
        WMMoveWidget(panel->posF, 20, 10);
        WMSetFrameTitle(panel->posF, _("Icon Positioning"));
 
-       for (i = 0; i < 8; i++) {
+       for (i = 0; i < wlengthof(icon_position_dbvalue); i++) {
                panel->posB[i] = WMCreateButton(panel->posF, WBTOnOff);
                WMSetButtonAction(panel->posB[i], showIconLayout, panel);
 
@@ -294,7 +302,6 @@ static void createPanel(Panel * p)
 
 static void storeData(_Panel * panel)
 {
-       char buf[8];
        int i;
 
        SetBoolForKey(WMGetButtonSelected(panel->arrB), "AutoArrangeIcons");
@@ -303,24 +310,7 @@ static void storeData(_Panel * panel)
 
        SetIntegerForKey(WMGetPopUpButtonSelectedItem(panel->sizeP) * 8 + 24, 
"IconSize");
 
-       buf[3] = 0;
-
-       if (panel->iconPos < 4) {
-               buf[0] = 't';
-       } else {
-               buf[0] = 'b';
-       }
-       if (panel->iconPos & 2) {
-               buf[1] = 'r';
-       } else {
-               buf[1] = 'l';
-       }
-       if (panel->iconPos & 1) {
-               buf[2] = 'h';
-       } else {
-               buf[2] = 'v';
-       }
-       SetStringForKey(buf, "IconPosition");
+       SetStringForKey(icon_position_dbvalue[panel->iconPos], "IconPosition");
 
        for (i = 0; i < wlengthof(icon_animation); i++) {
                if (WMGetButtonSelected(panel->animB[i])) {
-- 
2.1.3


-- 
To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.

Reply via email to