]> git.saurik.com Git - wxWidgets.git/commitdiff
Got wxHelpContext working, plus wxFindWindowAtPointer, wxGetMousePosition,
authorJulian Smart <julian@anthemion.co.uk>
Thu, 7 Sep 2000 13:22:42 +0000 (13:22 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Thu, 7 Sep 2000 13:22:42 +0000 (13:22 +0000)
wxFindWindowAtPoint.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8282 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gdicmn.h
include/wx/utils.h
src/common/helpbase.cpp
src/common/utilscmn.cpp
src/gtk/window.cpp
src/gtk1/window.cpp
src/mac/carbon/window.cpp
src/mac/window.cpp
src/motif/window.cpp

index 457c2da1e00fd8cae46aa13295be150a994693a4..b06e329c459b3f00b95d162e0aa711416ccca689 100644 (file)
@@ -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);
 
index 491dda25492c332f654bf765e511df7d9b4ef66c..b907015be346d067f80caa5cb8098bd970fc3424 100644 (file)
@@ -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
 // ----------------------------------------------------------------------------
index 8696ad47aa0529ab0e2efc17f3f05d4ec7a1d263..a99317ac720ae7ff1d90aa7c11c2bc5516428685 100644 (file)
@@ -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;
index 49c15f328409766841d5ed091a39a822082f497b..e35cd29f78847f62df81ff2addb728dba195d74e 100644 (file)
@@ -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
 
 /*
index 15d638df75ea3c8e4a9c578d08c2d4efe6bd3a51..d56ab1057d279252182c0f2419ffde5a63b2560c 100644 (file)
@@ -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);
+
 }
 
index 15d638df75ea3c8e4a9c578d08c2d4efe6bd3a51..d56ab1057d279252182c0f2419ffde5a63b2560c 100644 (file)
@@ -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);
+
 }
 
index ea685b98862d82fca771b9a5dce85db795bae0e5..fe831d3d08291e2fe51395551dd4546f34fc9db4 100644 (file)
@@ -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.
index ea685b98862d82fca771b9a5dce85db795bae0e5..fe831d3d08291e2fe51395551dd4546f34fc9db4 100644 (file)
@@ -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.
index 53a0dd26e3c385204efd2a9ef3dc86befa2b6b06..5e39ed8eef01a2ad7136062d6bc8ae3df65d6ef5 100644 (file)
@@ -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);
 }
 
 // ----------------------------------------------------------------------------