chiark / gitweb /
Replace fe->preset_menu when we change midend.
authorSimon Tatham <anakin@pobox.com>
Wed, 12 Dec 2018 22:18:00 +0000 (22:18 +0000)
committerSimon Tatham <anakin@pobox.com>
Wed, 12 Dec 2018 22:18:00 +0000 (22:18 +0000)
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.

windows.c

index 9994081e081fbea736ffc954258a7d06f1ff0b0d..38559c5454a588f767ab9c30527ec6cbed2a3a61 100644 (file)
--- 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;
         }