]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/window.cpp
patch applied with thanks, fixes #13865
[wxWidgets.git] / src / motif / window.cpp
index cc55da5b8d20f46fa4c1913a873fdff62293ef8d..01bac1281338259d34c7263af39444202217af0f 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        windows.cpp
+// Name:        src/motif/window.cpp
 // Purpose:     wxWindow
 // Author:      Julian Smart
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #pragma implementation "window.h"
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/hash.h"
+    #include "wx/log.h"
+    #include "wx/app.h"
+    #include "wx/utils.h"
+    #include "wx/frame.h"
+    #include "wx/dc.h"
+    #include "wx/dcclient.h"
+    #include "wx/button.h"
+    #include "wx/menu.h"
+    #include "wx/settings.h"
+    #include "wx/scrolwin.h"
+    #include "wx/layout.h"
+    #include "wx/menuitem.h"
+    #include "wx/module.h"
 #endif
 
-#ifdef __VMS
-#define XtDisplay XTDISPLAY
-#define XtWindow XTWINDOW
-#define XtScreen XTSCREEN
-#endif
-
-#include "wx/setup.h"
-#include "wx/menu.h"
-#include "wx/dc.h"
-#include "wx/dcclient.h"
-#include "wx/utils.h"
-#include "wx/app.h"
-#include "wx/layout.h"
-#include "wx/button.h"
-#include "wx/settings.h"
-#include "wx/frame.h"
-#include "wx/scrolwin.h"
-#include "wx/module.h"
-#include "wx/menuitem.h"
-#include "wx/log.h"
 #include "wx/evtloop.h"
-#include "wx/hash.h"
+#include "wx/unix/utilsx11.h"
 
 #if  wxUSE_DRAG_AND_DROP
     #include "wx/dnd.h"
@@ -51,7 +47,7 @@
 // DoSetSizeIntr and DoMoveWindowIntr
 // PROBLEM:
 // under Motif composite controls (such as wxCalendarCtrl or generic wxSpinCtrl
-// did nott work and/or segfaulted because
+// did not work and/or segfaulted because
 // 1) wxWindow::Create calls SetSize,
 //    which results in a call to DoSetSize much earlier than in the other ports
 // 2) if wxWindow::Create is called (wxControl::Create calls it)
@@ -64,7 +60,7 @@
 // 2) call DoMoveWindow from DoSetSize, allowing controls to override it
 
 #ifdef __VMS__
-#pragma message disable nosimpint
+    #pragma message disable nosimpint
 #endif
 #include <Xm/Xm.h>
 
 #include <Xm/Label.h>
 #include <Xm/RowColumn.h>           // for XmMenuPosition
 #ifdef __VMS__
-#pragma message enable nosimpint
+    #pragma message enable nosimpint
 #endif
 
 #include "wx/motif/private.h"
+#include "wx/motif/dcclient.h"
 
 #include <string.h>
 
-// ----------------------------------------------------------------------------
-// constants
-// ----------------------------------------------------------------------------
-
-static const int SCROLL_MARGIN = 4;
-
 // ----------------------------------------------------------------------------
 // global variables for this module
 // ----------------------------------------------------------------------------
@@ -141,11 +132,8 @@ static int str16len(const char *s)
 // event tables
 // ----------------------------------------------------------------------------
 
-    IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
-
     BEGIN_EVENT_TABLE(wxWindow, wxWindowBase)
         EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
-        EVT_IDLE(wxWindow::OnIdle)
     END_EVENT_TABLE()
 
 // ============================================================================
@@ -170,12 +158,7 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap)
 {
     Widget w = (Widget)widget;
     if ( !w )
-        return FALSE;
-
-    if ( domap )
-        XtMapWidget(w);
-    else
-        XtUnmapWidget(w);
+        return false;
 
     //   Rationale: a lot of common operations (including but not
     // limited to moving, resizing and appending items to a listbox)
@@ -184,7 +167,20 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap)
     // or that most controls are shown every time they are moved or resized!
     XtSetMappedWhenManaged( w, domap );
 
-    return TRUE;
+    // 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;
 }
 
 // ----------------------------------------------------------------------------
@@ -193,18 +189,14 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap)
 
 void wxWindow::Init()
 {
-    // generic initializations first
-    InitBase();
-
     // Motif-specific
-    m_needsRefresh = TRUE;
+    m_needsRefresh = true;
     m_mainWidget = (WXWidget) 0;
 
-    m_winCaptured = FALSE;
+    m_winCaptured = false;
+
+    m_isShown = true;
 
-    m_isShown = TRUE;
-    m_isBeingDeleted = FALSE;
-    
     m_hScrollBar =
     m_vScrollBar =
     m_borderWidget =
@@ -232,14 +224,17 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
                       long style,
                       const wxString& name)
 {
-    wxCHECK_MSG( parent, FALSE, "can't create wxWindow without parent" );
+    // Get default border
+    wxBorder border = GetBorder(style);
+    style &= ~wxBORDER_MASK;
+    style |= border;
+
+    wxCHECK_MSG( parent, false, "can't create wxWindow without parent" );
 
     CreateBase(parent, id, pos, size, style, wxDefaultValidator, name);
 
     parent->AddChild(this);
-
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-    m_foregroundColour = *wxBLACK;
+    PreCreation();
 
     //// TODO: we should probably optimize by only creating a
     //// a drawing area if we have one or more scrollbars (wxVSCROLL/wxHSCROLL).
@@ -247,7 +242,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     //// drawing area, since otherwise the translations are different.
 
     // New translations for getting mouse motion feedback
-    static const String translations =
+    static const String translations = wxMOTIF_STR(
 "<Btn1Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
 <Btn2Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
 <Btn3Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
@@ -261,44 +256,15 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
 <Motion>: wxCanvasMotionEvent() DrawingAreaInput()\n\
 <EnterWindow>: wxCanvasMotionEvent() DrawingAreaInput()\n\
 <LeaveWindow>: wxCanvasMotionEvent() DrawingAreaInput()\n\
-<Key>: DrawingAreaInput()";
+<Key>: DrawingAreaInput()");
 
     XtActionsRec actions[1];
-    actions[0].string = "wxCanvasMotionEvent";
+    actions[0].string = wxMOTIF_STR("wxCanvasMotionEvent");
     actions[0].proc = (XtActionProc) wxCanvasMotionEvent;
     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 +318,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 |
@@ -367,40 +327,28 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
                        (XtPointer) this
                      );
 
-    // Scrolled widget needs to have its colour changed or we get a little blue
-    // square where the scrollbars abutt
-    wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-    wxDoChangeBackgroundColour(m_scrolledWindow, backgroundColour, TRUE);
-    wxDoChangeBackgroundColour(m_drawingArea, backgroundColour, TRUE);
-
     XmScrolledWindowSetAreas(
                              (Widget)m_scrolledWindow,
                              (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
+    PostCreation();
 
     // Without this, the cursor may not be restored properly (e.g. in splitter
     // sample).
     SetCursor(*wxSTANDARD_CURSOR);
-    SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
-    DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, TRUE);
-    return TRUE;
+    DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, true);
+    return true;
 }
 
 // Destructor
 wxWindow::~wxWindow()
 {
+    SendDestroyEvent();
+
     if (g_captureWindow == this)
         g_captureWindow = NULL;
-    
-    m_isBeingDeleted = TRUE;
-    
+
     // Motif-specific actions first
     WXWidget wMain = GetMainWidget();
     if ( wMain )
@@ -409,11 +357,6 @@ wxWindow::~wxWindow()
         DetachWidget(wMain);
     }
 
