From 56dc7b62ab3109aa1e2815998779b42cfec52ae8 Mon Sep 17 00:00:00 2001 From: "simon.kagstrom" Date: Sat, 10 Jan 2009 09:32:58 +0000 Subject: [PATCH] Fixed prefs save/load --- CHANGES.WII | 1 + Src/C64.h | 2 ++ Src/C64_SDL.i | 58 +++++++++++++++++++++++++++++++++------------------ 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/CHANGES.WII b/CHANGES.WII index 10fea3a..31df4cf 100644 --- a/CHANGES.WII +++ b/CHANGES.WII @@ -1,4 +1,5 @@ version 2: + * Fixed some corner-cases in the prefs setting to avoid loosing key bindings etc * Improve keyboard bindings to handle press and release correctly and also both controllers at the same time (key is released when the last controller releases it) diff --git a/Src/C64.h b/Src/C64.h index 295e203..febb274 100644 --- a/Src/C64.h +++ b/Src/C64.h @@ -166,6 +166,8 @@ public: int fake_key_index; int fake_key_keytime; + bool prefs_changed; + void select_disc(Prefs *np); void bind_key(Prefs *np); void display_options(Prefs *np); diff --git a/Src/C64_SDL.i b/Src/C64_SDL.i index 1568cfc..70ac66a 100644 --- a/Src/C64_SDL.i +++ b/Src/C64_SDL.i @@ -77,6 +77,8 @@ void C64::c64_ctor1(void) this->fake_key_keytime = 5; this->fake_key_type = 0; + this->prefs_changed = false; + MENU_SIZE_X = FULL_DISPLAY_X - FULL_DISPLAY_X / 4; MENU_SIZE_Y = FULL_DISPLAY_Y - FULL_DISPLAY_Y / 4; @@ -198,6 +200,7 @@ void C64::select_disc(Prefs *np) NewPrefs(np); ThePrefs = *np; } + this->prefs_changed = true; } menu_fini(&select_disc_menu); @@ -253,10 +256,14 @@ void C64::bind_key(Prefs *np) 32, 32, MENU_SIZE_X, MENU_SIZE_Y); int key = menu_select(real_screen, &key_menu, NULL); + /* Assume prefs are changed */ + this->prefs_changed = true; if (key > 0) np->JoystickKeyBinding[opt] = kcs[key]; else if (key == 0) np->JoystickKeyBinding[opt] = -1; + else + this->prefs_changed = false; menu_fini(&key_menu); } menu_fini(&bind_key_menu); @@ -270,16 +277,19 @@ void C64::display_options(Prefs *np) 32, 32, MENU_SIZE_X, MENU_SIZE_Y); int opt = menu_select(real_screen, &display_menu, NULL); if (opt >= 0) + { np->DisplayOption = opt; + this->prefs_changed = true; + } menu_fini(&display_menu); } void C64::save_load_state(Prefs *np) { - menu_t save_load_menu; - menu_t select_saves_menu; + menu_t save_load_menu; + menu_t select_saves_menu; - menu_init(&save_load_menu, this->menu_font, save_load_state_messages, + menu_init(&save_load_menu, this->menu_font, save_load_state_messages, 32, 32, MENU_SIZE_X, MENU_SIZE_Y); int opt = menu_select(real_screen, &save_load_menu, NULL); switch(opt) @@ -320,17 +330,17 @@ void C64::save_load_state(Prefs *np) else /* Load the snapshot */ this->LoadSnapshot(buf); } - menu_fini(&select_saves_menu); + menu_fini(&select_saves_menu); - /* Cleanup everything */ - for ( int i = 0; file_list[i]; i++ ) - free((void*)file_list[i]); - free(file_list); + /* Cleanup everything */ + for ( int i = 0; file_list[i]; i++ ) + free((void*)file_list[i]); + free(file_list); } break; default: break; } - menu_fini(&save_load_menu); + menu_fini(&save_load_menu); } /* @@ -440,17 +450,19 @@ void C64::VBlank(bool draw_frame) if (this->have_a_break) { int submenus[1]; int opt; + int old_swap = ThePrefs.JoystickSwap == true ? 1 : 0; - Prefs *np = Frodo::reload_prefs(); + Prefs np = ThePrefs; + this->prefs_changed = false; TheSID->PauseSound(); - submenus[0] = np->JoystickSwap == true ? 1 : 0; + submenus[0] = old_swap; opt = menu_select(real_screen, &this->main_menu, submenus); switch(opt) { case 0: /* Insert disc/tape */ - this->select_disc(np); + this->select_disc(&np); break; case 1: /* Load disc/tape */ this->fake_key_sequence = true; @@ -459,15 +471,15 @@ void C64::VBlank(bool draw_frame) Reset(); break; case 3: /* Bind keys to joystick */ - this->bind_key(np); + this->bind_key(&np); break; case 4: /* Display options */ - this->display_options(np); + this->display_options(&np); break; case 5: /* Swap joysticks */ break; case 7: /* Save / load game */ - this->save_load_state(np); + this->save_load_state(&np); break; case 9: /* Quit */ quit_thyself = true; @@ -477,17 +489,23 @@ void C64::VBlank(bool draw_frame) break; } if (submenus[0] == 0) - np->JoystickSwap = false; + np.JoystickSwap = false; else - np->JoystickSwap = true; + np.JoystickSwap = true; + if (submenus[0] != old_swap) + this->prefs_changed = true; - this->NewPrefs(np); - ThePrefs = *np; - ThePrefs.Save(PREFS_PATH); + if (this->prefs_changed) + { + this->NewPrefs(&np); + ThePrefs = np; + } TheDisplay->FakeKeyPress(-1, false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix); this->have_a_break = false; + if (this->quit_thyself) + ThePrefs.Save(PREFS_PATH); } /* From Acorn port */ static uint64_t lastFrame;