frontend: add BIOS warning
[pcsx_rearmed.git] / frontend / common / menu.c
index 1cb41c5..b05c755 100644 (file)
@@ -1,7 +1,12 @@
-// (c) Copyright 2006-2010 notaz, All rights reserved.\r
-// Free for non-commercial use.\r
-\r
-// For commercial use, separate licencing terms must be obtained.\r
+/*\r
+ * (C) GraÅžvydas "notaz" Ignotas, 2006-2010\r
+ *\r
+ * This work is licensed under the terms of any of these licenses\r
+ * (at your option):\r
+ *  - GNU GPL, version 2 or later.\r
+ *  - GNU LGPL, version 2.1 or later.\r
+ * See the COPYING file in the top-level directory.\r
+ */\r
 \r
 #include <stdio.h>\r
 #include <string.h>\r
@@ -341,26 +346,6 @@ static void menu_darken_bg(void *dst, void *src, int pixels, int darker)
        }\r
 }\r
 \r
-static void menu_enter(int is_rom_loaded)\r
-{\r
-       if (is_rom_loaded)\r
-       {\r
-               // darken the active framebuffer\r
-               menu_darken_bg(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h, 1);\r
-       }\r
-       else\r
-       {\r
-               char buff[256];\r
-\r
-               // should really only happen once, on startup..\r
-               emu_make_path(buff, "skin/background.png", sizeof(buff));\r
-               if (readpng(g_menubg_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h) < 0)\r
-                       memset(g_menubg_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);\r
-       }\r
-\r
-       plat_video_menu_enter(is_rom_loaded);\r
-}\r
-\r
 static int me_id2offset(const menu_entry *ent, menu_id id)\r
 {\r
        int i;\r
@@ -461,8 +446,11 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
                h = g_menuscreen_h;\r
        }\r
 \r
-       x = g_menuscreen_w  / 2 - w / 2;\r
+       x = g_menuscreen_w / 2 - w / 2;\r
        y = g_menuscreen_h / 2 - h / 2;\r
+#ifdef MENU_ALIGN_LEFT\r
+       if (x > 12) x = 12;\r
+#endif\r
 \r
        /* draw */\r
        menu_draw_begin(1);\r
@@ -511,7 +499,7 @@ static void me_draw(const menu_entry *entries, int sel, void (*draw_more)(void))
                                len = strlen(names[i]);\r
                                if (len > 10)\r
                                        offs = 10 - len - 2;\r
-                               if (i == *(int *)ent->var) {\r
+                               if (i == *(unsigned char *)ent->var) {\r
                                        text_out16(x + col2_offs + offs * me_mfont_w, y, "%s", names[i]);\r
                                        break;\r
                                }\r
@@ -652,13 +640,12 @@ static void me_loop(menu_entry *menu, int *menu_sel, void (*draw_more)(void))
 \r
 /* ***************************************** */\r
 \r
-static void draw_menu_credits(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
@@ -670,14 +657,14 @@ static void draw_menu_credits(void)
                p++;\r
        }\r
 \r
-       x = g_menuscreen_w  / 2 - w * me_mfont_w / 2;\r
+       x = g_menuscreen_w / 2 - w * me_mfont_w / 2;\r
        y = g_menuscreen_h / 2 - h * me_mfont_h / 2;\r
        if (x < 0) x = 0;\r
        if (y < 0) y = 0;\r
 \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
@@ -686,6 +673,9 @@ static void draw_menu_credits(void)
                        p++;\r
        }\r
 \r
+       if (draw_more != NULL)\r
+               draw_more();\r
+\r
        menu_draw_end();\r
 }\r
 \r
@@ -726,22 +716,6 @@ static void do_delete(const char *fpath, const char *fname)
 \r
 // -------------- ROM selector --------------\r
 \r
-// rrrr rggg gggb bbbb\r
-static unsigned short file2color(const char *fname)\r
-{\r
-       const char *ext = fname + strlen(fname) - 3;\r
-       static const char *rom_exts[]   = { "zip", "bin", "smd", "gen", "iso", "cso", "cue" };\r
-       static const char *other_exts[] = { "gmv", "pat" };\r
-       int i;\r
-\r
-       if (ext < fname) ext = fname;\r
-       for (i = 0; i < array_size(rom_exts); i++)\r
-               if (strcasecmp(ext, rom_exts[i]) == 0) return 0xbdff; // FIXME: mk defines\r
-       for (i = 0; i < array_size(other_exts); i++)\r
-               if (strcasecmp(ext, other_exts[i]) == 0) return 0xaff5;\r
-       return 0xffff;\r
-}\r
-\r
 static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel)\r
 {\r
        int max_cnt, start, i, x, pos;\r
@@ -770,7 +744,7 @@ static void draw_dirlist(char *curdir, struct dirent **namelist, int n, int sel)
                        smalltext_out16(x, pos * me_sfont_h, "/", 0xfff6);\r
                        smalltext_out16(x + me_sfont_w, pos * me_sfont_h, namelist[i+1]->d_name, 0xfff6);\r
                } else {\r
-                       unsigned short color = file2color(namelist[i+1]->d_name);\r
+                       unsigned short color = fname2color(namelist[i+1]->d_name);\r
                        smalltext_out16(x, pos * me_sfont_h, namelist[i+1]->d_name, color);\r
                }\r
        }\r
