X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=psp%2Fmenu.c;h=0e578b135751a0f4771cc475cb3db813214ce6d7;hb=61f66fe0ab7ab4047a2c005fc52afeb50c26fc12;hp=86b1022ec7033aa592d56a70f501ce1e0214cb05;hpb=b846453101c070b93938dd2224f0cca130a55e8c;p=libpicofe.git diff --git a/psp/menu.c b/psp/menu.c index 86b1022..0e578b1 100644 --- a/psp/menu.c +++ b/psp/menu.c @@ -174,13 +174,9 @@ void menu_romload_end(void) // -------------- ROM selector -------------- -// SceIoDirent -#define DT_DIR FIO_SO_IFDIR -#define DT_REG FIO_SO_IFREG - struct my_dirent { - unsigned char d_type; + unsigned int d_type; char d_name[255]; }; @@ -221,7 +217,7 @@ static void draw_dirlist(char *curdir, struct my_dirent **namelist, int n, int s pos = start + i; if (pos < 0) continue; if (pos > 26) break; - if (namelist[i+1]->d_type & DT_DIR) { + if (namelist[i+1]->d_type & FIO_S_IFDIR) { smalltext_out16_lim(14, pos*10, "/", 0xd7ff, 1); smalltext_out16_lim(14+6, pos*10, namelist[i+1]->d_name, 0xd7ff, 80-3); } else { @@ -236,9 +232,10 @@ static void draw_dirlist(char *curdir, struct my_dirent **namelist, int n, int s static int scandir_cmp(const void *p1, const void *p2) { struct my_dirent **d1 = (struct my_dirent **)p1, **d2 = (struct my_dirent **)p2; - if ((*d1)->d_type == (*d2)->d_type) return strcasecmp((*d1)->d_name, (*d2)->d_name); - if ((*d1)->d_type & DT_DIR) return -1; // put before - if ((*d2)->d_type & DT_DIR) return 1; + if ((*d1)->d_type & (*d2)->d_type & FIO_S_IFDIR) + return strcasecmp((*d1)->d_name, (*d2)->d_name); + if ((*d1)->d_type & FIO_S_IFDIR) return -1; // put before + if ((*d2)->d_type & FIO_S_IFDIR) return 1; return strcasecmp((*d1)->d_name, (*d2)->d_name); } @@ -297,7 +294,7 @@ static int my_scandir(const char *dir, struct my_dirent ***namelist_out, { ent = malloc(sizeof(*ent)); if (ent == NULL) { lprintf("%s:%i: OOM\n", __FILE__, __LINE__); goto fail; } - ent->d_type = sce_ent.d_stat.st_attr; + ent->d_type = sce_ent.d_stat.st_mode; strncpy(ent->d_name, sce_ent.d_name, sizeof(ent->d_name)); ent->d_name[sizeof(ent->d_name)-1] = 0; if (filter == NULL || filter(ent)) @@ -350,7 +347,8 @@ static char *romsel_loop(char *curr_path) // is this a dir or a full path? memset(&cpstat, 0, sizeof(cpstat)); iret = sceIoGetstat(curr_path, &cpstat); - if (iret >= 0 && (cpstat.st_attr & FIO_SO_IFREG)) { // file + if (iret >= 0 && (cpstat.st_mode & FIO_S_IFDIR)); // dir + else if (iret >= 0 && (cpstat.st_mode & FIO_S_IFREG)) { // file char *p; for (p = curr_path + strlen(curr_path) - 1; p > curr_path && *p != '/'; p--); if (p > curr_path) { @@ -359,7 +357,6 @@ static char *romsel_loop(char *curr_path) } else strcpy(curr_path, "ms0:/"); } - else if (iret >= 0 && (cpstat.st_attr & FIO_SO_IFDIR)); // dir else strcpy(curr_path, "ms0:/"); // something else n = my_scandir(curr_path, &namelist, scandir_filter, scandir_cmp); @@ -394,14 +391,10 @@ static char *romsel_loop(char *curr_path) if(inp & BTN_L) { sel-=24; if (sel < 0) sel = 0; } if(inp & BTN_RIGHT) { sel+=10; if (sel > n-2) sel = n-2; } if(inp & BTN_R) { sel+=24; if (sel > n-2) sel = n-2; } - if(inp & BTN_CIRCLE) { // enter dir/select - if (namelist[sel+1]->d_type & DT_REG) { - strcpy(romFileName, curr_path); - strcat(romFileName, "/"); - strcat(romFileName, namelist[sel+1]->d_name); - ret = romFileName; - break; - } else if (namelist[sel+1]->d_type & DT_DIR) { + if(inp & BTN_CIRCLE) // enter dir/select + { + if (namelist[sel+1]->d_type & FIO_S_IFDIR) + { int newlen = strlen(curr_path) + strlen(namelist[sel+1]->d_name) + 2; char *p, *newdir = malloc(newlen); if (strcmp(namelist[sel+1]->d_name, "..") == 0) { @@ -422,6 +415,14 @@ static char *romsel_loop(char *curr_path) free(newdir); break; } + else if (namelist[sel+1]->d_type & FIO_S_IFREG) + { + strcpy(romFileName, curr_path); + strcat(romFileName, "/"); + strcat(romFileName, namelist[sel+1]->d_name); + ret = romFileName; + break; + } } if(inp & BTN_X) break; // cancel } @@ -672,14 +673,14 @@ static int count_bound_keys(int action, int pl_idx) static void draw_key_config(const me_bind_action *opts, int opt_cnt, int player_idx, int sel) { - int x, y, tl_y = 16+40, i; + int x, y, tl_y = 16+20, i; menu_draw_begin(); if (player_idx >= 0) { - text_out16(80+80, 16+20, "Player %i controls", player_idx + 1); + text_out16(80+80, 16, "Player %i controls", player_idx + 1); x = 80+80; } else { - text_out16(80+80, 16+20, "Emulator controls"); + text_out16(80+80, 16, "Emulator controls"); x = 80+40; } @@ -741,6 +742,19 @@ static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_ } } +menu_entry ctrlopt_entries[] = +{ + { "Player 1", MB_NONE, MA_CTRL_PLAYER1, NULL, 0, 0, 0, 1, 0 }, + { "Player 2", MB_NONE, MA_CTRL_PLAYER2, NULL, 0, 0, 0, 1, 0 }, + { "Emulator controls", MB_NONE, MA_CTRL_EMU, NULL, 0, 0, 0, 1, 0 }, + { "6 button pad", MB_ONOFF, MA_OPT_6BUTTON_PAD, &PicoOpt, 0x020, 0, 0, 1, 1 }, + { "Turbo rate", MB_RANGE, MA_CTRL_TURBO_RATE, ¤tConfig.turbo_rate, 0, 1, 30, 1, 1 }, + { "Done", MB_NONE, MA_CTRL_DONE, NULL, 0, 0, 0, 1, 0 }, +}; + +#define CTRLOPT_ENTRY_COUNT (sizeof(ctrlopt_entries) / sizeof(ctrlopt_entries[0])) +const int ctrlopt_entry_count = CTRLOPT_ENTRY_COUNT; + static void draw_kc_sel(int menu_sel) { int tl_x = 80+25+40, tl_y = 16+60, y; @@ -749,10 +763,7 @@ static void draw_kc_sel(int menu_sel) menu_draw_begin(); menu_draw_selection(tl_x - 16, tl_y + menu_sel*10, 138); - text_out16(tl_x, y, "Player 1"); - text_out16(tl_x, (y+=10), "Player 2"); - text_out16(tl_x, (y+=10), "Emulator controls"); - text_out16(tl_x, (y+=10), "Done"); + me_draw(ctrlopt_entries, ctrlopt_entry_count, tl_x, tl_y, NULL, NULL); menu_draw_end(); } @@ -777,23 +788,27 @@ me_bind_action emuctrl_actions[] = static void kc_sel_loop(void) { - int menu_sel = 3, menu_sel_max = 3; + int menu_sel = 5, menu_sel_max = 5; unsigned long inp = 0; - int is_6button = PicoOpt & POPT_6BTN_PAD; + menu_id selected_id; while (1) { draw_kc_sel(menu_sel); - inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_X|BTN_CIRCLE, 0); + inp = wait_for_input(BTN_UP|BTN_DOWN|BTN_LEFT|BTN_RIGHT|BTN_X|BTN_CIRCLE, 0); + selected_id = me_index2id(ctrlopt_entries, CTRLOPT_ENTRY_COUNT, menu_sel); + if (inp & (BTN_LEFT|BTN_RIGHT)) // multi choise + me_process(ctrlopt_entries, CTRLOPT_ENTRY_COUNT, selected_id, (inp&BTN_RIGHT) ? 1 : 0); if (inp & BTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = menu_sel_max; } if (inp & BTN_DOWN) { menu_sel++; if (menu_sel > menu_sel_max) menu_sel = 0; } if (inp & BTN_CIRCLE) { - switch (menu_sel) { - case 0: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 0); return; - case 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return; - case 2: key_config_loop(emuctrl_actions, - sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]) - 1, -1); return; - case 3: if (!rom_loaded) emu_WriteConfig(0); return; + int is_6button = PicoOpt & POPT_6BTN_PAD; + switch (selected_id) { + case MA_CTRL_PLAYER1: key_config_loop(me_ctrl_actions, is_6button ? 15 : 11, 0); return; + case MA_CTRL_PLAYER2: key_config_loop(me_ctrl_actions, is_6button ? 15 : 11, 1); return; + case MA_CTRL_EMU: key_config_loop(emuctrl_actions, + sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]) - 1, -1); return; + case MA_CTRL_DONE: if (!rom_loaded) emu_WriteConfig(0); return; default: return; } } @@ -810,7 +825,7 @@ menu_entry cdopt_entries[] = { NULL, MB_NONE, MA_CDOPT_TESTBIOS_EUR, NULL, 0, 0, 0, 1, 0 }, { NULL, MB_NONE, MA_CDOPT_TESTBIOS_JAP, NULL, 0, 0, 0, 1, 0 }, { "CD LEDs", MB_ONOFF, MA_CDOPT_LEDS, ¤tConfig.EmuOpt, 0x0400, 0, 0, 1, 1 }, - { "CDDA audio (using mp3s)", MB_ONOFF, MA_CDOPT_CDDA, &PicoOpt, 0x0800, 0, 0, 1, 1 }, + { "CDDA audio", MB_ONOFF, MA_CDOPT_CDDA, &PicoOpt, 0x0800, 0, 0, 1, 1 }, { "PCM audio", MB_ONOFF, MA_CDOPT_PCM, &PicoOpt, 0x0400, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_CDOPT_READAHEAD, NULL, 0, 0, 0, 1, 1 }, { "SaveRAM cart", MB_ONOFF, MA_CDOPT_SAVERAM, &PicoOpt, 0x8000, 0, 0, 1, 1 }, @@ -1146,6 +1161,7 @@ menu_entry opt2_entries[] = { "gzip savestates", MB_ONOFF, MA_OPT2_GZIP_STATES, ¤tConfig.EmuOpt, 0x00008, 0, 0, 1, 1 }, { "Don't save last used ROM", MB_ONOFF, MA_OPT2_NO_LAST_ROM, ¤tConfig.EmuOpt, 0x00020, 0, 0, 1, 1 }, { "Status line in main menu", MB_ONOFF, MA_OPT2_STATUS_LINE, ¤tConfig.EmuOpt, 0x20000, 0, 0, 1, 1 }, + { "Disable idle loop patching",MB_ONOFF, MA_OPT2_NO_IDLE_LOOPS, &PicoOpt, 0x80000, 0, 0, 1, 1 }, { "Disable frame limiter", MB_ONOFF, MA_OPT2_NO_FRAME_LIMIT, ¤tConfig.EmuOpt, 0x40000, 0, 0, 1, 1 }, { "done", MB_NONE, MA_OPT2_DONE, NULL, 0, 0, 0, 1, 0 }, }; @@ -1205,12 +1221,11 @@ static void amenu_loop_options(void) menu_entry opt_entries[] = { { NULL, MB_NONE, MA_OPT_RENDERER, NULL, 0, 0, 0, 1, 1 }, - { "Accurate sprites", MB_ONOFF, MA_OPT_ACC_SPRITES, &PicoOpt, 0x0080, 0, 0, 0, 1 }, + { "Accurate sprites", MB_ONOFF, MA_OPT_ACC_SPRITES, &PicoOpt, 0x080, 0, 0, 0, 1 }, { "Show FPS", MB_ONOFF, MA_OPT_SHOW_FPS, ¤tConfig.EmuOpt, 0x0002, 0, 0, 1, 1 }, { NULL, MB_RANGE, MA_OPT_FRAMESKIP, ¤tConfig.Frameskip, 0, -1, 16, 1, 1 }, { "Enable sound", MB_ONOFF, MA_OPT_ENABLE_SOUND, ¤tConfig.EmuOpt, 0x0004, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_OPT_SOUND_QUALITY, NULL, 0, 0, 0, 1, 1 }, - { "6 button pad", MB_ONOFF, MA_OPT_6BUTTON_PAD, &PicoOpt, 0x0020, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_OPT_REGION, NULL, 0, 0, 0, 1, 1 }, { "Use SRAM/BRAM savestates", MB_ONOFF, MA_OPT_SRAM_STATES, ¤tConfig.EmuOpt, 0x0001, 0, 0, 1, 1 }, { NULL, MB_NONE, MA_OPT_CONFIRM_STATES,NULL, 0, 0, 0, 1, 1 }, @@ -1617,10 +1632,10 @@ static void menu_loop_root(void) { char curr_path[PATH_MAX], *selfname; FILE *tstf; - if ( (tstf = fopen(lastRomFile, "rb")) ) + if ( (tstf = fopen(loadedRomFName, "rb")) ) { fclose(tstf); - strcpy(curr_path, lastRomFile); + strcpy(curr_path, loadedRomFName); } else getcwd(curr_path, PATH_MAX); @@ -1762,10 +1777,10 @@ int menu_loop_tray(void) menu_gfx_prepare(); - if ( (tstf = fopen(lastRomFile, "rb")) ) + if ( (tstf = fopen(loadedRomFName, "rb")) ) { fclose(tstf); - strcpy(curr_path, lastRomFile); + strcpy(curr_path, loadedRomFName); } else { @@ -1789,7 +1804,7 @@ int menu_loop_tray(void) if (selfname) { int ret = -1; cd_img_type cd_type; - cd_type = emu_cdCheck(NULL); + cd_type = emu_cdCheck(NULL, romFileName); if (cd_type != CIT_NOT_CD) ret = Insert_CD(romFileName, cd_type); if (ret != 0) {