From 8b26aa07de0098b7a96c36b985cb9d124843f20d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 22 Oct 2002 00:30:26 +0000 Subject: [PATCH] a hack to fix multiple problems with showing modal dialogs from OnIdle() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/app.cpp | 16 +++++++++++----- src/msw/dialog.cpp | 8 ++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/msw/app.cpp b/src/msw/app.cpp index cfaf7b34e9..f29c2213fc 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -1066,15 +1066,21 @@ bool wxApp::ProcessMessage(WXMSG *wxmsg) return FALSE; } +// this is a temporary hack and will be replaced by using wxEventLoop in the +// future +// +// it is needed to allow other event loops (currently only one: the modal +// dialog one) to reset the OnIdle() semaphore because otherwise OnIdle() +// wouldn't do anything while a modal dialog shown from OnIdle() call is shown. +bool wxIsInOnIdleFlag = FALSE; + void wxApp::OnIdle(wxIdleEvent& event) { - static bool s_inOnIdle = FALSE; - // Avoid recursion (via ProcessEvent default case) - if ( s_inOnIdle ) + if ( wxIsInOnIdleFlag ) return; - s_inOnIdle = TRUE; + wxIsInOnIdleFlag = TRUE; // If there are pending events, we must process them: pending events // are either events to the threads other than main or events posted @@ -1109,7 +1115,7 @@ void wxApp::OnIdle(wxIdleEvent& event) event.RequestMore(TRUE); } - s_inOnIdle = FALSE; + wxIsInOnIdleFlag = FALSE; } // Send idle event to all top-level windows diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index 948d9e27d8..214bfb1dd4 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -247,6 +247,12 @@ void wxDialog::DoShowModal() m_windowDisabler = new wxWindowDisabler(this); + // before entering the modal loop, reset the "is in OnIdle()" flag (see + // comment in app.cpp) + extern bool wxIsInOnIdleFlag; + bool wasInOnIdle = wxIsInOnIdleFlag; + wxIsInOnIdleFlag = FALSE; + // enter the modal loop while ( IsModalShowing() ) { @@ -261,6 +267,8 @@ void wxDialog::DoShowModal() wxTheApp->DoMessage(); } + wxIsInOnIdleFlag = wasInOnIdle; + // and restore focus // Note that this code MUST NOT access the dialog object's data // in case the object has been deleted (which will be the case