From: Vadim Zeitlin Date: Sat, 22 May 2010 16:14:11 +0000 (+0000) Subject: Fix for user input processing in wxProgressDialog. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/86417abf07ba800ad9058fedfbbff2d168c3fbf0 Fix for user input processing in wxProgressDialog. Yield for input event processing before updating the dialog instead of doing it after this as the latter apparently doesn't always work. Closes #10645. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64385 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/generic/progdlgg.h b/include/wx/generic/progdlgg.h index 5a90d1f1f4..ce05dd40f8 100644 --- a/include/wx/generic/progdlgg.h +++ b/include/wx/generic/progdlgg.h @@ -81,7 +81,10 @@ private: void UpdateMessage(const wxString &newmsg); // common part of Update() and Pulse(), returns true if not cancelled - bool DoAfterUpdate(bool *skip); + bool DoBeforeUpdate(bool *skip); + + // common part of Update() and Pulse() + void DoAfterUpdate(); // shortcuts for enabling buttons void EnableClose(); diff --git a/src/generic/progdlgg.cpp b/src/generic/progdlgg.cpp index ef7b89b24e..77ec484ac1 100644 --- a/src/generic/progdlgg.cpp +++ b/src/generic/progdlgg.cpp @@ -313,6 +313,9 @@ wxProgressDialog::CreateLabel(const wxString& text, wxSizer *sizer) bool wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) { + if ( !DoBeforeUpdate(skip) ) + return false; + wxASSERT_MSG( value == -1 || m_gauge, wxT("cannot update non existent dialog") ); #ifdef __WXMSW__ @@ -428,7 +431,7 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) } else // not at maximum yet { - return DoAfterUpdate(skip); + DoAfterUpdate(); } // update the display in case yielding above didn't do it @@ -439,6 +442,9 @@ wxProgressDialog::Update(int value, const wxString& newmsg, bool *skip) bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip) { + if ( !DoBeforeUpdate(skip) ) + return false; + wxASSERT_MSG( m_gauge, wxT("cannot update non existent dialog") ); // show a bit of progress @@ -455,13 +461,15 @@ bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip) SetTimeLabel((unsigned long)-1, m_remaining); } - return DoAfterUpdate(skip); + DoAfterUpdate(); + + return m_state != Canceled; } -bool wxProgressDialog::DoAfterUpdate(bool *skip) +bool wxProgressDialog::DoBeforeUpdate(bool *skip) { wxCHECK_MSG(wxEventLoopBase::GetActive(), false, - "wxProgressDialog::DoAfterUpdate needs a running event loop"); + "wxProgressDialog::DoBeforeUpdate 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 @@ -481,6 +489,17 @@ bool wxProgressDialog::DoAfterUpdate(bool *skip) return m_state != Canceled; } +void wxProgressDialog::DoAfterUpdate() +{ + wxCHECK_RET(wxEventLoopBase::GetActive(), + "wxProgressDialog::DoAfterUpdate 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 wxProgressDialog::Resume() { m_state = Continue;