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:
@@ -313,6 +313,7 @@ public:
|
|||||||
bool operator!=(const wxRect& rect) const { return !(*this == rect); }
|
bool operator!=(const wxRect& rect) const { return !(*this == rect); }
|
||||||
|
|
||||||
bool Inside(int cx, int cy) const;
|
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) const;
|
||||||
wxRect& operator+=(const wxRect& rect);
|
wxRect& operator+=(const wxRect& rect);
|
||||||
|
|
||||||
|
@@ -40,6 +40,7 @@ class WXDLLEXPORT wxProcess;
|
|||||||
class WXDLLEXPORT wxFrame;
|
class WXDLLEXPORT wxFrame;
|
||||||
class WXDLLEXPORT wxWindow;
|
class WXDLLEXPORT wxWindow;
|
||||||
class WXDLLEXPORT wxWindowList;
|
class WXDLLEXPORT wxWindowList;
|
||||||
|
class WXDLLEXPORT wxPoint;
|
||||||
|
|
||||||
// FIXME should use wxStricmp() instead
|
// FIXME should use wxStricmp() instead
|
||||||
#if defined(__GNUWIN32__)
|
#if defined(__GNUWIN32__)
|
||||||
@@ -269,6 +270,8 @@ WXDLLEXPORT wxWindow* wxFindWindowByName(const wxString& name, wxWindow *parent
|
|||||||
// Returns menu item id or -1 if none.
|
// Returns menu item id or -1 if none.
|
||||||
WXDLLEXPORT int wxFindMenuItemId(wxFrame *frame, const wxString& menuString, const wxString& itemString);
|
WXDLLEXPORT int wxFindMenuItemId(wxFrame *frame, const wxString& menuString, const wxString& itemString);
|
||||||
|
|
||||||
|
WXDLLEXPORT wxWindow* wxFindWindowAtPoint(const wxPoint& pt);
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Message/event queue helpers
|
// Message/event queue helpers
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -78,7 +78,10 @@ bool wxContextHelp::BeginContextHelp(wxWindow* win)
|
|||||||
wxCursor cursor(wxCURSOR_QUESTION_ARROW);
|
wxCursor cursor(wxCURSOR_QUESTION_ARROW);
|
||||||
wxCursor oldCursor = win->GetCursor();
|
wxCursor oldCursor = win->GetCursor();
|
||||||
win->SetCursor(cursor);
|
win->SetCursor(cursor);
|
||||||
wxSetCursor(cursor);
|
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
// wxSetCursor(cursor);
|
||||||
|
#endif
|
||||||
|
|
||||||
win->PushEventHandler(new wxContextHelpEvtHandler(this));
|
win->PushEventHandler(new wxContextHelpEvtHandler(this));
|
||||||
|
|
||||||
@@ -133,7 +136,7 @@ bool wxContextHelpEvtHandler::ProcessEvent(wxEvent& event)
|
|||||||
{
|
{
|
||||||
case wxEVT_LEFT_DOWN:
|
case wxEVT_LEFT_DOWN:
|
||||||
{
|
{
|
||||||
wxMouseEvent& mouseEvent = (wxMouseEvent&) event;
|
//wxMouseEvent& mouseEvent = (wxMouseEvent&) event;
|
||||||
m_contextHelp->SetStatus(TRUE);
|
m_contextHelp->SetStatus(TRUE);
|
||||||
m_contextHelp->EndContextHelp();
|
m_contextHelp->EndContextHelp();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@@ -667,6 +667,47 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i
|
|||||||
return menuBar->FindMenuItem (menuString, itemString);
|
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
|
#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
|
// Find the wxWindow at the current mouse position, also returning the mouse
|
||||||
// position.
|
// position.
|
||||||
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
||||||
{
|
{
|
||||||
int x, y;
|
pt = wxGetMousePosition();
|
||||||
GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y);
|
wxWindow* found = wxFindWindowAtPoint(pt);
|
||||||
pt.x = x;
|
return found;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the current mouse position.
|
// Get the current mouse position.
|
||||||
wxPoint wxGetMousePosition()
|
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;
|
int x, y;
|
||||||
GdkWindow* windowAtPtr = gdk_window_at_pointer(& 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
|
// Find the wxWindow at the current mouse position, also returning the mouse
|
||||||
// position.
|
// position.
|
||||||
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
||||||
{
|
{
|
||||||
int x, y;
|
pt = wxGetMousePosition();
|
||||||
GdkWindow* windowAtPtr = gdk_window_at_pointer(& x, & y);
|
wxWindow* found = wxFindWindowAtPoint(pt);
|
||||||
pt.x = x;
|
return found;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the current mouse position.
|
// Get the current mouse position.
|
||||||
wxPoint wxGetMousePosition()
|
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;
|
int x, y;
|
||||||
GdkWindow* windowAtPtr = gdk_window_at_pointer(& 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.
|
// position.
|
||||||
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
||||||
{
|
{
|
||||||
wxFAIL_MSG(_("Not implemented"));
|
pt = wxGetMousePosition();
|
||||||
return NULL;
|
wxWindow* found = wxFindWindowAtPoint(pt);
|
||||||
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the current mouse position.
|
// Get the current mouse position.
|
||||||
|
@@ -2361,8 +2361,9 @@ wxMacDrawingClientHelper::~wxMacDrawingClientHelper()
|
|||||||
// position.
|
// position.
|
||||||
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
||||||
{
|
{
|
||||||
wxFAIL_MSG(_("Not implemented"));
|
pt = wxGetMousePosition();
|
||||||
return NULL;
|
wxWindow* found = wxFindWindowAtPoint(pt);
|
||||||
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the current mouse position.
|
// Get the current mouse position.
|
||||||
|
@@ -2992,15 +2992,26 @@ wxWindow *wxGetActiveWindow()
|
|||||||
// position.
|
// position.
|
||||||
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
wxWindow* wxFindWindowAtPointer(wxPoint& pt)
|
||||||
{
|
{
|
||||||
wxFAIL_MSG(_("Not implemented"));
|
pt = wxGetMousePosition();
|
||||||
return NULL;
|
wxWindow* found = wxFindWindowAtPoint(pt);
|
||||||
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the current mouse position.
|
// Get the current mouse position.
|
||||||
wxPoint wxGetMousePosition()
|
wxPoint wxGetMousePosition()
|
||||||
{
|
{
|
||||||
wxFAIL_MSG(_("Not implemented"));
|
Display *display = (Display*) wxGetDisplay();
|
||||||
return wxPoint;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user