From 8d8e662f135b01fd7ed67a8f3074f7958dfb28f0 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 22 Jul 2019 17:01:32 +0200 Subject: X11: Improve live resize smoothness This avoids a double context swap when both a configure and expose event arrive in the same loop iteration, which happens often during resize. --- pugl/pugl_x11.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/pugl/pugl_x11.c b/pugl/pugl_x11.c index e0adc31..512a383 100644 --- a/pugl/pugl_x11.c +++ b/pugl/pugl_x11.c @@ -527,16 +527,22 @@ puglProcessEvents(PuglView* view) } } - if (config_event.type) { - // Resize drawing context before dispatching - view->impl->ctx.resize(view, - (int)config_event.configure.width, - (int)config_event.configure.height); - puglDispatchEvent(view, (const PuglEvent*)&config_event); - } + if (config_event.type || expose_event.type) { + puglEnterContext(view); + + if (config_event.type) { + view->width = (int)config_event.configure.width; + view->height = (int)config_event.configure.height; + view->impl->ctx.resize(view, view->width, view->height); + view->eventFunc(view, (const PuglEvent*)&config_event); + } - if (expose_event.type) { - puglDispatchEvent(view, (const PuglEvent*)&expose_event); + if (expose_event.type && expose_event.expose.count == 0) { + view->eventFunc(view, (const PuglEvent*)&expose_event); + puglLeaveContext(view, true); + } else { + puglLeaveContext(view, false); + } } return PUGL_SUCCESS; -- cgit v1.2.1