Don't infinitely recurse when setting the child focus. Without

this, nested panels/scrolled windows that work fine on wxGTK, wxMSW
can cause infinite recursion on wxMac


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26868 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2004-04-19 14:41:06 +00:00
parent 422a142bc2
commit b33f7651ae
2 changed files with 14 additions and 1 deletions

View File

@@ -92,6 +92,9 @@ protected:
// a temporary override of m_winDefault, use the latter if NULL // a temporary override of m_winDefault, use the latter if NULL
wxWindow *m_winTmpDefault; wxWindow *m_winTmpDefault;
// a guard against infinite recursion
bool m_inSetFocus;
DECLARE_NO_COPY_CLASS(wxControlContainer) DECLARE_NO_COPY_CLASS(wxControlContainer)
}; };

View File

@@ -51,6 +51,7 @@ wxControlContainer::wxControlContainer(wxWindow *winParent)
m_winLastFocused = m_winLastFocused =
m_winTmpDefault = m_winTmpDefault =
m_winDefault = NULL; m_winDefault = NULL;
m_inSetFocus = false;
} }
bool wxControlContainer::AcceptsFocus() const bool wxControlContainer::AcceptsFocus() const
@@ -341,6 +342,11 @@ bool wxControlContainer::DoSetFocus()
wxLogTrace(_T("focus"), _T("SetFocus on wxPanel 0x%08lx."), wxLogTrace(_T("focus"), _T("SetFocus on wxPanel 0x%08lx."),
(unsigned long)m_winParent->GetHandle()); (unsigned long)m_winParent->GetHandle());
if (m_inSetFocus)
return true;
m_inSetFocus = true;
// when the panel gets the focus we move the focus to either the last // when the panel gets the focus we move the focus to either the last
// window that had the focus or the first one that can get it unless the // window that had the focus or the first one that can get it unless the
// focus had been already set to some other child // focus had been already set to some other child
@@ -364,7 +370,11 @@ bool wxControlContainer::DoSetFocus()
win = win->GetParent(); win = win->GetParent();
} }
return SetFocusToChild(); bool ret = SetFocusToChild();
m_inSetFocus = false;
return ret;
} }
void wxControlContainer::HandleOnFocus(wxFocusEvent& event) void wxControlContainer::HandleOnFocus(wxFocusEvent& event)