Skip to content

Commit 68a5768

Browse files
authored
Fix saving config in web version (wasm) (#2909)
* Fix saving config in web version (wasm) [Gemini] The Emscripten logic in src/system/sdl/main.c was using an uninitialized internal variable FS.syncFSRequests to decide when to sync the in-memory filesystem to the browser's persistent storage (IDBFS). Since this variable was always undefined, the sync was never triggered, causing all changes (including settings) to be lost upon refreshing or closing the page. * Save settings when exiting menu * Makes a distinction between saveConfigCart and saveOptions * Changed position of functions (saveOptions and initConfig) to pass compilation * Simplify by saving just "onBackFromOptionsMenu" * rebuild
1 parent 2a60190 commit 68a5768

7 files changed

Lines changed: 69 additions & 45 deletions

File tree

src/studio/config.c

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ static void reset(Config* config)
140140
saveConfig(config, true);
141141
}
142142

143-
static void save(Config* config)
143+
static void saveConfigCart(Config* config)
144144
{
145145
*config->cart = config->tic->cart;
146146
readConfig(config);
@@ -192,44 +192,6 @@ static void loadOptions(Config* config)
192192
}
193193
}
194194

195-
void initConfig(Config* config, Studio* studio, tic_fs* fs)
196-
{
197-
*config = (Config)
198-
{
199-
.studio = studio,
200-
.tic = getMemory(studio),
201-
.cart = realloc(config->cart, sizeof(tic_cartridge)),
202-
.save = save,
203-
.reset = reset,
204-
.fs = fs,
205-
};
206-
207-
setDefault(config);
208-
209-
// read config.tic
210-
{
211-
s32 size = 0;
212-
u8* data = (u8*)tic_fs_loadroot(fs, CONFIG_TIC_PATH, &size);
213-
214-
if(data)
215-
{
216-
update(config, data, size);
217-
218-
free(data);
219-
}
220-
else saveConfig(config, false);
221-
}
222-
223-
loadOptions(config);
224-
225-
#if defined(__TIC_LINUX__)
226-
// do not load fullscreen option on Linux
227-
config->data.options.fullscreen = false;
228-
#endif
229-
230-
tic_api_reset(config->tic);
231-
}
232-
233195
static string data2str(const void* data, s32 size)
234196
{
235197
string res;
@@ -287,6 +249,45 @@ static void saveOptions(Config* config)
287249
tic_fs_saveroot(config->fs, OptionsJsonPath, buf.data, strlen(buf.data), true);
288250
}
289251

252+
void initConfig(Config* config, Studio* studio, tic_fs* fs)
253+
{
254+
*config = (Config)
255+
{
256+
.studio = studio,
257+
.tic = getMemory(studio),
258+
.cart = realloc(config->cart, sizeof(tic_cartridge)),
259+
.saveConfigCart = saveConfigCart,
260+
.saveOptions = saveOptions,
261+
.reset = reset,
262+
.fs = fs,
263+
};
264+
265+
setDefault(config);
266+
267+
// read config.tic
268+
{
269+
s32 size = 0;
270+
u8* data = (u8*)tic_fs_loadroot(fs, CONFIG_TIC_PATH, &size);
271+
272+
if(data)
273+
{
274+
update(config, data, size);
275+
276+
free(data);
277+
}
278+
else saveConfig(config, false);
279+
}
280+
281+
loadOptions(config);
282+
283+
#if defined(__TIC_LINUX__)
284+
// do not load fullscreen option on Linux
285+
config->data.options.fullscreen = false;
286+
#endif
287+
288+
tic_api_reset(config->tic);
289+
}
290+
290291
void freeConfig(Config* config)
291292
{
292293
saveOptions(config);

src/studio/config.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ struct Config
3535
StudioConfig data;
3636
tic_cartridge* cart;
3737

38-
void(*save)(Config*);
38+
void(*saveConfigCart)(Config*);
39+
void(*saveOptions)(Config*);
3940
void(*reset)(Config*);
4041
};
4142

