X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/af111fc33841cc8bdc4d6cf027702805333bdd2a..b0230a69bcf6db9a18bbdefb0c3027c6a438ed55:/src/motif/window.cpp diff --git a/src/motif/window.cpp b/src/motif/window.cpp index eb96d7f645..f251d7492e 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -40,12 +40,13 @@ #include "wx/menuitem.h" #include "wx/log.h" -#include "wx/listimpl.cpp" - #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" #endif +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include #include @@ -54,6 +55,9 @@ #include #include #include // for XmMenuPosition +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/motif/private.h" @@ -116,25 +120,17 @@ static int str16len(const char *s) // event tables // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase) BEGIN_EVENT_TABLE(wxWindow, wxWindowBase) EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged) EVT_IDLE(wxWindow::OnIdle) END_EVENT_TABLE() -#endif // USE_SHARED_LIBRARY // ============================================================================ // implementation // ============================================================================ -// ---------------------------------------------------------------------------- -// list types -// ---------------------------------------------------------------------------- - -WX_DEFINE_LIST(wxRectList); - // ---------------------------------------------------------------------------- // helper functions // ---------------------------------------------------------------------------- @@ -253,7 +249,18 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, XtAppAddActions ((XtAppContext) wxTheApp->GetAppContext(), actions, 1); Widget parentWidget = (Widget) parent->GetClientWidget(); - if (style & wxBORDER) + + if (style & wxSIMPLE_BORDER) + { + m_borderWidget = (WXWidget)XtVaCreateManagedWidget + ( + "canvasBorder", + xmFrameWidgetClass, parentWidget, + XmNshadowType, XmSHADOW_IN, + XmNshadowThickness, 1, + NULL + ); + } else if (style & wxSUNKEN_BORDER) { m_borderWidget = (WXWidget)XtVaCreateManagedWidget ( @@ -262,6 +269,15 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, XmNshadowType, XmSHADOW_IN, NULL ); + } else if (style & wxRAISED_BORDER) + { + m_borderWidget = (WXWidget)XtVaCreateManagedWidget + ( + "canvasBorder", + xmFrameWidgetClass, parentWidget, + XmNshadowType, XmSHADOW_OUT, + NULL + ); } m_scrolledWindow = (WXWidget)XtVaCreateManagedWidget @@ -430,7 +446,12 @@ wxWindow::~wxWindow() // or dialog is destroyed, but before that you may get some memory // leaks and potential layout problems if you delete and then add // child windows. - XtDestroyWidget((Widget) GetMainWidget()); + + // GRG, Feb/2000: commented this out when adding support for + // wxSCROLL[WIN]_THUMBRELEASE events. Also it was reported + // that this call crashed wxMotif under OS/2, so it seems + // that leaving it out is the right thing to do. +// XtDestroyWidget((Widget) GetMainWidget()); SetMainWidget((WXWidget) NULL); } } @@ -453,7 +474,7 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) xmScrollBarWidgetClass, (Widget) m_scrolledWindow, XmNorientation, XmHORIZONTAL, NULL); - // XtAddCallback (hScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); + XtAddCallback (hScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); XtAddCallback (hScrollBar, XmNdragCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); XtAddCallback (hScrollBar, XmNincrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); XtAddCallback (hScrollBar, XmNdecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL); @@ -489,7 +510,7 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) xmScrollBarWidgetClass, (Widget) m_scrolledWindow, XmNorientation, XmVERTICAL, NULL); - // XtAddCallback (vScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); + XtAddCallback (vScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); XtAddCallback (vScrollBar, XmNdragCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); XtAddCallback (vScrollBar, XmNincrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); XtAddCallback (vScrollBar, XmNdecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL); @@ -888,6 +909,18 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) GetClientSize(& w, & h); } + wxNode *cnode = m_children.First(); + while (cnode) + { + wxWindow *child = (wxWindow*) cnode->Data(); + int sx = 0; + int sy = 0; + child->GetSize( &sx, &sy ); + wxPoint pos( child->GetPosition() ); + child->SetSize( pos.x + dx, pos.y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE ); + cnode = cnode->Next(); + } + int x1 = (dx >= 0) ? x : x - dx; int y1 = (dy >= 0) ? y : y - dy; int w1 = w - abs(dx); @@ -1222,69 +1255,61 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) GetSize(& oldW, & oldH); GetPosition(& oldX, & oldY); - bool useOldPos = FALSE; - bool useOldSize = FALSE; + if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) ) + { + if ( x == -1 ) + x = oldX; + if ( y == -1 ) + y = oldY; + } - if ((x == -1) && (x == -1) && ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)) - useOldPos = TRUE; - else if (x == oldX && y == oldY) - useOldPos = TRUE; + if ( width == -1 ) + width = oldW; + if ( height == -1 ) + height = oldH; - if ((width == -1) && (height == -1)) - useOldSize = TRUE; - else if (width == oldW && height == oldH) - useOldSize = TRUE; + bool nothingChanged = (x == oldX) && (y == oldY) && + (width == oldW) && (height == oldH); if (!wxNoOptimize::CanOptimize()) { - useOldSize = FALSE; useOldPos = FALSE; + nothingChanged = FALSE; } - if (useOldPos && useOldSize) - return; - - if (m_drawingArea) + if ( !nothingChanged ) { - CanvasSetSize(x, y, width, height, sizeFlags); - return; - } - Widget widget = (Widget) GetTopWidget(); - if (!widget) - return; + if (m_drawingArea) + { + CanvasSetSize(x, y, width, height, sizeFlags); + return; + } - bool managed = XtIsManaged( widget ); - if (managed) - XtUnmanageChild(widget); + Widget widget = (Widget) GetTopWidget(); + if (!widget) + return; - int xx = x; int yy = y; - AdjustForParentClientOrigin(xx, yy, sizeFlags); + bool managed = XtIsManaged( widget ); + if (managed) + XtUnmanageChild(widget); - if (!useOldPos) - { - if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - XtVaSetValues(widget, XmNx, xx, NULL); - if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - XtVaSetValues(widget, XmNy, yy, NULL); - } - if (!useOldSize) - { - if (width > -1) - XtVaSetValues(widget, XmNwidth, width, NULL); - if (height > -1) - XtVaSetValues(widget, XmNheight, height, NULL); - } + int xx = x; + int yy = y; + AdjustForParentClientOrigin(xx, yy, sizeFlags); - if (managed) - XtManageChild(widget); + DoMoveWindow(xx, yy, width, height); + + if (managed) + XtManageChild(widget); - // How about this bit. Maybe we don't need to generate size events - // all the time -- they'll be generated when the window is sized anyway. + // How about this bit. Maybe we don't need to generate size events + // all the time -- they'll be generated when the window is sized anyway. #if 0 - wxSizeEvent sizeEvent(wxSize(width, height), GetId()); - sizeEvent.SetEventObject(this); + wxSizeEvent sizeEvent(wxSize(width, height), GetId()); + sizeEvent.SetEventObject(this); - GetEventHandler()->ProcessEvent(sizeEvent); + GetEventHandler()->ProcessEvent(sizeEvent); #endif // 0 + } } void wxWindow::DoSetClientSize(int width, int height) @@ -1356,6 +1381,16 @@ void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, in XtVaSetValues(widget, XmNheightInc, incH, NULL); } +void wxWindow::DoMoveWindow(int x, int y, int width, int height) +{ + XtVaSetValues((Widget)GetTopWidget(), + XmNx, x, + XmNy, y, + XmNwidth, width, + XmNheight, height, + NULL); +} + // --------------------------------------------------------------------------- // text metrics // --------------------------------------------------------------------------- @@ -1633,7 +1668,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) // Try for a menu command if (frame->GetMenuBar()) { - wxMenuItem* item = frame->GetMenuBar()->FindItemForId(entry->GetCommand()); + wxMenuItem* item = frame->GetMenuBar()->FindItem(entry->GetCommand()); if (item) { wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, entry->GetCommand()); @@ -1690,7 +1725,7 @@ bool wxAddWindowToTable(Widget w, wxWindow *win) wxWidgetHashTable->Put((long) w, win); - wxLogDebug("Widget 0x%08x <-> window %p (%s)", + wxLogTrace("widget", "Widget 0x%08x <-> window %p (%s)", w, win, win->GetClassInfo()->GetClassName()); return TRUE; @@ -1944,22 +1979,6 @@ static void wxCanvasInputEvent(Widget drawingArea, else if (local_event.xany.type == MotionNotify) { eventType = wxEVT_MOTION; - if (local_event.xmotion.is_hint == NotifyHint) - { - Window root, child; - Display *dpy = XtDisplay (drawingArea); - - XQueryPointer (dpy, XtWindow (drawingArea), - &root, &child, - &local_event.xmotion.x_root, - &local_event.xmotion.y_root, - &local_event.xmotion.x, - &local_event.xmotion.y, - &local_event.xmotion.state); - } - else - { - } } else if (local_event.xany.type == ButtonPress) @@ -2017,6 +2036,26 @@ static void wxCanvasInputEvent(Widget drawingArea, wxevent.m_metaDown = local_event.xbutton.state & Mod1Mask; wxevent.SetTimestamp(local_event.xbutton.time); + if ( eventType == wxEVT_MOTION ) + { + if (local_event.xmotion.is_hint == NotifyHint) + { + Window root, child; + Display *dpy = XtDisplay (drawingArea); + + XQueryPointer (dpy, XtWindow (drawingArea), + &root, &child, + &local_event.xmotion.x_root, + &local_event.xmotion.y_root, + &local_event.xmotion.x, + &local_event.xmotion.y, + &local_event.xmotion.state); + } + else + { + } + } + // Now check if we need to translate this event into a double click if (TRUE) // canvas->doubleClickAllowed) { @@ -2239,9 +2278,7 @@ static void wxScrollBarCallback(Widget scrollbar, } case XmCR_VALUE_CHANGED: { - // TODO: Should this be intercepted too, or will it cause - // duplicate events? - eventType = wxEVT_SCROLLWIN_THUMBTRACK; + eventType = wxEVT_SCROLLWIN_THUMBRELEASE; break; } case XmCR_PAGE_INCREMENT: