+ p = creds = plat_get_credits();\r
+\r
+ for (h = 1, w = 0; *p != 0; h++) {\r
+ for (wt = 0; *p != 0 && *p != '\n'; p++)\r
+ wt++;\r
+\r
+ if (wt > w)\r
+ w = wt;\r
+ if (*p == 0)\r
+ break;\r
+ p++;\r
+ }\r
+\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
+ text_out16(x, y, p);\r
+\r
+ for (; *p != 0 && *p != '\n'; p++)\r
+ ;\r
+ if (*p != 0)\r
+ p++;\r
+ }\r
+\r
+ menu_draw_end();\r
+}\r
+\r
+// -------------- del confirm ---------------\r
+\r
+static void do_delete(const char *fpath, const char *fname)\r
+{\r
+ int len, mid, inp;\r
+ const char *nm;\r
+ char tmp[64];\r
+\r
+ menu_draw_begin(1);\r
+\r
+ len = strlen(fname);\r
+ if (len > g_menuscreen_w / me_sfont_w)\r
+ len = g_menuscreen_w / me_sfont_w;\r
+\r
+ mid = g_menuscreen_w / 2;\r
+ text_out16(mid - me_mfont_w * 15 / 2, 8 * me_mfont_h, "About to delete");\r
+ smalltext_out16(mid - len * me_sfont_w / 2, 9 * me_mfont_h + 5, fname, 0xbdff);\r
+ text_out16(mid - me_mfont_w * 13 / 2, 11 * me_mfont_h, "Are you sure?");\r
+\r
+ nm = in_get_key_name(-1, -PBTN_MA3);\r
+ snprintf(tmp, sizeof(tmp), "(%s - confirm, ", nm);\r
+ len = strlen(tmp);\r
+ nm = in_get_key_name(-1, -PBTN_MBACK);\r
+ snprintf(tmp + len, sizeof(tmp) - len, "%s - cancel)", nm);\r
+ len = strlen(tmp);\r
+\r
+ text_out16(mid - me_mfont_w * len / 2, 12 * me_mfont_h, tmp);\r
+ menu_draw_end();\r
+\r
+ while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MA2));\r
+ inp = in_menu_wait(PBTN_MA3|PBTN_MBACK, 100);\r
+ if (inp & PBTN_MA3)\r
+ remove(fpath);\r
+}\r
+\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
+ void *darken_ptr;\r
+\r
+ max_cnt = g_menuscreen_h / me_sfont_h;\r
+ start = max_cnt / 2 - sel;\r
+ n--; // exclude current dir (".")\r
+\r
+ menu_draw_begin(1);\r
+\r
+// if (!rom_loaded)\r
+// menu_darken_bg(gp2x_screen, 320*240, 0);\r
+\r
+ darken_ptr = (short *)g_menuscreen_ptr + g_menuscreen_w * max_cnt/2 * me_sfont_h;\r
+ menu_darken_bg(darken_ptr, darken_ptr, g_menuscreen_w * me_sfont_h * 8 / 10, 0);\r
+\r
+ x = 5 + me_mfont_w + 1;\r
+ if (start - 2 >= 0)\r
+ smalltext_out16(14, (start - 2) * me_sfont_h, curdir, 0xffff);\r
+ for (i = 0; i < n; i++) {\r
+ pos = start + i;\r
+ if (pos < 0) continue;\r
+ if (pos >= max_cnt) break;\r
+ if (namelist[i+1]->d_type == DT_DIR) {\r
+ 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
+ smalltext_out16(x, pos * me_sfont_h, namelist[i+1]->d_name, color);\r