-    ClearUpdateRects();
-
-    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 )
@@ -490,120 +433,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 = DoCreateScrollBar( m_scrolledWindow, wxHORIZONTAL,
+                                          (void (*)())wxScrollBarCallback );
 
-        m_hScrollBar = (WXWidget) hScrollBar;
+        wxDoChangeBackgroundColour(m_hScrollBar, backgroundColour, true);
 
-        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);
+        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);
 }
 
 // ---------------------------------------------------------------------------
@@ -618,7 +548,7 @@ void wxWindow::SetFocus()
 }
 
 // Get the window with the focus
-wxWindow *wxWindowBase::FindFocus()
+wxWindow *wxWindowBase::DoFindFocus()
 {
     // TODO Problems:
     // (1) Can there be multiple focussed widgets in an application?
@@ -626,8 +556,8 @@ wxWindow *wxWindowBase::FindFocus()
     // currently active.
     // (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();
+    wxWindow *winFocus = NULL;
+    for ( wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst();
           node;
           node = node->GetNext() )
     {
@@ -649,7 +579,7 @@ wxWindow *wxWindowBase::FindFocus()
 bool wxWindow::Enable(bool enable)
 {
     if ( !wxWindowBase::Enable(enable) )
-        return FALSE;
+        return false;
 
     Widget wMain = (Widget)GetMainWidget();
     if ( wMain )
@@ -658,18 +588,18 @@ bool wxWindow::Enable(bool enable)
         XmUpdateDisplay(wMain);
     }
 
-    return TRUE;
+    return true;
 }
 
 bool wxWindow::Show(bool show)
 {
     if ( !wxWindowBase::Show(show) )
-        return FALSE;
+        return false;
 
     if (m_borderWidget || m_scrolledWindow)
     {
-        MapOrUnmap(m_drawingArea, show);
         MapOrUnmap(m_borderWidget ? m_borderWidget : m_scrolledWindow, show);
+        // MapOrUnmap(m_drawingArea, show);
     }
     else
     {
@@ -677,7 +607,7 @@ bool wxWindow::Show(bool show)
             MapOrUnmap(GetMainWidget(), show);
     }
 
-    return TRUE;
+    return true;
 }
 
 // Raise the window to the top of the Z order
@@ -696,17 +626,18 @@ void wxWindow::Lower()
     XLowerWindow(XtDisplay(wTop), window);
 }
 
-void wxWindow::SetTitle(const wxString& title)
+void wxWindow::SetLabel(const wxString& label)
 {
-    XtVaSetValues((Widget)GetMainWidget(), XmNtitle, title.c_str(), NULL);
+    XtVaSetValues((Widget)GetMainWidget(), XmNtitle,
+                  (const char*)label.mb_str(), NULL);
 }
 
-wxString wxWindow::GetTitle() const
+wxString wxWindow::GetLabel() const
 {
-    char *title;
-    XtVaGetValues((Widget)GetMainWidget(), XmNtitle, &title, NULL);
+    char *label = NULL;
+    XtVaGetValues((Widget)GetMainWidget(), XmNtitle, &label, NULL);
 
-    return wxString(title);
+    return wxString(label);
 }
 
 void wxWindow::DoCaptureMouse()
@@ -717,9 +648,9 @@ void wxWindow::DoCaptureMouse()
 
     Widget wMain = (Widget)GetMainWidget();
     if ( wMain )
-        XtAddGrab(wMain, TRUE, FALSE);
+        XtAddGrab(wMain, True, False);
 
-    m_winCaptured = TRUE;
+    m_winCaptured = true;
 }
 
 void wxWindow::DoReleaseMouse()
@@ -732,7 +663,7 @@ void wxWindow::DoReleaseMouse()
     if ( wMain )
         XtRemoveGrab(wMain);
 
-    m_winCaptured = FALSE;
+    m_winCaptured = false;
 }
 
 bool wxWindow::SetFont(const wxFont& font)
@@ -740,12 +671,12 @@ bool wxWindow::SetFont(const wxFont& font)
     if ( !wxWindowBase::SetFont(font) )
     {
         // nothing to do
-        return FALSE;
+        return false;
     }
 
     ChangeFont();
 
-    return TRUE;
+    return true;
 }
 
 bool wxWindow::SetCursor(const wxCursor& cursor)
@@ -753,13 +684,13 @@ bool wxWindow::SetCursor(const wxCursor& cursor)
     if ( !wxWindowBase::SetCursor(cursor) )
     {
         // no change
-        return FALSE;
+        return false;
     }
 
-    //    wxASSERT_MSG( m_cursor.Ok(),
+    //    wxASSERT_MSG( m_cursor.IsOk(),
     //                  wxT("cursor must be valid after call to the base version"));
-    wxCursor* cursor2 = NULL;
-    if (m_cursor.Ok())
+    const wxCursor* cursor2 = NULL;
+    if (m_cursor.IsOk())
         cursor2 = & m_cursor;
     else
         cursor2 = wxSTANDARD_CURSOR;
