X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/1fbb0680d5935d6217a1110f02756229a42f5fb2..b182e5d58190f834c2dc49e777cdc12e38a60c00:/midend.c diff --git a/midend.c b/midend.c index 249fb2b..250a479 100644 --- 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; @@ -212,7 +212,7 @@ static void midend_size_new_drawstate(midend *me) } } -void midend_size(midend *me, int *x, int *y, int expand) +void midend_size(midend *me, int *x, int *y, int user_size) { int min, max; int rx, ry; @@ -230,11 +230,14 @@ void midend_size(midend *me, int *x, int *y, int expand) /* * Find the tile size that best fits within the given space. If - * `expand' is TRUE, we must actually find the _largest_ such - * tile size; otherwise, we bound above at the game's preferred - * tile size. + * `user_size' is TRUE, we must actually find the _largest_ such + * tile size, in order to get as close to the user's explicit + * request as possible; otherwise, we bound above at the game's + * preferred tile size, so that the game gets what it wants + * provided that this doesn't break the constraint from the + * front-end (which is likely to be a screen size or similar). */ - if (expand) { + if (user_size) { max = 1; do { max *= 2; @@ -264,6 +267,9 @@ void midend_size(midend *me, int *x, int *y, int expand) */ me->tilesize = min; + if (user_size) + /* If the user requested a change in size, make it permanent. */ + me->preferred_tilesize = me->tilesize; midend_size_new_drawstate(me); *x = me->winwidth; *y = me->winheight; @@ -550,6 +556,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 +585,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 +697,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 +746,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 +773,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 +788,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 +820,6 @@ float *midend_colours(midend *me, int *ncolours) } } - if (me->nstates == 0) - me->ourgame->free_game(state); - return ret; } @@ -905,7 +912,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 +1221,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,