Got wxHelpContext working, plus wxFindWindowAtPointer, wxGetMousePosition,
wxFindWindowAtPoint. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8282 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
b85cfb6fd4
commit
59a12e9034
@ -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);
|
||||
|
||||
|
@ -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
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user