@@ -771,7 +702,7 @@ bool wxWindow::SetCursor(const wxCursor& cursor)
     Window win = XtWindow(w);
     XDefineCursor((Display*) dpy, win, (Cursor) x_cursor);
 
-    return TRUE;
+    return true;
 }
 
 // Coordinates relative to the window
@@ -811,10 +742,12 @@ 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) 
+    if (scrollBar)
         XtVaGetValues(scrollBar, XmNmaximum, &range, NULL);
     return range;
 }
@@ -822,10 +755,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;
 }
 
@@ -913,7 +847,7 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
 
     // Adjusting scrollbars can resize the canvas accidentally
     if (newW != oldW || newH != oldH)
-        SetSize(-1, -1, oldW, oldH);
+        SetSize(wxDefaultCoord, wxDefaultCoord, oldW, oldH);
 }
 
 // Does a physical scroll
@@ -940,6 +874,9 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
     int y2 = (dy >= 0) ? y + dy : y;
 
     wxClientDC dc(this);
+    wxClientDCImpl * const
+        dcimpl = static_cast<wxClientDCImpl *>(dc.GetImpl());
+    GC const gc = (GC) dcimpl->GetGC();
 
     dc.SetLogicalFunction (wxCOPY);
 
@@ -947,14 +884,13 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
     Window window = XtWindow(widget);
     Display* display = XtDisplay(widget);
 
-    XCopyArea(display, window, window, (GC) dc.GetGC(),
-              x1, y1, w1, h1, x2, y2);
+    XCopyArea(display, window, window, gc, x1, y1, w1, h1, x2, y2);
 
-    dc.SetAutoSetting(TRUE);
+    dcimpl->SetAutoSetting(true);
     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();
@@ -978,8 +914,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         rect->width = dx;
         rect->height = h;
 
-        XFillRectangle(display, window,
-            (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
+        XFillRectangle(display, window, gc, rect->x, rect->y, rect->width, rect->height);
 
         rect->x = rect->x;
         rect->y = rect->y;
@@ -997,9 +932,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         rect->width = -dx;
         rect->height = h;
 
-        XFillRectangle(display, window,
-            (GC) dc.GetGC(), rect->x, rect->y, rect->width,
-            rect->height);
+        XFillRectangle(display, window, gc, rect->x, rect->y, rect->width, rect->height);
 
         rect->x = rect->x;
         rect->y = rect->y;
@@ -1017,8 +950,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         rect->width = w;
         rect->height = dy;
 
-        XFillRectangle(display, window,
-            (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
+        XFillRectangle(display, window, gc, rect->x, rect->y, rect->width, rect->height);
 
         rect->x = rect->x;
         rect->y = rect->y;
@@ -1036,8 +968,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         rect->width = w;
         rect->height = -dy;
 
-        XFillRectangle(display, window,
-            (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
+        XFillRectangle(display, window, gc, rect->x, rect->y, rect->width, rect->height);
 
         rect->x = rect->x;
         rect->y = rect->y;
@@ -1050,7 +981,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();
@@ -1126,6 +1057,12 @@ void wxWindow::DoSetToolTip(wxToolTip * WXUNUSED(tooltip))
 
 bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
 {
+    if ( x == wxDefaultCoord && y == wxDefaultCoord )
+    {
+        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
@@ -1136,16 +1073,15 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
     */
 
     if (menu->GetParent() && (menu->GetId() != -1))
-        return FALSE;
+        return false;
 
     if (menu->GetMainWidget())
     {
-        menu->DestroyMenu(TRUE);
+        menu->DestroyMenu(true);
     }
 
     menu->SetId(1); /* Mark as popped-up */
-    menu->CreateMenu(NULL, widget, menu);
-    menu->SetInvokingWindow(this);
+    menu->CreateMenu(NULL, widget, menu, 0);
 
     menu->UpdateUI();
 
@@ -1203,7 +1139,7 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
         wxDoEventLoopIteration( evtLoop );
     }
 
-    return TRUE;
+    return true;
 }
 
 #endif
@@ -1214,7 +1150,7 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
 
 bool wxWindow::PreResize()
 {
-    return TRUE;
+    return true;
 }
 
 // Get total size
@@ -1226,19 +1162,20 @@ void wxWindow::DoGetSize(int *x, int *y) const
                                 m_drawingArea ) );
     Dimension xx, yy;
 
-    XtVaGetValues( widget,
-                   XmNwidth, &xx,
-                   XmNheight, &yy,
-                   NULL );
-    if(x) *x = xx; 
-    if(y) *y = yy;
+    if (widget)
+        XtVaGetValues( widget,
+                       XmNwidth, &xx,
+                       XmNheight, &yy,
+                       NULL );
+    if(x) *x = widget ? xx : -1;
+    if(y) *y = widget ? yy : -1;
 }
 
 void wxWindow::DoGetPosition(int *x, int *y) const
 {
     Widget widget = (Widget)
         ( m_drawingArea ?
-          ( m_borderWidget ? m_borderWidget : m_scrolledWindow ) : 
+          ( m_borderWidget ? m_borderWidget : m_scrolledWindow ) :
           GetTopWidget() );
 
     Position xx, yy;
@@ -1249,8 +1186,8 @@ void wxWindow::DoGetPosition(int *x, int *y) const
     if (GetParent())
     {
         wxPoint pt(GetParent()->GetClientAreaOrigin());
-        xx -= pt.x;
-        yy -= pt.y;
+        xx = (Position)(xx - pt.x);
+        yy = (Position)(yy - pt.y);
     }
 
     if(x) *x = xx;
@@ -1265,9 +1202,11 @@ void wxWindow::DoScreenToClient(int *x, int *y) const
     Window thisWindow = XtWindow(widget);
 
     Window childWindow;
-    int xx = *x;
-    int yy = *y;
-    XTranslateCoordinates(display, rootWindow, thisWindow, xx, yy, x, y, &childWindow);
+    int xx = x ? *x : 0;
+    int yy = y ? *y : 0;
+    XTranslateCoordinates(display, rootWindow, thisWindow,
+                          xx, yy, x ? x : &xx, y ? y : &yy,
+                          &childWindow);
 }
 
 void wxWindow::DoClientToScreen(int *x, int *y) const
@@ -1278,9 +1217,11 @@ void wxWindow::DoClientToScreen(int *x, int *y) const
     Window thisWindow = XtWindow(widget);
 
     Window childWindow;
-    int xx = *x;
-    int yy = *y;
-    XTranslateCoordinates(display, thisWindow, rootWindow, xx, yy, x, y, &childWindow);
+    int xx = x ? *x : 0;
+    int yy = y ? *y : 0;
+    XTranslateCoordinates(display, thisWindow, rootWindow,
+                          xx, yy, x ? x : &xx, y ? y : &yy,
+                          &childWindow);
 }
 
 
@@ -1295,7 +1236,7 @@ void wxWindow::DoGetClientSize(int *x, int *y) const
 
 void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
-    DoSetSizeIntr(x, y, width, height, sizeFlags, FALSE);
+    DoSetSizeIntr(x, y, width, height, sizeFlags, false);
 }
 
 void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
@@ -1303,21 +1244,27 @@ void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
 {
     // A bit of optimization to help sort out the flickers.
     int oldX = -1, oldY = -1, oldW = -1, oldH = -1;
+
     if( !fromCtor )
     {
         GetSize(& oldW, & oldH);
         GetPosition(& oldX, & oldY);
     }
 
+    if (x == -1)
+        x = oldX;
+    if (x == -1)
+        x = oldY;
+
     if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
     {
-        if ( x == -1 )
-            x = oldX;
-        if ( y == -1 )
-            y = oldY;
+        if ( width == -1 )
+            width = oldW;
+        if ( height == -1 )
+            height = oldH;
     }
 
-    wxSize size(-1, -1);
+    wxSize size(wxDefaultSize);
     if ( width <= 0 )
     {
         if ( ( sizeFlags & wxSIZE_AUTO_WIDTH ) && !fromCtor )
@@ -1351,10 +1298,10 @@ void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
         {
             int flags = 0;
 
-            if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+            if (x != oldX)
                 flags |= wxMOVE_X;
 
-            if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+            if (y != oldY)
                 flags |= wxMOVE_Y;
 
             if (width > 0)
@@ -1417,13 +1364,6 @@ void wxWindow::DoSetClientSize(int width, int height)
         XtVaSetValues(widget, XmNheight, height, NULL);
 }
 
-// For implementation purposes - sometimes decorations make the client area
-// smaller
-wxPoint wxWindow::GetClientAreaOrigin() const
-{
-    return wxPoint(0, 0);
-}
-
 void wxWindow::DoMoveWindowIntr(int xx, int yy, int w, int h,
                                 int flags)
 {
@@ -1461,6 +1401,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);
         }
 
@@ -1477,6 +1418,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);
         }
 
