shithub: puzzles

Download patch

ref: 52d4dae0a9a997b01d6410b42d1e1c503f039bc1
parent: bb14689b4a555b4b176192d2c3cd02a4c354a37f
author: Simon Tatham <anakin@pobox.com>
date: Sun Mar 31 07:50:46 EDT 2013

Make sure the right element of the game-type dropdown starts off
selected. Previously we were leaving the first element on the list
selected, which is _usually_ right, but not right for Slant.

In the process of doing this, I've also reorganised to fix a crash
which shows up with non-configurable games (admittedly currently only
Nullgame :-) when we still try to call js_select_preset in spite of
not having any preset options to select.

[originally from svn r9794]

--- a/emcc.c
+++ b/emcc.c
@@ -504,7 +504,16 @@
  */
 static game_params **presets;
 static int custom_preset;
+int have_presets_dropdown;
 
+void select_appropriate_preset(void)
+{
+    if (have_presets_dropdown) {
+        int preset = midend_which_preset(me);
+        js_select_preset(preset < 0 ? custom_preset : preset);
+    }
+}
+
 static config_item *cfg = NULL;
 static int cfg_which;
 
@@ -578,9 +587,7 @@
              * New settings are fine; start a new game and close the
              * dialog.
              */
-            int preset = midend_which_preset(me);
-            js_select_preset(preset < 0 ? custom_preset : preset);
-
+            select_appropriate_preset();
             midend_new_game(me);
             resize();
             midend_redraw(me);
@@ -602,8 +609,7 @@
          * js_add_preset in emcclib.js - so you won't even be able to
          * select Custom without a faffy workaround.)
          */
-        int preset = midend_which_preset(me);
-        js_select_preset(preset < 0 ? custom_preset : preset);
+        select_appropriate_preset();
 
         free_cfg(cfg);
         js_dialog_cleanup();
@@ -738,16 +744,34 @@
      * it's selected.
      */
     custom_preset = midend_num_presets(me);
-    presets = snewn(custom_preset, game_params *);
-    for (i = 0; i < custom_preset; i++) {
-        char *name;
-        midend_fetch_preset(me, i, &name, &presets[i]);
-        js_add_preset(name);
-    }
-    if (thegame.can_configure)
-        js_add_preset(NULL);           /* the 'Custom' entry in the dropdown */
-    else if (custom_preset == 0)
+    if (custom_preset == 0) {
+        /*
+         * This puzzle doesn't have selectable game types at all.
+         * Completely remove the drop-down list from the page.
+         */
         js_remove_type_dropdown();
+        have_presets_dropdown = FALSE;
+    } else {
+        int preset;
+
+        presets = snewn(custom_preset, game_params *);
+        for (i = 0; i < custom_preset; i++) {
+            char *name;
+            midend_fetch_preset(me, i, &name, &presets[i]);
+            js_add_preset(name);
+        }
+        if (thegame.can_configure)
+            js_add_preset(NULL);   /* the 'Custom' entry in the dropdown */
+
+        have_presets_dropdown = TRUE;
+
+        /*
+         * Now ensure the appropriate element of the presets menu
+         * starts off selected, in case it isn't the first one in the
+         * list (e.g. Slant).
+         */
+        select_appropriate_preset();
+    }
 
     /*
      * Remove the Solve button if the game doesn't support it.