Dispatch events from the native MSW wxProgressDialog too

Do this for compatibility with wxGenericProgressDialog, which always did
this and can't really do otherwise as it needs to react to the clicks on
its buttons, and also because not doing it results in the other
application windows being marked as "not responding" by MSW, which looks
bad.

Closes #17768.
This commit is contained in:
Vadim Zeitlin
2017-10-28 19:46:36 +02:00
parent 93c9ec2f01
commit 0b96d3b905
2 changed files with 24 additions and 0 deletions

View File

@@ -59,6 +59,10 @@ private:
// Returns false if the user requested cancelling the dialog. // Returns false if the user requested cancelling the dialog.
bool DoNativeBeforeUpdate(bool *skip); bool DoNativeBeforeUpdate(bool *skip);
// Dispatch the pending events to let the windows to update, just as the
// generic version does. This is done as part of DoNativeBeforeUpdate().
void DispatchEvents();
// Updates the various timing informations for both determinate // Updates the various timing informations for both determinate
// and indeterminate modes. Requires the shared object to have // and indeterminate modes. Requires the shared object to have
// been entered. // been entered.

View File

@@ -508,9 +508,29 @@ bool wxProgressDialog::Pulse(const wxString& newmsg, bool *skip)
return wxGenericProgressDialog::Pulse( newmsg, skip ); return wxGenericProgressDialog::Pulse( newmsg, skip );
} }
void wxProgressDialog::DispatchEvents()
{
#ifdef wxHAS_MSW_TASKDIALOG
// No need for HasNativeTaskDialog() check, we're only called when this is
// the case.
wxEventLoopBase* const loop = wxEventLoop::GetActive();
if ( loop )
{
// We don't need to dispatch the user input events as the task dialog
// handles its own ones in its thread and we shouldn't react to any
// other user actions while the dialog is shown.
loop->YieldFor(wxEVT_CATEGORY_ALL & ~wxEVT_CATEGORY_USER_INPUT);
}
#else // !wxHAS_MSW_TASKDIALOG
wxFAIL_MSG( "unreachable" );
#endif // wxHAS_MSW_TASKDIALOG/!wxHAS_MSW_TASKDIALOG
}
bool wxProgressDialog::DoNativeBeforeUpdate(bool *skip) bool wxProgressDialog::DoNativeBeforeUpdate(bool *skip)
{ {
#ifdef wxHAS_MSW_TASKDIALOG #ifdef wxHAS_MSW_TASKDIALOG
DispatchEvents();
wxCriticalSectionLocker locker(m_sharedData->m_cs); wxCriticalSectionLocker locker(m_sharedData->m_cs);
if ( m_sharedData->m_skipped ) if ( m_sharedData->m_skipped )