From b33f7651ae55310d7d76b0205e409464ba8af484 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Mon, 19 Apr 2004 14:41:06 +0000 Subject: [PATCH] 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 --- include/wx/containr.h | 3 +++ src/common/containr.cpp | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/wx/containr.h b/include/wx/containr.h index e5399b71ce..99049e718c 100644 --- a/include/wx/containr.h +++ b/include/wx/containr.h @@ -92,6 +92,9 @@ protected: // a temporary override of m_winDefault, use the latter if NULL wxWindow *m_winTmpDefault; + // a guard against infinite recursion + bool m_inSetFocus; + DECLARE_NO_COPY_CLASS(wxControlContainer) }; diff --git a/src/common/containr.cpp b/src/common/containr.cpp index 368cee065d..69b8fa56ae 100644 --- a/src/common/containr.cpp +++ b/src/common/containr.cpp @@ -51,6 +51,7 @@ wxControlContainer::wxControlContainer(wxWindow *winParent) m_winLastFocused = m_winTmpDefault = m_winDefault = NULL; + m_inSetFocus = false; } bool wxControlContainer::AcceptsFocus() const @@ -341,6 +342,11 @@ bool wxControlContainer::DoSetFocus() wxLogTrace(_T("focus"), _T("SetFocus on wxPanel 0x%08lx."), (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 // window that had the focus or the first one that can get it unless the // focus had been already set to some other child @@ -364,7 +370,11 @@ bool wxControlContainer::DoSetFocus() win = win->GetParent(); } - return SetFocusToChild(); + bool ret = SetFocusToChild(); + + m_inSetFocus = false; + + return ret; } void wxControlContainer::HandleOnFocus(wxFocusEvent& event)