frontend: add BIOS warning
[pcsx_rearmed.git] / frontend / common / menu.c
index f7085fa..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
@@ -635,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 (*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
@@ -653,14 +657,14 @@ static void draw_menu_credits(void (*draw_more)(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
@@ -867,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
@@ -915,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
@@ -949,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
@@ -1020,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
@@ -1040,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
@@ -1107,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
@@ -1136,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
@@ -1152,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
@@ -1165,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
@@ -1198,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