From 59a12e90345a6d88e74f594b500be4b48637f52c Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 7 Sep 2000 13:22:42 +0000 Subject: [PATCH] Got wxHelpContext working, plus wxFindWindowAtPointer, wxGetMousePosition, wxFindWindowAtPoint. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8282 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gdicmn.h | 1 + include/wx/utils.h | 3 ++ src/common/helpbase.cpp | 7 ++-- src/common/utilscmn.cpp | 41 ++++++++++++++++++++++ src/gtk/window.cpp | 71 ++++++++++++++------------------------- src/gtk1/window.cpp | 71 ++++++++++++++------------------------- src/mac/carbon/window.cpp | 5 +-- src/mac/window.cpp | 5 +-- src/motif/window.cpp | 19 ++++++++--- 9 files changed, 123 insertions(+), 100 deletions(-) diff --git a/include/wx/gdicmn.h b/include/wx/gdicmn.h index 457c2da1e0..b06e329c45 100644 --- a/include/wx/gdicmn.h +++ b/include/wx/gdicmn.h @@ -313,6 +313,7 @@ public: bool operator!=(const wxRect& rect) const { return !(*this == rect); } bool Inside(int cx, int cy) const; + bool Inside(const wxPoint& pt) const { return Inside(pt.x, pt.y); } wxRect operator+(const wxRect& rect) const; wxRect& operator+=(const wxRect& rect); diff --git a/include/wx/utils.h b/include/wx/utils.h index 491dda2549..b907015be3 100644 --- a/include/wx/utils.h +++ b/include/wx/utils.h @@ -40,6 +40,7 @@ class WXDLLEXPORT wxProcess; class WXDLLEXPORT wxFrame; class WXDLLEXPORT wxWindow; class WXDLLEXPORT wxWindowList; +class WXDLLEXPORT wxPoint; // FIXME should use wxStricmp() instead #if defined(__GNUWIN32__) @@ -269,6 +270,8 @@ WXDLLEXPORT wxWindow* wxFindWindowByName(const wxString& name, wxWindow *parent // Returns menu item id or -1 if none. WXDLLEXPORT int wxFindMenuItemId(wxFrame *frame, const wxString& menuString, const wxString& itemString); +WXDLLEXPORT wxWindow* wxFindWindowAtPoint(const wxPoint& pt); + // ---------------------------------------------------------------------------- // Message/event queue helpers // ---------------------------------------------------------------------------- diff --git a/src/common/helpbase.cpp b/src/common/helpbase.cpp index 8696ad47aa..a99317ac72 100644 --- a/src/common/helpbase.cpp +++ b/src/common/helpbase.cpp @@ -78,7 +78,10 @@ bool wxContextHelp::BeginContextHelp(wxWindow* win) wxCursor cursor(wxCURSOR_QUESTION_ARROW); wxCursor oldCursor = win->GetCursor(); win->SetCursor(cursor); - wxSetCursor(cursor); + +#ifdef __WXMSW__ + // wxSetCursor(cursor); +#endif win->PushEventHandler(new wxContextHelpEvtHandler(this)); @@ -133,7 +136,7 @@ bool wxContextHelpEvtHandler::ProcessEvent(wxEvent& event) { case wxEVT_LEFT_DOWN: { - wxMouseEvent& mouseEvent = (wxMouseEvent&) event; + //wxMouseEvent& mouseEvent = (wxMouseEvent&) event; m_contextHelp->SetStatus(TRUE); m_contextHelp->EndContextHelp(); return TRUE; diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 49c15f3284..e35cd29f78 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -667,6 +667,47 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i return menuBar->FindMenuItem (menuString, itemString); } +// Try to find the deepest child that contains 'pt' +wxWindow* wxFindWindowAtPoint(wxWindow* win, const wxPoint& pt) +{ + wxNode* node = win->GetChildren().First(); + while (node) + { + wxWindow* child = (wxWindow*) node->Data(); + wxWindow* foundWin = wxFindWindowAtPoint(child, pt); + if (foundWin) + return foundWin; + node = node->Next(); + } + + wxPoint pos = win->GetPosition(); + wxSize sz = win->GetSize(); + if (win->GetParent()) + { + pos = win->GetParent()->ClientToScreen(pos); + } + + wxRect rect(pos, sz); + if (rect.Inside(pt)) + return win; + else + return NULL; +} + +wxWindow* wxFindWindowAtPoint(const wxPoint& pt) +{ + wxNode* node = wxTopLevelWindows.First(); + while (node) + { + wxWindow* win = (wxWindow*) node->Data(); + wxWindow* found = wxFindWindowAtPoint(win, pt); + if (found) + return found; + node = node->Next(); + } + return NULL; +} + #endif // wxUSE_GUI /* diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 15d638df75..d56ab1057d 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -3754,61 +3754,42 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) */ } -// Helper for wxFindWindowAtPointer -wxWindow* wxFindWindowForGdkWindow(wxWindow* win, GdkWindow* gdkWindow) -{ - GdkWindow* thisGdkWindow1 = 0; - GdkWindow* thisGdkWindow2 = 0; - - if (win->m_wxwindow) - thisGdkWindow1 = GTK_PIZZA(win->m_wxwindow)->bin_window; - - thisGdkWindow2 = win->m_widget->window; - - if (gdkWindow == thisGdkWindow1 || gdkWindow == thisGdkWindow2) - return win; - - wxNode* node = win->GetChildren().First(); - while (node) - { - wxWindow* child = (wxWindow*) node->Data(); - wxWindow* found = wxFindWindowForGdkWindow(child, gdkWindow); - if (found) - return found; - - node = node->Next(); - } - return NULL; -} - // Find the wxWindow at the current mouse position, also returning the mouse // position. wxWindow* wxFindWindowAtPointer(wxPoint& pt) { - int x, y; - GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y); - pt.x = x; - pt.y = y; - if (windowAtPtr) - { - wxNode* node = wxTopLevelWindows.First(); - while (node) - { - wxWindow* win = (wxWindow*) node->Data(); - wxWindow* wxWinAtPtr = wxFindWindowForGdkWindow(win, windowAtPtr); - if (wxWinAtPtr) - return wxWinAtPtr; - node = node->Next(); - } - } - return NULL; + pt = wxGetMousePosition(); + wxWindow* found = wxFindWindowAtPoint(pt); + return found; } // Get the current mouse position. wxPoint wxGetMousePosition() { + /* This crashes when used within wxHelpContext, + so we have to use the X-specific implementation below. + gint x, y; + GdkModifierType *mask; + (void) gdk_window_get_pointer(NULL, &x, &y, mask); + + return wxPoint(x, y); + */ + int x, y; GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y); - return wxPoint(x, y); + + Display *display = GDK_WINDOW_XDISPLAY(windowAtPtr); + Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display)); + Window rootReturn, childReturn; + int rootX, rootY, winX, winY; + unsigned int maskReturn; + + XQueryPointer (display, + rootWindow, + &rootReturn, + &childReturn, + &rootX, &rootY, &winX, &winY, &maskReturn); + return wxPoint(rootX, rootY); + } diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 15d638df75..d56ab1057d 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -3754,61 +3754,42 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) */ } -// Helper for wxFindWindowAtPointer -wxWindow* wxFindWindowForGdkWindow(wxWindow* win, GdkWindow* gdkWindow) -{ - GdkWindow* thisGdkWindow1 = 0; - GdkWindow* thisGdkWindow2 = 0; - - if (win->m_wxwindow) - thisGdkWindow1 = GTK_PIZZA(win->m_wxwindow)->bin_window; - - thisGdkWindow2 = win->m_widget->window; - - if (gdkWindow == thisGdkWindow1 || gdkWindow == thisGdkWindow2) - return win; - - wxNode* node = win->GetChildren().First(); - while (node) - { - wxWindow* child = (wxWindow*) node->Data(); - wxWindow* found = wxFindWindowForGdkWindow(child, gdkWindow); - if (found) - return found; - - node = node->Next(); - } - return NULL; -} - // Find the wxWindow at the current mouse position, also returning the mouse // position. wxWindow* wxFindWindowAtPointer(wxPoint& pt) { - int x, y; - GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y); - pt.x = x; - pt.y = y; - if (windowAtPtr) - { - wxNode* node = wxTopLevelWindows.First(); - while (node) - { - wxWindow* win = (wxWindow*) node->Data(); - wxWindow* wxWinAtPtr = wxFindWindowForGdkWindow(win, windowAtPtr); - if (wxWinAtPtr) - return wxWinAtPtr; - node = node->Next(); - } - } - return NULL; + pt = wxGetMousePosition(); + wxWindow* found = wxFindWindowAtPoint(pt); + return found; } // Get the current mouse position. wxPoint wxGetMousePosition() { + /* This crashes when used within wxHelpContext, + so we have to use the X-specific implementation below. + gint x, y; + GdkModifierType *mask; + (void) gdk_window_get_pointer(NULL, &x, &y, mask); + + return wxPoint(x, y); + */ + int x, y; GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y); - return wxPoint(x, y); + + Display *display = GDK_WINDOW_XDISPLAY(windowAtPtr); + Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display)); + Window rootReturn, childReturn; + int rootX, rootY, winX, winY; + unsigned int maskReturn; + + XQueryPointer (display, + rootWindow, + &rootReturn, + &childReturn, + &rootX, &rootY, &winX, &winY, &maskReturn); + return wxPoint(rootX, rootY); + } diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index ea685b9886..fe831d3d08 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -2361,8 +2361,9 @@ wxMacDrawingClientHelper::~wxMacDrawingClientHelper() // position. wxWindow* wxFindWindowAtPointer(wxPoint& pt) { - wxFAIL_MSG(_("Not implemented")); - return NULL; + pt = wxGetMousePosition(); + wxWindow* found = wxFindWindowAtPoint(pt); + return found; } // Get the current mouse position. diff --git a/src/mac/window.cpp b/src/mac/window.cpp index ea685b9886..fe831d3d08 100644 --- a/src/mac/window.cpp +++ b/src/mac/window.cpp @@ -2361,8 +2361,9 @@ wxMacDrawingClientHelper::~wxMacDrawingClientHelper() // position. wxWindow* wxFindWindowAtPointer(wxPoint& pt) { - wxFAIL_MSG(_("Not implemented")); - return NULL; + pt = wxGetMousePosition(); + wxWindow* found = wxFindWindowAtPoint(pt); + return found; } // Get the current mouse position. diff --git a/src/motif/window.cpp b/src/motif/window.cpp index 53a0dd26e3..5e39ed8eef 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -2992,15 +2992,26 @@ wxWindow *wxGetActiveWindow() // position. wxWindow* wxFindWindowAtPointer(wxPoint& pt) { - wxFAIL_MSG(_("Not implemented")); - return NULL; + pt = wxGetMousePosition(); + wxWindow* found = wxFindWindowAtPoint(pt); + return found; } // Get the current mouse position. wxPoint wxGetMousePosition() { - wxFAIL_MSG(_("Not implemented")); - return wxPoint; + Display *display = (Display*) wxGetDisplay(); + Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display)); + Window rootReturn, childReturn; + int rootX, rootY, winX, winY; + unsigned int maskReturn; + + XQueryPointer (display, + rootWindow, + &rootReturn, + &childReturn, + &rootX, &rootY, &winX, &winY, &maskReturn); + return wxPoint(rootX, rootY); } // ---------------------------------------------------------------------------- -- 2.45.2