shithub: puzzles

Download patch

ref: 2698fc9e9e29b9ef5578bf79bd4059616d9667d8
parent: ee429c13cd91a43609eb4688c7a20b5c5056662f
author: Simon Tatham <anakin@pobox.com>
date: Tue May 31 04:50:42 EDT 2005

GTK misfires timers at inconvenient moments, sometimes causing a new
puzzle of a different size to be redrawn before the pixmap is
resized, and since backends never redraw already-drawn stuff this is
a problem. Was biting me when I entered a Mines game ID of a
different size than the current settings into the Specific box.

[originally from svn r5872]

--- a/gtk.c
+++ b/gtk.c
@@ -468,7 +468,7 @@
     gdk_draw_rectangle(fe->pixmap, gc, 1, 0, 0, fe->w, fe->h);
     gdk_gc_unref(gc);
 
-    midend_redraw(fe->me);
+    midend_force_redraw(fe->me);
 
     return TRUE;
 }
--- a/midend.c
+++ b/midend.c
@@ -132,6 +132,14 @@
 	deactivate_timer(me->frontend);
 }
 
+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_redraw(me);
+}
+
 void midend_new_game(midend_data *me)
 {
     while (me->nstates > 0)
--- a/puzzles.h
+++ b/puzzles.h
@@ -131,6 +131,7 @@
 void midend_new_game(midend_data *me);
 void midend_restart_game(midend_data *me);
 int midend_process_key(midend_data *me, int x, int y, int button);
+void midend_force_redraw(midend_data *me);
 void midend_redraw(midend_data *me);
 float *midend_colours(midend_data *me, int *ncolours);
 void midend_timer(midend_data *me, float tplus);