@@ -1510,79 +1452,64 @@ void wxWindow::DoMoveWindow(int x, int y, int width, int height)
 
 int wxWindow::GetCharHeight() const
 {
-    wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
-
-    WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay());
+    int height;
 
-    int direction, ascent, descent;
-    XCharStruct overall;
-    XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent,
-        &descent, &overall);
+    if (m_font.IsOk())
+        wxGetTextExtent (GetXDisplay(), m_font, 1.0,
+                         "x", NULL, &height, NULL, NULL);
+    else
+        wxGetTextExtent (this, "x", NULL, &height, NULL, NULL);
 
-    //  return (overall.ascent + overall.descent);
-    return (ascent + descent);
+    return height;
 }
 
 int wxWindow::GetCharWidth() const
 {
-    wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
-
-    WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay());
+    int width;
 
-    int direction, ascent, descent;
-    XCharStruct overall;
-    XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent,
-        &descent, &overall);
+    if (m_font.IsOk())
+        wxGetTextExtent (GetXDisplay(), m_font, 1.0,
+                         "x", &width, NULL, NULL, NULL);
+    else
+        wxGetTextExtent (this, "x", &width, NULL, NULL, NULL);
 
-    return overall.width;
+    return width;
 }
 
-void wxWindow::GetTextExtent(const wxString& string,
-                             int *x, int *y,
-                             int *descent, int *externalLeading,
-                             const wxFont *theFont) const
+void wxWindow::DoGetTextExtent(const wxString& string,
+                               int *x, int *y,
+                               int *descent,
+                               int *externalLeading,
+                               const wxFont *theFont) const
 {
-    wxFont *fontToUse = (wxFont *)theFont;
-    if (!fontToUse)
-        fontToUse = (wxFont *) & m_font;
+    const wxFont *fontToUse = theFont ? theFont : &m_font;
 
-    wxCHECK_RET( fontToUse->Ok(), "valid window font needed" );
-    
-    WXFontStructPtr pFontStruct = fontToUse->GetFontStruct(1.0, GetXDisplay());
-
-    int direction, ascent, descent2;
-    XCharStruct overall;
-    int slen = string.Len();
-
-#if 0
-    if (use16)
-        XTextExtents16((XFontStruct*) pFontStruct, (XChar2b *) (char*) (const char*) string, slen, &direction,
-        &ascent, &descent2, &overall);
-#endif
-
-    XTextExtents((XFontStruct*) pFontStruct, string, slen,
-                 &direction, &ascent, &descent2, &overall);
-
-    if ( x )
-        *x = (overall.width);
-    if ( y )
-        *y = (ascent + descent2);
-    if (descent)
-        *descent = descent2;
     if (externalLeading)
         *externalLeading = 0;
-
+    if (fontToUse->IsOk())
+        wxGetTextExtent (GetXDisplay(), *fontToUse, 1.0,
+                         string, x, y, NULL, descent);
+    else
+        wxGetTextExtent (this, string, x, y, NULL, descent);
 }
 
 // ----------------------------------------------------------------------------
 // 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;
-    Display *display = XtDisplay((Widget) GetMainWidget());
-    Window thisWindow = XtWindow((Widget) GetMainWidget());
+    Widget widget = (Widget) GetMainWidget();
+    if (!widget)
+        return;
+    m_needsRefresh = true;
+    Display *display = XtDisplay(widget);
+    Window thisWindow = XtWindow(widget);
 
     XExposeEvent dummyEvent;
     int width, height;
