X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/57591e0edb8cbaa2b12e4a0da68fe445fa636747..181cbcf49ee56d4a3ce50a894bc6a76be79ad2f5:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index e556674f85..796e131cf0 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -66,6 +66,10 @@ #if wxUSE_GUI #include "wx/colordlg.h" + #include "wx/notebook.h" + #include "wx/frame.h" + #include "wx/statusbr.h" + #include "wx/toolbar.h" #endif // wxUSE_GUI #include @@ -667,17 +671,62 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i return menuBar->FindMenuItem (menuString, itemString); } -// Try to find the deepest child that contains 'pt' +// Try to find the deepest child that contains 'pt'. +// We go backwards, to try to allow for controls that are spacially +// within other controls, but are still siblings (e.g. buttons within +// static boxes). Static boxes are likely to be created _before_ controls +// that sit inside them. wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt) { - wxNode* node = win->GetChildren().First(); + if (!win->IsShown()) + return NULL; + + // Hack for wxNotebook case: at least in wxGTK, all pages + // claim to be shown, so we must only deal with the selected one. + if (win->IsKindOf(CLASSINFO(wxNotebook))) + { + wxNotebook* nb = (wxNotebook*) win; + int sel = nb->GetSelection(); + if (sel >= 0) + { + wxWindow* child = nb->GetPage(sel); + wxWindow* foundWin = wxFindWindowAtPoint(child, pt); + if (foundWin) + return foundWin; + } + } + /* Doesn't work + // Frame case + else if (win->IsKindOf(CLASSINFO(wxFrame))) + { + // Pseudo-children that may not be mentioned in the child list + wxWindowList extraChildren; + wxFrame* frame = (wxFrame*) win; + if (frame->GetStatusBar()) + extraChildren.Append(frame->GetStatusBar()); + if (frame->GetToolBar()) + extraChildren.Append(frame->GetToolBar()); + + wxNode* node = extraChildren.First(); + while (node) + { + wxWindow* child = (wxWindow*) node->Data(); + wxWindow* foundWin = wxFindWindowAtPoint(child, pt); + if (foundWin) + return foundWin; + node = node->Next(); + } + } + */ + + wxNode* node = win->GetChildren().Last(); while (node) { wxWindow* child = (wxWindow*) node->Data(); wxWindow* foundWin = wxFindWindowAtPoint(child, pt); if (foundWin) - return foundWin; - node = node->Next(); + return foundWin; + node = node->Previous(); } wxPoint pos = win->GetPosition();