// wxControlContainerBase
// ----------------------------------------------------------------------------
-void wxControlContainerBase::SetCanFocus(bool acceptsFocus)
+bool wxControlContainerBase::UpdateCanFocusChildren()
{
- if ( acceptsFocus == m_acceptsFocus )
- return;
+ const bool acceptsFocusChildren = HasAnyFocusableChildren();
+ if ( acceptsFocusChildren != m_acceptsFocusChildren )
+ {
+ m_acceptsFocusChildren = acceptsFocusChildren;
- m_acceptsFocus = acceptsFocus;
+ // In the ports where it does something non trivial, the parent window
+ // should only be focusable if it doesn't have any focusable children
+ // (e.g. native focus handling in wxGTK totally breaks down otherwise).
+ m_winParent->SetCanFocus(m_acceptsFocusSelf && !m_acceptsFocusChildren);
+ }
- m_winParent->SetCanFocus(m_acceptsFocus);
+ return m_acceptsFocusChildren;
}
bool wxControlContainerBase::HasAnyFocusableChildren() const
wxLogTrace(TRACE_FOCUS, wxT("No more last focus"));
}
}
-
- // propagate the last focus upwards so that our parent can set focus back
- // to us if it loses it now and regains later; do *not* do this if we are
- // a toplevel window (e.g. wxDialog) that has another frame as its parent
- if ( !m_winParent->IsTopLevel() )
- {
- wxWindow *parent = m_winParent->GetParent();
- if ( parent )
- {
- wxChildFocusEvent eventFocus(m_winParent);
- parent->GetEventHandler()->ProcessEvent(eventFocus);
- }
- }
}
// --------------------------------------------------------------------