X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f62c55815f78f889c17c49f4375dce7104cf67ba..645706a24e10dd3c5db9063a53887ec52413c632:/src/generic/progdlgg.cpp diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index 94e1bed6f1..224f40a593 100644 --- a/src/generic/progdlgg.cpp +++ b/src/generic/progdlgg.cpp @@ -38,9 +38,11 @@ #include "wx/dcclient.h" #include "wx/timer.h" #include "wx/settings.h" + #include "wx/app.h" #endif #include "wx/progdlg.h" +#include "wx/evtloop.h" // --------------------------------------------------------------------------- // macros @@ -401,7 +403,13 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) m_msg->SetLabel(_("Done.")); } - wxYieldIfNeeded(); + wxCHECK_MSG(wxEventLoopBase::GetActive(), false, + "wxProgressDialog::Update needs a running event loop"); + + // allow the window to repaint: + // NOTE: since we yield only for UI events with this call, there + // should be no side-effects + wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI); (void)ShowModal(); } @@ -449,9 +457,14 @@ bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip) bool wxProgressDialog::DoAfterUpdate(bool *skip) { + wxCHECK_MSG(wxEventLoopBase::GetActive(), false, + "wxProgressDialog::DoAfterUpdate needs a running event loop"); + // we have to yield because not only we want to update the display but // also to process the clicks on the cancel and skip buttons - wxYieldIfNeeded(); + // NOTE: using YieldFor() this call shouldn't give re-entrancy problems + // for event handlers not interested to UI/user-input events. + wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI|wxEVT_CATEGORY_USER_INPUT); Update(); @@ -578,7 +591,7 @@ void wxProgressDialog::ReenableOtherWindows() if ( HasFlag(wxPD_APP_MODAL) ) { delete m_winDisabler; - m_winDisabler = (wxWindowDisabler *)NULL; + m_winDisabler = NULL; } else { @@ -664,13 +677,19 @@ void wxProgressDialog::EnableClose() void wxProgressDialog::UpdateMessage(const wxString &newmsg) { + wxCHECK_RET(wxEventLoopBase::GetActive(), + "wxProgressDialog::UpdateMessage needs a running event loop"); + if ( !newmsg.empty() && newmsg != m_msg->GetLabel() ) { m_msg->SetLabel(newmsg); Fit(); // adapt to the new label size - wxYieldIfNeeded() ; + // allow the window to repaint: + // NOTE: since we yield only for UI events with this call, there + // should be no side-effects + wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI); } }