+void *wxGUIAppTraits::BeforeChildWaitLoop()
+{
+ /*
+ We use a dirty hack here to disable all application windows (which we
+ must do because otherwise the calls to wxYield() could lead to some very
+ unexpected reentrancies in the users code) but to avoid losing
+ focus/activation entirely when the child process terminates which would
+ happen if we simply disabled everything using wxWindowDisabler. Indeed,
+ remember that Windows will never activate a disabled window and when the
+ last child's window is closed and Windows looks for a window to activate
+ all our windows are still disabled. There is no way to enable them in
+ time because we don't know when the child's windows are going to be
+ closed, so the solution we use here is to keep one special tiny dialog
+ enabled all the time. Then when the child terminates it will get
+ activated and when we close it below -- after re-enabling all the other
+ windows! -- the previously active window becomes activated again and
+ everything is ok.
+ */
+ wxBeginBusyCursor();
+
+ // first disable all existing windows
+ wxWindowDisabler *wd = new wxWindowDisabler;
+
+ // then create an "invisible" dialog: it has minimal size, is positioned
+ // (hopefully) outside the screen and doesn't appear in the Alt-TAB list
+ // (unlike the frames, which is why we use a dialog here)
+ wxWindow *winActive = new wxDialog
+ (
+ wxTheApp->GetTopWindow(),
+ wxID_ANY,
+ wxEmptyString,
+ wxPoint(32600, 32600),
+ wxSize(1, 1)
+ );
+ winActive->Show();
+
+ return new ChildWaitLoopData(wd, winActive);
+}