From 6ca243fc75755bf1bb42d9ec8a0fdd7a4aab88ca Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 18 Apr 2012 09:23:05 +0000 Subject: [PATCH] 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 --- src/common/containr.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/common/containr.cpp b/src/common/containr.cpp index 2fda844..8490cc5 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()); -- 2.7.4