X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/90c3bdac77fac8f7c788d6df93eaca01af825557..52cbfcf009d9f2ac995280bd6f5dcf584295b67d:/src/generic/panelg.cpp diff --git a/src/generic/panelg.cpp b/src/generic/panelg.cpp index 809cb7c569..c58841ba5c 100644 --- a/src/generic/panelg.cpp +++ b/src/generic/panelg.cpp @@ -91,8 +91,13 @@ void wxPanel::OnNavigationKey(wxNavigationKeyEvent& event) // first of all, find the window which currently has the focus wxNode *node = GetChildren()->First(); wxWindow *winFocus = event.GetCurrentFocus(); - if ( winFocus == NULL ) - winFocus = wxWindow::FindFocus(); + + // @@@ no FindFocus() in wxGTK + #ifndef __WXGTK__ + if ( winFocus == NULL ) + winFocus = wxWindow::FindFocus(); + #endif + while ( node != NULL ) { if ( node->Data() == winFocus ) break; @@ -123,15 +128,24 @@ bool wxPanel::SetFocusToNextChild(wxNode *node, bool bForward) bFound = WIN(node)->AcceptsFocus(); } +#if 0 // to restore when it will really work (now it's triggered all the time) else { // just to be sure it's the right one wxASSERT( WIN(node)->AcceptsFocus() ); } +#endif // 0 // find the next child which accepts focus + bool bParentWantsIt = TRUE; while ( !bFound ) { node = bForward ? node->Next() : node->Previous(); if ( node == NULL ) { + if ( !bParentWantsIt ) { + // we've already been here which means that we've done a whole + // cycle without success - get out from the infinite loop + return FALSE; + } + // ask parent if he doesn't want to advance focus to the next panel if ( GetParent() != NULL ) { wxNavigationKeyEvent event; @@ -143,6 +157,9 @@ bool wxPanel::SetFocusToNextChild(wxNode *node, bool bForward) return TRUE; } + // a sentinel to avoid infinite loops + bParentWantsIt = FALSE; + // wrap around node = bForward ? children->First() : children->Last(); } @@ -155,4 +172,4 @@ bool wxPanel::SetFocusToNextChild(wxNode *node, bool bForward) #undef WIN return TRUE; -} \ No newline at end of file +}