frontend: menu: limit enum text length
[pcsx_rearmed.git] / frontend / common / menu.c
index 31522f7..d76eda4 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- * (C) Gražvydas "notaz" Ignotas, 2006-2010\r
+ * (C) Gražvydas "notaz" Ignotas, 2006-2011\r
  *\r
  * This work is licensed under the terms of any of these licenses\r
  * (at your option):\r
@@ -372,6 +372,28 @@ static int me_count(const menu_entry *ent)
        return ret;\r
 }\r
 \r
+static unsigned int me_read_onoff(const menu_entry *ent)\r
+{\r
+       // guess var size based on mask to avoid reading too much\r
+       if (ent->mask & 0xffff0000)\r
+               return *(unsigned int *)ent->var & ent->mask;\r
+       else if (ent->mask & 0xff00)\r
+               return *(unsigned short *)ent->var & ent->mask;\r
+       else\r
+               return *(unsigned char *)ent->var & ent->mask;\r
+}\r
+\r
+static void me_toggle_onoff(menu_entry *ent)\r
+{\r
+       // guess var size based on mask to avoid reading too much\r
+       if (ent->mask & 0xffff0000)\r
+               *(unsigned int *)ent->var ^= ent->mask;\r
+       else if (ent->mask & 0xff00)\r
+               *(unsigned short *)ent->var ^= ent->mask;\r
+       else\r
+               *(unsigned char *)ent->var ^= ent->mask;\r
+}\r
+\r
 static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))\r
 {\r
        const menu_entry *ent, *ent_sel = entries;\r
@@ -460,7 +482,7 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
        for (ent = entries; ent->name; ent++)\r
        {\r
                const char **names;\r
-               int len;\r
+               int len, leftname_end = 0;\r
 \r
                if (!ent->enabled)\r
                        continue;\r
@@ -470,14 +492,16 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
                        if (ent->generate_name)\r
                                name = ent->generate_name(ent->id, &offs);\r
                }\r
-               if (name != NULL)\r
+               if (name != NULL) {\r
                        text_out16(x, y, name);\r
+                       leftname_end = x + (strlen(name) + 1) * me_mfont_w;\r
+               }\r
 \r
                switch (ent->beh) {\r
                case MB_NONE:\r
                        break;\r
                case MB_OPT_ONOFF:\r
-                       text_out16(x + col2_offs, y, (*(int *)ent->var & ent->mask) ? "ON" : "OFF");\r
+                       text_out16(x + col2_offs, y, me_read_onoff(ent) ? "ON" : "OFF");\r
                        break;\r
                case MB_OPT_RANGE:\r
                        text_out16(x + col2_offs, y, "%i", *(int *)ent->var);\r
@@ -494,13 +518,15 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
                        break;\r
                case MB_OPT_ENUM:\r
                        names = (const char **)ent->data;\r
-                       offs = 0;\r
                        for (i = 0; names[i] != NULL; i++) {\r
+                               offs = x + col2_offs;\r
                                len = strlen(names[i]);\r
                                if (len > 10)\r
-                                       offs = 10 - len - 2;\r
+                                       offs += (10 - len - 2) * me_mfont_w;\r
+                               if (offs < leftname_end)\r
+                                       offs = leftname_end;\r
                                if (i == *(unsigned char *)ent->var) {\r
-                                       text_out16(x + col2_offs + offs * me_mfont_w, y, "%s", names[i]);\r
+                                       text_out16(offs, y, "%s", names[i]);\r
                                        break;\r
                                }\r
                        }\r
@@ -545,7 +571,7 @@ static int me_process(menu_entry *entry, int is_next, int is_lr)
        {\r
                case MB_OPT_ONOFF:\r
                case MB_OPT_CUSTONOFF:\r
-                       *(int *)entry->var ^= entry->mask;\r
+                       me_toggle_onoff(entry);\r
                        return 1;\r
                case MB_OPT_RANGE:\r
                case MB_OPT_CUSTRANGE:\r
@@ -560,11 +586,11 @@ static int me_process(menu_entry *entry, int is_next, int is_lr)
                        names = (const char **)entry->data;\r
                        for (c = 0; names[c] != NULL; c++)\r
                                ;\r
-                       *(int *)entry->var += is_next ? 1 : -1;\r
-                       if (*(int *)entry->var < 0)\r
-                               *(int *)entry->var = 0;\r
-                       if (*(int *)entry->var >= c)\r
-                               *(int *)entry->var = c - 1;\r
+                       *(signed char *)entry->var += is_next ? 1 : -1;\r
+                       if (*(signed char *)entry->var < 0)\r
+                               *(signed char *)entry->var = 0;\r
+                       if (*(signed char *)entry->var >= c)\r
+                               *(signed char *)entry->var = c - 1;\r
                        return 1;\r
                default:\r
                        return 0;\r
@@ -573,14 +599,14 @@ static int me_process(menu_entry *entry, int is_next, int is_lr)
 \r
 static void debug_menu_loop(void);\r
 \r
-static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void))\r
+static int me_loop_d(menu_entry *menu, int *menu_sel, void (*draw_prep)(void), void (*draw_more)(void))\r
 {\r
-       int ret, inp, sel = *menu_sel, menu_sel_max;\r
+       int ret = 0, inp, sel = *menu_sel, menu_sel_max;\r
 \r
        menu_sel_max = me_count(menu) - 1;\r
        if (menu_sel_max < 0) {\r
                lprintf("no enabled menu entries\n");\r
-               return;\r
+               return 0;\r
        }\r
 \r
        while ((!menu[sel].enabled || !menu[sel].selectable) && sel < menu_sel_max)\r
@@ -592,6 +618,9 @@ static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void))
 \r
        for (;;)\r
        {\r
+               if (draw_prep != NULL)\r
+                       draw_prep();\r
+\r
                me_draw(menu, sel, draw_more);\r
                inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|\r
                                        PBTN_MOK|PBTN_MBACK|PBTN_MENU|PBTN_L|PBTN_R, 70);\r
