X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/24b3cc2c9632b7c6f0f0dd8f935688bd4d5e36f0..aad65f130d9cb77d0e9f2b7b580c54712386f77a:/src/msw/toplevel.cpp diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index 842a8a587b..3a25093115 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -77,6 +77,10 @@ wxWindow *wxTopLevelWindowMSW::ms_hiddenParent = NULL; // wxTopLevelWindowMSW implementation // ============================================================================ +BEGIN_EVENT_TABLE(wxTopLevelWindowMSW, wxTopLevelWindowBase) + EVT_ACTIVATE(wxTopLevelWindowMSW::OnActivate) +END_EVENT_TABLE() + // ---------------------------------------------------------------------------- // wxDialog helpers // ---------------------------------------------------------------------------- @@ -116,6 +120,8 @@ void wxTopLevelWindowMSW::Init() m_fsOldWindowStyle = 0; m_fsIsMaximized = FALSE; m_fsIsShowing = FALSE; + + m_winLastFocused = (wxWindow *)NULL; } WXDWORD wxTopLevelWindowMSW::MSWGetStyle(long style, WXDWORD *exflags) const @@ -740,3 +746,57 @@ bool wxTopLevelWindowMSW::EnableCloseButton(bool enable) return TRUE; } +// ---------------------------------------------------------------------------- +// wxTopLevelWindow event handling +// ---------------------------------------------------------------------------- + +// Default activation behaviour - set the focus for the first child +// subwindow found. +void wxTopLevelWindowMSW::OnActivate(wxActivateEvent& event) +{ + if ( event.GetActive() ) + { + // restore focus to the child which was last focused + wxLogTrace(_T("focus"), _T("wxTLW %08x activated."), m_hWnd); + + wxWindow *parent = m_winLastFocused ? m_winLastFocused->GetParent() + : NULL; + if ( !parent ) + { + parent = this; + } + + wxSetFocusToChild(parent, &m_winLastFocused); + } + else // deactivating + { + // remember the last focused child if it is our child + m_winLastFocused = FindFocus(); + + // so we NULL it out if it's a child from some other frame + wxWindow *win = m_winLastFocused; + while ( win ) + { + if ( win->IsTopLevel() ) + { + if ( win != this ) + { + m_winLastFocused = NULL; + } + + break; + } + + win = win->GetParent(); + } + + wxLogTrace(_T("focus"), + _T("wxTLW %08x deactivated, last focused: %08x."), + m_hWnd, + m_winLastFocused ? GetHwndOf(m_winLastFocused) + : NULL); + + event.Skip(); + } +} +