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:
Julian Smart 2000-09-07 13:22:42 +00:00
parent b85cfb6fd4
commit 59a12e9034
9 changed files with 123 additions and 100 deletions

View 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);

View 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
// ----------------------------------------------------------------------------

View 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;

View 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
/*

View 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);
}

View 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);
}

View 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.

View 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.

View 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);
}
// ----------------------------------------------------------------------------