From 1a33ac8fb0f5e43c89bd698618d554c6f7b8b452 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Sun, 11 Jan 2004 16:34:05 +0000 Subject: [PATCH] Applied patch [ 858324 ] Calling EndModal inside an EVT_INIT_DIALOG event handler git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25126 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/dialog.h | 3 ++- src/msw/dialog.cpp | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/include/wx/msw/dialog.h b/include/wx/msw/dialog.h index d28c1544b3..2a0631bb54 100644 --- a/include/wx/msw/dialog.h +++ b/include/wx/msw/dialog.h @@ -114,7 +114,8 @@ protected: void Init(); private: - wxWindow *m_oldFocus; + wxWindow* m_oldFocus; + bool m_endModalCalled; // allow for closing within InitDialog // this pointer is non-NULL only while the modal event loop is running wxDialogModalData *m_modalData; diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index 8ec0087a81..9563732e25 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -170,11 +170,10 @@ wxDEFINE_TIED_SCOPED_PTR_TYPE(wxDialogModalData); void wxDialog::Init() { m_oldFocus = (wxWindow *)NULL; - m_isShown = FALSE; - m_modalData = NULL; - + m_endModalCalled = FALSE; + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); } @@ -369,7 +368,10 @@ bool wxDialog::Show(bool show) InitDialog(); } - if ( show && IsModal() ) + // EndModal may have been called from InitDialog handler, + // which would cause an infinite loop if we didn't take it + // into account + if ( show && IsModal() && !m_endModalCalled ) { // modal dialog needs a parent window, so try to find one if ( !GetParent() ) @@ -391,6 +393,7 @@ void wxDialog::Raise() // a special version for Show(TRUE) for modal dialogs which returns return code int wxDialog::ShowModal() { + m_endModalCalled = FALSE; if ( !IsModal() ) { SetModal(TRUE); @@ -405,6 +408,7 @@ int wxDialog::ShowModal() // dialogs and should work for both of them void wxDialog::EndModal(int retCode) { + m_endModalCalled = TRUE; SetReturnCode(retCode); Show(FALSE);