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:
@@ -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)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user