Make sure doApplyConfigure() is called from main thread

Task-number: QTBUG-101948
Change-Id: I867365384c43ccddf5b7a8600a3db84aa99aca6d
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
Paul Olav Tvete 2023-04-11 14:48:25 +02:00
parent 446508bea7
commit d66e8f148f
2 changed files with 23 additions and 2 deletions

View File

@ -30,6 +30,7 @@
#include <QtCore/QDebug>
#include <QtCore/QThread>
#include <QtCore/private/qthread_p.h>
#include <QtWaylandClient/private/qwayland-fractional-scale-v1.h>
@ -599,12 +600,24 @@ void QWaylandWindow::doApplyConfigure()
if (!mWaitingToApplyConfigure)
return;
Q_ASSERT_X(QThread::currentThreadId() == QThreadData::get2(thread())->threadId.loadRelaxed(),
"QWaylandWindow::doApplyConfigure", "not called from main thread");
if (mShellSurface)
mShellSurface->applyConfigure();
mWaitingToApplyConfigure = false;
}
void QWaylandWindow::doApplyConfigureFromOtherThread()
{
QMutexLocker lock(&mResizeLock);
if (!mCanResize || !mWaitingToApplyConfigure)
return;
doApplyConfigure();
sendExposeEvent(QRect(QPoint(), geometry().size()));
}
void QWaylandWindow::setCanResize(bool canResize)
{
QMutexLocker lock(&mResizeLock);
@ -615,8 +628,13 @@ void QWaylandWindow::setCanResize(bool canResize)
QWindowSystemInterface::handleGeometryChange(window(), geometry());
}
if (mWaitingToApplyConfigure) {
doApplyConfigure();
sendExposeEvent(QRect(QPoint(), geometry().size()));
bool inGuiThread = QThread::currentThreadId() == QThreadData::get2(thread())->threadId.loadRelaxed();
if (inGuiThread) {
doApplyConfigure();
sendExposeEvent(QRect(QPoint(), geometry().size()));
} else {
QMetaObject::invokeMethod(this, &QWaylandWindow::doApplyConfigureFromOtherThread, Qt::QueuedConnection);
}
} else if (mResizeDirty) {
mResizeDirty = false;
sendExposeEvent(QRect(QPoint(), geometry().size()));

View File

@ -321,6 +321,9 @@ protected:
QPointer<QWaylandWindow> mTransientParent;
QList<QPointer<QWaylandWindow>> mChildPopups;
private slots:
void doApplyConfigureFromOtherThread();
private:
void setGeometry_helper(const QRect &rect);
void initWindow();