All the games in this collection have always defined their graphics

in terms of a constant TILE_SIZE (or equivalent). Here's a
surprisingly small patch which switches this constant into a
run-time variable.

The only observable behaviour change should be on Windows, which
physically does not permit the creation of windows larger than the
screen; if you try to create a puzzle (Net makes this plausible)
large enough to encounter this restriction, the Windows front end
should automatically re-adjust the puzzle's tile size so that it
does fit within the available space.

On GTK, I haven't done this, on the grounds that X _does_ permit
windows larger than the screen, and many X window managers already
provide the means to navigate around such a window. Gareth said he'd
rather navigate around a huge Net window than have it shrunk to fit
on one screen. I'm uncertain that this makes sense for all puzzles -
Pattern in particular strikes me as something that might be better
off shrunk to fit - so I may have to change policy later or make it
configurable.

On OS X, I also haven't done automatic shrinkage to fit on one
screen, largely because I didn't have the courage to address the
question of multiple monitors and what that means for the entire
concept :-)

[originally from svn r5913]
This commit is contained in:
Simon Tatham
2005-06-07 17:57:50 +00:00
parent 69f7e7f8f5
commit 02035753f8
16 changed files with 512 additions and 226 deletions

View File

@ -48,6 +48,8 @@ struct midend_data {
char *laststatus;
int pressed_mouse_button;
int winwidth, winheight;
};
#define ensure(me) do { \
@ -90,6 +92,7 @@ midend_data *midend_new(frontend *fe, const game *ourgame)
me->laststatus = NULL;
me->timing = FALSE;
me->elapsed = 0.0F;
me->winwidth = me->winheight = 0;
sfree(randseed);
@ -134,9 +137,11 @@ void midend_free(midend_data *me)
sfree(me);
}
void midend_size(midend_data *me, int *x, int *y)
void midend_size(midend_data *me, int *x, int *y, int expand)
{
me->ourgame->size(me->params, x, y);
me->ourgame->size(me->params, me->drawstate, x, y, expand);
me->winwidth = *x;
me->winheight = *y;
}
void midend_set_params(midend_data *me, game_params *params)
@ -155,11 +160,18 @@ static void midend_set_timer(midend_data *me)
deactivate_timer(me->frontend);
}
static void midend_size_new_drawstate(midend_data *me)
{
me->ourgame->size(me->params, me->drawstate, &me->winwidth, &me->winheight,
TRUE);
}
void midend_force_redraw(midend_data *me)
{
if (me->drawstate)
me->ourgame->free_drawstate(me->drawstate);
me->drawstate = me->ourgame->new_drawstate(me->states[0].state);
midend_size_new_drawstate(me);
midend_redraw(me);
}
@ -217,6 +229,7 @@ void midend_new_game(midend_data *me)
me->nstates++;
me->statepos = 1;
me->drawstate = me->ourgame->new_drawstate(me->states[0].state);
midend_size_new_drawstate(me);
me->elapsed = 0.0F;
midend_set_timer(me);
if (me->ui)