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,39 +54,49 @@ void wxControlContainer::SetLastFocus(wxWindow *win)
|
|||||||
// the panel itself should never get the focus at all but if it does happen
|
// 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
|
// temporarily (as it seems to do under wxGTK), at the very least don't
|
||||||
// forget our previous m_winLastFocused
|
// forget our previous m_winLastFocused
|
||||||
if ( win == m_winParent )
|
if ( win != m_winParent )
|
||||||
return;
|
|
||||||
|
|
||||||
// if we're setting the focus
|
|
||||||
if ( win )
|
|
||||||
{
|
{
|
||||||
// find the last _immediate_ child which got focus but be prepared to
|
// if we're setting the focus
|
||||||
// handle the case when win == m_winParent as well
|
if ( win )
|
||||||
wxWindow *winParent = win;
|
|
||||||
while ( winParent != m_winParent )
|
|
||||||
{
|
{
|
||||||
win = winParent;
|
// find the last _immediate_ child which got focus
|
||||||
winParent = win->GetParent();
|
wxWindow *winParent = win;
|
||||||
|
while ( winParent != m_winParent )
|
||||||
|
{
|
||||||
|
win = winParent;
|
||||||
|
winParent = win->GetParent();
|
||||||
|
|
||||||
// Yes, this can happen, though in a totally pathological case.
|
// Yes, this can happen, though in a totally pathological case.
|
||||||
// like when detaching a menubar from a frame with a child which
|
// like when detaching a menubar from a frame with a child
|
||||||
// has pushed itself as an event handler for the menubar. (wxGtk)
|
// 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?") );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_winLastFocused = win;
|
||||||
|
|
||||||
|
if ( win )
|
||||||
|
{
|
||||||
|
wxLogTrace(_T("focus"), _T("Set last focus to %s(%s)"),
|
||||||
|
win->GetClassInfo()->GetClassName(),
|
||||||
|
win->GetLabel().c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxLogTrace(_T("focus"), _T("No more last focus"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_winLastFocused = win;
|
// propagate the last focus upwards so that our parent can set focus back
|
||||||
|
// to us if it loses it now and regains later
|
||||||
if ( win )
|
wxWindow *parent = m_winParent->GetParent();
|
||||||
|
if ( parent )
|
||||||
{
|
{
|
||||||
wxLogTrace(_T("focus"), _T("Set last focus to %s(%s)"),
|
wxChildFocusEvent eventFocus(m_winParent);
|
||||||
win->GetClassInfo()->GetClassName(),
|
parent->GetEventHandler()->ProcessEvent(eventFocus);
|
||||||
win->GetLabel().c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLogTrace(_T("focus"), _T("No more last focus"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,19 +362,21 @@ bool wxControlContainer::SetFocusToChild()
|
|||||||
bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
|
bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused)
|
||||||
{
|
{
|
||||||
wxCHECK_MSG( win, FALSE, _T("wxSetFocusToChild(): invalid window") );
|
wxCHECK_MSG( win, FALSE, _T("wxSetFocusToChild(): invalid window") );
|
||||||
|
wxCHECK_MSG( childLastFocused, FALSE,
|
||||||
|
_T("wxSetFocusToChild(): NULL child poonter") );
|
||||||
|
|
||||||
if ( *childLastFocused )
|
if ( *childLastFocused )
|
||||||
{
|
{
|
||||||
// It might happen that the window got reparented or no longer accepts
|
// It might happen that the window got reparented
|
||||||
// the focus.
|
if ( (*childLastFocused)->GetParent() == win )
|
||||||
if ( (*childLastFocused)->GetParent() == win &&
|
|
||||||
(*childLastFocused)->AcceptsFocusFromKeyboard() )
|
|
||||||
{
|
{
|
||||||
wxLogTrace(_T("focus"),
|
wxLogTrace(_T("focus"),
|
||||||
_T("SetFocusToChild() => last child (0x%08x)."),
|
_T("SetFocusToChild() => last child (0x%08x)."),
|
||||||
(*childLastFocused)->GetHandle());
|
(*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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Reference in New Issue
Block a user