diff options
| author | Simon Tatham <anakin@pobox.com> | 2015-10-03 12:27:47 +0100 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2015-10-03 16:07:01 +0100 |
| commit | 8b491946ef0d7f34b310faf5bf484f5a419887a2 (patch) | |
| tree | f43595f7f546cb29e420058c006183920f284244 /gtk.c | |
| parent | f9027226a05b6e2fc49d0256262edc6cc3a8c569 (diff) | |
| download | puzzles-8b491946ef0d7f34b310faf5bf484f5a419887a2.zip puzzles-8b491946ef0d7f34b310faf5bf484f5a419887a2.tar.gz puzzles-8b491946ef0d7f34b310faf5bf484f5a419887a2.tar.bz2 puzzles-8b491946ef0d7f34b310faf5bf484f5a419887a2.tar.xz | |
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.
Diffstat (limited to 'gtk.c')
| -rw-r--r-- | gtk.c | 30 |
1 files changed, 18 insertions, 12 deletions
@@ -1199,18 +1199,24 @@ static gint configure_area(GtkWidget *widget, frontend *fe = (frontend *)data; int x, y; - if (backing_store_ok(fe)) - teardown_backing_store(fe); - - 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; - - setup_backing_store(fe); + x = event->width; + y = event->height; + + if (x != fe->w || y != fe->h || !backing_store_ok(fe)) { + if (backing_store_ok(fe)) + teardown_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; |