From 81f259a91b461b9779b66287f8592dbbd910fd18 Mon Sep 17 00:00:00 2001 From: Daniel d'Andrada <daniel.dandrada@canonical.com> Date: Thu, 6 Aug 2015 11:37:56 +0200 Subject: [PATCH] Fix surface resize If you call QWindowSystemInterface::handleExposeEvent() from the render thread you won't give a change for the main thread to process further resize events. In a long resize animation (like dragging a window border with mouse) the resize events will queue up like crazy, leving handleSurfaceResize() to deal with a ton of outdated resize events once the resize animation is finally over. Furthermore, as there's no synchronicity between the processing of resize events and the consupmtion of buffers, there's no point in trying to tie one to the other in any way. So better ignore the actual size information from a resize event. Change-Id: I5109245761f19a527d98c3c6f5d24789b633ed14 Reviewed-by: Gerry Boland <gerry.boland@canonical.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com> --- src/plugins/platforms/mirclient/window.cpp | 34 +++++----------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/src/plugins/platforms/mirclient/window.cpp b/src/plugins/platforms/mirclient/window.cpp index 812b71e6928..dd37d78948f 100644 --- a/src/plugins/platforms/mirclient/window.cpp +++ b/src/plugins/platforms/mirclient/window.cpp @@ -98,7 +98,6 @@ public: MirConnection *connection; MirSurface* surface; QSize bufferSize; - QSize targetBufferSize; QMutex mutex; QSharedPointer<UbuntuClipboard> clipboard; }; @@ -318,17 +317,15 @@ void UbuntuWindow::handleSurfaceResize(int width, int height) LOG("UbuntuWindow::handleSurfaceResize(width=%d, height=%d)", width, height); // The current buffer size hasn't actually changed. so just render on it and swap - // buffers until we render on a buffer with the target size. - - d->targetBufferSize.rwidth() = width; - d->targetBufferSize.rheight() = height; - - if (d->bufferSize != d->targetBufferSize) { + // buffers in the hope that the next buffer will match the surface size advertised + // in this event. + // But since this event is processed by a thread different from the one that swaps + // buffers, you can never know if this information is already outdated as there's + // no synchronicity whatsoever between the processing of resize events and the + // consumption of buffers. + if (d->bufferSize.width() != width || d->bufferSize.height() != height) { QWindowSystemInterface::handleExposeEvent(window(), geometry()); - } else { - qWarning("[ubuntumirclient QPA] UbuntuWindow::handleSurfaceResize" - " current buffer already has the target size"); - d->targetBufferSize = QSize(); + QWindowSystemInterface::flushWindowSystemEvents(); } } @@ -430,20 +427,5 @@ void UbuntuWindow::onBuffersSwapped_threadSafe(int newBufferWidth, int newBuffer QPlatformWindow::setGeometry(newGeometry); QWindowSystemInterface::handleGeometryChange(window(), newGeometry, QRect()); - QWindowSystemInterface::handleExposeEvent(window(), newGeometry); - - } else { - // buffer size hasn't changed - if (d->targetBufferSize.isValid()) { - if (d->bufferSize != d->targetBufferSize) { - // but we still didn't reach the promised buffer size from the mir resize event. - // thus keep swapping buffers - QWindowSystemInterface::handleExposeEvent(window(), geometry()); - } else { - // target met. we have just provided a render with the target size and - // can therefore finally rest. - d->targetBufferSize = QSize(); - } - } } } -- GitLab