@@ -1613,36 +1540,18 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
         wxClientDC dc(this);
         wxBrush backgroundBrush(GetBackgroundColour(), wxSOLID);
         dc.SetBackground(backgroundBrush);
+
+        wxClientDCImpl * const
+            dcimpl = static_cast<wxClientDCImpl *>(dc.GetImpl());
         if (rect)
-            dc.Clear(*rect);
+            dcimpl->Clear(*rect);
         else
-            dc.Clear();
+            dcimpl->Clear();
     }
 
     XSendEvent(display, thisWindow, False, ExposureMask, (XEvent *)&dummyEvent);
 }
 
-void wxWindow::Clear()
-{
-    wxClientDC dc(this);
-    wxBrush brush(GetBackgroundColour(), wxSOLID);
-    dc.SetBackground(brush);
-    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
@@ -1650,7 +1559,10 @@ void wxWindow::DoPaint()
     {
       wxPaintDC dc(this);
 
-      GC tempGC = (GC) dc.GetBackingGC();
+      wxPaintDCImpl * const
+          dcimpl = static_cast<wxPaintDCImpl *>(dc.GetImpl());
+
+      GC tempGC = (GC) dcimpl->GetBackingGC();
 
       Widget widget = (Widget) GetMainWidget();
 
@@ -1661,7 +1573,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 )
       {
@@ -1707,13 +1619,13 @@ void wxWindow::DoPaint()
         // Set an erase event first
         wxEraseEvent eraseEvent(GetId(), &dc);
         eraseEvent.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(eraseEvent);
+        HandleWindowEvent(eraseEvent);
 
         wxPaintEvent event(GetId());
         event.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(event);
+        HandleWindowEvent(event);
 
-        m_needsRefresh = FALSE;
+        m_needsRefresh = false;
     }
 }
 
@@ -1724,7 +1636,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
@@ -1732,21 +1644,14 @@ void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event)
         if ( win->GetParent() )
         {
             wxSysColourChangedEvent event2;
-            event.m_eventObject = win;
-            win->GetEventHandler()->ProcessEvent(event2);
+            event.SetEventObject(win);
+            win->HandleWindowEvent(event2);
         }
 
         node = node->GetNext();
     }
 }
 
-void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event))
-{
-    // This calls the UI-update mechanism (querying windows for
-    // menu/toolbar/control state information)
-    UpdateWindowUI();
-}
-
 // ----------------------------------------------------------------------------
 // accelerators
 // ----------------------------------------------------------------------------
@@ -1754,8 +1659,8 @@ void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event))
 bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
 {
 #if wxUSE_ACCEL
-    if (!m_acceleratorTable.Ok())
-        return FALSE;
+    if (!m_acceleratorTable.IsOk())
+        return false;
 
     int count = m_acceleratorTable.GetCount();
     wxAcceleratorEntry* entries = m_acceleratorTable.GetEntries();
@@ -1775,7 +1680,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
                 parent = parent->GetParent();
 
             if (!parent)
-                return FALSE;
+                return false;
 
             wxFrame* frame = wxDynamicCast(parent, wxFrame);
             if ( frame )
@@ -1790,9 +1695,9 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
                         wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, entry->GetCommand());
                         commandEvent.SetEventObject(frame);
 
-                        // If ProcessEvent returns TRUE (it was handled), then
+                        // If ProcessEvent returns true (it was handled), then
                         // the calling code will skip the event handling.
-                        return frame->GetEventHandler()->ProcessEvent(commandEvent);
+                        return frame->HandleWindowEvent(commandEvent);
                     }
                 }
 #endif
@@ -1803,7 +1708,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
 
             // No such child
             if (!child)
-                return FALSE;
+                return false;
 
             // Now we process those kinds of windows that we can.
             // For now, only buttons.
@@ -1811,16 +1716,16 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
             {
                 wxCommandEvent commandEvent (wxEVT_COMMAND_BUTTON_CLICKED, child->GetId());
                 commandEvent.SetEventObject(child);
-                return child->GetEventHandler()->ProcessEvent(commandEvent);
+                return child->HandleWindowEvent(commandEvent);
             }
 
-            return FALSE;
+            return false;
         } // matches event
     }// for
 #endif
 
     // We didn't match the key event against an accelerator.
-    return FALSE;
+    return false;
 }
 
 // ============================================================================
@@ -1828,25 +1733,25 @@ 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)
 {
-    wxWindow *oldItem = NULL;
-    if ((oldItem = (wxWindow *)wxWidgetHashTable->Get ((long) w)))
+    const long key = (long)w;
+    if ( wxWidgetHashTable->Get(key))
     {
         wxLogDebug("Widget table clash: new widget is %ld, %s",
-                   (long)w, win->GetClassInfo()->GetClassName());
-        return FALSE;
+                   key, win->GetClassInfo()->GetClassName());
+        return false;
     }
 
-    wxWidgetHashTable->Put((long) w, win);
+    wxWidgetHashTable->Put(key, win);
 
     wxLogTrace("widget", "Widget 0x%p <-> window %p (%s)",
-               (WXWidget)w, win, win->GetClassInfo()->GetClassName());
+               w, win, win->GetClassInfo()->GetClassName());
 
-    return TRUE;
+    return true;
 }
 
 wxWindow *wxGetWindowFromTable(Widget w)
@@ -1889,7 +1794,7 @@ bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget,
     if (formWidget)
     {
         if (!wxAddWindowToTable((Widget) formWidget, this))
-            return FALSE;
+            return false;
 
         XtTranslations ptr;
         XtOverrideTranslations ((Widget) formWidget,
@@ -1901,9 +1806,9 @@ bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget,
         x = 0;
     if (y == -1)
         y = 0;
-    SetSize (x, y, width, height);
+    DoSetSize (x, y, width, height, wxSIZE_USE_EXISTING);
 
-    return TRUE;
+    return true;
 }
 
 // Remove event handler, remove from hash table
@@ -1917,13 +1822,22 @@ bool wxWindow::DetachWidget(WXWidget widget)
                           (XtPointer)this);
 
     wxDeleteWindowFromTable((Widget) widget);
