X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/31528cd3cac75558beef4bce0ba21fd182a808ab..d04d2fb520e226ff931b36a47c95f9fcbb01704b:/src/motif/window.cpp diff --git a/src/motif/window.cpp b/src/motif/window.cpp index c8e810b83f..2c8c3758cb 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -80,7 +80,7 @@ static void wxCanvasInputEvent(Widget drawingArea, XtPointer data, XmDrawingArea static void wxCanvasMotionEvent(Widget, XButtonEvent * event); static void wxCanvasEnterLeave(Widget drawingArea, XtPointer clientData, XCrossingEvent * event); static void wxScrollBarCallback(Widget widget, XtPointer clientData, - XmScaleCallbackStruct *cbs); + XmScrollBarCallbackStruct *cbs); static void wxPanelItemEventHandler(Widget wid, XtPointer client_data, XEvent* event, @@ -117,9 +117,9 @@ static int str16len(const char *s) // ---------------------------------------------------------------------------- #if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler) + IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase) - BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) + BEGIN_EVENT_TABLE(wxWindow, wxWindowBase) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) EVT_IDLE(wxWindow::OnIdle) END_EVENT_TABLE() @@ -183,7 +183,8 @@ void wxWindow::Init() m_winCaptured = FALSE; m_isShown = TRUE; - + m_isBeingDeleted = FALSE; + m_hScrollBar = m_vScrollBar = m_borderWidget = @@ -217,7 +218,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, { wxCHECK_MSG( parent, FALSE, "can't create wxWindow without parent" ); - CreateBase(parent, id, pos, size, style, name); + CreateBase(parent, id, pos, size, style, wxDefaultValidator, name); parent->AddChild(this); @@ -360,6 +361,8 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, // Destructor wxWindow::~wxWindow() { + m_isBeingDeleted = TRUE; + // Motif-specific actions first WXWidget wMain = GetMainWidget(); if ( wMain ) @@ -399,6 +402,15 @@ wxWindow::~wxWindow() wxDeleteWindowFromTable((Widget) m_scrolledWindow); } + if (m_hScrollBar) + { + wxDeleteWindowFromTable((Widget) m_hScrollBar); + } + if (m_vScrollBar) + { + wxDeleteWindowFromTable((Widget) m_vScrollBar); + } + UnmanageAndDestroy(m_hScrollBar); UnmanageAndDestroy(m_vScrollBar); UnmanageAndDestroy(m_scrolledWindow); @@ -467,6 +479,8 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) NULL); m_hScroll = TRUE; + + wxAddWindowToTable( hScrollBar, this ); } if (orientation == wxVERTICAL) @@ -500,6 +514,8 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) NULL); m_vScroll = TRUE; + + wxAddWindowToTable( vScrollBar, this ); } XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL); @@ -515,6 +531,7 @@ void wxWindow::DestroyScrollbar(wxOrientation orientation) { if (m_hScrollBar) { + wxDeleteWindowFromTable((Widget)m_hScrollBar); XtDestroyWidget((Widget) m_hScrollBar); } m_hScrollBar = (WXWidget) 0; @@ -530,6 +547,7 @@ void wxWindow::DestroyScrollbar(wxOrientation orientation) { if (m_vScrollBar) { + wxDeleteWindowFromTable((Widget)m_vScrollBar); XtDestroyWidget((Widget) m_vScrollBar); } m_vScrollBar = (WXWidget) 0; @@ -1381,12 +1399,12 @@ void wxWindow::GetTextExtent(const wxString& string, fontToUse = (wxFont *) & m_font; wxCHECK_RET( fontToUse->Ok(), "valid window font needed" ); - + WXFontStructPtr pFontStruct = theFont->GetFontStruct(1.0, GetXDisplay()); int direction, ascent, descent2; XCharStruct overall; - int slen; + int slen = string.Len(); #if 0 if (use16) @@ -1405,6 +1423,7 @@ void wxWindow::GetTextExtent(const wxString& string, *descent = descent2; if (externalLeading) *externalLeading = 0; + } // ---------------------------------------------------------------------------- @@ -1836,22 +1855,14 @@ static void wxCanvasRepaintProc(Widget drawingArea, { case Expose: { + win->AddUpdateRect(event->xexpose.x, event->xexpose.y, + event->xexpose.width, event->xexpose.height); + if (event -> xexpose.count == 0) { -#if 0 - wxPaintEvent event(win->GetId()); - event.SetEventObject(win); - win->GetEventHandler()->ProcessEvent(event); -#endif // 0 - win->DoPaint(); win->ClearUpdateRects(); } - else - { - win->AddUpdateRect(event->xexpose.x, event->xexpose.y, - event->xexpose.width, event->xexpose.height); - } break; } } @@ -2200,7 +2211,7 @@ static void wxPanelItemEventHandler(Widget wid, static void wxScrollBarCallback(Widget scrollbar, XtPointer clientData, - XmScaleCallbackStruct *cbs) + XmScrollBarCallbackStruct *cbs) { wxWindow *win = wxGetWindowFromTable(scrollbar); int orientation = (int) clientData; @@ -2210,44 +2221,44 @@ static void wxScrollBarCallback(Widget scrollbar, { case XmCR_INCREMENT: { - eventType = wxEVT_SCROLL_LINEDOWN; + eventType = wxEVT_SCROLLWIN_LINEDOWN; break; } case XmCR_DECREMENT: { - eventType = wxEVT_SCROLL_LINEUP; + eventType = wxEVT_SCROLLWIN_LINEUP; break; } case XmCR_DRAG: { - eventType = wxEVT_SCROLL_THUMBTRACK; + eventType = wxEVT_SCROLLWIN_THUMBTRACK; break; } case XmCR_VALUE_CHANGED: { // TODO: Should this be intercepted too, or will it cause // duplicate events? - eventType = wxEVT_SCROLL_THUMBTRACK; + eventType = wxEVT_SCROLLWIN_THUMBTRACK; break; } case XmCR_PAGE_INCREMENT: { - eventType = wxEVT_SCROLL_PAGEDOWN; + eventType = wxEVT_SCROLLWIN_PAGEDOWN; break; } case XmCR_PAGE_DECREMENT: { - eventType = wxEVT_SCROLL_PAGEUP; + eventType = wxEVT_SCROLLWIN_PAGEUP; break; } case XmCR_TO_TOP: { - eventType = wxEVT_SCROLL_TOP; + eventType = wxEVT_SCROLLWIN_TOP; break; } case XmCR_TO_BOTTOM: { - eventType = wxEVT_SCROLL_BOTTOM; + eventType = wxEVT_SCROLLWIN_BOTTOM; break; } default: @@ -2258,11 +2269,11 @@ static void wxScrollBarCallback(Widget scrollbar, } } - wxScrollEvent event(eventType, win->GetId()); - event.SetEventObject(win); - event.SetPosition(cbs->value); - event.SetOrientation( (orientation == XmHORIZONTAL) ? wxHORIZONTAL : wxVERTICAL ); - + wxScrollWinEvent event(eventType, + cbs->value, + ((orientation == XmHORIZONTAL) ? + wxHORIZONTAL : wxVERTICAL)); + event.SetEventObject( win ); win->GetEventHandler()->ProcessEvent(event); } @@ -2637,6 +2648,7 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget widget, XEve switch (xevent->xany.type) { case KeyPress: + case KeyRelease: { char buf[20]; @@ -2874,3 +2886,7 @@ wxWindow *wxGetActiveWindow() // ---------------------------------------------------------------------------- int wxNoOptimize::ms_count = 0; + + + +