diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2020-06-02 18:03:36 +0300 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2020-06-03 21:14:44 +0000 |
commit | 4b6de83bcc42b742ee9cceb3f294302d242b9de7 (patch) | |
tree | b1e740c0bd12ab1cf76770f58e74a296a2d4972e /tests/auto/gui | |
parent | 5d684fa3f6a3a0ae88a84d28ac545c9e2cc24acb (diff) | |
download | qtbase-4b6de83bcc42b742ee9cceb3f294302d242b9de7.tar.gz |
QEventDispatcherWin32: retrieve PM_REMOVE value as a bit flag
Windows unexpectedly passes PM_NOYIELD flag in wParam parameter to the
hook procedure, if ::PeekMessage(..., PM_REMOVE | PM_NOYIELD) is called
from the event loop. So, to ignore undocumented flag, we should
interpret wParam as a bit field.
Thanks to Robin Lobel for research.
Fixes: QTBUG-84562
Change-Id: Ib16d7d747aebc9a3628e4ee67478c4d3edeb96f1
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
(cherry picked from commit 33e6e5fac3c86805b1b4e744462645cac8c8a044)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'tests/auto/gui')
-rw-r--r-- | tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp b/tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp index 3d1876f00f..5fd7079a6a 100644 --- a/tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp +++ b/tests/auto/gui/kernel/noqteventloop/tst_noqteventloop.cpp @@ -51,6 +51,7 @@ private slots: void consumeMouseEvents(); void consumeSocketEvents(); void deliverEventsInLivelock(); + void postingWithNoYieldFlag(); }; class Window : public QRasterWindow @@ -341,6 +342,43 @@ void tst_NoQtEventLoop::deliverEventsInLivelock() QVERIFY(!livelockTimer.isActive()); } +void tst_NoQtEventLoop::postingWithNoYieldFlag() +{ + int argc = 1; + char *argv[] = { const_cast<char *>("test"), 0 }; + QGuiApplication app(argc, argv); + + bool signalReceived = false; + // Post a message to the queue + QMetaObject::invokeMethod(this, [&signalReceived]() { + signalReceived = true; + }, Qt::QueuedConnection); + + // Post some system messages + QWindow mainWindow; + mainWindow.show(); + + QElapsedTimer elapsedTimer; + elapsedTimer.start(); + + // Exec own message loop + MSG msg; + forever { + if (elapsedTimer.hasExpired(3000) || signalReceived) + break; + + if (!::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE | PM_NOYIELD)) { + QThread::msleep(100); + continue; + } + + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + QVERIFY(signalReceived); +} + #include <tst_noqteventloop.moc> QTEST_APPLESS_MAIN(tst_NoQtEventLoop) |