@@ -636,17 +665,23 @@ static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void))
                }\r
        }\r
        *menu_sel = sel;\r
+\r
+       return ret;\r
+}\r
+\r
+static int me_loop(menu_entry *menu, int *menu_sel)\r
+{\r
+       return me_loop_d(menu, menu_sel, NULL, NULL);\r
 }\r
 \r
 /* ***************************************** */\r
 \r
-static void draw_menu_credits(void (*draw_more)(void))\r
+static void draw_menu_message(const char *msg, void (*draw_more)(void))\r
 {\r
-       const char *creds, *p;\r
        int x, y, h, w, wt;\r
+       const char *p;\r
 \r
-       p = creds = plat_get_credits();\r
-\r
+       p = msg;\r
        for (h = 1, w = 0; *p != 0; h++) {\r
                for (wt = 0; *p != 0 && *p != '\n'; p++)\r
                        wt++;\r
@@ -665,7 +700,7 @@ static void draw_menu_credits(void (*draw_more)(void))
 \r
        menu_draw_begin(1);\r
 \r
-       for (p = creds; *p != 0 && y <= g_menuscreen_h - me_mfont_h; y += me_mfont_h) {\r
+       for (p = msg; *p != 0 && y <= g_menuscreen_h - me_mfont_h; y += me_mfont_h) {\r
                text_out16(x, y, p);\r
 \r
                for (; *p != 0 && *p != '\n'; p++)\r
@@ -767,11 +802,6 @@ static int scandir_cmp(const void *p1, const void *p2)
        return alphasort(d1, d2);\r
 }\r
 \r
-static const char *filter_exts[] = {\r
-       ".mp3", ".MP3", ".srm", ".brm", "s.gz", ".mds", "bcfg", ".txt", ".htm", "html",\r
-       ".jpg", ".gpe"\r
-};\r
-\r
 static int scandir_filter(const struct dirent *ent)\r
 {\r
        const char *p;\r