summaryrefslogtreecommitdiff
path: root/src/corelib/kernel/qeventdispatcher_win.cpp
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 /src/corelib/kernel/qeventdispatcher_win.cpp
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 'src/corelib/kernel/qeventdispatcher_win.cpp')
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
index e841919600..34518c4101 100644
--- a/src/corelib/kernel/qeventdispatcher_win.cpp
+++ b/src/corelib/kernel/qeventdispatcher_win.cpp
@@ -277,9 +277,13 @@ LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp)
Q_ASSERT(q != 0);
QEventDispatcherWin32Private *d = q->d_func();
MSG *msg = reinterpret_cast<MSG *>(lp);
+ // Windows unexpectedly passes PM_NOYIELD flag to the hook procedure,
+ // if ::PeekMessage(..., PM_REMOVE | PM_NOYIELD) is called from the event loop.
+ // So, retrieve 'removed' tag as a bit field.
+ const bool messageRemoved = (wp & PM_REMOVE) != 0;
if (msg->hwnd == d->internalHwnd && msg->message == WM_QT_SENDPOSTEDEVENTS
- && wp == PM_REMOVE && d->sendPostedEventsTimerId == 0) {
+ && messageRemoved && d->sendPostedEventsTimerId == 0) {
// Start a timer to deliver posted events when the message queue is emptied.
d->sendPostedEventsTimerId = SetTimer(d->internalHwnd, SendPostedEventsTimerId,
USER_TIMER_MINIMUM, NULL);