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
// 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"),