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);
class WXDLLEXPORT wxFrame;
class WXDLLEXPORT wxWindow;
class WXDLLEXPORT wxWindowList;
+class WXDLLEXPORT wxPoint;
// FIXME should use wxStricmp() instead
#if defined(__GNUWIN32__)
// 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
// ----------------------------------------------------------------------------
wxCursor cursor(wxCURSOR_QUESTION_ARROW);
wxCursor oldCursor = win->GetCursor();
win->SetCursor(cursor);
- wxSetCursor(cursor);
+
+#ifdef __WXMSW__
+ // wxSetCursor(cursor);
+#endif
win->PushEventHandler(new wxContextHelpEvtHandler(this));
{
case wxEVT_LEFT_DOWN:
{
- wxMouseEvent& mouseEvent = (wxMouseEvent&) event;
+ //wxMouseEvent& mouseEvent = (wxMouseEvent&) event;
m_contextHelp->SetStatus(TRUE);
m_contextHelp->EndContextHelp();
return TRUE;
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
/*
*/
}
-// 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);
+
}
*/
}
-// 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);
+
}
// position.
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
{
- wxFAIL_MSG(_("Not implemented"));
- return NULL;
+ pt = wxGetMousePosition();
+ wxWindow* found = wxFindWindowAtPoint(pt);
+ return found;
}
// Get the current mouse position.
// position.
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
{
- wxFAIL_MSG(_("Not implemented"));
- return NULL;
+ pt = wxGetMousePosition();
+ wxWindow* found = wxFindWindowAtPoint(pt);
+ return found;
}
// Get the current mouse position.
// 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);
}
// ----------------------------------------------------------------------------