Allow resizing the Qt window after the buffers swap

Some EGL implementations resize the EGL buffers after eglSwapBuffers,
so we need to send the geometry change event after the swap, or else
the Qt window size and the physical buffer size will be different to
each other. Do not force this behavior though, but use it only when
the QT_WAYLAND_RESIZE_AFTER_SWAP environment variable is set.

Change-Id: I79e39442b3010c563a81d7c94e747a982e158fc1
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
This commit is contained in:
Giulio Camuffo 2014-01-21 17:07:32 +02:00 committed by The Qt Project
parent e8df7316cd
commit 5f52b6b508
2 changed files with 19 additions and 7 deletions

View File

@ -80,6 +80,8 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
, mFrameCallback(0)
, mRequestResizeSent(false)
, mCanResize(true)
, mResizeDirty(false)
, mResizeAfterSwap(!qEnvironmentVariableIsSet("QT_WAYLAND_RESIZE_AFTER_SWAP"))
, mSentInitialResize(false)
, mMouseDevice(0)
, mMouseSerial(0)
@ -195,10 +197,11 @@ void QWaylandWindow::setGeometry(const QRect &rect)
if (mWindowDecoration && window()->isVisible())
mWindowDecoration->update();
if (mConfigure.isEmpty()) {
if (mResizeAfterSwap)
mResizeDirty = true;
else
QWindowSystemInterface::handleGeometryChange(window(), geometry());
QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
}
}
void QWaylandWindow::setVisible(bool visible)
@ -287,7 +290,6 @@ void QWaylandWindow::doResize()
setGeometry(geometry);
mConfigure.clear();
QWindowSystemInterface::handleGeometryChange(window(), geometry);
}
void QWaylandWindow::setCanResize(bool canResize)
@ -295,9 +297,17 @@ void QWaylandWindow::setCanResize(bool canResize)
QMutexLocker lock(&mResizeLock);
mCanResize = canResize;
if (canResize && !mConfigure.isEmpty()) {
if (canResize) {
if (mResizeDirty) {
QWindowSystemInterface::handleGeometryChange(window(), geometry());
}
if (!mConfigure.isEmpty()) {
doResize();
QWindowSystemInterface::handleExposeEvent(window(), geometry());
} else if (mResizeDirty) {
QWindowSystemInterface::handleExposeEvent(window(), geometry());
mResizeDirty = false;
}
}
}

View File

@ -193,6 +193,8 @@ protected:
QWaylandWindowConfigure mConfigure;
bool mRequestResizeSent;
bool mCanResize;
bool mResizeDirty;
bool mResizeAfterSwap;
bool mSentInitialResize;
QPoint mOffset;