From 4934653e18265ea5c128cff6215e5c84bd4d7514 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 25 Feb 2012 23:49:45 +0000 Subject: [PATCH] Dispatch unknown messages immediately in wxMSW YieldFor(). Failure to do this can have catastrophic consequences, e.g. embedded ActiveX IE controls may stop working -- even after resuming the normal message dispatching. Closes #14027. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70690 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/evtloop.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/msw/evtloop.cpp b/src/msw/evtloop.cpp index 6e734bc53f..9734216483 100644 --- a/src/msw/evtloop.cpp +++ b/src/msw/evtloop.cpp @@ -426,7 +426,7 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess) } // choose a wxEventCategory for this Windows message - wxEventCategory cat; + bool processNow; switch (msg.message) { #if !defined(__WXWINCE__) @@ -495,11 +495,11 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess) case WM_MBUTTONUP: case WM_MBUTTONDBLCLK: case WM_MOUSEWHEEL: - cat = wxEVT_CATEGORY_USER_INPUT; + processNow = (eventsToProcess & wxEVT_CATEGORY_USER_INPUT) != 0; break; case WM_TIMER: - cat = wxEVT_CATEGORY_TIMER; + processNow = (eventsToProcess & wxEVT_CATEGORY_TIMER) != 0; break; default: @@ -509,14 +509,22 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess) // by the system. // there are too many of these types of messages to handle // them in this switch - cat = wxEVT_CATEGORY_UI; + processNow = (eventsToProcess & wxEVT_CATEGORY_UI) != 0; } else - cat = wxEVT_CATEGORY_UNKNOWN; + { + // Process all the unknown messages. We must do it because + // failure to process some of them can be fatal, e.g. if we + // don't dispatch WM_APP+2 then embedded IE ActiveX + // controls don't work any more, see #14027. And there may + // be more examples like this, so dispatch all unknown + // messages immediately to be safe. + processNow = true; + } } // should we process this event now? - if (cat & eventsToProcess) + if ( processNow ) { if ( !wxTheApp->Dispatch() ) break; -- 2.45.2