fixes to better remember the last focused child; also restore it using SetFocus() and not SetFocusFromKbd()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15667 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -54,14 +54,12 @@ void wxControlContainer::SetLastFocus(wxWindow *win)
|
||||
// the panel itself should never get the focus at all but if it does happen
|
||||
// temporarily (as it seems to do under wxGTK), at the very least don't
|
||||
// forget our previous m_winLastFocused
|
||||
if ( win == m_winParent )
|
||||
return;
|
||||
|
||||
if ( win != m_winParent )
|
||||
{
|
||||
// if we're setting the focus
|
||||
if ( win )
|
||||
{
|
||||
// find the last _immediate_ child which got focus but be prepared to
|
||||
// handle the case when win == m_winParent as well
|
||||
// find the last _immediate_ child which got focus
|
||||
wxWindow *winParent = win;
|
||||
while ( winParent != m_winParent )
|
||||
{
|
||||
@@ -69,10 +67,12 @@ void wxControlContainer::SetLastFocus(wxWindow *win)
|
||||
winParent = win->GetParent();
|
||||
|
||||
// Yes, this can happen, though in a totally pathological case.
|
||||
// like when detaching a menubar from a frame with a child which
|
||||
// has pushed itself as an event handler for the menubar. (wxGtk)
|
||||
// like when detaching a menubar from a frame with a child
|
||||
// which has pushed itself as an event handler for the menubar.
|
||||
// (under wxGTK)
|
||||
|
||||
wxASSERT_MSG( winParent, _T("Setting last-focus for a window that is not our child?") );
|
||||
wxASSERT_MSG( winParent,
|
||||
_T("Setting last focus for a window that is not our child?") );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,6 +90,16 @@ void wxControlContainer::SetLastFocus(wxWindow *win)
|
||||
}
|
||||
}
|
||||
|
||||
// propagate the last focus upwards so that our parent can set focus back
|
||||
// to us if it loses it now and regains later
|
||||
wxWindow *parent = m_winParent->GetParent();
|
||||
if ( parent )
|
||||
{
|
||||
wxChildFocusEvent eventFocus(m_winParent);
|
||||
parent->GetEventHandler()->ProcessEvent(eventFocus);
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Keyboard handling - this is the place where the TAB traversal logic is
|
||||
// implemented. As this code is common to all ports, this ensures consistent
|
||||
@@ -352,19 +362,21 @@ bool wxControlContainer::SetFocusToChild()
|
||||
bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
|
||||
{
|
||||
wxCHECK_MSG( win, FALSE, _T("wxSetFocusToChild(): invalid window") );
|
||||
wxCHECK_MSG( childLastFocused, FALSE,
|
||||
_T("wxSetFocusToChild(): NULL child poonter") );
|
||||
|
||||
if ( *childLastFocused )
|
||||
{
|
||||
// It might happen that the window got reparented or no longer accepts
|
||||
// the focus.
|
||||
if ( (*childLastFocused)->GetParent() == win &&
|
||||
(*childLastFocused)->AcceptsFocusFromKeyboard() )
|
||||
// It might happen that the window got reparented
|
||||
if ( (*childLastFocused)->GetParent() == win )
|
||||
{
|
||||
wxLogTrace(_T("focus"),
|
||||
_T("SetFocusToChild() => last child (0x%08x)."),
|
||||
(*childLastFocused)->GetHandle());
|
||||
|
||||
(*childLastFocused)->SetFocusFromKbd();
|
||||
// not SetFocusFromKbd(): we're restoring focus back to the old
|
||||
// window and not setting it as the result of a kbd action
|
||||
(*childLastFocused)->SetFocus();
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user