Use a "hidden" dialog, not frame, in sync wxExecute() hack in wxMSW.

Replace a "hidden" (not really, but shown far off screen) frame with a dialog
to avoid this frame appearing in the Alt+TAB list.

Closes #13251.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72667 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-10-13 22:53:22 +00:00
parent 90bad79f70
commit 0ec1064b79

View File

@@ -172,12 +172,12 @@ void *wxGUIAppTraits::BeforeChildWaitLoop()
focus/activation entirely when the child process terminates which would focus/activation entirely when the child process terminates which would
happen if we simply disabled everything using wxWindowDisabler. Indeed, happen if we simply disabled everything using wxWindowDisabler. Indeed,
remember that Windows will never activate a disabled window and when the remember that Windows will never activate a disabled window and when the
last childs window is closed and Windows looks for a window to activate 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 all our windows are still disabled. There is no way to enable them in
time because we don't know when the childs windows are going to be 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 frame 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 enabled all the time. Then when the child terminates it will get
activated and when we close it below -- after reenabling all the other activated and when we close it below -- after re-enabling all the other
windows! -- the previously active window becomes activated again and windows! -- the previously active window becomes activated again and
everything is ok. everything is ok.
*/ */
@@ -186,16 +186,16 @@ void *wxGUIAppTraits::BeforeChildWaitLoop()
// first disable all existing windows // first disable all existing windows
wxWindowDisabler *wd = new wxWindowDisabler; wxWindowDisabler *wd = new wxWindowDisabler;
// then create an "invisible" frame: it has minimal size, is positioned // then create an "invisible" dialog: it has minimal size, is positioned
// (hopefully) outside the screen and doesn't appear on the taskbar // (hopefully) outside the screen and doesn't appear in the Alt-TAB list
wxWindow *winActive = new wxFrame // (unlike the frames, which is why we use a dialog here)
wxWindow *winActive = new wxDialog
( (
wxTheApp->GetTopWindow(), wxTheApp->GetTopWindow(),
wxID_ANY, wxID_ANY,
wxEmptyString, wxEmptyString,
wxPoint(32600, 32600), wxPoint(32600, 32600),
wxSize(1, 1), wxSize(1, 1)
wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR
); );
winActive->Show(); winActive->Show();
@@ -210,9 +210,9 @@ void wxGUIAppTraits::AfterChildWaitLoop(void *dataOrig)
delete data->wd; delete data->wd;
// finally delete the dummy frame and, as wd has been already destroyed and // finally delete the dummy dialog and, as wd has been already destroyed
// the other windows reenabled, the activation is going to return to the // and the other windows reenabled, the activation is going to return to
// window which had had it before // the window which had had it before
data->winActive->Destroy(); data->winActive->Destroy();
// also delete the temporary data object itself // also delete the temporary data object itself