summaryrefslogtreecommitdiff
path: root/tests/auto/gui
diff options
context:
space:
mode:
authorAlex Trotsenko <alex1973tr@gmail.com>2020-06-02 18:03:36 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-06-03 21:14:44 +0000
commit4b6de83bcc42b742ee9cceb3f294302d242b9de7 (patch)
treeb1e740c0bd12ab1cf76770f58e74a296a2d4972e /tests/auto/gui
parent5d684fa3f6a3a0ae88a84d28ac545c9e2cc24acb (diff)
downloadqtbase-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.cpp38
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)