-    return TRUE;
+    return true;
 }
 
 // ----------------------------------------------------------------------------
 // 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
 {
@@ -1941,7 +1855,7 @@ WXDisplay *wxWindow::GetXDisplay() const
     if ( wMain )
         return (WXDisplay*) XtDisplay(wMain);
     else
-        return (WXDisplay*) NULL;
+        return NULL;
 }
 
 WXWidget wxWindow::GetMainWidget() const
@@ -1985,11 +1899,10 @@ void wxWidgetResizeProc(Widget w, XConfigureEvent *WXUNUSED(event),
 
     if (win->PreResize())
     {
-        int width, height;
-        win->GetSize(&width, &height);
-        wxSizeEvent sizeEvent(wxSize(width, height), win->GetId());
+        wxSize newSize(win->GetSize());
+        wxSizeEvent sizeEvent(newSize, win->GetId());
         sizeEvent.SetEventObject(win);
-        win->GetEventHandler()->ProcessEvent(sizeEvent);
+        win->HandleWindowEvent(sizeEvent);
     }
 }
 
@@ -2009,11 +1922,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;
         }
@@ -2057,7 +1969,7 @@ static void wxCanvasInputEvent(Widget drawingArea,
                                XmDrawingAreaCallbackStruct * cbs)
 {
     wxWindow *canvas = wxGetWindowFromTable(drawingArea);
-    XEvent local_event;
+    XEvent* xevent = cbs->event;
 
     if (canvas==NULL)
         return;
@@ -2065,27 +1977,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->HandleWindowEvent(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;
@@ -2095,7 +2005,7 @@ static void wxCanvasInputEvent(Widget drawingArea,
                 if (parent)
                 {
                     event.SetEventType(wxEVT_CHAR_HOOK);
-                    if (parent->GetEventHandler()->ProcessEvent(event))
+                    if (parent->HandleWindowEvent(event))
                         return;
                 }
 
@@ -2104,10 +2014,10 @@ static void wxCanvasInputEvent(Widget drawingArea,
                 event.SetEventType(wxEVT_KEY_DOWN);
 
                 // Only process OnChar if OnKeyDown didn't swallow it
-                if (!canvas->GetEventHandler()->ProcessEvent (event))
+                if (!canvas->HandleWindowEvent (event))
                 {
                     event.SetEventType(wxEVT_CHAR);
-                    canvas->GetEventHandler()->ProcessEvent (event);
+                    canvas->HandleWindowEvent (event);
                 }
             }
             break;
@@ -2115,29 +2025,29 @@ 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);
+                canvas->HandleWindowEvent (event);
             }
             break;
         }
     case FocusIn:
         {
-            if (local_event.xfocus.detail != NotifyPointer)
+            if (xevent->xfocus.detail != NotifyPointer)
             {
                 wxFocusEvent event(wxEVT_SET_FOCUS, canvas->GetId());
                 event.SetEventObject(canvas);
-                canvas->GetEventHandler()->ProcessEvent(event);
+                canvas->HandleWindowEvent(event);
             }
             break;
         }
     case FocusOut:
         {
-            if (local_event.xfocus.detail != NotifyPointer)
+            if (xevent->xfocus.detail != NotifyPointer)
             {
                 wxFocusEvent event(wxEVT_KILL_FOCUS, canvas->GetId());
                 event.SetEventObject(canvas);
-                canvas->GetEventHandler()->ProcessEvent(event);
+                canvas->HandleWindowEvent(event);
             }
             break;
         }
@@ -2159,14 +2069,14 @@ static void wxPanelItemEventHandler(Widget    wid,
         wxMouseEvent wxevent(0);
         if (wxTranslateMouseEvent(wxevent, window, wid, event))
         {
-            window->GetEventHandler()->ProcessEvent(wxevent);
+            window->HandleWindowEvent(wxevent);
         }
     }
 
     // TODO: probably the key to allowing default behaviour to happen. Say we
-    // set a m_doDefault flag to FALSE at the start of this function. Then in
+    // set a m_doDefault flag to false at the start of this function. Then in
     // e.g. wxWindow::OnMouseEvent we can call Default() which sets this flag to
-    // TRUE, indicating that default processing can happen. Thus, behaviour can
+    // true, indicating that default processing can happen. Thus, behaviour can
     // appear to be overridden just by adding an event handler and not calling
     // wxWindow::OnWhatever. ALSO, maybe we can use this instead of the current
     // way of handling drawing area events, to simplify things.
@@ -2178,7 +2088,9 @@ static void wxScrollBarCallback(Widget scrollbar,
                                 XmScrollBarCallbackStruct *cbs)
 {
     wxWindow *win = wxGetWindowFromTable(scrollbar);
-    int orientation = (int) clientData;
+    wxCHECK_RET( win, wxT("invalid widget in scrollbar callback") );
+
+    wxOrientation orientation = (wxOrientation)wxPtrToUInt(clientData);
 
     wxEventType eventType = wxEVT_NULL;
     switch (cbs->reason)
@@ -2233,39 +2145,28 @@ static void wxScrollBarCallback(Widget scrollbar,
 
     wxScrollWinEvent event(eventType,
                            cbs->value,
-                           ((orientation == XmHORIZONTAL) ?
-                            wxHORIZONTAL : wxVERTICAL));
+                           orientation);
     event.SetEventObject( win );
-    win->GetEventHandler()->ProcessEvent(event);
+    win->HandleWindowEvent(event);
 }
 
 // For repainting arbitrary windows
 void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, char *)
 {
-    Window window;
-    Display *display;
-
     wxWindow* win = wxGetWindowFromTable(w);
     if (!win)
         return;
 
-    switch(event -> type)
+    switch ( event->type )
     {
-    case Expose:
+        case Expose:
         {
-            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)
+            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;
@@ -2278,7 +2179,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)
     {
@@ -2293,6 +2194,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)
@@ -2306,6 +2209,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)
             {
@@ -2329,7 +2244,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();
@@ -2367,11 +2282,11 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win,
                     eventType = wxEVT_RIGHT_UP;
                 }
                 else
-                    return FALSE;
+                    return false;
             }
             else
             {
-                return FALSE;
+                return false;
             }
 
             wxevent.SetEventType(eventType);
@@ -2382,7 +2297,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;
@@ -2393,8 +2308,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)
@@ -2406,22 +2321,22 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win,
                 || (event_right_is_down (xevent)
                 && (eventType != wxEVT_RIGHT_UP)));
 
-            wxevent.m_shiftDown = xevent->xbutton.state & ShiftMask;
-            wxevent.m_controlDown = xevent->xbutton.state & ControlMask;
-            wxevent.m_altDown = xevent->xbutton.state & Mod3Mask;
-            wxevent.m_metaDown = xevent->xbutton.state & Mod1Mask;
+            wxevent.m_shiftDown = (xevent->xbutton.state & ShiftMask) == ShiftMask;
+            wxevent.m_controlDown = (xevent->xbutton.state & ControlMask) == ControlMask;
+            wxevent.m_altDown = (xevent->xbutton.state & Mod3Mask) == Mod3Mask;
+            wxevent.m_metaDown = (xevent->xbutton.state & Mod1Mask) == Mod1Mask;
 
             wxevent.SetId(win->GetId());
             wxevent.SetEventObject(win);
 
-            return TRUE;
+            return true;
         }
     }
-    return FALSE;
+    return false;
 }
 
 bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win,
-                         Widget WXUNUSED(widget), XEvent *xevent)
+                         Widget WXUNUSED(widget), const XEvent *xevent)
 {
     switch (xevent->xany.type)
     {
@@ -2439,13 +2354,13 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win,
                 id = toupper(id);
 
             if (xevent->xkey.state & ShiftMask)
-                wxevent.m_shiftDown = TRUE;
+                wxevent.m_shiftDown = true;
             if (xevent->xkey.state & ControlMask)
-                wxevent.m_controlDown = TRUE;
+                wxevent.m_controlDown = true;
             if (xevent->xkey.state & Mod3Mask)
-                wxevent.m_altDown = TRUE;
+                wxevent.m_altDown = true;
             if (xevent->xkey.state & Mod1Mask)
-                wxevent.m_metaDown = TRUE;
+                wxevent.m_metaDown = true;
             wxevent.SetEventObject(win);
             wxevent.m_keyCode = id;
             wxevent.SetTimestamp(xevent->xkey.time);
@@ -2454,15 +2369,14 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win,
             wxevent.m_y = xevent->xbutton.y;
 
             if (id > -1)
-                return TRUE;
-            else
-                return FALSE;
-            break;
+                return true;
+
+            return false;
         }
     default:
         break;
     }
-    return FALSE;
+    return false;
 }
 
 // ----------------------------------------------------------------------------
@@ -2471,7 +2385,7 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win,
 
 #define YAllocColor XAllocColor
 XColor g_itemColors[5];
-int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
+int wxComputeColours (Display *display, const wxColour * back, const wxColour * fore)
 {
     int result;
     static XmColorProc colorProc;
@@ -2480,9 +2394,9 @@ int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
 
     if (back)
     {
-        g_itemColors[0].red = (((long) back->Red ()) << 8);
-        g_itemColors[0].green = (((long) back->Green ()) << 8);
-        g_itemColors[0].blue = (((long) back->Blue ()) << 8);
+        g_itemColors[0].red = (unsigned short)(((long) back->Red ()) << 8);
+        g_itemColors[0].green = (unsigned short)(((long) back->Green ()) << 8);
+        g_itemColors[0].blue = (unsigned short)(((long) back->Blue ()) << 8);
         g_itemColors[0].flags = DoRed | DoGreen | DoBlue;
         if (colorProc == (XmColorProc) NULL)
         {
@@ -2500,9 +2414,9 @@ int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
     }
     if (fore)
     {
-        g_itemColors[wxFORE_INDEX].red = (((long) fore->Red ()) << 8);
-        g_itemColors[wxFORE_INDEX].green = (((long) fore->Green ()) << 8);
-        g_itemColors[wxFORE_INDEX].blue = (((long) fore->Blue ()) << 8);
+        g_itemColors[wxFORE_INDEX].red = (unsigned short)(((long) fore->Red ()) << 8);
+        g_itemColors[wxFORE_INDEX].green = (unsigned short)(((long) fore->Green ()) << 8);
+        g_itemColors[wxFORE_INDEX].blue = (unsigned short)(((long) fore->Blue ()) << 8);
         g_itemColors[wxFORE_INDEX].flags = DoRed | DoGreen | DoBlue;
         if (result == wxNO_COLORS)
             result = wxFORE_COLORS;
@@ -2536,6 +2450,8 @@ void wxWindow::ChangeBackgroundColour()
     WXWidget mainWidget = GetMainWidget();
     if ( mainWidget )
         wxDoChangeBackgroundColour(mainWidget, m_backgroundColour);
+    if ( m_scrolledWindow && mainWidget != m_scrolledWindow )
+        wxDoChangeForegroundColour(m_scrolledWindow, m_backgroundColour);
 }
 
 void wxWindow::ChangeForegroundColour()
@@ -2550,21 +2466,21 @@ void wxWindow::ChangeForegroundColour()
 bool wxWindow::SetBackgroundColour(const wxColour& col)
 {
     if ( !wxWindowBase::SetBackgroundColour(col) )
-        return FALSE;
+        return false;
 
     ChangeBackgroundColour();
 
-    return TRUE;
+    return true;
 }
 
 bool wxWindow::SetForegroundColour(const wxColour& col)
 {
     if ( !wxWindowBase::SetForegroundColour(col) )
-        return FALSE;
+        return false;
 
     ChangeForegroundColour();
 
-    return TRUE;
+    return true;
 }
 
 void wxWindow::ChangeFont(bool keepOriginalSize)
@@ -2573,21 +2489,35 @@ void wxWindow::ChangeFont(bool keepOriginalSize)
     // to its original size! We therefore have to set the size
     // back again. TODO: a better way in Motif?
     Widget w = (Widget) GetLabelWidget(); // Usually the main widget
-    if (w && m_font.Ok())
+    if (w && m_font.IsOk())
     {
         int width, height, width1, height1;
         GetSize(& width, & height);
 
-        wxDoChangeFont( GetLabelWidget(), m_font );
+        wxDoChangeFont( w, m_font );
 
         GetSize(& width1, & height1);
         if (keepOriginalSize && (width != width1 || height != height1))
         {
-            SetSize(-1, -1, width, height);
+            SetSize(wxDefaultCoord, wxDefaultCoord, width, height);
         }
     }
 }
 
+// Post-creation
+void wxWindow::PostCreation()
+{
+    ChangeFont();
+    ChangeForegroundColour();
+    ChangeBackgroundColour();
+}
+
+// Pre-creation
+void wxWindow::PreCreation()
+{
+    InheritAttributes();
+}
+
 // ----------------------------------------------------------------------------
 // global functions
 // ----------------------------------------------------------------------------
@@ -2610,30 +2540,158 @@ wxWindow *wxWindowBase::GetCapture()
 // position.
 wxWindow* wxFindWindowAtPointer(wxPoint& pt)
 {
-    return wxFindWindowAtPoint(wxGetMousePosition());
+    pt = wxGetMousePosition();
+    return wxFindWindowAtPoint(pt);
 }
 
-// Get the current mouse position.
-wxPoint wxGetMousePosition()
+void wxGetMouseState(int& rootX, int& rootY, unsigned& maskReturn)
 {
-    Display *display = (Display*) wxGetDisplay();
+    Display *display = wxGlobalDisplay();
     Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display));
     Window rootReturn, childReturn;
-    int rootX, rootY, winX, winY;
-    unsigned int maskReturn;
+    int winX, winY;
 
     XQueryPointer (display,
                    rootWindow,
                    &rootReturn,
                    &childReturn,
                    &rootX, &rootY, &winX, &winY, &maskReturn);
-    return wxPoint(rootX, rootY);
 }
 
+// Get the current mouse position.
+wxPoint wxGetMousePosition()
+{
+    int x, y;
+    unsigned mask;
+
+    wxGetMouseState(x, y, mask);
+    return wxPoint(x, y);
+}
+
+wxMouseState wxGetMouseState()
+{
+    wxMouseState ms;
+    int x, y;
+    unsigned mask;
+
+    wxGetMouseState(x, y, mask);
+
+    ms.SetX(x);
+    ms.SetY(y);
+
+    ms.SetLeftDown(mask & Button1Mask);
+    ms.SetMiddleDown(mask & Button2Mask);
+    ms.SetRightDown(mask & Button3Mask);
+
+    ms.SetControlDown(mask & ControlMask);
+    ms.SetShiftDown(mask & ShiftMask);
+    ms.SetAltDown(mask & Mod3Mask);
+    ms.SetMetaDown(mask & Mod1Mask);
+
+    return ms;
+}
+
+
+#if wxMOTIF_NEW_FONT_HANDLING
+
+#include <Xm/XmP.h>
+
+void wxGetTextExtent(const wxWindow* window, const wxString& str,
+                     int* width, int* height, int* ascent, int* descent)
+{
+    Arg args[2];
+    int count = 0;
+    XmRendition rendition = NULL;
+    XmRenderTable table = NULL;
+    Widget w = (Widget) window->GetLabelWidget();
+
+    XtVaGetValues( w, XmNrenderTable, &table, NULL );
+    if (table == NULL)
+        table = XmeGetDefaultRenderTable(w, XmTEXT_RENDER_TABLE);
+
+    rendition = XmRenderTableGetRendition( table, "" );
+    XtSetArg( args[count], XmNfont, 0 ); ++count;
+    XtSetArg( args[count], XmNfontType, 0 ); ++count;
+    XmRenditionRetrieve( rendition, args, count );
+
+    if (args[1].value == XmFONT_IS_FONTSET)
+    {
+        XRectangle ink, logical;
+        WXFontSet fset = (WXFontSet) args[0].value;
+
+        XmbTextExtents( (XFontSet)fset, str.c_str(), str.length(),
+                        &ink, &logical);
+
+        if( width ) *width = logical.width;
+        if( height ) *height = logical.height;
+        if( ascent ) *ascent = -logical.y;
+        if( descent ) *descent = logical.height + logical.y;
+    }
+    else
+    {
+        int direction, ascent2, descent2;
+        XCharStruct overall;
+        XFontStruct* fontStruct;
+
+        XmeRenderTableGetDefaultFont( table, &fontStruct );
+        XTextExtents(fontStruct, (const char*)str.c_str(), str.length(),
+                     &direction, &ascent2, &descent2, &overall);
+
+        if ( width ) *width = overall.width;
+        if ( height ) *height = ascent2 + descent2;
+        if ( descent ) *descent = descent2;
+        if ( ascent ) *ascent = ascent2;
+    }
+}
+
+#else // if !wxMOTIF_NEW_FONT_HANDLING
+
+void wxGetTextExtent(const wxWindow* window, const wxString& str,
+                     int* width, int* height, int* ascent, int* descent)
+{
+    XmFontList list = NULL;
+    XmFontContext cxt;
+    XmFontType type;
+    Widget w = (Widget) window->GetLabelWidget();
+
+    XtVaGetValues( w, XmNfontList, &list, NULL );
+    XmFontListInitFontContext( &cxt, list );
+
+    XmFontListEntry entry = XmFontListNextEntry( cxt );
+    XmFontListFreeFontContext( cxt );
+    XtPointer thing = XmFontListEntryGetFont( entry, &type );
+
+    if (type == XmFONT_IS_FONTSET)
+    {
+        XRectangle ink, logical;
+
+        XmbTextExtents( (XFontSet)thing, str.c_str(), str.length(),
+                        &ink, &logical);
+
+        if( width ) *width = logical.width;
+        if( height ) *height = logical.height;
+        if( ascent ) *ascent = -logical.y;
+        if( descent ) *descent = logical.height + logical.y;
+    }
+    else
+    {
+        int direction, ascent2, descent2;
+        XCharStruct overall;
+
+        XTextExtents( (XFontStruct*)thing, (char*)(const char*)str.c_str(), str.length(),
+                     &direction, &ascent2, &descent2, &overall);
+
+        if ( width ) *width = overall.width;
+        if ( height ) *height = ascent2 + descent2;
+        if ( descent ) *descent = descent2;
+        if ( ascent ) *ascent = ascent2;
+    }
+}
+
+#endif // !wxMOTIF_NEW_FONT_HANDLING
 
 // ----------------------------------------------------------------------------
 // wxNoOptimize: switch off size optimization
 // ----------------------------------------------------------------------------
 
 int wxNoOptimize::ms_count = 0;
-