return me;
}
+static void midend_purge_states(midend *me)
+{
+ while (me->nstates > me->statepos) {
+ me->ourgame->free_game(me->states[--me->nstates].state);
+ if (me->states[me->nstates].movestr)
+ sfree(me->states[me->nstates].movestr);
+ }
+}
+
static void midend_free_game(midend *me)
{
while (me->nstates > 0) {
me->pressed_mouse_button = 0;
}
+int midend_can_undo(midend *me)
+{
+ return (me->statepos > 1);
+}
+
+int midend_can_redo(midend *me)
+{
+ return (me->statepos < me->nstates);
+}
+
static int midend_undo(midend *me)
{
if (me->statepos > 1) {
* Now enter the restarted state as the next move.
*/
midend_stop_anim(me);
- while (me->nstates > me->statepos)
- me->ourgame->free_game(me->states[--me->nstates].state);
+ midend_purge_states(me);
ensure(me);
me->states[me->nstates].state = s;
me->states[me->nstates].movestr = dupstr(me->desc);
goto done;
} else if (s) {
midend_stop_anim(me);
- while (me->nstates > me->statepos)
- me->ourgame->free_game(me->states[--me->nstates].state);
+ midend_purge_states(me);
ensure(me);
assert(movestr != NULL);
me->states[me->nstates].state = s;
* Now enter the solved state as the next move.
*/
midend_stop_anim(me);
- while (me->nstates > me->statepos) {
- me->ourgame->free_game(me->states[--me->nstates].state);
- if (me->states[me->nstates].movestr)
- sfree(me->states[me->nstates].movestr);
- }
+ midend_purge_states(me);
ensure(me);
me->states[me->nstates].state = s;
me->states[me->nstates].movestr = movestr;
return NULL;
}
+int midend_is_solved(midend *me)
+{
+ /*
+ * We should probably never be called when the state stack has no
+ * states on it at all - ideally, midends should never be left in
+ * that state for long enough to get put down and forgotten about.
+ * But if we are, I think we return _true_ - pedantically speaking
+ * a midend in that state is 'vacuously solved', and more
+ * practically, a user whose midend has been left in that state
+ * probably _does_ want the 'new game' option to be prominent.
+ */
+ return (me->statepos == 0 ||
+ me->ourgame->is_solved(me->states[me->statepos-1].state));
+}
+
char *midend_rewrite_statusbar(midend *me, char *text)
{
/*