@@ -897,9 +871,12 @@ rescan:
                        {\r
                                int newlen;\r
                                char *p, *newdir;\r
-                               if (!(inp & PBTN_MOK)) continue;\r
+                               if (!(inp & PBTN_MOK))\r
+                                       continue;\r
                                newlen = strlen(curr_path) + strlen(namelist[sel+1]->d_name) + 2;\r
                                newdir = malloc(newlen);\r
+                               if (newdir == NULL)\r
+                                       break;\r
                                if (strcmp(namelist[sel+1]->d_name, "..") == 0) {\r
                                        char *start = curr_path;\r
                                        p = start + strlen(start) - 1;\r
@@ -945,6 +922,13 @@ rescan:
                free(namelist);\r
        }\r
 \r
+       // restore curr_path\r
+       if (fname != NULL) {\r
+               n = strlen(curr_path);\r
+               if (curr_path + n + 1 == fname)\r
+                       curr_path[n] = '/';\r
+       }\r
+\r
        return ret;\r
 }\r
 \r
@@ -979,6 +963,10 @@ static void draw_savestate_menu(int menu_sel, int is_loading)
        if (x < 0) x = 0;\r
        y = g_menuscreen_h / 2 - h / 2;\r
        if (y < 0) y = 0;\r
+#ifdef MENU_ALIGN_LEFT\r
+       if (x > 12 + me_mfont_w * 2)\r
+               x = 12 + me_mfont_w * 2;\r
+#endif\r
 \r
        menu_draw_begin(1);\r
 \r
