X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0b30bb0bda00908650d46b326ba04237f0d4121f..75db495992a115ec9da82c888a57fd91842b6f64:/src/motif/window.cpp diff --git a/src/motif/window.cpp b/src/motif/window.cpp index 2684299552..207afc3ed0 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -17,10 +17,13 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "window.h" #endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + #ifdef __VMS #define XtDisplay XTDISPLAY #define XtWindow XTWINDOW @@ -145,7 +148,6 @@ static int str16len(const char *s) BEGIN_EVENT_TABLE(wxWindow, wxWindowBase) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) - EVT_IDLE(wxWindow::OnIdle) END_EVENT_TABLE() // ============================================================================ @@ -201,9 +203,6 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap) void wxWindow::Init() { - // generic initializations first - InitBase(); - // Motif-specific m_needsRefresh = TRUE; m_mainWidget = (WXWidget) 0; @@ -211,7 +210,6 @@ void wxWindow::Init() m_winCaptured = FALSE; m_isShown = TRUE; - m_isBeingDeleted = FALSE; m_hScrollBar = m_vScrollBar = @@ -375,9 +373,6 @@ wxWindow::~wxWindow() DetachWidget(wMain); } - if ( m_parent ) - m_parent->RemoveChild( this ); - // If m_drawingArea, we're a fully-fledged window with drawing area, // scrollbars etc. (what wxCanvas used to be) if ( m_drawingArea ) @@ -578,7 +573,7 @@ wxWindow *wxWindowBase::FindFocus() // (2) The widget with the focus may not be in the widget table // depending on which widgets I put in the table wxWindow *winFocus = (wxWindow *)NULL; - for ( wxWindowList::Node *node = wxTopLevelWindows.GetFirst(); + for ( wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { @@ -762,7 +757,9 @@ int wxWindow::GetScrollPos(int orient) const int wxWindow::GetScrollRange(int orient) const { Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient); - wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); + // CE scintilla windows don't always have these scrollbars + // and it tends to pile up a whole bunch of asserts + //wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); int range = 0; if (scrollBar) @@ -773,10 +770,11 @@ int wxWindow::GetScrollRange(int orient) const int wxWindow::GetScrollThumb(int orient) const { Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient); - wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); + //wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); - int thumb; - XtVaGetValues(scrollBar, XmNsliderSize, &thumb, NULL); + int thumb = 0; + if (scrollBar) + XtVaGetValues(scrollBar, XmNsliderSize, &thumb, NULL); return thumb; } @@ -905,7 +903,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) wxBrush brush(GetBackgroundColour(), wxSOLID); dc.SetBrush(brush); // FIXME: needed? - wxWindowList::Node *cnode = m_children.GetFirst(); + wxWindowList::compatibility_iterator cnode = m_children.GetFirst(); while (cnode) { wxWindow *child = cnode->GetData(); @@ -1001,7 +999,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) // Now send expose events - wxList::Node* node = updateRects.GetFirst(); + wxList::compatibility_iterator node = updateRects.GetFirst(); while (node) { wxRect* rect = (wxRect*) node->GetData(); @@ -1077,6 +1075,12 @@ void wxWindow::DoSetToolTip(wxToolTip * WXUNUSED(tooltip)) bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) { + if ( x == -1 && y == -1 ) + { + wxPoint mouse = ScreenToClient(wxGetMousePosition()); + x = mouse.x; y = mouse.y; + } + Widget widget = (Widget) GetMainWidget(); /* The menuId field seems to be usused, so we'll use it to @@ -1412,6 +1416,7 @@ void wxWindow::DoMoveWindowIntr(int xx, int yy, int w, int h, w -= 2 * (thick + margin); } + if( w < 1 ) w = 1; XtVaSetValues ((Widget) m_scrolledWindow, XmNwidth, w, NULL); } @@ -1428,6 +1433,7 @@ void wxWindow::DoMoveWindowIntr(int xx, int yy, int w, int h, h -= 2 * (thick + margin); } + if( h < 1 ) h = 1; XtVaSetValues ((Widget) m_scrolledWindow, XmNheight, h, NULL); } @@ -1578,14 +1584,6 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect) XSendEvent(display, thisWindow, False, ExposureMask, (XEvent *)&dummyEvent); } -void wxWindow::Clear() -{ - wxClientDC dc(this); - wxBrush brush(GetBackgroundColour(), wxSOLID); - dc.SetBackground(brush); - dc.Clear(); -} - void wxWindow::DoPaint() { //TODO : make a temporary gc so we can do the XCopyArea below @@ -1604,7 +1602,7 @@ void wxWindow::DoPaint() // otherwise we don't know how many pixels have been scrolled. We might // solve this in the future by defining virtual wxWindow functions to get // the scroll position in pixels. Or, each kind of scrolled window has to - // implement backing stores itself, using generic wxWindows code. + // implement backing stores itself, using generic wxWidgets code. wxScrolledWindow* scrolledWindow = wxDynamicCast(this, wxScrolledWindow); if ( scrolledWindow ) { @@ -1667,7 +1665,7 @@ void wxWindow::DoPaint() // Responds to colour changes: passes event on to children. void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event) { - wxWindowList::Node *node = GetChildren().GetFirst(); + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); while ( node ) { // Only propagate to non-top-level windows @@ -1683,12 +1681,12 @@ void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event) } } -void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event)) +void wxWindow::OnInternalIdle() { // This calls the UI-update mechanism (querying windows for // menu/toolbar/control state information) - if (wxUpdateUIEvent::CanUpdate()) - UpdateWindowUI(); + if (wxUpdateUIEvent::CanUpdate(this)) + UpdateWindowUI(wxUPDATE_UI_FROMIDLE); } // ---------------------------------------------------------------------------- @@ -1772,7 +1770,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) // ============================================================================ // ---------------------------------------------------------------------------- -// function which maintain the global hash table mapping Widgets to wxWindows +// function which maintain the global hash table mapping Widgets to wxWidgets // ---------------------------------------------------------------------------- bool wxAddWindowToTable(Widget w, wxWindow *win) @@ -1868,6 +1866,15 @@ bool wxWindow::DetachWidget(WXWidget widget) // Motif-specific accessors // ---------------------------------------------------------------------------- +WXWindow wxWindow::GetClientXWindow() const +{ + Widget wMain = (Widget)GetClientWidget(); + if ( wMain ) + return (WXWindow) XtWindow(wMain); + else + return (WXWindow) 0; +} + // Get the underlying X window WXWindow wxWindow::GetXWindow() const { @@ -2000,7 +2007,7 @@ static void wxCanvasInputEvent(Widget drawingArea, XmDrawingAreaCallbackStruct * cbs) { wxWindow *canvas = wxGetWindowFromTable(drawingArea); - XEvent local_event; + XEvent* xevent = cbs->event; if (canvas==NULL) return; @@ -2008,27 +2015,25 @@ static void wxCanvasInputEvent(Widget drawingArea, if (cbs->reason != XmCR_INPUT) return; - local_event = *(cbs->event); // We must keep a copy! - - switch (local_event.xany.type) + switch (xevent->xany.type) { case EnterNotify: case LeaveNotify: case ButtonPress: case ButtonRelease: case MotionNotify: - { - wxMouseEvent wxevent; - if(wxTranslateMouseEvent(wxevent, canvas, drawingArea, &local_event)) { - canvas->GetEventHandler()->ProcessEvent(wxevent); + wxMouseEvent wxevent(0); + if (wxTranslateMouseEvent(wxevent, canvas, drawingArea, xevent)) + { + canvas->GetEventHandler()->ProcessEvent(wxevent); + } + break; } - break; - } case KeyPress: { wxKeyEvent event (wxEVT_CHAR); - if (wxTranslateKeyEvent (event, canvas, (Widget) 0, &local_event)) + if (wxTranslateKeyEvent (event, canvas, (Widget) 0, xevent)) { // Implement wxFrame::OnCharHook by checking ancestor. wxWindow *parent = canvas; @@ -2058,7 +2063,7 @@ static void wxCanvasInputEvent(Widget drawingArea, case KeyRelease: { wxKeyEvent event (wxEVT_KEY_UP); - if (wxTranslateKeyEvent (event, canvas, (Widget) 0, &local_event)) + if (wxTranslateKeyEvent (event, canvas, (Widget) 0, xevent)) { canvas->GetEventHandler()->ProcessEvent (event); } @@ -2066,7 +2071,7 @@ static void wxCanvasInputEvent(Widget drawingArea, } case FocusIn: { - if (local_event.xfocus.detail != NotifyPointer) + if (xevent->xfocus.detail != NotifyPointer) { wxFocusEvent event(wxEVT_SET_FOCUS, canvas->GetId()); event.SetEventObject(canvas); @@ -2076,7 +2081,7 @@ static void wxCanvasInputEvent(Widget drawingArea, } case FocusOut: { - if (local_event.xfocus.detail != NotifyPointer) + if (xevent->xfocus.detail != NotifyPointer) { wxFocusEvent event(wxEVT_KILL_FOCUS, canvas->GetId()); event.SetEventObject(canvas); @@ -2216,7 +2221,7 @@ void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, // ---------------------------------------------------------------------------- bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, - Widget widget, XEvent *xevent) + Widget widget, const XEvent *xevent) { switch (xevent->xany.type) { @@ -2231,6 +2236,8 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, case ButtonRelease: case MotionNotify: { + int eventx = xevent->xbutton.x, eventy = xevent->xbutton.y; + wxEventType eventType = wxEVT_NULL; if (xevent->xany.type == LeaveNotify) @@ -2244,6 +2251,18 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, else if (xevent->xany.type == MotionNotify) { eventType = wxEVT_MOTION; + + if (xevent->xmotion.is_hint == NotifyHint) + { + Window root, child; + int x_root, y_root; + unsigned int state; + Display *dpy = XtDisplay (widget); + + XQueryPointer (dpy, XtWindow (widget), + &root, &child, + &x_root, &y_root, &eventx, &eventy, &state); + } } else if (xevent->xany.type == ButtonPress) { @@ -2320,7 +2339,7 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, int x2, y2; win->GetPosition(&x2, &y2); - // The button x/y must be translated to wxWindows + // The button x/y must be translated to wxWidgets // window space - the widget might be a label or button, // within a form. int dx = 0; @@ -2331,8 +2350,8 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, dy = y1; } - wxevent.m_x = xevent->xbutton.x + dx; - wxevent.m_y = xevent->xbutton.y + dy; + wxevent.m_x = eventx + dx; + wxevent.m_y = eventy + dy; wxevent.m_leftDown = ((eventType == wxEVT_LEFT_DOWN) || (event_left_is_down (xevent) @@ -2359,7 +2378,7 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, } bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, - Widget WXUNUSED(widget), XEvent *xevent) + Widget WXUNUSED(widget), const XEvent *xevent) { switch (xevent->xany.type) {