From 86417abf07ba800ad9058fedfbbff2d168c3fbf0 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 May 2010 16:14:11 +0000 Subject: [PATCH] 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 --- include/wx/generic/progdlgg.h | 5 ++++- src/generic/progdlgg.cpp | 27 +++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) 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; -- 2.45.2