- wxEnableTopLevelWindows(FALSE);
- // always enable ourselves
- if ( win )
- win->Enable(TRUE);
- bool rc = wxYield();
- wxEnableTopLevelWindows(TRUE);
- return rc;
+ // remember all windows we're going to (temporarily) disable
+ wxWindowList winDisabled;
+
+ wxWindowList::Node *node;
+ for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() )
+ {
+ wxWindow *winTop = node->GetData();
+ wxFindDisabledWindows(winDisabled, winTop);
+
+ winTop->Disable();
+ }
+
+ if ( win )
+ {
+ // always enable ourselves
+ win->Enable();
+ }
+
+ bool rc = wxYield();
+
+ // don't call wxEnableTopLevelWindows(TRUE) because this will reenable even
+ // the window which had been disabled before, do it manually instead
+ for ( node = winDisabled.GetFirst(); node; node = node->GetNext() )
+ {
+ node->GetData()->Enable();
+ }
+
+ return rc;