aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-02-02 14:55:16 +0100
committerDavid Robillard <d@drobilla.net>2020-02-02 14:55:16 +0100
commitc1c69abf7bc964b6e2c1c5d5c1ba7f1542dcecc4 (patch)
tree72139763618bfe995d0ffd2402fe42f8b1f47adf
parent0f114d846286355c90df02ef45e9c7e098b71104 (diff)
Only resize backend when necessary
This avoids resizing the backend when the window is only moved, which fixes flicker with Cairo where resizing is expensive.
-rw-r--r--pugl/detail/win.c23
-rw-r--r--pugl/detail/x11.c20
2 files changed, 26 insertions, 17 deletions
diff --git a/pugl/detail/win.c b/pugl/detail/win.c
index 9debb6d..6ef9255 100644
--- a/pugl/detail/win.c
+++ b/pugl/detail/win.c
@@ -435,20 +435,25 @@ handleConfigure(PuglView* view, PuglEvent* event)
(LPPOINT)&rect,
2);
- view->frame.x = rect.left;
- view->frame.y = rect.top;
- view->frame.width = rect.right - rect.left;
- view->frame.height = rect.bottom - rect.top;
+ const LONG width = rect.right - rect.left;
+ const LONG height = rect.bottom - rect.top;
+
+ view->frame.x = rect.left;
+ view->frame.y = rect.top;
event->configure.type = PUGL_CONFIGURE;
event->configure.x = view->frame.x;
event->configure.y = view->frame.y;
- event->configure.width = view->frame.width;
- event->configure.height = view->frame.height;
+ event->configure.width = width;
+ event->configure.height = height;
+
+ if (view->frame.width != width || view->frame.height != height) {
+ view->frame.width = width;
+ view->frame.height = height;
+
+ view->backend->resize(view, width, height);
+ }
- view->backend->resize(view,
- rect.right - rect.left,
- rect.bottom - rect.top);
return rect;
}
diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c
index 49c843b..4099553 100644
--- a/pugl/detail/x11.c
+++ b/pugl/detail/x11.c
@@ -648,14 +648,18 @@ flushPendingConfigure(PuglView* view)
PuglEvent* const configure = &view->impl->pendingConfigure;
if (configure->type) {
- view->frame.x = configure->configure.x;
- view->frame.y = configure->configure.y;
- view->frame.width = configure->configure.width;
- view->frame.height = configure->configure.height;
-
- view->backend->resize(view,
- (int)view->frame.width,
- (int)view->frame.height);
+ view->frame.x = configure->configure.x;
+ view->frame.y = configure->configure.y;
+
+ if (configure->configure.width != view->frame.width ||
+ configure->configure.height != view->frame.height) {
+ view->frame.width = configure->configure.width;
+ view->frame.height = configure->configure.height;
+
+ view->backend->resize(view,
+ (int)view->frame.width,
+ (int)view->frame.height);
+ }
view->eventFunc(view, configure);
configure->type = 0;