Patch from Ben Hutchings to allow user-initiated tilesize changes to persist
[sgt/puzzles] / midend.c
index 249fb2b..d0bc950 100644 (file)
--- a/midend.c
+++ b/midend.c
@@ -126,7 +126,7 @@ midend *midend_new(frontend *fe, const game *ourgame,
     me->elapsed = 0.0F;
     me->tilesize = me->winwidth = me->winheight = 0;
     if (drapi)
-       me->drawing = drawing_init(drapi, drhandle);
+       me->drawing = drawing_new(drapi, me, drhandle);
     else
        me->drawing = NULL;
 
@@ -264,6 +264,8 @@ void midend_size(midend *me, int *x, int *y, int expand)
      */
 
     me->tilesize = min;
+    if (expand)
+        me->preferred_tilesize = me->tilesize;
     midend_size_new_drawstate(me);
     *x = me->winwidth;
     *y = me->winheight;
@@ -550,6 +552,7 @@ static int midend_really_process_key(midend *me, int x, int y, int button)
              * state has been updated and a redraw is called for.
              */
             midend_redraw(me);
+            midend_set_timer(me);
             goto done;
         } else if (s) {
            midend_stop_anim(me);
@@ -578,7 +581,7 @@ static int midend_really_process_key(midend *me, int x, int y, int button)
      * See if this move requires an animation.
      */
     if (special(type) && !(type == SOLVE &&
-                          (me->ourgame->mouse_priorities & SOLVE_ANIMATES))) {
+                          (me->ourgame->flags & SOLVE_ANIMATES))) {
         anim_time = 0;
     } else {
         anim_time = me->ourgame->anim_length(oldstate,
@@ -690,7 +693,7 @@ int midend_process_key(midend *me, int x, int y, int button)
         * If the new button has lower priority than the old one,
         * don't bother doing this.
         */
-       if (me->ourgame->mouse_priorities &
+       if (me->ourgame->flags &
            BUTTON_BEATS(me->pressed_mouse_button, button))
            return ret;                /* just ignore it */
 
@@ -739,8 +742,21 @@ void midend_redraw(midend *me)
     }
 }
 
+/*
+ * Nasty hacky function used to implement the --redo option in
+ * gtk.c. Only used for generating the puzzles' icons.
+ */
+void midend_freeze_timer(midend *me, float tprop)
+{
+    me->anim_pos = me->anim_time * tprop;
+    midend_redraw(me);
+    deactivate_timer(me->frontend);
+}
+
 void midend_timer(midend *me, float tplus)
 {
+    int need_redraw = (me->anim_time > 0 || me->flash_time > 0);
+
     me->anim_pos += tplus;
     if (me->anim_pos >= me->anim_time ||
         me->anim_time == 0 || !me->oldstate) {
@@ -753,7 +769,8 @@ void midend_timer(midend *me, float tplus)
        me->flash_pos = me->flash_time = 0;
     }
 
-    midend_redraw(me);
+    if (need_redraw)
+        midend_redraw(me);
 
     if (me->timing) {
        float oldelapsed = me->elapsed;
@@ -767,20 +784,9 @@ void midend_timer(midend *me, float tplus)
 
 float *midend_colours(midend *me, int *ncolours)
 {
-    game_state *state = NULL;
     float *ret;
 
-    if (me->nstates == 0) {
-       char *aux = NULL;
-        char *desc = me->ourgame->new_desc(me->params, me->random,
-                                          &aux, TRUE);
-        state = me->ourgame->new_game(me, me->params, desc);
-        sfree(desc);
-        sfree(aux);
-    } else
-        state = me->states[0].state;
-
-    ret = me->ourgame->colours(me->frontend, state, ncolours);
+    ret = me->ourgame->colours(me->frontend, ncolours);
 
     {
         int i;
@@ -810,9 +816,6 @@ float *midend_colours(midend *me, int *ncolours)
         }
     }
 
-    if (me->nstates == 0)
-        me->ourgame->free_game(state);
-
     return ret;
 }
 
@@ -905,7 +908,7 @@ void midend_fetch_preset(midend *me, int n,
 
 int midend_wants_statusbar(midend *me)
 {
-    return me->ourgame->wants_statusbar();
+    return me->ourgame->wants_statusbar;
 }
 
 void midend_supersede_game_desc(midend *me, char *desc, char *privdesc)
@@ -1214,7 +1217,7 @@ char *midend_solve(midend *me)
                                    me->states[me->statepos-2].state,
                                    me->states[me->statepos-1].state);
     me->dir = +1;
-    if (me->ourgame->mouse_priorities & SOLVE_ANIMATES) {
+    if (me->ourgame->flags & SOLVE_ANIMATES) {
        me->oldstate = me->ourgame->dup_game(me->states[me->statepos-2].state);
         me->anim_time =
            me->ourgame->anim_length(me->states[me->statepos-2].state,