From: Vadim Zeitlin Date: Wed, 18 Apr 2012 09:23:05 +0000 (+0000) Subject: Don't set focus to hidden window in wxSetFocusToChild(). X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/6ca243fc75755bf1bb42d9ec8a0fdd7a4aab88ca Don't set focus to hidden window in wxSetFocusToChild(). The window that had focus previously could be hidden now, but its parent could be hidden as well so it's not enough to set focus to it but we need to loop until we find a visible ancestor. Closes #14230. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71227 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/containr.cpp b/src/common/containr.cpp index 2fda844c96..8490cc5b9f 100644 --- a/src/common/containr.cpp +++ b/src/common/containr.cpp @@ -653,17 +653,27 @@ bool wxSetFocusToChild(wxWindow *win, wxWindow **childLastFocused) // It might happen that the window got reparented if ( (*childLastFocused)->GetParent() == win ) { - // And it also could have become hidden in the meanwhile, in this - // case focus its parent instead. - while ( !(*childLastFocused)->IsShown() ) + // And it also could have become hidden in the meanwhile + // We want to focus on the deepest widget visible + wxWindow *deepestVisibleWindow = NULL; + + while ( *childLastFocused ) { + if ( (*childLastFocused)->IsShown() ) + { + if ( !deepestVisibleWindow ) + deepestVisibleWindow = *childLastFocused; + } + else + deepestVisibleWindow = NULL; + *childLastFocused = (*childLastFocused)->GetParent(); - if ( !*childLastFocused ) - break; } - if ( *childLastFocused ) + if ( deepestVisibleWindow ) { + *childLastFocused = deepestVisibleWindow; + wxLogTrace(TRACE_FOCUS, wxT("SetFocusToChild() => last child (0x%p)."), (*childLastFocused)->GetHandle());