gl: clear w, h on reinit
[libpicofe.git] / menu.c
diff --git a/menu.c b/menu.c
index 96b1ea2..5d96b7e 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -994,10 +994,11 @@ static int dirent_seek_char(struct dirent **namelist, int len, int sel, char c)
        return i;\r
 }\r
 \r
-static const char *menu_loop_romsel(char *curr_path, int len,\r
+static const char *menu_loop_romsel_d(char *curr_path, int len,\r
        const char **filter_exts,\r
        int (*extra_filter)(struct dirent **namelist, int count,\r
-                           const char *basedir))\r
+                           const char *basedir),\r
+       void (*draw_prep)(void))\r
 {\r
        static char rom_fname_reload[256]; // used for scratch and return\r
        char sel_fname[256];\r
@@ -1020,13 +1021,12 @@ static const char *menu_loop_romsel(char *curr_path, int len,
                        curr_path_restore = p;\r
                        snprintf(sel_fname, sizeof(sel_fname), "%s", p + 1);\r
                }\r
-\r
-               if (rom_fname_reload[0] == 0)\r
-                       show_help = 2;\r
        }\r
+       show_help = 2;\r
 \r
 rescan:\r
        if (namelist != NULL) {\r
+               n += !n;\r
                while (n-- > 0)\r
                        free(namelist[n]);\r
                free(namelist);\r
@@ -1038,16 +1038,17 @@ rescan:
                filter = scandir_filter;\r
 \r
        n = scandir(curr_path, &namelist, filter, (void *)scandir_cmp);\r
-       if (n < 0) {\r
+       if (n < 0 || !namelist) {\r
                lprintf("menu_loop_romsel failed, dir: %s\n", curr_path);\r
 \r
                // try data root\r
                plat_get_data_dir(curr_path, len);\r
                n = scandir(curr_path, &namelist, filter, (void *)scandir_cmp);\r
-               if (n < 0) {\r
+               if (n < 0 || !namelist) {\r
                        // oops, we failed\r
                        lprintf("menu_loop_romsel failed, dir: %s\n", curr_path);\r
-                       return NULL;\r
+                       namelist = malloc(sizeof(*namelist));\r
+                       namelist[0] = calloc(1, sizeof(**namelist));\r
                }\r
        }\r
 \r
@@ -1098,6 +1099,8 @@ rescan:
 \r
        for (;;)\r
        {\r
+               if (draw_prep != NULL)\r
+                       draw_prep();\r
                draw_dirlist(curr_path, namelist, n, sel, show_help);\r
                inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT\r
                        | PBTN_L|PBTN_R|PBTN_MA2|PBTN_MA3|PBTN_MOK|PBTN_MBACK\r
@@ -1106,14 +1109,16 @@ rescan:
                        g_menu_filter_off = !g_menu_filter_off;\r
                        snprintf(sel_fname, sizeof(sel_fname), "%s",\r
                                namelist[sel]->d_name);\r
+                       show_help = 2;\r
                        goto rescan;\r
                }\r
-               if      (inp & PBTN_UP  )  { sel--;   if (sel < 0)   sel = n-1; }\r
+               int last = n ? n-1 : 0;\r
+               if      (inp & PBTN_UP  )  { sel--;   if (sel < 0)   sel = last; }\r
                else if (inp & PBTN_DOWN)  { sel++;   if (sel > n-1) sel = 0; }\r
                else if (inp & PBTN_LEFT)  { sel-=10; if (sel < 0)   sel = 0; }\r
-               else if (inp & PBTN_RIGHT) { sel+=10; if (sel > n-1) sel = n-1; }\r
+               else if (inp & PBTN_RIGHT) { sel+=10; if (sel > n-1) sel = last; }\r
                else if (inp & PBTN_L)     { sel-=24; if (sel < 0)   sel = 0; }\r
-               else if (inp & PBTN_R)     { sel+=24; if (sel > n-1) sel = n-1; }\r
+               else if (inp & PBTN_R)     { sel+=24; if (sel > n-1) sel = last; }\r
 \r
                else if ((inp & PBTN_MOK) || (inp & (PBTN_MENU|PBTN_MA2)) == (PBTN_MENU|PBTN_MA2))\r
                {\r
@@ -1154,7 +1159,7 @@ rescan:
                                        strcat(newdir, "/");\r
                                        strcat(newdir, namelist[sel]->d_name);\r
                                }\r
-                               ret = menu_loop_romsel(newdir, newlen, filter_exts, extra_filter);\r
+                               ret = menu_loop_romsel_d(newdir, newlen, filter_exts, extra_filter, draw_prep);\r
                                free(newdir);\r
                                break;\r
                        }\r
@@ -1188,6 +1193,14 @@ rescan:
        return ret;\r
 }\r
 \r
+static const char *menu_loop_romsel(char *curr_path, int len,\r
+       const char **filter_exts,\r
+       int (*extra_filter)(struct dirent **namelist, int count,\r
+                           const char *basedir))\r
+{\r
+       return menu_loop_romsel_d(curr_path, len, filter_exts, extra_filter, NULL);\r
+}\r
+\r
 // ------------ savestate loader ------------\r
 \r
 #define STATE_SLOT_COUNT 10\r