shithub: puzzles

Download patch

ref: 8b491946ef0d7f34b310faf5bf484f5a419887a2
parent: f9027226a05b6e2fc49d0256262edc6cc3a8c569
author: Simon Tatham <anakin@pobox.com>
date: Sat Oct 3 08:27:47 EDT 2015

Don't refresh backing store on a no-op configure event.

Sometimes, we can get a "configure_area" event telling us that the
drawing area has changed size to the same size it already was. This
can happen when we change puzzle presets in a way that doesn't change
the size, and also sometimes seems to happen as a side effect of
changing the text in the status line.

In that situation, it's a waste of effort - and can cause visible
on-screen flicker - to throw away the window's backing image and
pixmap and regenerate them from scratch. So now we detect a non-resize
and avoid doing all that.

The only thing we retain unconditionally in configure_area is the
midend_force_redraw, because that's the place where a puzzle redraw is
forced when changing presets or loading a new game.

--- a/gtk.c
+++ b/gtk.c
@@ -1199,18 +1199,24 @@
     frontend *fe = (frontend *)data;
     int x, y;
 
-    if (backing_store_ok(fe))
-	teardown_backing_store(fe);
+    x = event->width;
+    y = event->height;
 
-    x = fe->w = event->width;
-    y = fe->h = event->height;
-    midend_size(fe->me, &x, &y, TRUE);
-    fe->pw = x;
-    fe->ph = y;
-    fe->ox = (fe->w - fe->pw) / 2;
-    fe->oy = (fe->h - fe->ph) / 2;
+    if (x != fe->w || y != fe->h || !backing_store_ok(fe)) {
+        if (backing_store_ok(fe))
+            teardown_backing_store(fe);
 
-    setup_backing_store(fe);
+        fe->w = x;
+        fe->h = y;
+        midend_size(fe->me, &x, &y, TRUE);
+        fe->pw = x;
+        fe->ph = y;
+        fe->ox = (fe->w - fe->pw) / 2;
+        fe->oy = (fe->h - fe->ph) / 2;
+
+        setup_backing_store(fe);
+    }
+
     midend_force_redraw(fe->me);
 
     return TRUE;