Cleanup: relieve frontends of the duty to call

midend_rewrite_statusbar() and check the result against the last
string returned. This is now done centrally in drawing.c, and the
front end status bar function need only do what it says on the tin.

While I'm modifying the prototype of drawing_init(), I've also
renamed it drawing_new() for the same reason as random_new() (it
_allocates_ a drawing object, rather than just initialising one
passed in).

[originally from svn r6420]
This commit is contained in:
Simon Tatham
2005-10-22 17:23:55 +00:00
parent a3b837c698
commit 240b6cab8c
7 changed files with 65 additions and 80 deletions

View File

@ -1863,6 +1863,11 @@ with the drawing API the property that it may only be called from
within the back end redraw function, so this is as good a place as
any to document it.)
The supplied text is filtered through the mid-end for optional
rewriting before being passed on to the front end; the mid-end will
prepend the current game time if the game is timed (and may in
future perform other rewriting if it seems like a good idea).
This function is for drawing only; it must never be called during
printing.
@ -2068,7 +2073,7 @@ structure called \c{drawing_api}. Each of the functions takes a
a more useful type. Thus, a drawing \e{object} (\c{drawing *)}
suitable for passing to the back end redraw or printing functions
is constructed by passing a \c{drawing_api} and a \cq{void *} to the
function \cw{drawing_init()} (see \k{drawing-init}).
function \cw{drawing_new()} (see \k{drawing-new}).
\S{drawingapi-draw-text} \cw{draw_text()}
@ -2167,19 +2172,9 @@ called unless drawing is attempted.
This function behaves exactly like the back end \cw{status_bar()}
function; see \k{drawing-status-bar}.
Front ends implementing this function should not use the provided
text directly; they should call \cw{midend_rewrite_statusbar()}
(\k{midend-rewrite-statusbar}) to process it first.
In a game which has a timer, this function is likely to be called
every time the timer goes off, i.e. many times a second. It is
therefore likely to be common that this function is called with
precisely the same text as the last time it was called. Front ends
may well wish to detect this common case and avoid bothering to do
anything. If they do, however, they \e{must} perform this check on
the value \e{returned} from \cw{midend_rewrite_statusbar()}, rather
than the value passed in to it (because the mid-end will frequently
update the status-bar timer without the back end's intervention).
Front ends implementing this function need not worry about it being
called repeatedly with the same text; the middleware code in
\cw{status_bar()} will take care of this.
Implementations of this API which do not provide drawing services
may define this function pointer to be \cw{NULL}; it will never be
@ -2351,15 +2346,23 @@ There are a small number of functions provided in \cw{drawing.c}
which the front end needs to \e{call}, rather than helping to
implement. They are described in this section.
\S{drawing-init} \cw{drawing_init()}
\S{drawing-new} \cw{drawing_new()}
\c drawing *drawing_init(const drawing_api *api, void *handle);
\c drawing *drawing_new(const drawing_api *api, midend *me,
\c void *handle);
This function creates a drawing object. It is passed a
\c{drawing_api}, which is a structure containing nothing but
function pointers; and also a \cq{void *} handle. The handle is
passed back to each function pointer when it is called.
The \c{midend} parameter is used for rewriting the status bar
contents: \cw{status_bar()} (see \k{drawing-status-bar}) has to call
a function in the mid-end which might rewrite the status bar text.
If the drawing object is to be used only for printing, or if the
game is known not to call \cw{status_bar()}, this parameter may be
\cw{NULL}.
\S{drawing-free} \cw{drawing_free()}
\c void drawing_free(drawing *dr);
@ -2412,7 +2415,7 @@ calling back to functions such as \cw{activate_timer()}
function \cw{colours()} (\k{backend-colours}).
The parameters \c{drapi} and \c{drhandle} are passed to
\cw{drawing_init()} (\k{drawing-init}) to construct a drawing object
\cw{drawing_new()} (\k{drawing-new}) to construct a drawing object
which will be passed to the back end function \cw{redraw()}
(\k{backend-redraw}). Hence, all drawing-related function pointers
defined in \c{drapi} can expect to be called with \c{drhandle} as
@ -2798,32 +2801,6 @@ The front end can expect its drawing API and/or
\cw{activate_timer()} to be called from within a call to this
function.
\H{midend-rewrite-statusbar} \cw{midend_rewrite_statusbar()}
\c char *midend_rewrite_statusbar(midend *me, char *text);
The front end should call this function from within
\cw{status_bar()} (\k{drawing-status-bar}). It should be passed the
string that was passed by the back end to \cw{status_bar()}; it will
return a dynamically allocated string adjusted by the mid-end.
(Specifically, adjusted to include the timer if the game is a timed
one.) The returned value should be placed in the actual status bar
in place of the input value.
(This is a nasty piece of architecture; I apologise for it. It would
seem a lot more pleasant to have the back end pass its status bar
text to the mid-end, which in turn would rewrite it and pass it on
to the front end, so that each front end needed to do nothing
strange. The main reason why I haven't done this is because it means
the back end redraw function would need to be passed a mid-end
pointer \e{as well} as a front end pointer, which seemed like an
excessive proliferation of opaque handles. The only way to avoid
that proliferation would be to have all the drawing API functions
also gatewayed through the mid-end, and that seemed like an
excessive proliferation of wrapper functions. The current setup
isn't nice, but it has minimal impact and I'm unconvinced that any
of the other options are an improvement.)
\H{midend-serialise} \cw{midend_serialise()}
\c void midend_serialise(midend *me,