@@ -1050,18 +1038,11 @@ static int menu_loop_savestate(int is_loading)
 \r
 static char *action_binds(int player_idx, int action_mask, int dev_id)\r
 {\r
-       int k, count = 0, can_combo = 0, type;\r
-       const int *binds;\r
+       int dev = 0, dev_last = IN_MAX_DEVS - 1;\r
+       int can_combo = 1, type;\r
 \r
        static_buff[0] = 0;\r
 \r
-       binds = in_get_dev_binds(dev_id);\r
-       if (binds == NULL)\r
-               return static_buff;\r
-\r
-       in_get_config(dev_id, IN_CFG_BIND_COUNT, &count);\r
-       in_get_config(dev_id, IN_CFG_DOES_COMBOS, &can_combo);\r
-\r
        type = IN_BINDTYPE_EMU;\r
        if (player_idx >= 0) {\r
                can_combo = 0;\r
@@ -1070,22 +1051,37 @@ static char *action_binds(int player_idx, int action_mask, int dev_id)
        if (player_idx == 1)\r
                action_mask <<= 16;\r
 \r
-       for (k = 0; k < count; k++)\r
-       {\r
-               const char *xname;\r
-               int len;\r
+       if (dev_id >= 0)\r
+               dev = dev_last = dev_id;\r
+\r
+       for (; dev <= dev_last; dev++) {\r
+               int k, count = 0, combo = 0;\r
+               const int *binds;\r
 \r
-               if (!(binds[IN_BIND_OFFS(k, type)] & action_mask))\r
+               binds = in_get_dev_binds(dev);\r
+               if (binds == NULL)\r
                        continue;\r
 \r
-               xname = in_get_key_name(dev_id, k);\r
-               len = strlen(static_buff);\r
-               if (len) {\r
-                       strncat(static_buff, can_combo ? " + " : ", ",\r
-                               sizeof(static_buff) - len - 1);\r
-                       len += can_combo ? 3 : 2;\r
+               in_get_config(dev, IN_CFG_BIND_COUNT, &count);\r
+               in_get_config(dev, IN_CFG_DOES_COMBOS, &combo);\r
+               combo = combo && can_combo;\r
+\r
+               for (k = 0; k < count; k++) {\r
+                       const char *xname;\r
+                       int len;\r
+\r
+                       if (!(binds[IN_BIND_OFFS(k, type)] & action_mask))\r
+                               continue;\r
+\r
+                       xname = in_get_key_name(dev, k);\r
+                       len = strlen(static_buff);\r
+                       if (len) {\r
+                               strncat(static_buff, combo ? " + " : ", ",\r
+                                       sizeof(static_buff) - len - 1);\r
+                               len += combo ? 3 : 2;\r
+                       }\r
+                       strncat(static_buff, xname, sizeof(static_buff) - len - 1);\r
                }\r
-               strncat(static_buff, xname, sizeof(static_buff) - len - 1);\r
        }\r
 \r
        return static_buff;\r
@@ -1137,7 +1133,10 @@ static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_
                text_out16(x, y, "%s : %s", opts[i].name,\r
                        action_binds(player_idx, opts[i].mask, dev_id));\r
 \r
-       dev_name = in_get_dev_name(dev_id, 1, 1);\r
+       if (dev_id < 0)\r
+               dev_name = "(all devices)";\r
+       else\r
+               dev_name = in_get_dev_name(dev_id, 1, 1);\r
        w = strlen(dev_name) * me_mfont_w;\r
        if (w < 30 * me_mfont_w)\r
                w = 30 * me_mfont_w;\r
@@ -1166,7 +1165,7 @@ static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_
 static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_idx)\r
 {\r
        int i, sel = 0, menu_sel_max = opt_cnt - 1, does_combos = 0;\r
-       int dev_id, dev_count, kc, is_down, mkey;\r
+       int dev_id, bind_dev_id, dev_count, kc, is_down, mkey;\r
        int unbind, bindtype, mask_shift;\r
 \r
        for (i = 0, dev_id = -1, dev_count = 0; i < IN_MAX_DEVS; i++) {\r
@@ -1182,6 +1181,7 @@ static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_
                return;\r
        }\r
 \r
+       dev_id = -1; // show all\r
        mask_shift = 0;\r
        if (player_idx == 1)\r
                mask_shift = 16;\r
@@ -1195,18 +1195,18 @@ static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_
                        case PBTN_UP:   sel--; if (sel < 0) sel = menu_sel_max; continue;\r
                        case PBTN_DOWN: sel++; if (sel > menu_sel_max) sel = 0; continue;\r
                        case PBTN_LEFT:\r
-                               for (i = 0, dev_id--; i < IN_MAX_DEVS; i++, dev_id--) {\r
-                                       if (dev_id < 0)\r
+                               for (i = 0, dev_id--; i < IN_MAX_DEVS + 1; i++, dev_id--) {\r
+                                       if (dev_id < -1)\r
                                                dev_id = IN_MAX_DEVS - 1;\r
-                                       if (in_get_dev_name(dev_id, 1, 0) != NULL)\r
+                                       if (dev_id == -1 || in_get_dev_name(dev_id, 1, 0) != NULL)\r
                                                break;\r
                                }\r
                                continue;\r
                        case PBTN_RIGHT:\r
                                for (i = 0, dev_id++; i < IN_MAX_DEVS; i++, dev_id++) {\r
                                        if (dev_id >= IN_MAX_DEVS)\r
-                                               dev_id = 0;\r
-                                       if (in_get_dev_name(dev_id, 1, 0) != NULL)\r
+                                               dev_id = -1;\r
+                                       if (dev_id == -1 || in_get_dev_name(dev_id, 1, 0) != NULL)\r
                                                break;\r
                                }\r
                                continue;\r
@@ -1228,20 +1228,20 @@ static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_
 \r
                /* wait for some up event */\r
                for (is_down = 1; is_down; )\r
-                       kc = in_update_keycode(&dev_id, &is_down, -1);\r
+                       kc = in_update_keycode(&bind_dev_id, &is_down, -1);\r
 \r
-               i = count_bound_keys(dev_id, opts[sel].mask << mask_shift, bindtype);\r
+               i = count_bound_keys(bind_dev_id, opts[sel].mask << mask_shift, bindtype);\r
                unbind = (i > 0);\r
 \r
                /* allow combos if device supports them */\r
-               in_get_config(dev_id, IN_CFG_DOES_COMBOS, &does_combos);\r
+               in_get_config(bind_dev_id, IN_CFG_DOES_COMBOS, &does_combos);\r
                if (i == 1 && bindtype == IN_BINDTYPE_EMU && does_combos)\r
                        unbind = 0;\r
 \r
                if (unbind)\r
-                       in_unbind_all(dev_id, opts[sel].mask << mask_shift, bindtype);\r
+                       in_unbind_all(bind_dev_id, opts[sel].mask << mask_shift, bindtype);\r
 \r
-               in_bind_key(dev_id, kc, opts[sel].mask << mask_shift, bindtype, 0);\r
+               in_bind_key(bind_dev_id, kc, opts[sel].mask << mask_shift, bindtype, 0);\r
        }\r
 }\r
 \r