+void midend_restart_game(midend_data *me)
+{
+ game_state *s;
+
+ assert(me->statepos >= 1);
+ if (me->statepos == 1)
+ return; /* no point doing anything at all! */
+
+ s = me->ourgame->dup_game(me->states[0].state);
+
+ /*
+ * 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);
+ ensure(me);
+ me->states[me->nstates].state = s;
+ me->states[me->nstates].special = TRUE; /* we just restarted */
+ me->statepos = ++me->nstates;
+ me->anim_time = 0.0;
+ midend_finish_move(me);
+ midend_redraw(me);
+ activate_timer(me->frontend);
+}
+