From e9456d8d5b35a80f28b8bb4cce9a6b8a53ca770d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 14 Apr 2001 21:46:54 +0000 Subject: [PATCH] merged focus handling fix from 2.2 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9752 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/generic/panelg.cpp | 2 ++ src/msw/frame.cpp | 29 +++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/generic/panelg.cpp b/src/generic/panelg.cpp index 346a2c82e6..3cab12dccb 100644 --- a/src/generic/panelg.cpp +++ b/src/generic/panelg.cpp @@ -353,6 +353,8 @@ bool wxPanel::SetFocusToChild() bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) { + wxCHECK_MSG( win, FALSE, _T("wxSetFocusToChild(): invalid window") ); + if ( *childLastFocused ) { // It might happen that the window got reparented or no longer accepts diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 857089ffb1..6723824373 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -727,18 +727,35 @@ void wxFrame::OnActivate(wxActivateEvent& event) // restore focus to the child which was last focused wxLogTrace(_T("focus"), _T("wxFrame %08x activated."), m_hWnd); - wxSetFocusToChild(this, &m_winLastFocused); + wxWindow *parent = m_winLastFocused ? m_winLastFocused->GetParent() + : NULL; + if ( !parent ) + { + parent = this; + } + + wxSetFocusToChild(parent, &m_winLastFocused); } - else + else // deactivating { - // remember the last focused child + // remember the last focused child if it is our child m_winLastFocused = FindFocus(); - while ( m_winLastFocused ) + + // so we NULL it out if it's a child from some other frame + wxWindow *win = m_winLastFocused; + while ( win ) { - if ( GetChildren().Find(m_winLastFocused) ) + if ( win->IsTopLevel() ) + { + if ( win != this ) + { + m_winLastFocused = NULL; + } + break; + } - m_winLastFocused = m_winLastFocused->GetParent(); + win = win->GetParent(); } wxLogTrace(_T("focus"), -- 2.47.2