]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/window.cpp
renamed wxScrollHelper::GetRect() to GetScrollRect() to avoid conflicts with wxWindow...
[wxWidgets.git] / src / motif / window.cpp
index cc55da5b8d20f46fa4c1913a873fdff62293ef8d..268429955291286c8d8dfbe28553a227b412f12e 100644 (file)
@@ -172,11 +172,6 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap)
     if ( !w )
         return FALSE;
 
-    if ( domap )
-        XtMapWidget(w);
-    else
-        XtUnmapWidget(w);
-
     //   Rationale: a lot of common operations (including but not
     // limited to moving, resizing and appending items to a listbox)
     // unmamange the widget, do their work, then manage it again.
@@ -184,6 +179,19 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap)
     // or that most controls are shown every time they are moved or resized!
     XtSetMappedWhenManaged( w, domap );
 
+    // if the widget is not unmanaged, it still intercepts
+    // mouse events, even if it is not mapped (and hence invisible)
+    if ( domap )
+    {
+        XtManageChild(w);
+        // XtMapWidget(w);
+    }
+    else
+    {
+        XtUnmanageChild(w);
+        // XtUnmapWidget(w);
+    }
+
     return TRUE;
 }
 
@@ -269,36 +277,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     XtAppAddActions ((XtAppContext) wxTheApp->GetAppContext(), actions, 1);
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
-    
-    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
-                                   (
-                                    "canvasBorder",
-                                    xmFrameWidgetClass, parentWidget,
-                                    XmNshadowType, XmSHADOW_IN,
-                                    NULL
-                                   );
-    } else if (style & wxRAISED_BORDER)
-    {
-        m_borderWidget = (WXWidget)XtVaCreateManagedWidget
-                                   (
-                                    "canvasBorder",
-                                    xmFrameWidgetClass, parentWidget,
-                                    XmNshadowType, XmSHADOW_OUT,
-                                    NULL
-                                   );
-    }
+    m_borderWidget = wxCreateBorderWidget( (WXWidget)parentWidget, style );
 
     m_scrolledWindow = (WXWidget)XtVaCreateManagedWidget
                                  (
@@ -352,12 +331,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     XtAddCallback ((Widget) m_drawingArea, XmNexposeCallback, (XtCallbackProc) wxCanvasRepaintProc, (XtPointer) this);
     XtAddCallback ((Widget) m_drawingArea, XmNinputCallback, (XtCallbackProc) wxCanvasInputEvent, (XtPointer) this);
 
-    // TODO?
-#if 0
-    display = XtDisplay (scrolledWindow);
-    xwindow = XtWindow (drawingArea);
-#endif // 0
-
     XtAddEventHandler(
                       (Widget)m_drawingArea,
                        PointerMotionHintMask | EnterWindowMask |
@@ -378,13 +351,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
                              (Widget) 0, (Widget) 0,
                              (Widget) m_drawingArea);
 
-#if 0
-    if (m_hScrollBar)
-        XtRealizeWidget ((Widget) m_hScrollBar);
-    if (m_vScrollBar)
-        XtRealizeWidget ((Widget) m_vScrollBar);
-#endif // 0
-
     // Without this, the cursor may not be restored properly (e.g. in splitter
     // sample).
     SetCursor(*wxSTANDARD_CURSOR);
@@ -409,8 +375,6 @@ wxWindow::~wxWindow()
         DetachWidget(wMain);
     }
 
-    ClearUpdateRects();
-
     if ( m_parent )
         m_parent->RemoveChild( this );
 
@@ -490,120 +454,107 @@ wxWindow::~wxWindow()
 // scrollbar management
 // ----------------------------------------------------------------------------
 
+WXWidget wxWindow::DoCreateScrollBar(WXWidget parent,
+                                     wxOrientation orientation,
+                                     void (*callback)())
+{
+    int orient = ( orientation & wxHORIZONTAL ) ? XmHORIZONTAL : XmVERTICAL;
+    Widget sb =
+        XtVaCreateManagedWidget( "scrollBarWidget",
+                                 xmScrollBarWidgetClass, (Widget)parent,
+                                 XmNorientation, orient,
+                                 XmNincrement, 1,
+                                 XmNvalue, 0,
+                                 NULL );
+
+    XtPointer o = (XtPointer)orientation;
+    XtCallbackProc cb = (XtCallbackProc)callback;
+
+    XtAddCallback( sb, XmNvalueChangedCallback, cb, o );
+    XtAddCallback( sb, XmNdragCallback, cb, o );
+    XtAddCallback( sb, XmNincrementCallback, cb, o );
+    XtAddCallback( sb, XmNdecrementCallback, cb, o );
+    XtAddCallback( sb, XmNpageIncrementCallback, cb, o );
+    XtAddCallback( sb, XmNpageDecrementCallback, cb, o );
+    XtAddCallback( sb, XmNtoTopCallback, cb, o );
+    XtAddCallback( sb, XmNtoBottomCallback, cb, o );
+
+    return (WXWidget)sb;
+}
+
 // Helper function
 void wxWindow::CreateScrollbar(wxOrientation orientation)
 {
     wxCHECK_RET( m_drawingArea, "this window can't have scrollbars" );
 
-    XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_NONE, NULL);
+    XtVaSetValues( (Widget) m_scrolledWindow,
+                   XmNresizePolicy, XmRESIZE_NONE,
+                   NULL );
 
+    wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
     // Add scrollbars if required
     if (orientation == wxHORIZONTAL)
     {
-        Widget hScrollBar = XtVaCreateManagedWidget ("hsb",
-            xmScrollBarWidgetClass, (Widget) m_scrolledWindow,
-            XmNorientation, XmHORIZONTAL,
-            NULL);
-        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);
-        XtAddCallback (hScrollBar, XmNpageIncrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
-        XtAddCallback (hScrollBar, XmNpageDecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
-        XtAddCallback (hScrollBar, XmNtoTopCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
-        XtAddCallback (hScrollBar, XmNtoBottomCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
-
-        XtVaSetValues (hScrollBar,
-            XmNincrement, 1,
-            XmNvalue, 0,
-            NULL);
-
-        m_hScrollBar = (WXWidget) hScrollBar;
+        m_hScrollBar = DoCreateScrollBar( m_scrolledWindow, wxHORIZONTAL,
+                                          (void (*)())wxScrollBarCallback );
 
-        wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
         wxDoChangeBackgroundColour(m_hScrollBar, backgroundColour, TRUE);
 
-        XtRealizeWidget(hScrollBar);
+        XtRealizeWidget( (Widget)m_hScrollBar );
 
         XtVaSetValues((Widget) m_scrolledWindow,
             XmNhorizontalScrollBar, (Widget) m_hScrollBar,
             NULL);
 
-        wxAddWindowToTable( hScrollBar, this );
+        wxAddWindowToTable( (Widget)m_hScrollBar, this );
     }
-
-    if (orientation == wxVERTICAL)
+    else if (orientation == wxVERTICAL)
     {
-        Widget vScrollBar = XtVaCreateManagedWidget ("vsb",
-            xmScrollBarWidgetClass, (Widget) m_scrolledWindow,
-            XmNorientation, XmVERTICAL,
-            NULL);
-        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);
-        XtAddCallback (vScrollBar, XmNpageIncrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
-        XtAddCallback (vScrollBar, XmNpageDecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
-        XtAddCallback (vScrollBar, XmNtoTopCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
-        XtAddCallback (vScrollBar, XmNtoBottomCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
-
-        XtVaSetValues (vScrollBar,
-            XmNincrement, 1,
-            XmNvalue, 0,
-            NULL);
+        m_vScrollBar = DoCreateScrollBar( m_scrolledWindow, wxVERTICAL,
+                                          (void (*)())wxScrollBarCallback );
 
-        m_vScrollBar = (WXWidget) vScrollBar;
-        wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
         wxDoChangeBackgroundColour(m_vScrollBar, backgroundColour, TRUE);
 
-        XtRealizeWidget(vScrollBar);
+        XtRealizeWidget((Widget)m_vScrollBar);
 
         XtVaSetValues((Widget) m_scrolledWindow,
             XmNverticalScrollBar, (Widget) m_vScrollBar,
             NULL);
 
-        wxAddWindowToTable( vScrollBar, this );
+        wxAddWindowToTable( (Widget)m_vScrollBar, this );
     }
 
-    XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL);
+    XtVaSetValues( (Widget) m_scrolledWindow,
+                   XmNresizePolicy, XmRESIZE_ANY,
+                   NULL );
 }
 
 void wxWindow::DestroyScrollbar(wxOrientation orientation)
 {
     wxCHECK_RET( m_drawingArea, "this window can't have scrollbars" );
 
-    XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_NONE, NULL);
-    // Add scrollbars if required
-    if (orientation == wxHORIZONTAL)
-    {
-        if (m_hScrollBar)
-        {
-            wxDeleteWindowFromTable((Widget)m_hScrollBar);
-            XtDestroyWidget((Widget) m_hScrollBar);
-        }
-        m_hScrollBar = (WXWidget) 0;
-
-        XtVaSetValues((Widget) m_scrolledWindow,
-            XmNhorizontalScrollBar, (Widget) 0,
-            NULL);
+    XtVaSetValues((Widget) m_scrolledWindow,
+                  XmNresizePolicy, XmRESIZE_NONE,
+                  NULL);
+    String stringSB = orientation == wxHORIZONTAL ?
+        XmNhorizontalScrollBar : XmNverticalScrollBar;
+    WXWidget* widgetSB = orientation == wxHORIZONTAL ?
+        &m_hScrollBar : &m_vScrollBar;
 
-    }
-
-    if (orientation == wxVERTICAL)
+    if( *widgetSB )
     {
-        if (m_vScrollBar)
-        {
-            wxDeleteWindowFromTable((Widget)m_vScrollBar);
-            XtDestroyWidget((Widget) m_vScrollBar);
-        }
-        m_vScrollBar = (WXWidget) 0;
+        wxDeleteWindowFromTable( (Widget)*widgetSB );
+        XtDestroyWidget( (Widget)*widgetSB );
+        *widgetSB = (WXWidget)NULL;
+    }
 
-        XtVaSetValues((Widget) m_scrolledWindow,
-            XmNverticalScrollBar, (Widget) 0,
-            NULL);
+    XtVaSetValues( (Widget)m_scrolledWindow,
+                   stringSB, (Widget) 0,
+                   NULL );
 
-    }
-    XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL);
+    XtVaSetValues((Widget) m_scrolledWindow,
+                  XmNresizePolicy, XmRESIZE_ANY,
+                  NULL);
 }
 
 // ---------------------------------------------------------------------------
@@ -668,8 +619,8 @@ bool wxWindow::Show(bool show)
 
     if (m_borderWidget || m_scrolledWindow)
     {
-        MapOrUnmap(m_drawingArea, show);
         MapOrUnmap(m_borderWidget ? m_borderWidget : m_scrolledWindow, show);
+        // MapOrUnmap(m_drawingArea, show);
     }
     else
     {
@@ -1578,6 +1529,11 @@ void wxWindow::GetTextExtent(const wxString& string,
 // painting
 // ----------------------------------------------------------------------------
 
+void wxWindow::AddUpdateRect(int x, int y, int w, int h)
+{
+    m_updateRegion.Union( x, y, w, h );
+}
+
 void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
 {
     m_needsRefresh = TRUE;
@@ -1630,19 +1586,6 @@ void wxWindow::Clear()
     dc.Clear();
 }
 
-void wxWindow::ClearUpdateRects()
-{
-    wxRectList::Node* node = m_updateRects.GetFirst();
-    while (node)
-    {
-        wxRect* rect = node->GetData();
-        delete rect;
-        node = node->GetNext();
-    }
-
-    m_updateRects.Clear();
-}
-
 void wxWindow::DoPaint()
 {
     //TODO : make a temporary gc so we can do the XCopyArea below
@@ -1744,7 +1687,8 @@ void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event))
 {
     // This calls the UI-update mechanism (querying windows for
     // menu/toolbar/control state information)
-    UpdateWindowUI();
+    if (wxUpdateUIEvent::CanUpdate())
+        UpdateWindowUI();
 }
 
 // ----------------------------------------------------------------------------
@@ -2009,11 +1953,10 @@ static void wxCanvasRepaintProc(Widget drawingArea,
         {
             win->AddUpdateRect(event->xexpose.x, event->xexpose.y,
                                event->xexpose.width, event->xexpose.height);
-            
+
             if (event -> xexpose.count == 0)
             {
                 win->DoPaint();
-                win->ClearUpdateRects();
             }
             break;
         }
@@ -2178,7 +2121,7 @@ static void wxScrollBarCallback(Widget scrollbar,
                                 XmScrollBarCallbackStruct *cbs)
 {
     wxWindow *win = wxGetWindowFromTable(scrollbar);
-    int orientation = (int) clientData;
+    wxOrientation orientation = (wxOrientation)(int)clientData;
 
     wxEventType eventType = wxEVT_NULL;
     switch (cbs->reason)
@@ -2233,8 +2176,7 @@ static void wxScrollBarCallback(Widget scrollbar,
 
     wxScrollWinEvent event(eventType,
                            cbs->value,
-                           ((orientation == XmHORIZONTAL) ?
-                            wxHORIZONTAL : wxVERTICAL));
+                           orientation);
     event.SetEventObject( win );
     win->GetEventHandler()->ProcessEvent(event);
 }
@@ -2256,16 +2198,12 @@ void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event,
             window = (Window) win -> GetXWindow();
             display = (Display *) win -> GetXDisplay();
 
+            win->AddUpdateRect(event->xexpose.x, event->xexpose.y,
+                               event->xexpose.width, event->xexpose.height);
+
             if (event -> xexpose.count == 0)
             {
                 win->DoPaint();
-
-                win->ClearUpdateRects();
-            }
-            else
-            {
-                win->AddUpdateRect(event->xexpose.x, event->xexpose.y,
-                                   event->xexpose.width, event->xexpose.height);
             }
 
             break;
@@ -2329,7 +2267,7 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win,
 
                 // check for a double click
                 //
-                long dclickTime = XtGetMultiClickTime(wxGlobalDisplay());
+                long dclickTime = XtGetMultiClickTime(xevent->xany.display);
                 long ts = wxevent.GetTimestamp();
 
                 int buttonLast = win->GetLastClickedButton();
@@ -2616,7 +2554,7 @@ wxWindow* wxFindWindowAtPointer(wxPoint& pt)
 // Get the current mouse position.
 wxPoint wxGetMousePosition()
 {
-    Display *display = (Display*) wxGetDisplay();
+    Display *display = wxGlobalDisplay();
     Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display));
     Window rootReturn, childReturn;
     int rootX, rootY, winX, winY;