- while (1)\r
- {\r
- switch (mode)\r
- {\r
- case 0: menu_draw_begin();\r
- tmp = PDebugMain();\r
- emu_platformDebugCat(tmp);\r
- draw_text_debug(tmp, 0, 0);\r
- if (dumped) {\r
- smalltext_out16(SCREEN_WIDTH-6*10, SCREEN_HEIGHT-8, "dumped", 0xffff);\r
- dumped = 0;\r
- }\r
- break;\r
- case 1: draw_frame_debug(); break;\r
- case 2: clear_screen();\r
- emu_forcedFrame(0);\r
- darken_screen();\r
- PDebugShowSpriteStats((unsigned short *)SCREEN_BUFFER + (SCREEN_HEIGHT/2 - 240/2)*SCREEN_WIDTH +\r
- SCREEN_WIDTH/2 - 320/2, SCREEN_WIDTH); break;\r
- case 3: clear_screen();\r
- PDebugShowPalette(SCREEN_BUFFER, SCREEN_WIDTH);\r
- PDebugShowSprite((unsigned short *)SCREEN_BUFFER + SCREEN_WIDTH*120+SCREEN_WIDTH/2+16,\r
- SCREEN_WIDTH, spr_offs);\r
- draw_text_debug(PDebugSpriteList(), spr_offs, 6);\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 = fname2color(namelist[i+1]->d_name);\r
+ smalltext_out16(x, pos * me_sfont_h, namelist[i+1]->d_name, color);\r
+ }\r
+ }\r
+ smalltext_out16(5, max_cnt/2 * me_sfont_h, ">", 0xffff);\r
+ menu_draw_end();\r
+}\r
+\r
+static int scandir_cmp(const void *p1, const void *p2)\r
+{\r
+ const struct dirent **d1 = (const struct dirent **)p1;\r
+ const struct dirent **d2 = (const struct dirent **)p2;\r
+ if ((*d1)->d_type == (*d2)->d_type)\r
+ return alphasort(d1, d2);\r
+ if ((*d1)->d_type == DT_DIR)\r
+ return -1; // put before\r
+ if ((*d2)->d_type == DT_DIR)\r
+ return 1;\r
+\r
+ return alphasort(d1, d2);\r
+}\r
+\r
+static int scandir_filter(const struct dirent *ent)\r
+{\r
+ const char *p;\r
+ int i;\r
+\r
+ if (ent == NULL || ent->d_name == NULL) return 0;\r
+ if (strlen(ent->d_name) < 5) return 1;\r
+\r
+ p = ent->d_name + strlen(ent->d_name) - 4;\r
+\r
+ for (i = 0; i < array_size(filter_exts); i++)\r
+ if (strcmp(p, filter_exts[i]) == 0)\r
+ return 0;\r
+\r
+ return 1;\r
+}\r
+\r
+static char *menu_loop_romsel(char *curr_path, int len)\r
+{\r
+ struct dirent **namelist;\r
+ int n, inp, sel = 0;\r
+ char *ret = NULL, *fname = NULL;\r
+\r
+rescan:\r
+ // is this a dir or a full path?\r
+ if (!plat_is_dir(curr_path)) {\r
+ char *p = curr_path + strlen(curr_path) - 1;\r
+ for (; p > curr_path && *p != '/'; p--)\r
+ ;\r
+ *p = 0;\r
+ fname = p+1;\r
+ }\r
+\r
+ n = scandir(curr_path, &namelist, scandir_filter, (void *)scandir_cmp);\r
+ if (n < 0) {\r
+ char *t;\r
+ lprintf("menu_loop_romsel failed, dir: %s\n", curr_path);\r
+\r
+ // try root\r
+ t = getcwd(curr_path, len);\r
+ if (t == NULL)\r
+ plat_get_root_dir(curr_path, len);\r
+ n = scandir(curr_path, &namelist, scandir_filter, (void *)scandir_cmp);\r
+ if (n < 0) {\r
+ // oops, we failed\r
+ lprintf("menu_loop_romsel failed, dir: %s\n", curr_path);\r
+ return NULL;\r
+ }\r
+ }\r
+\r
+ // try to find sel\r
+ if (fname != NULL) {\r
+ int i;\r
+ for (i = 1; i < n; i++) {\r
+ if (strcmp(namelist[i]->d_name, fname) == 0) {\r
+ sel = i - 1;\r