From 4f3639fab62fa95f4bdc620b2e3500e717a0fcf3 Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 25 Dec 2010 21:29:45 +0200 Subject: [PATCH] menu: add config save/load --- Makefile | 2 +- frontend/common/menu.c | 20 ---- frontend/main.c | 16 +-- frontend/menu.c | 225 ++++++++++++++++++++++++++++++++++++++--- frontend/plat_dummy.c | 4 - frontend/plat_omap.c | 5 - frontend/plugin_lib.h | 4 + gui/Config.c | 180 --------------------------------- 8 files changed, 216 insertions(+), 240 deletions(-) delete mode 100644 gui/Config.c diff --git a/Makefile b/Makefile index b4748fc5..30627530 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ plugins/cdrcimg/%.o: CFLAGS += -Wall OBJS += plugins/cdrcimg/cdrcimg.o # gui -OBJS += gui/Config.o gui/Plugin.o +OBJS += gui/Plugin.o OBJS += frontend/main.o frontend/plugin.o frontend/plugin_lib.o OBJS += frontend/menu.o diff --git a/frontend/common/menu.c b/frontend/common/menu.c index d9717d46..f7085fa6 100644 --- a/frontend/common/menu.c +++ b/frontend/common/menu.c @@ -341,26 +341,6 @@ static void menu_darken_bg(void *dst, void *src, int pixels, int darker) } } -static void menu_enter(int is_rom_loaded) -{ - if (is_rom_loaded) - { - // darken the active framebuffer - menu_darken_bg(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h, 1); - } - else - { - char buff[256]; - - // should really only happen once, on startup.. - emu_make_path(buff, "skin/background.png", sizeof(buff)); - if (readpng(g_menubg_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h) < 0) - memset(g_menubg_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2); - } - - plat_video_menu_enter(is_rom_loaded); -} - static int me_id2offset(const menu_entry *ent, menu_id id) { int i; diff --git a/frontend/main.c b/frontend/main.c index 7e33f2ee..36b6a6a1 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -185,21 +185,7 @@ int main(int argc, char *argv[]) strcpy(Config.Cdr, "builtin_cdr"); strcpy(Config.Pad1, "builtin_pad"); strcpy(Config.Pad2, "builtin_pad"); - - // try to load config - // if the config file doesn't exist - if (LoadConfig() == -1) { - // Uh oh, no config file found, use some defaults - Config.PsxAuto = 1; - - // create & load default memcards if they don't exist - CreateMemcard("card1.mcd", Config.Mcd1); - CreateMemcard("card2.mcd", Config.Mcd2); - - LoadMcds(Config.Mcd1, Config.Mcd2); - - SaveConfig(); - } + Config.PsxAuto = 1; snprintf(Config.PatchesDir, sizeof(Config.PatchesDir), "." PATCHES_DIR); /* diff --git a/frontend/menu.c b/frontend/menu.c index 75c51e83..c2fc72a1 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -59,7 +59,6 @@ extern int ready_to_go; static int game_config_loaded; static int last_psx_w, last_psx_h, last_psx_bpp; static int scaling, filter, state_slot, cpu_clock; -static int state_slot; static char rom_fname_reload[MAXPATHLEN]; static char last_selected_fname[MAXPATHLEN]; int g_opts; @@ -144,14 +143,199 @@ static void menu_set_defconfig(void) iUseTimer = 2; } +#define CE_CONFIG_STR(val) \ + { #val, 0, Config.val } + +#define CE_CONFIG_VAL(val) \ + { #val, sizeof(Config.val), &Config.val } + +#define CE_STR(val) \ + { #val, 0, val } + +#define CE_INTVAL(val) \ + { #val, sizeof(val), &val } + +static const struct { + const char *name; + size_t len; + void *val; +} config_data[] = { + CE_CONFIG_STR(Bios), + CE_CONFIG_STR(Gpu), + CE_CONFIG_STR(Spu), + CE_CONFIG_STR(Cdr), + CE_CONFIG_VAL(Xa), + CE_CONFIG_VAL(Sio), + CE_CONFIG_VAL(Mdec), + CE_CONFIG_VAL(PsxAuto), + CE_CONFIG_VAL(Cdda), + CE_CONFIG_VAL(Debug), + CE_CONFIG_VAL(PsxOut), + CE_CONFIG_VAL(SpuIrq), + CE_CONFIG_VAL(RCntFix), + CE_CONFIG_VAL(VSyncWA), + CE_CONFIG_VAL(Cpu), + CE_CONFIG_VAL(PsxType), + CE_INTVAL(scaling), + CE_INTVAL(filter), + CE_INTVAL(state_slot), + CE_INTVAL(cpu_clock), + CE_INTVAL(g_opts), + CE_INTVAL(iUseDither), + CE_INTVAL(UseFrameSkip), + CE_INTVAL(dwActFixes), + CE_INTVAL(iUseReverb), + CE_INTVAL(iUseInterpolation), + CE_INTVAL(iXAPitch), + CE_INTVAL(iSPUIRQWait), + CE_INTVAL(iUseTimer), +}; + static int menu_write_config(int is_game) { - return -1; + char cfgfile[MAXPATHLEN]; + FILE *f; + int i; + + if (is_game) + return -1; + + snprintf(cfgfile, sizeof(cfgfile), "." PCSX_DOT_DIR "%s", cfgfile_basename); + f = fopen(cfgfile, "w"); + if (f == NULL) { + printf("failed to open: %s\n", cfgfile); + return -1; + } + + for (i = 0; i < ARRAY_SIZE(config_data); i++) { + fprintf(f, "%s = ", config_data[i].name); + switch (config_data[i].len) { + case 0: + fprintf(f, "%s\n", (char *)config_data[i].val); + break; + case 1: + fprintf(f, "%x\n", *(u8 *)config_data[i].val); + break; + case 2: + fprintf(f, "%x\n", *(u16 *)config_data[i].val); + break; + case 4: + fprintf(f, "%x\n", *(u32 *)config_data[i].val); + break; + default: + printf("menu_write_config: unhandled len %d for %s\n", + config_data[i].len, config_data[i].name); + break; + } + } + + if (!is_game) + fprintf(f, "lastcdimg = %s\n", last_selected_fname); + + fclose(f); + return 0; +} + +static void parse_str_val(char *cval, const char *src) +{ + char *tmp; + strncpy(cval, src, MAXPATHLEN); + cval[MAXPATHLEN - 1] = 0; + tmp = strchr(cval, '\n'); + if (tmp == NULL) + tmp = strchr(cval, '\r'); + if (tmp != NULL) + *tmp = 0; } static int menu_load_config(int is_game) { - return 0; + char cfgfile[MAXPATHLEN]; + int i, ret = -1; + long size; + char *cfg; + FILE *f; + + if (is_game) + return -1; + + snprintf(cfgfile, sizeof(cfgfile), "." PCSX_DOT_DIR "%s", cfgfile_basename); + f = fopen(cfgfile, "r"); + if (f == NULL) { + printf("failed to open: %s\n", cfgfile); + return -1; + } + + fseek(f, 0, SEEK_END); + size = ftell(f); + if (size <= 0) { + printf("bad size %ld: %s\n", size, cfgfile); + goto fail; + } + + cfg = malloc(size + 1); + if (cfg == NULL) + goto fail; + + fseek(f, 0, SEEK_SET); + if (fread(cfg, 1, size, f) != size) { + printf("failed to read: %s\n", cfgfile); + goto fail_read; + } + cfg[size] = 0; + + for (i = 0; i < ARRAY_SIZE(config_data); i++) { + char *tmp, *tmp2; + u32 val; + + tmp = strstr(cfg, config_data[i].name); + if (tmp == NULL) + continue; + tmp += strlen(config_data[i].name); + if (strncmp(tmp, " = ", 3) != 0) + continue; + tmp += 3; + + if (config_data[i].len == 0) { + parse_str_val(config_data[i].val, tmp); + continue; + } + + tmp2 = NULL; + val = strtoul(tmp, &tmp2, 16); + if (tmp2 == NULL || tmp == tmp2) + continue; // parse failed + + switch (config_data[i].len) { + case 1: + *(u8 *)config_data[i].val = val; + break; + case 2: + *(u16 *)config_data[i].val = val; + break; + case 4: + *(u32 *)config_data[i].val = val; + break; + default: + printf("menu_load_config: unhandled len %d for %s\n", + config_data[i].len, config_data[i].name); + break; + } + } + + if (!is_game) { + char *tmp = strstr(cfg, "lastcdimg = "); + if (tmp != NULL) { + tmp += 12; + parse_str_val(last_selected_fname, tmp); + } + } + +fail_read: + free(cfg); +fail: + fclose(f); + return ret; } // rrrr rggg gggb bbbb @@ -208,10 +392,11 @@ static void apply_cpu_clock(void) static void apply_filter(int which) { + static int old = -1; char buf[128]; int i; - if (pnd_filter_list == NULL) + if (pnd_filter_list == NULL || which == old) return; for (i = 0; i < which; i++) @@ -223,6 +408,7 @@ static void apply_filter(int which) snprintf(buf, sizeof(buf), "%s/op_videofir.sh %s", pnd_script_base, pnd_filter_list[i]); system(buf); + old = which; } static menu_entry e_menu_gfx_options[]; @@ -385,7 +571,7 @@ static menu_entry e_menu_keyconfig[] = mee_handler_id("Player 2", MA_CTRL_PLAYER2, key_config_loop_wrap), mee_handler_id("Emulator controls", MA_CTRL_EMU, key_config_loop_wrap), mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg), - mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_saveloadcfg, mgn_saveloadcfg), +// mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_saveloadcfg, mgn_saveloadcfg), mee_label (""), mee_label ("Input devices:"), mee_label_mk (MA_CTRL_DEV_FIRST, mgn_dev_name), @@ -402,7 +588,7 @@ static int menu_loop_keyconfig(int id, int keys) { static int sel = 0; - me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go); +// me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go); me_loop(e_menu_keyconfig, &sel, NULL); return 0; } @@ -615,7 +801,7 @@ static menu_entry e_menu_options[] = mee_handler ("[Display]", menu_loop_gfx_options), mee_handler ("[BIOS/Plugins]", menu_loop_plugin_options), mee_handler ("[Advanced]", menu_loop_adv_options), -// mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg), + mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg), // mee_cust_nosave("Save cfg for loaded game",MA_OPT_SAVECFG_GAME, mh_saveloadcfg, mgn_saveloadcfg), mee_handler_h ("Restore default config", mh_restore_defaults, h_restore_def), mee_end, @@ -628,7 +814,7 @@ static int menu_loop_options(int id, int keys) i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS); e_menu_options[i].enabled = cpu_clock != 0 ? 1 : 0; - me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go); +// me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go); me_loop(e_menu_options, &sel, NULL); @@ -797,7 +983,7 @@ void menu_loop(void) me_enable(e_menu_main, MA_MAIN_LOAD_STATE, ready_to_go); me_enable(e_menu_main, MA_MAIN_RESET_GAME, ready_to_go); - menu_enter(ready_to_go); +// menu_enter(ready_to_go); in_set_config_int(0, IN_CFG_BLOCKING, 1); do { @@ -817,16 +1003,24 @@ void menu_loop(void) void menu_init(void) { + char buff[MAXPATHLEN]; + + strcpy(last_selected_fname, "/media"); + + pnd_menu_init(); + menu_init_common(); + menu_set_defconfig(); menu_load_config(0); - menu_init_common(); - pnd_menu_init(); last_psx_w = 320; last_psx_h = 240; last_psx_bpp = 16; - strcpy(last_selected_fname, "/media"); - //strcpy(last_selected_fname, "/mnt/ntz/stuff/psx"); + g_menubg_src_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1); + if (g_menubg_src_ptr == NULL) + exit(1); + emu_make_path(buff, "skin/background.png", sizeof(buff)); + readpng(g_menubg_src_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h); } void menu_notify_mode_change(int w, int h, int bpp) @@ -846,16 +1040,17 @@ static void menu_leave_emu(void) { omap_enable_layer(0); + memcpy(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2); if (ready_to_go && last_psx_bpp == 16) { int x = max(0, g_menuscreen_w - last_psx_w); int y = max(0, g_menuscreen_h / 2 - last_psx_h / 2); int w = min(g_menuscreen_w, last_psx_w); int h = min(g_menuscreen_h, last_psx_h); - u16 *d = (u16 *)g_menubg_src_ptr + g_menuscreen_w * y + x; + u16 *d = (u16 *)g_menubg_ptr + g_menuscreen_w * y + x; u16 *s = pl_fbdev_buf; for (; h > 0; h--, d += g_menuscreen_w, s += last_psx_w) - memcpy(d, s, w * 2); + menu_darken_bg(d, s, w, 0); } } diff --git a/frontend/plat_dummy.c b/frontend/plat_dummy.c index d3080ae6..0b4f100b 100644 --- a/frontend/plat_dummy.c +++ b/frontend/plat_dummy.c @@ -19,10 +19,6 @@ int omap_enable_layer(int enabled) return 0; } -void plat_video_menu_enter(int is_rom_loaded) -{ -} - void plat_video_menu_begin(void) { } diff --git a/frontend/plat_omap.c b/frontend/plat_omap.c index 034e9e58..d31fa50f 100644 --- a/frontend/plat_omap.c +++ b/frontend/plat_omap.c @@ -120,10 +120,6 @@ int omap_enable_layer(int enabled) g_layer_x, g_layer_y, g_layer_w, g_layer_h, 0); } -void plat_video_menu_enter(int is_rom_loaded) -{ -} - void plat_video_menu_begin(void) { } @@ -189,7 +185,6 @@ void plat_init(void) goto fail1; } g_menubg_ptr = temp_frame; - g_menubg_src_ptr = temp_frame; in_set_config(in_name_to_id("evdev:gpio-keys"), IN_CFG_KEY_NAMES, pandora_gpio_keys, sizeof(pandora_gpio_keys)); diff --git a/frontend/plugin_lib.h b/frontend/plugin_lib.h index cfb9bd10..a1400e93 100644 --- a/frontend/plugin_lib.h +++ b/frontend/plugin_lib.h @@ -27,3 +27,7 @@ void pl_fbdev_flip(void); void pl_fbdev_finish(void); void pl_text_out16(int x, int y, const char *texto, ...); + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#endif diff --git a/gui/Config.c b/gui/Config.c deleted file mode 100644 index aff4f1ef..00000000 --- a/gui/Config.c +++ /dev/null @@ -1,180 +0,0 @@ -/* Pcsx - Pc Psx Emulator - * Copyright (C) 1999-2002 Pcsx Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA - */ - -#include -#include -#include -#include -#include - -#include "Linux.h" - -/* TODO escaping/unescaping would be nice, as would maxchars */ -static void GetValue(char *src, char *name, char *outvar) { - char *tmp; - - *outvar = 0; - tmp = strstr(src, name); - if (tmp == NULL) return; - - tmp += strlen(name); - while ((*tmp == ' ') || (*tmp == '=')) tmp++; - - while (*tmp != '\n' && *tmp != 0) - *outvar++ = *tmp++; - - *outvar = 0; - return; -} - -static long GetValuel(char *src, char *name) { - char *tmp = strstr(src, name); - if (tmp != NULL) { - tmp += strlen(name); - while ((*tmp == ' ') || (*tmp == '=')) tmp++; - if (*tmp != '\n') return atol(tmp); - } - return 0; -} - -static boolean GetValueb(char *src, char *name) { - char *tmp = strstr(src, name); - if (tmp != NULL) { - tmp += strlen(name); - while ((*tmp == ' ') || (*tmp == '=')) tmp++; - if (*tmp != '\n') return (atoi(tmp) != 0); - } - return FALSE; -} - -#define SetValue(name, var) \ - fprintf(f, "%s = %s\n", name, var); - -#define SetValuel(name, var) \ - fprintf(f, "%s = %x\n", name, var); - -#define SetValueb(name, var) \ - fprintf(f, "%s = %d\n", name, (var) ? 1 : 0); - -int LoadConfig(PcsxConfig *Conf) { - struct stat buf; - FILE *f; - int size; - char *data; - - /* TODO local var called cfgfile */ - - // Ryan says: use dotdir, dotdir is GOOD - // No giant homedir names - strncpy(cfgfile, getenv("HOME"), 200); - strcat(cfgfile, PCSX_DOT_DIR); - - // proceed to load the cfg file - // append its name - strcat(cfgfile, cfgfile_basename); - - // file is now ~/.pcsx/pcsx.cfg (or whatever cfgfile_basename is) - if (stat(cfgfile, &buf) == -1) { - // the config file doesn't exist! - /* TODO Error checking? */ - printf("Configuration file %s couldn't be found\n", cfgfile); - return -1; - } - - size = buf.st_size; - - /* TODO Error checking for the next two lines, and at least log failures */ - f = fopen(cfgfile, "r"); - if (f == NULL) return -1; - - data = (char *)malloc(size + 1); - if (data == NULL) return -1; - - fread(data, 1, buf.st_size, f); - fclose(f); - - data[size] = '\0'; - - GetValue(data, "Bios", Config.Bios); - GetValue(data, "Gpu", Config.Gpu); - GetValue(data, "Spu", Config.Spu); - GetValue(data, "Cdr", Config.Cdr); - GetValue(data, "Pad1", Config.Pad1); - GetValue(data, "Pad2", Config.Pad2); - GetValue(data, "Net", Config.Net); - GetValue(data, "Mcd1", Config.Mcd1); - GetValue(data, "Mcd2", Config.Mcd2); - GetValue(data, "BiosDir", Config.BiosDir); - GetValue(data, "PluginsDir", Config.PluginsDir); - - Config.Xa = GetValueb(data, "Xa"); - Config.Sio = GetValueb(data, "Sio"); - Config.Mdec = GetValueb(data, "Mdec"); - Config.PsxAuto = GetValueb(data, "PsxAuto"); - Config.Cdda = GetValueb(data, "Cdda"); - Config.Debug = GetValueb(data, "Dbg"); - Config.PsxOut = GetValueb(data, "PsxOut"); - Config.SpuIrq = GetValueb(data, "SpuIrq"); - Config.RCntFix = GetValueb(data, "RCntFix"); - Config.VSyncWA = GetValueb(data, "VSyncWA"); - - Config.Cpu = GetValuel(data, "Cpu"); - Config.PsxType = GetValuel(data, "PsxType"); - - free(data); - - return 0; -} - -void SaveConfig() { - FILE *f; - - /* TODO Error checking for the next two lines, and at least log - failures - suggest a file dialog to specify a new file or - create a new file */ - f = fopen(cfgfile, "w"); - if (f == NULL) return; - - SetValue("Bios", Config.Bios); - SetValue("Gpu", Config.Gpu); - SetValue("Spu", Config.Spu); - SetValue("Cdr", Config.Cdr); - SetValue("Net", Config.Net); - SetValue("Pad1", Config.Pad1); - SetValue("Pad2", Config.Pad2); - SetValue("Mcd1", Config.Mcd1); - SetValue("Mcd2", Config.Mcd2); - SetValue("BiosDir", Config.BiosDir); - SetValue("PluginsDir", Config.PluginsDir); - - SetValueb("Xa", Config.Xa); - SetValueb("Sio", Config.Sio); - SetValueb("Mdec", Config.Mdec); - SetValueb("PsxAuto", Config.PsxAuto); - SetValueb("Cdda", Config.Cdda); - SetValueb("Dbg", Config.Debug); - SetValueb("PsxOut", Config.PsxOut); - SetValueb("SpuIrq", Config.SpuIrq); - SetValueb("RCntFix", Config.RCntFix); - SetValueb("VSyncWA", Config.VSyncWA); - - SetValuel("Cpu", Config.Cpu); - SetValuel("PsxType", Config.PsxType); - - fclose(f); -} -- 2.39.2