src/studio/screens/console.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2493,7 +2493,7 @@ static CartSaveResult saveCartName(Console* console, const char* name)
24932493
{
24942494
if(strcmp(name, CONFIG_TIC_PATH) == 0)
24952495
{
2496-
console->config->save(console->config);
2496+
console->config->saveConfigCart(console->config);
24972497
studioRomSaved(console->studio);
24982498
free(buffer);
24992499
return CART_SAVE_OK;

src/studio/screens/mainmenu.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct StudioMainMenu
5050
.count = COUNT_OF(((const char*[])__VA_ARGS__))
5151

5252
static void showMainMenu(void* data, s32 pos);
53+
static void onBackFromOptionsMenu(void* data, s32 pos);
5354

5455
StudioMainMenu* studio_mainmenu_init(Menu *menu, Config *config)
5556
{
@@ -330,7 +331,7 @@ static const MenuItem OptionMenu[] =
330331
#endif
331332
{"SETUP GAMEPAD", showGamepadMenu},
332333
{""},
333-
{"BACK", showMainMenu, .back = true},
334+
{"BACK", onBackFromOptionsMenu, .back = true},
334335
};
335336

336337
static void showOptionsMenu(void* data, s32 pos);
@@ -441,6 +442,15 @@ static inline s32 mainMenuOffset(StudioMainMenu* menu)
441442
return 1;
442443
}
443444

445+
static void onBackFromOptionsMenu(void* data, s32 pos)
446+
{
447+
StudioMainMenu* main = data;
448+
Config* config = studio_config_get(main->studio);
449+
config->saveOptions(config);
450+
451+
showMainMenu(data, pos);
452+
}
453+
444454
static void onResumeGame(void* data, s32 pos)
445455
{
446456
StudioMainMenu* main = data;
@@ -518,7 +528,7 @@ static void showOptionsMenuPos(void* data, s32 pos)
518528
StudioMainMenu* main = data;
519529

520530
s32 offset = mainMenuOffset(main);
521-
studio_menu_init(main->menu, OptionMenu, COUNT_OF(OptionMenu), pos, MainMenu_Options - offset, showMainMenu, main);
531+
studio_menu_init(main->menu, OptionMenu, COUNT_OF(OptionMenu), pos, MainMenu_Options - offset, onBackFromOptionsMenu, main);
522532
}
523533

524534
static void showOptionsMenu(void* data, s32 pos)

src/studio/studio.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,11 @@ const StudioConfig* getConfig(Studio* studio)
711711
return studio_config(studio);
712712
}
713713

714+
Config* studio_config_get(Studio* studio)
715+
{
716+
return studio->config;
717+
}
718+
714719
struct Start* getStartScreen(Studio* studio)
715720
{
716721
return studio->start;

src/studio/studio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,9 @@ bool enterWasPressed(Studio* studio);
284284
bool anyKeyWasPressed(Studio* studio);
285285
bool ticEnterWasPressed(tic_mem* tic, s32 hold, s32 period);
286286

287+
typedef struct Config Config;
287288
const StudioConfig* getConfig(Studio* studio);
289+
Config* studio_config_get(Studio* studio);
288290
struct Start* getStartScreen(Studio* studio);
289291
struct Sprite* getSpriteEditor(Studio* studio);
290292

src/system/sdl/main.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1878,10 +1878,14 @@ static void emsGpuTick()
18781878

18791879
EM_ASM(
18801880
{
1881-
if(FS.syncFSRequests == 0 && Module.syncFSRequests)
1881+
if(!Module.syncing && Module.syncFSRequests)
18821882
{
1883+
Module.syncing = true;
18831884
Module.syncFSRequests = 0;
1884-
FS.syncfs(false,function(){});
1885+
FS.syncfs(false, function()
1886+
{
1887+
Module.syncing = false;
1888+
});
18851889
}
18861890
});
18871891

@@ -2150,6 +2154,7 @@ s32 main(s32 argc, char **argv)
21502154
(
21512155
{
21522156
Module.syncFSRequests = 0;
2157+
Module.syncing = false;
21532158

21542159
var dir = UTF8ToString($0);
21552160

0 commit comments

Comments
 (0)