]> git.saurik.com Git - wxWidgets.git/commitdiff
Don't infinitely recurse when setting the child focus. Without
authorJulian Smart <julian@anthemion.co.uk>
Mon, 19 Apr 2004 14:41:06 +0000 (14:41 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Mon, 19 Apr 2004 14:41:06 +0000 (14:41 +0000)
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
src/common/containr.cpp

index e5399b71ce5df0d20210c6bff11f898e083dea31..99049e718c9ed9f018739fa8935d3f062417c30e 100644 (file)
@@ -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)
 };
 
index 368cee065daaa97b9e30e7b3d0d67dc2c2b8baac..69b8fa56aea7a6864958e2de5655947781a61942 100644 (file)
@@ -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)