aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2018-12-12 22:18:00 +0000
committerSimon Tatham <anakin@pobox.com>2018-12-12 22:18:00 +0000
commitced51ada363d895eee796dd03923042f97f95321 (patch)
tree9f14c89721066a7b896f73caedf3d303535cb0be
parent0a5d13bcd5e6a88418abaf528d9d529ced7dfb9c (diff)
downloadpuzzles-ced51ada363d895eee796dd03923042f97f95321.zip
puzzles-ced51ada363d895eee796dd03923042f97f95321.tar.gz
puzzles-ced51ada363d895eee796dd03923042f97f95321.tar.bz2
puzzles-ced51ada363d895eee796dd03923042f97f95321.tar.xz
Replace fe->preset_menu when we change midend.
Thanks to Rocco Matano for reporting that in the -DCOMBINED version of the Windows front end, switching games causes a crash because the presets menu from the old midend is still left over in fe, and its presence inhibits the setup code from making a new one. Now we throw it out at the same time as we throw out the old midend itself. Also, the condition 'if (!fe->preset_menu)' was misguided. I think the point of that was to avoid pointlessly tearing down and rebuilding the preset menu when we're _not_ changing game - but that's a cost too small to worry about if it causes the slightest trouble. Now fe->preset_menu should always be NULL at that point in the function, so I've replaced the if with an assert.
-rw-r--r--windows.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/windows.c b/windows.c
index 9994081..38559c5 100644
--- a/windows.c
+++ b/windows.c
@@ -1719,7 +1719,11 @@ static int fe_set_midend(frontend *fe, midend *me)
int x, y;
RECT r;
- if (fe->me) midend_free(fe->me);
+ if (fe->me) {
+ midend_free(fe->me);
+ fe->preset_menu = NULL;
+ sfree(fe->preset_menuitems);
+ }
fe->me = me;
fe->game = midend_which_game(fe->me);
@@ -1847,12 +1851,14 @@ static int fe_set_midend(frontend *fe, midend *me)
AppendMenu(menu, MF_ENABLED, IDM_SEED, TEXT("Rando&m Seed..."));
#endif
- if (!fe->preset_menu) {
+ assert(!fe->preset_menu);
+
+ fe->preset_menu = midend_get_presets(
+ fe->me, &fe->n_preset_menuitems);
+ fe->preset_menuitems = snewn(fe->n_preset_menuitems,
+ struct preset_menuitemref);
+ {
int i;
- fe->preset_menu = midend_get_presets(
- fe->me, &fe->n_preset_menuitems);
- fe->preset_menuitems = snewn(fe->n_preset_menuitems,
- struct preset_menuitemref);
for (i = 0; i < fe->n_preset_menuitems; i++)
fe->preset_menuitems[i].which_menu = NULL;
}