X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/abceee76ea4d642ccfd3cf91cc139a3fe2b471b7..4de601b1280321675d6ec3580947e0c158a42c93:/src/msw/dialog.cpp diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index a9849ee218..bbd4c9f334 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -70,8 +70,6 @@ wxWindowList wxModelessWindows; // all modal dialogs currently shown static wxWindowList wxModalDialogs; -static wxWindow *m_oldFocus; - // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- @@ -100,6 +98,7 @@ END_EVENT_TABLE() wxDialog::wxDialog() { + m_oldFocus = (wxWindow *)NULL; m_isShown = FALSE; SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE)); @@ -420,8 +419,29 @@ bool wxDialog::Show(bool show) // Replacement for Show(TRUE) for modal dialogs - returns return code int wxDialog::ShowModal() { + // modal dialog needs a parent window, so try to find one + if ( !GetParent() ) + { + wxWindow *parent = wxTheApp->GetTopWindow(); + if ( parent && parent != this ) + { + // use it + m_parent = parent; + } + } + + wxWindowDisabler *wd = (wxWindowDisabler *)NULL; + if ( !GetParent() ) + { + // still no parent? make the dialog app modal by disabling all windows + wd = new wxWindowDisabler(this); + } + m_windowStyle |= wxDIALOG_MODAL; Show(TRUE); + + delete wd; + return GetReturnCode(); } @@ -522,6 +542,33 @@ long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) switch ( message ) { + case WM_ACTIVATE: + switch ( LOWORD(wParam) ) + { + case WA_ACTIVE: + case WA_CLICKACTIVE: + if ( IsModalShowing() && GetParent() ) + { + // bring the owner window to top as the standard dialog + // boxes do + if ( !::SetWindowPos + ( + GetHwndOf(GetParent()), + GetHwnd(), + 0, 0, + 0, 0, + SWP_NOACTIVATE | + SWP_NOMOVE | + SWP_NOSIZE + ) ) + { + wxLogLastError("SetWindowPos(SWP_NOACTIVATE)"); + } + } + // fall through to process it normally as well + } + break; + case WM_CLOSE: // if we can't close, tell the system that we processed the // message - otherwise it would close us @@ -531,13 +578,28 @@ long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) case WM_SETCURSOR: // we want to override the busy cursor for modal dialogs: // typically, wxBeginBusyCursor() is called and then a modal dialog - // is shown, but the modal dialog shouldn't have this cursor - if ( wxIsBusy() ) + // is shown, but the modal dialog shouldn't have hourglass cursor + if ( IsModalShowing() && wxIsBusy() ) { - rc = TRUE; + // set our cursor for all windows (but see below) + wxCursor cursor = m_cursor; + if ( !cursor.Ok() ) + cursor = wxCURSOR_ARROW; + + ::SetCursor(GetHcursorOf(cursor)); + // in any case, stop here and don't let wxWindow process this + // message (it would set the busy cursor) processed = TRUE; + + // but return FALSE to tell the child window (if the event + // comes from one of them and not from ourselves) that it can + // set its own cursor if it has one: thus, standard controls + // (e.g. text ctrl) still have correct cursors in a dialog + // invoked while wxIsBusy() + rc = FALSE; } + break; } if ( !processed )