From: Julian Smart Date: Wed, 17 Nov 2004 13:42:14 +0000 (+0000) Subject: Added IsTopLevel() check to last message loop in PreProcessMessage. This X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/22cfea03b8abd902001dd2a9a1b9f61a8cf3d69e Added IsTopLevel() check to last message loop in PreProcessMessage. This stops e.g. ESC being processed by a parent modal dialog if not processed by the child -> assert and lockup git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30585 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/msw/evtloop.cpp b/src/msw/evtloop.cpp index 55ce24cbe5..b329452419 100644 --- a/src/msw/evtloop.cpp +++ b/src/msw/evtloop.cpp @@ -168,13 +168,20 @@ bool wxEventLoop::PreProcessMessage(WXMSG *msg) break; } - // now try the other hooks (kbd navigation is handled here): we start from - // wndThis->GetParent() because wndThis->MSWProcessMessage() was already - // called above - for ( wnd = wndThis->GetParent(); wnd; wnd = wnd->GetParent() ) + // now try the other hooks (kbd navigation is handled here) + for ( wnd = wndThis; wnd; wnd = wnd->GetParent() ) { - if ( wnd->MSWProcessMessage((WXMSG *)msg) ) - return true; + if (wnd != wndThis) // Skip the first since wndThis->MSWProcessMessage() was called above + { + if ( wnd->MSWProcessMessage((WXMSG *)msg) ) + return true; + } + + // Stop at first top level window (as per comment above). + // If we don't do this, pressing ESC on a modal dialog shown as child of a modal + // dialog with wxID_CANCEL will cause the parent dialog to be closed, for example + if (wnd->IsTopLevel()) + break; } // no special preprocessing for this message, dispatch it normally