]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/window.cpp
tmake update.
[wxWidgets.git] / src / x11 / window.cpp
index d0a7035d95e80243e073812806ab805a3b8a5106..2f49b3f8b5fde90e75c48f9c86bfe3c2148d8dca 100644 (file)
     #pragma implementation "window.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/dnd.h"
 #endif
 
-#ifdef __VMS__
-#pragma message disable nosimpint
-#endif
-#include <Xm/Xm.h>
-
-#include <Xm/DrawingA.h>
-#include <Xm/ScrolledW.h>
-#include <Xm/ScrollBar.h>
-#include <Xm/Frame.h>
-#include <Xm/Label.h>
-#include <Xm/RowColumn.h>           // for XmMenuPosition
-#ifdef __VMS__
-#pragma message enable nosimpint
-#endif
-
-#include "wx/motif/private.h"
+#include "wx/x11/private.h"
+#include "X11/Xutil.h"
 
 #include <string.h>
 
@@ -82,40 +62,6 @@ static const int SCROLL_MARGIN = 4;
 extern wxHashTable *wxWidgetHashTable;
 static wxWindow* g_captureWindow = NULL;
 
-
-// ----------------------------------------------------------------------------
-// private functions
-// ----------------------------------------------------------------------------
-
-static void wxCanvasRepaintProc(Widget, XtPointer, XmDrawingAreaCallbackStruct * cbs);
-static void wxCanvasInputEvent(Widget drawingArea, XtPointer data, XmDrawingAreaCallbackStruct * cbs);
-static void wxCanvasMotionEvent(Widget, XButtonEvent * event);
-static void wxCanvasEnterLeave(Widget drawingArea, XtPointer clientData, XCrossingEvent * event);
-static void wxScrollBarCallback(Widget widget, XtPointer clientData,
-                                XmScrollBarCallbackStruct *cbs);
-static void wxPanelItemEventHandler(Widget    wid,
-                                    XtPointer client_data,
-                                    XEvent*   event,
-                                    Boolean  *continueToDispatch);
-
-// unused for now
-#if 0
-
-// Helper function for 16-bit fonts
-static int str16len(const char *s)
-{
-    int count = 0;
-
-    while (s[0] && s[1]) {
-        count++;
-        s += 2;
-    }
-
-    return count;
-}
-
-#endif // 0
-
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------
@@ -128,12 +74,12 @@ static int str16len(const char *s)
 // event tables
 // ----------------------------------------------------------------------------
 
-    IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)
+IMPLEMENT_DYNAMIC_CLASS(wxWindowX11, wxWindowBase)
 
-    BEGIN_EVENT_TABLE(wxWindow, wxWindowBase)
-        EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
-        EVT_IDLE(wxWindow::OnIdle)
-    END_EVENT_TABLE()
+BEGIN_EVENT_TABLE(wxWindowX11, wxWindowBase)
+    EVT_SYS_COLOUR_CHANGED(wxWindowX11::OnSysColourChanged)
+    EVT_IDLE(wxWindowX11::OnIdle)
+END_EVENT_TABLE()
 
 // ============================================================================
 // implementation
@@ -143,42 +89,18 @@ static int str16len(const char *s)
 // helper functions
 // ----------------------------------------------------------------------------
 
-void wxWindow::UnmanageAndDestroy(WXWidget widget)
-{
-    Widget w = (Widget)widget;
-    if ( w )
-    {
-        XtUnmanageChild(w);
-        XtDestroyWidget(w);
-    }
-}
-
-bool wxWindow::MapOrUnmap(WXWidget widget, bool map)
-{
-    Widget w = (Widget)widget;
-    if ( !w )
-        return FALSE;
-
-    if ( map )
-        XtMapWidget(w);
-    else
-        XtUnmapWidget(w);
-
-    return TRUE;
-}
-
 // ----------------------------------------------------------------------------
 // constructors
 // ----------------------------------------------------------------------------
 
-void wxWindow::Init()
+void wxWindowX11::Init()
 {
     // generic initializations first
     InitBase();
 
-    // Motif-specific
+    // X11-specific
     m_needsRefresh = TRUE;
-    m_mainWidget = (WXWidget) 0;
+    m_mainWidget = (WXWindow) 0;
 
     m_button1Pressed =
     m_button2Pressed =
@@ -193,7 +115,7 @@ void wxWindow::Init()
     m_vScrollBar =
     m_borderWidget =
     m_scrolledWindow =
-    m_drawingArea = (WXWidget) 0;
+    m_drawingArea = (WXWindow) 0;
 
     m_hScroll =
     m_vScroll = FALSE;
@@ -214,7 +136,7 @@ void wxWindow::Init()
 }
 
 // real construction (Init() must have been called before!)
-bool wxWindow::Create(wxWindow *parent, wxWindowID id,
+bool wxWindowX11::Create(wxWindow *parent, wxWindowID id,
                       const wxPoint& pos,
                       const wxSize& size,
                       long style,
@@ -229,149 +151,20 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
     m_foregroundColour = *wxBLACK;
 
-    //// TODO: we should probably optimize by only creating a
-    //// a drawing area if we have one or more scrollbars (wxVSCROLL/wxHSCROLL).
-    //// But for now, let's simplify things by always creating the
-    //// drawing area, since otherwise the translations are different.
-
-    // New translations for getting mouse motion feedback
-    static const String translations =
-"<Btn1Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
-<Btn2Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
-<Btn3Motion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
-<BtnMotion>: wxCanvasMotionEvent() DrawingAreaInput() ManagerGadgetButtonMotion()\n\
-<Btn1Down>: DrawingAreaInput() ManagerGadgetArm()\n\
-<Btn2Down>: DrawingAreaInput() ManagerGadgetArm()\n\
-<Btn3Down>: DrawingAreaInput() ManagerGadgetArm()\n\
-<Btn1Up>: DrawingAreaInput() ManagerGadgetActivate()\n\
-<Btn2Up>: DrawingAreaInput() ManagerGadgetActivate()\n\
-<Btn3Up>: DrawingAreaInput() ManagerGadgetActivate()\n\
-<Motion>: wxCanvasMotionEvent() DrawingAreaInput()\n\
-<EnterWindow>: wxCanvasMotionEvent() DrawingAreaInput()\n\
-<LeaveWindow>: wxCanvasMotionEvent() DrawingAreaInput()\n\
-<Key>: DrawingAreaInput()";
-
-    XtActionsRec actions[1];
-    actions[0].string = "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_scrolledWindow = (WXWidget)XtVaCreateManagedWidget
-                                 (
-                                  "scrolledWindow",
-                                  xmScrolledWindowWidgetClass,
-                                  m_borderWidget ? (Widget) m_borderWidget
-                                                 : parentWidget,
-                                  XmNresizePolicy, XmRESIZE_NONE,
-                                  XmNspacing, 0,
-                                  XmNscrollingPolicy, XmAPPLICATION_DEFINED,
-                                  //XmNscrollBarDisplayPolicy, XmAS_NEEDED,
-                                  NULL
-                                 );
-
-    XtTranslations ptr = XtParseTranslationTable(translations);
-    m_drawingArea = (WXWidget)XtVaCreateWidget
-                              (
-                               name,
-                               xmDrawingAreaWidgetClass, (Widget) m_scrolledWindow,
-                               XmNunitType, XmPIXELS,
-                               // XmNresizePolicy, XmRESIZE_ANY,
-                               XmNresizePolicy, XmRESIZE_NONE,
-                               XmNmarginHeight, 0,
-                               XmNmarginWidth, 0,
-                               XmNtranslations, ptr,
-                               NULL
-                              );
-    XtFree((char *) ptr);
-
-#if 0
-    if (GetWindowStyleFlag() & wxOVERRIDE_KEY_TRANSLATIONS)
-    {
-        ptr = XtParseTranslationTable ("<Key>: DrawingAreaInput()");
-        XtOverrideTranslations ((Widget) m_drawingArea, ptr);
-        XtFree ((char *) ptr);
     }
-#endif // 0
-
-    wxAddWindowToTable((Widget) m_drawingArea, this);
-    wxAddWindowToTable((Widget) m_scrolledWindow, this);
-
-    // This order is very important in Motif 1.2.1
-    XtRealizeWidget ((Widget) m_scrolledWindow);
-    XtRealizeWidget ((Widget) m_drawingArea);
-    XtManageChild ((Widget) m_drawingArea);
 
-    ptr = XtParseTranslationTable("<Configure>: resize()");
-    XtOverrideTranslations((Widget) m_drawingArea, ptr);
-    XtFree ((char *) ptr);
+    // TODO: create XWindow
 
-    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 |
-                       LeaveWindowMask | FocusChangeMask,
-                       False,
-                       (XtEventHandler) wxCanvasEnterLeave,
-                       (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);
-    DoChangeBackgroundColour(m_scrolledWindow, backgroundColour, TRUE);
-    DoChangeBackgroundColour(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
+    wxAddWindowToTable((Window) m_drawingArea, this);
+    wxAddWindowToTable((Window) m_scrolledWindow, this);
+#endif
 
     // Without this, the cursor may not be restored properly (e.g. in splitter
     // sample).
@@ -383,19 +176,19 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
 }
 
 // Destructor
-wxWindow::~wxWindow()
+wxWindowX11::~wxWindowX11()
 {
     if (g_captureWindow == this)
        g_captureWindow = NULL;
     
     m_isBeingDeleted = TRUE;
     
-    // Motif-specific actions first
-    WXWidget wMain = GetMainWidget();
+    // X11-specific actions first
+    WXWindow wMain = GetMainWindow();
     if ( wMain )
     {
         // Removes event handlers
-        DetachWidget(wMain);
+        //DetachWidget(wMain);
     }
 
     ClearUpdateRects();
@@ -403,6 +196,9 @@ wxWindow::~wxWindow()
     if ( m_parent )
         m_parent->RemoveChild( this );
 
+    // TODO
+
+#if 0    
     // If m_drawingArea, we're a fully-fledged window with drawing area,
     // scrollbars etc. (what wxCanvas used to be)
     if ( m_drawingArea )
@@ -453,25 +249,16 @@ wxWindow::~wxWindow()
         }
     }
     else // Why wasn't this here before? JACS 8/3/2000
+#endif
         DestroyChildren();
 
 
     // Destroy the window
-    if (GetMainWidget())
+    if (GetMainWindow())
     {
-        // If this line (XtDestroyWidget) causes a crash, you may comment it out.
-        // Child widgets will get destroyed automatically when a frame
-        // 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.
-
-        // 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.
-        // SN, Feb/2000: newgrid/griddemo shows why it is needed :-(
-        XtDestroyWidget((Widget) GetMainWidget());
-        SetMainWidget((WXWidget) NULL);
+        // TODO
+        // XtDestroyWidget((Widget) GetMainWidget());
+        SetMainWindow((WXWindow) NULL);
     }
 }
 
@@ -480,8 +267,10 @@ wxWindow::~wxWindow()
 // ----------------------------------------------------------------------------
 
 // Helper function
-void wxWindow::CreateScrollbar(wxOrientation orientation)
+void wxWindowX11::CreateScrollbar(wxOrientation orientation)
 {
+    // TODO
+#if 0
     wxCHECK_RET( m_drawingArea, "this window can't have scrollbars" );
 
     XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_NONE, NULL);
@@ -559,10 +348,13 @@ void wxWindow::CreateScrollbar(wxOrientation orientation)
     }
 
     XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL);
+#endif
 }
 
-void wxWindow::DestroyScrollbar(wxOrientation orientation)
+void wxWindowX11::DestroyScrollbar(wxOrientation orientation)
 {
+    // TODO
+#if 0
     wxCHECK_RET( m_drawingArea, "this window can't have scrollbars" );
 
     XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_NONE, NULL);
@@ -599,22 +391,30 @@ void wxWindow::DestroyScrollbar(wxOrientation orientation)
 
     }
     XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL);
+#endif
 }
 
 // ---------------------------------------------------------------------------
 // basic operations
 // ---------------------------------------------------------------------------
 
-void wxWindow::SetFocus()
+void wxWindowX11::SetFocus()
 {
+    // TODO
+#if 0
     Widget wMain = (Widget) GetMainWidget();
     XmProcessTraversal(wMain, XmTRAVERSE_CURRENT);
     XmProcessTraversal((Widget) GetMainWidget(), XmTRAVERSE_CURRENT);
+#endif
 }
 
 // Get the window with the focus
 wxWindow *wxWindowBase::FindFocus()
 {
+    // TODO
+    return NULL;
+#if 0
+
     // TODO Problems:
     // (1) Can there be multiple focussed widgets in an application?
     // In which case we need to find the top-level window that's
@@ -639,107 +439,109 @@ wxWindow *wxWindowBase::FindFocus()
     }
 
     return winFocus;
+#endif
 }
 
-bool wxWindow::Enable(bool enable)
+bool wxWindowX11::Enable(bool enable)
 {
     if ( !wxWindowBase::Enable(enable) )
         return FALSE;
 
+    // TODO
+#if 0
     Widget wMain = (Widget)GetMainWidget();
     if ( wMain )
     {
         XtSetSensitive(wMain, enable);
         XmUpdateDisplay(wMain);
     }
+#endif
 
     return TRUE;
 }
 
-bool wxWindow::Show(bool show)
+bool wxWindowX11::Show(bool show)
 {
     if ( !wxWindowBase::Show(show) )
         return FALSE;
 
-    if (m_borderWidget || m_scrolledWindow)
-    {
-        MapOrUnmap(m_drawingArea, show);
-        MapOrUnmap(m_borderWidget ? m_borderWidget : m_scrolledWindow, show);
-    }
-    else
-    {
-        if ( !MapOrUnmap(GetTopWidget(), show) )
-            MapOrUnmap(GetMainWidget(), show);
-    }
-
-#if 0
     Window xwin = (Window) GetXWindow();
     Display *xdisp = (Display*) GetXDisplay();
     if (show)
         XMapWindow(xdisp, xwin);
     else
         XUnmapWindow(xdisp, xwin);
-#endif
 
     return TRUE;
 }
 
 // Raise the window to the top of the Z order
-void wxWindow::Raise()
+void wxWindowX11::Raise()
 {
-    Widget wTop = (Widget) GetTopWidget();
-    Window window = XtWindow(wTop);
-    XRaiseWindow(XtDisplay(wTop), window);
+    Window window = (Window) GetTopWindow();
+    if (window)
+        XRaiseWindow((Display*) wxGetDisplay(), window);
 }
 
 // Lower the window to the bottom of the Z order
-void wxWindow::Lower()
+void wxWindowX11::Lower()
 {
-    Widget wTop = (Widget) GetTopWidget();
-    Window window = XtWindow(wTop);
-    XLowerWindow(XtDisplay(wTop), window);
+    Window window = (Window) GetTopWindow();
+    if (window)
+        XLowerWindow((Display*) wxGetDisplay(), window);
 }
 
-void wxWindow::SetTitle(const wxString& title)
+void wxWindowX11::SetTitle(const wxString& title)
 {
-    XtVaSetValues((Widget)GetMainWidget(), XmNtitle, title.c_str(), NULL);
+    // TODO
+//    XtVaSetValues((Widget)GetMainWidget(), XmNtitle, title.c_str(), NULL);
 }
 
-wxString wxWindow::GetTitle() const
+wxString wxWindowX11::GetTitle() const
 {
+    // TODO
+    return wxEmptyString;
+#if 0
     char *title;
     XtVaGetValues((Widget)GetMainWidget(), XmNtitle, &title, NULL);
 
     return wxString(title);
+#endif
 }
 
-void wxWindow::DoCaptureMouse()
+void wxWindowX11::DoCaptureMouse()
 {
-    g_captureWindow = this;
+    g_captureWindow = (wxWindow*) this;
     if ( m_winCaptured )
         return;
 
+    // TODO
+#if 0
     Widget wMain = (Widget)GetMainWidget();
     if ( wMain )
         XtAddGrab(wMain, TRUE, FALSE);
+#endif
 
     m_winCaptured = TRUE;
 }
 
-void wxWindow::DoReleaseMouse()
+void wxWindowX11::DoReleaseMouse()
 {
     g_captureWindow = NULL;
     if ( !m_winCaptured )
         return;
 
+    // TODO
+#if 0
     Widget wMain = (Widget)GetMainWidget();
     if ( wMain )
         XtRemoveGrab(wMain);
+#endif
 
     m_winCaptured = FALSE;
 }
 
-bool wxWindow::SetFont(const wxFont& font)
+bool wxWindowX11::SetFont(const wxFont& font)
 {
     if ( !wxWindowBase::SetFont(font) )
     {
@@ -752,7 +554,7 @@ bool wxWindow::SetFont(const wxFont& font)
     return TRUE;
 }
 
-bool wxWindow::SetCursor(const wxCursor& cursor)
+bool wxWindowX11::SetCursor(const wxCursor& cursor)
 {
     if ( !wxWindowBase::SetCursor(cursor) )
     {
@@ -760,8 +562,6 @@ bool wxWindow::SetCursor(const wxCursor& cursor)
         return FALSE;
     }
 
-    //    wxASSERT_MSG( m_cursor.Ok(),
-    //                  wxT("cursor must be valid after call to the base version"));
     wxCursor* cursor2 = NULL;
     if (m_cursor.Ok())
         cursor2 = & m_cursor;
@@ -771,83 +571,84 @@ bool wxWindow::SetCursor(const wxCursor& cursor)
     WXDisplay *dpy = GetXDisplay();
     WXCursor x_cursor = cursor2->GetXCursor(dpy);
 
-    Widget w = (Widget) GetMainWidget();
-    Window win = XtWindow(w);
+    Window win = (Window) GetMainWindow();
     XDefineCursor((Display*) dpy, win, (Cursor) x_cursor);
 
     return TRUE;
 }
 
 // Coordinates relative to the window
-void wxWindow::WarpPointer (int x, int y)
+void wxWindowX11::WarpPointer (int x, int y)
 {
-    Widget wClient = (Widget)GetClientWidget();
+    Window wClient = (Window) GetClientWindow();
 
-    XWarpPointer(XtDisplay(wClient), None, XtWindow(wClient), 0, 0, 0, 0, x, y);
+    XWarpPointer((Display*) wxGetDisplay(), None, wClient, 0, 0, 0, 0, x, y);
 }
 
 // ---------------------------------------------------------------------------
 // scrolling stuff
 // ---------------------------------------------------------------------------
 
-int wxWindow::GetScrollPos(int orient) const
+int wxWindowX11::GetScrollPos(int orient) const
 {
     if (orient == wxHORIZONTAL)
         return m_scrollPosX;
     else
         return m_scrollPosY;
-
-#if 0
-    Widget scrollBar = (Widget) ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar);
-    if (scrollBar)
-    {
-        int pos;
-        XtVaGetValues(scrollBar, XmNvalue, &pos, NULL);
-        return pos;
-    }
-    else
-        return 0;
-#endif // 0
 }
 
 // This now returns the whole range, not just the number of positions that we
 // can scroll.
-int wxWindow::GetScrollRange(int orient) const
+int wxWindowX11::GetScrollRange(int WXUNUSED(orient)) const
 {
+    // TODO
+    return 0;
+#if 0
     Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient);
     wxCHECK_MSG( scrollBar, 0, "no such scrollbar" );
 
     int range;
     XtVaGetValues(scrollBar, XmNmaximum, &range, NULL);
     return range;
+#endif
 }
 
-int wxWindow::GetScrollThumb(int orient) const
+int wxWindowX11::GetScrollThumb(int orient) const
 {
+    // TODO
+    return 0;
+
+#if 0
     Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient);
     wxCHECK_MSG( scrollBar, 0, "no such scrollbar" );
 
     int thumb;
     XtVaGetValues(scrollBar, XmNsliderSize, &thumb, NULL);
     return thumb;
+#endif
 }
 
-void wxWindow::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
+void wxWindowX11::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
 {
+    // TODO
+
+#if 0
     Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient);
 
     if ( scrollBar )
     {
         XtVaSetValues (scrollBar, XmNvalue, pos, NULL);
     }
-
+#endif
     SetInternalScrollPos((wxOrientation)orient, pos);
 }
 
 // New function that will replace some of the above.
-void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
-                            int range, bool WXUNUSED(refresh))
+void wxWindowX11::SetScrollbar(int WXUNUSED(orient), int WXUNUSED(pos), int WXUNUSED(thumbVisible),
+                            int WXUNUSED(range), bool WXUNUSED(refresh))
 {
+    // TODO
+#if 0
     int oldW, oldH;
     GetSize(& oldW, & oldH);
 
@@ -917,10 +718,11 @@ 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);
+#endif
 }
 
 // Does a physical scroll
-void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
+void wxWindowX11::ScrollWindow(int dx, int dy, const wxRect *rect)
 {
     int x, y, w, h;
     if (rect)
@@ -934,45 +736,44 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         x = 0; y = 0;
         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 );
+        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();
+        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);
     int h1 = h - abs(dy);
     int x2 = (dx >= 0) ? x + dx : x;
     int y2 = (dy >= 0) ? y + dy : y;
-
-    wxClientDC dc(this);
-
+    
+    wxClientDC dc((wxWindow*) this);
+    
     dc.SetLogicalFunction (wxCOPY);
-
-    Widget widget = (Widget) GetMainWidget();
-    Window window = XtWindow(widget);
-    Display* display = XtDisplay(widget);
-
+    
+    Window window = (Window) GetMainWindow();
+    Display* display = (Display*) wxGetDisplay();
+    
     XCopyArea(display, window, window, (GC) dc.GetGC(),
-              x1, y1, w1, h1, x2, y2);
-
+        x1, y1, w1, h1, x2, y2);
+    
     dc.SetAutoSetting(TRUE);
     wxBrush brush(GetBackgroundColour(), wxSOLID);
     dc.SetBrush(brush); // FIXME: needed?
-
+    
     // We'll add rectangles to the list of update rectangles according to which
     // bits we've exposed.
     wxList updateRects;
-
+    
     if (dx > 0)
     {
         wxRect *rect = new wxRect;
@@ -980,103 +781,103 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         rect->y = y;
         rect->width = dx;
         rect->height = h;
-
+        
         XFillRectangle(display, window,
             (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
-
+        
         rect->x = rect->x;
         rect->y = rect->y;
         rect->width = rect->width;
         rect->height = rect->height;
-
+        
         updateRects.Append((wxObject*) rect);
     }
     else if (dx < 0)
     {
         wxRect *rect = new wxRect;
-
+        
         rect->x = x + w + dx;
         rect->y = y;
         rect->width = -dx;
         rect->height = h;
-
+        
         XFillRectangle(display, window,
             (GC) dc.GetGC(), rect->x, rect->y, rect->width,
             rect->height);
-
+        
         rect->x = rect->x;
         rect->y = rect->y;
         rect->width = rect->width;
         rect->height = rect->height;
-
+        
         updateRects.Append((wxObject*) rect);
     }
     if (dy > 0)
     {
         wxRect *rect = new wxRect;
-
+        
         rect->x = x;
         rect->y = y;
         rect->width = w;
         rect->height = dy;
-
+        
         XFillRectangle(display, window,
             (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
-
+        
         rect->x = rect->x;
         rect->y = rect->y;
         rect->width = rect->width;
         rect->height = rect->height;
-
+        
         updateRects.Append((wxObject*) rect);
     }
     else if (dy < 0)
     {
         wxRect *rect = new wxRect;
-
+        
         rect->x = x;
         rect->y = y + h + dy;
         rect->width = w;
         rect->height = -dy;
-
+        
         XFillRectangle(display, window,
             (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
-
+        
         rect->x = rect->x;
         rect->y = rect->y;
         rect->width = rect->width;
         rect->height = rect->height;
-
+        
         updateRects.Append((wxObject*) rect);
     }
     dc.SetBrush(wxNullBrush);
-
+    
     // Now send expose events
-
+    
     wxNode* node = updateRects.First();
     while (node)
     {
         wxRect* rect = (wxRect*) node->Data();
         XExposeEvent event;
-
+        
         event.type = Expose;
         event.display = display;
         event.send_event = True;
         event.window = window;
-
+        
         event.x = rect->x;
         event.y = rect->y;
         event.width = rect->width;
         event.height = rect->height;
-
+        
         event.count = 0;
-
+        
         XSendEvent(display, window, False, ExposureMask, (XEvent *)&event);
-
+        
         node = node->Next();
-
+        
     }
-
+    
     // Delete the update rects
     node = updateRects.First();
     while (node)
@@ -1085,8 +886,10 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         delete rect;
         node = node->Next();
     }
+    
+    // TODO
 
-    XmUpdateDisplay((Widget) GetMainWidget());
+    // XmUpdateDisplay((Widget) GetMainWidget());
 }
 
 // ---------------------------------------------------------------------------
@@ -1095,7 +898,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
 
 #if wxUSE_DRAG_AND_DROP
 
-void wxWindow::SetDropTarget(wxDropTarget * WXUNUSED(pDropTarget))
+void wxWindowX11::SetDropTarget(wxDropTarget * WXUNUSED(pDropTarget))
 {
     // TODO
 }
@@ -1103,7 +906,7 @@ void wxWindow::SetDropTarget(wxDropTarget * WXUNUSED(pDropTarget))
 #endif
 
 // Old style file-manager drag&drop
-void wxWindow::DragAcceptFiles(bool WXUNUSED(accept))
+void wxWindowX11::DragAcceptFiles(bool WXUNUSED(accept))
 {
     // TODO
 }
@@ -1114,95 +917,27 @@ void wxWindow::DragAcceptFiles(bool WXUNUSED(accept))
 
 #if wxUSE_TOOLTIPS
 
-void wxWindow::DoSetToolTip(wxToolTip * WXUNUSED(tooltip))
+void wxWindowX11::DoSetToolTip(wxToolTip * WXUNUSED(tooltip))
 {
     // TODO
 }
 
 #endif // wxUSE_TOOLTIPS
 
-// ----------------------------------------------------------------------------
-// popup menus
-// ----------------------------------------------------------------------------
-
-bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
-{
-    Widget widget = (Widget) GetMainWidget();
-
-    /* The menuId field seems to be usused, so we'll use it to
-    indicate whether a menu is popped up or not:
-    0: Not currently created as a popup
-    -1: Created as a popup, but not active
-    1: Active popup.
-    */
-
-    if (menu->GetParent() && (menu->GetId() != -1))
-        return FALSE;
-
-    if (menu->GetMainWidget()) {
-        menu->DestroyMenu(TRUE);
-    }
-
-    menu->SetId(1); /* Mark as popped-up */
-    menu->CreateMenu(NULL, widget, menu);
-    menu->SetInvokingWindow(this);
-
-    menu->UpdateUI();
-
-    //  menu->SetParent(parent);
-    //  parent->children->Append(menu);  // Store menu for later deletion
-
-    Widget menuWidget = (Widget) menu->GetMainWidget();
-
-    int rootX = 0;
-    int rootY = 0;
-
-    int deviceX = x;
-    int deviceY = y;
-    /*
-    if (this->IsKindOf(CLASSINFO(wxCanvas)))
-    {
-    wxCanvas *canvas = (wxCanvas *) this;
-    deviceX = canvas->GetDC ()->LogicalToDeviceX (x);
-    deviceY = canvas->GetDC ()->LogicalToDeviceY (y);
-    }
-    */
-
-    Display *display = XtDisplay (widget);
-    Window rootWindow = RootWindowOfScreen (XtScreen((Widget)widget));
-    Window thisWindow = XtWindow (widget);
-    Window childWindow;
-    XTranslateCoordinates (display, thisWindow, rootWindow, (int) deviceX, (int) deviceY,
-        &rootX, &rootY, &childWindow);
-
-    XButtonPressedEvent event;
-    event.type = ButtonPress;
-    event.button = 1;
-
-    event.x = deviceX;
-    event.y = deviceY;
-
-    event.x_root = rootX;
-    event.y_root = rootY;
-
-    XmMenuPosition (menuWidget, &event);
-    XtManageChild (menuWidget);
-
-    return TRUE;
-}
-
 // ---------------------------------------------------------------------------
 // moving and resizing
 // ---------------------------------------------------------------------------
 
-bool wxWindow::PreResize()
+bool wxWindowX11::PreResize()
 {
     return TRUE;
 }
 
 // Get total size
-void wxWindow::DoGetSize(int *x, int *y) const
+void wxWindowX11::DoGetSize(int *x, int *y) const
 {
+    // TODO
+#if 0
     if (m_drawingArea)
     {
         CanvasGetSize(x, y);
@@ -1213,10 +948,13 @@ void wxWindow::DoGetSize(int *x, int *y) const
     Dimension xx, yy;
     XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
     if(x) *x = xx; if(y) *y = yy;
+#endif
 }
 
-void wxWindow::DoGetPosition(int *x, int *y) const
+void wxWindowX11::DoGetPosition(int *x, int *y) const
 {
+    // TODO
+#if 0
     if (m_drawingArea)
     {
         CanvasGetPosition(x, y);
@@ -1236,14 +974,14 @@ void wxWindow::DoGetPosition(int *x, int *y) const
     }
 
     if(x) *x = xx; if(y) *y = yy;
+#endif
 }
 
-void wxWindow::DoScreenToClient(int *x, int *y) const
+void wxWindowX11::DoScreenToClient(int *x, int *y) const
 {
-    Widget widget = (Widget) GetClientWidget();
-    Display *display = XtDisplay((Widget) GetMainWidget());
-    Window rootWindow = RootWindowOfScreen(XtScreen(widget));
-    Window thisWindow = XtWindow(widget);
+    Display *display = (Display*) wxGetDisplay();
+    Window rootWindow = RootWindowOfScreen(DefaultScreenOfDisplay(display));
+    Window thisWindow = (Window) GetClientWindow();
 
     Window childWindow;
     int xx = *x;
@@ -1251,12 +989,11 @@ void wxWindow::DoScreenToClient(int *x, int *y) const
     XTranslateCoordinates(display, rootWindow, thisWindow, xx, yy, x, y, &childWindow);
 }
 
-void wxWindow::DoClientToScreen(int *x, int *y) const
+void wxWindowX11::DoClientToScreen(int *x, int *y) const
 {
-    Widget widget = (Widget) GetClientWidget();
-    Display *display = XtDisplay(widget);
-    Window rootWindow = RootWindowOfScreen(XtScreen(widget));
-    Window thisWindow = XtWindow(widget);
+    Display *display = (Display*) wxGetDisplay();
+    Window rootWindow = RootWindowOfScreen(DefaultScreenOfDisplay(display));
+    Window thisWindow = (Window) GetClientWindow();
 
     Window childWindow;
     int xx = *x;
@@ -1266,16 +1003,21 @@ void wxWindow::DoClientToScreen(int *x, int *y) const
 
 
 // Get size *available for subwindows* i.e. excluding menu bar etc.
-void wxWindow::DoGetClientSize(int *x, int *y) const
+void wxWindowX11::DoGetClientSize(int *x, int *y) const
 {
+    // TODO
+#if 0
     Widget widget = (Widget) GetClientWidget();
     Dimension xx, yy;
     XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
     if(x) *x = xx; if(y) *y = yy;
+#endif
 }
 
-void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+void wxWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
+    // TODO
+#if 0
     // A bit of optimization to help sort out the flickers.
     int oldX, oldY, oldW, oldH;
     GetSize(& oldW, & oldH);
@@ -1327,19 +1069,14 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
         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.
-#if 0
-        wxSizeEvent sizeEvent(wxSize(width, height), GetId());
-        sizeEvent.SetEventObject(this);
-
-        GetEventHandler()->ProcessEvent(sizeEvent);
-#endif // 0
     }
+#endif
 }
 
-void wxWindow::DoSetClientSize(int width, int height)
+void wxWindowX11::DoSetClientSize(int width, int height)
 {
+    // TODO
+#if 0
     if (m_drawingArea)
     {
         CanvasSetClientSize(width, height);
@@ -1357,18 +1094,19 @@ void wxWindow::DoSetClientSize(int width, int height)
     sizeEvent.SetEventObject(this);
 
     GetEventHandler()->ProcessEvent(sizeEvent);
+#endif
 }
 
 // For implementation purposes - sometimes decorations make the client area
 // smaller
-wxPoint wxWindow::GetClientAreaOrigin() const
+wxPoint wxWindowX11::GetClientAreaOrigin() const
 {
     return wxPoint(0, 0);
 }
 
 // Makes an adjustment to the window position (for example, a frame that has
 // a toolbar that it manages itself).
-void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
+void wxWindowX11::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
 {
     if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent())
     {
@@ -1377,8 +1115,10 @@ void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
     }
 }
 
-void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, int incH)
+void wxWindowX11::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, int incH)
 {
+    // TODO
+#if 0
     m_minWidth = minW;
     m_minHeight = minH;
     m_maxWidth = maxW;
@@ -1405,23 +1145,27 @@ void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, in
         XtVaSetValues(widget, XmNwidthInc, incW, NULL);
     if (incH > -1)
         XtVaSetValues(widget, XmNheightInc, incH, NULL);
+#endif
 }
 
-void wxWindow::DoMoveWindow(int x, int y, int width, int height)
+void wxWindowX11::DoMoveWindow(int x, int y, int width, int height)
 {
+    // TODO
+#if 0
     XtVaSetValues((Widget)GetTopWidget(),
                   XmNx, x,
                   XmNy, y,
                   XmNwidth, width,
                   XmNheight, height,
                   NULL);
+#endif
 }
 
 // ---------------------------------------------------------------------------
 // text metrics
 // ---------------------------------------------------------------------------
 
-int wxWindow::GetCharHeight() const
+int wxWindowX11::GetCharHeight() const
 {
     wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
 
@@ -1436,7 +1180,7 @@ int wxWindow::GetCharHeight() const
     return (ascent + descent);
 }
 
-int wxWindow::GetCharWidth() const
+int wxWindowX11::GetCharWidth() const
 {
     wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
 
@@ -1450,7 +1194,7 @@ int wxWindow::GetCharWidth() const
     return overall.width;
 }
 
-void wxWindow::GetTextExtent(const wxString& string,
+void wxWindowX11::GetTextExtent(const wxString& string,
                              int *x, int *y,
                              int *descent, int *externalLeading,
                              const wxFont *theFont) const
@@ -1491,11 +1235,11 @@ void wxWindow::GetTextExtent(const wxString& string,
 // painting
 // ----------------------------------------------------------------------------
 
-void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
+void wxWindowX11::Refresh(bool eraseBack, const wxRect *rect)
 {
     m_needsRefresh = TRUE;
-    Display *display = XtDisplay((Widget) GetMainWidget());
-    Window thisWindow = XtWindow((Widget) GetMainWidget());
+    Display *display = (Display*) wxGetDisplay();
+    Window thisWindow = (Window) GetMainWindow();
 
     XExposeEvent dummyEvent;
     int width, height;
@@ -1523,7 +1267,7 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
 
     if (eraseBack)
     {
-        wxClientDC dc(this);
+        wxClientDC dc((wxWindow*) this);
         wxBrush backgroundBrush(GetBackgroundColour(), wxSOLID);
         dc.SetBackground(backgroundBrush);
         if (rect)
@@ -1535,15 +1279,15 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
     XSendEvent(display, thisWindow, False, ExposureMask, (XEvent *)&dummyEvent);
 }
 
-void wxWindow::Clear()
+void wxWindowX11::Clear()
 {
-    wxClientDC dc(this);
+    wxClientDC dc((wxWindow*) this);
     wxBrush brush(GetBackgroundColour(), wxSOLID);
     dc.SetBackground(brush);
     dc.Clear();
 }
 
-void wxWindow::ClearUpdateRects()
+void wxWindowX11::ClearUpdateRects()
 {
     wxRectList::Node* node = m_updateRects.GetFirst();
     while (node)
@@ -1556,77 +1300,18 @@ void wxWindow::ClearUpdateRects()
     m_updateRects.Clear();
 }
 
-void wxWindow::DoPaint()
+void wxWindowX11::DoPaint()
 {
-    //TODO : make a temporary gc so we can do the XCopyArea below
-    if (m_backingPixmap && !m_needsRefresh)
-    {
-      wxPaintDC dc(this);
-
-      GC tempGC = (GC) dc.GetBackingGC();
-
-      Widget widget = (Widget) GetMainWidget();
-
-      int scrollPosX = 0;
-      int scrollPosY = 0;
-
-      // We have to test whether it's a wxScrolledWindow (hack!) because
-      // 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.
-      wxScrolledWindow* scrolledWindow = wxDynamicCast(this, wxScrolledWindow);
-      if ( scrolledWindow )
-      {
-          int x, y;
-          scrolledWindow->CalcScrolledPosition(0, 0, &x, &y);
-
-          scrollPosX = - x;
-          scrollPosY = - y;
-      }
-
-      // TODO: This could be optimized further by only copying the areas in the
-      //       current update region.
-
-      // Only blit the part visible in the client area. The backing pixmap
-      // always starts at 0, 0 but we may be looking at only a portion of it.
-      wxSize clientArea = GetClientSize();
-      int toBlitX = m_pixmapWidth - scrollPosX;
-      int toBlitY = m_pixmapHeight - scrollPosY;
-
-      // Copy whichever is samller, the amount of pixmap we have to copy,
-      // or the size of the client area.
-      toBlitX = wxMin(toBlitX, clientArea.x);
-      toBlitY = wxMin(toBlitY, clientArea.y);
-
-      // Make sure we're not negative
-      toBlitX = wxMax(0, toBlitX);
-      toBlitY = wxMax(0, toBlitY);
-
-      XCopyArea
-      (
-       XtDisplay(widget),
-       (Pixmap) m_backingPixmap,
-       XtWindow (widget),
-       tempGC,
-       scrollPosX, scrollPosY, // Start at the scroll position
-       toBlitX, toBlitY,       // How much of the pixmap to copy
-       0, 0                    // Destination
-      );
-    }
-    else
-    {
-        // Set an erase event first
-        wxEraseEvent eraseEvent(GetId());
-        eraseEvent.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(eraseEvent);
-
-        wxPaintEvent event(GetId());
-        event.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(event);
-
-        m_needsRefresh = FALSE;
-    }
+    // Set an erase event first
+    wxEraseEvent eraseEvent(GetId());
+    eraseEvent.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(eraseEvent);
+    
+    wxPaintEvent event(GetId());
+    event.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(event);
+    
+    m_needsRefresh = FALSE;
 }
 
 // ----------------------------------------------------------------------------
@@ -1634,7 +1319,7 @@ void wxWindow::DoPaint()
 // ----------------------------------------------------------------------------
 
 // Responds to colour changes: passes event on to children.
-void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event)
+void wxWindowX11::OnSysColourChanged(wxSysColourChangedEvent& event)
 {
     wxWindowList::Node *node = GetChildren().GetFirst();
     while ( node )
@@ -1652,7 +1337,7 @@ void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event)
     }
 }
 
-void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event))
+void wxWindowX11::OnIdle(wxIdleEvent& WXUNUSED(event))
 {
     // This calls the UI-update mechanism (querying windows for
     // menu/toolbar/control state information)
@@ -1663,25 +1348,20 @@ void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event))
 // accelerators
 // ----------------------------------------------------------------------------
 
-bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
+bool wxWindowX11::ProcessAccelerator(wxKeyEvent& event)
 {
     if (!m_acceleratorTable.Ok())
         return FALSE;
 
-    int count = m_acceleratorTable.GetCount();
-    wxAcceleratorEntry* entries = m_acceleratorTable.GetEntries();
-    int i;
-    for (i = 0; i < count; i++)
+    const wxAcceleratorEntry* entry = m_acceleratorTable.GetEntry(event);
+    if (entry)
     {
-        wxAcceleratorEntry* entry = & (entries[i]);
-        if (entry->MatchesEvent(event))
-        {
             // Bingo, we have a match. Now find a control that matches the
            // entry command id.
 
             // Need to go up to the top of the window hierarchy, since it might
             // be e.g. a menu item
-            wxWindow* parent = this;
+            wxWindow* parent = (wxWindow*) this;
             while ( parent && !parent->IsTopLevel() )
                 parent = parent->GetParent();
 
@@ -1724,22 +1404,22 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
             }
 
             return FALSE;
-        } // matches event
-    }// for
+
+    }// if
 
     // We didn't match the key event against an accelerator.
     return FALSE;
 }
 
 // ============================================================================
-// Motif-specific stuff from here on
+// X11-specific stuff from here on
 // ============================================================================
 
 // ----------------------------------------------------------------------------
 // function which maintain the global hash table mapping Widgets to wxWindows
 // ----------------------------------------------------------------------------
 
-bool wxAddWindowToTable(Widget w, wxWindow *win)
+bool wxAddWindowToTable(Window w, wxWindow *win)
 {
     wxWindow *oldItem = NULL;
     if ((oldItem = (wxWindow *)wxWidgetHashTable->Get ((long) w)))
@@ -1751,18 +1431,18 @@ bool wxAddWindowToTable(Widget w, wxWindow *win)
 
     wxWidgetHashTable->Put((long) w, win);
 
-    wxLogTrace("widget", "Widget 0x%08x <-> window %p (%s)",
+    wxLogTrace("widget", "XWindow 0x%08x <-> window %p (%s)",
                w, win, win->GetClassInfo()->GetClassName());
 
     return TRUE;
 }
 
-wxWindow *wxGetWindowFromTable(Widget w)
+wxWindow *wxGetWindowFromTable(Window w)
 {
     return (wxWindow *)wxWidgetHashTable->Get((long) w);
 }
 
-void wxDeleteWindowFromTable(Widget w)
+void wxDeleteWindowFromTable(Window w)
 {
     wxWidgetHashTable->Delete((long)w);
 }
@@ -1772,10 +1452,13 @@ void wxDeleteWindowFromTable(Widget w)
 // ----------------------------------------------------------------------------
 
 // Add to hash table, add event handler
-bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget,
-                             WXWidget formWidget, int x, int y, int width, int height)
+bool wxWindowX11::AttachWindow (wxWindow* WXUNUSED(parent), WXWindow mainWidget,
+                             int x, int y, int width, int height)
 {
-    wxAddWindowToTable((Widget) mainWidget, this);
+    wxAddWindowToTable((Window ) mainWidget, (wxWindow*) this);
+
+    // TODO
+#if 0
     if (CanAddEventHandler())
     {
         XtAddEventHandler((Widget) mainWidget,
@@ -1804,19 +1487,22 @@ bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget,
             ptr = XtParseTranslationTable ("<Configure>: resize()"));
         XtFree ((char *) ptr);
     }
-
+#endif
     if (x == -1)
         x = 0;
     if (y == -1)
         y = 0;
+
     SetSize (x, y, width, height);
 
     return TRUE;
 }
 
 // Remove event handler, remove from hash table
-bool wxWindow::DetachWidget(WXWidget widget)
+bool wxWindowX11::DetachWindow(WXWindow widget)
 {
+    // TODO
+#if 0
     if (CanAddEventHandler())
     {
         XtRemoveEventHandler((Widget) widget,
@@ -1825,36 +1511,29 @@ bool wxWindow::DetachWidget(WXWidget widget)
             wxPanelItemEventHandler,
             (XtPointer)this);
     }
+#endif
 
-    wxDeleteWindowFromTable((Widget) widget);
+    wxDeleteWindowFromTable((Window) widget);
     return TRUE;
 }
 
 // ----------------------------------------------------------------------------
-// Motif-specific accessors
+// X11-specific accessors
 // ----------------------------------------------------------------------------
 
 // Get the underlying X window
-WXWindow wxWindow::GetXWindow() const
+WXWindow wxWindowX11::GetXWindow() const
 {
-    Widget wMain = (Widget)GetMainWidget();
-    if ( wMain )
-        return (WXWindow) XtWindow(wMain);
-    else
-        return (WXWindow) 0;
+    return GetMainWindow();
 }
 
 // Get the underlying X display
-WXDisplay *wxWindow::GetXDisplay() const
+WXDisplay *wxWindowX11::GetXDisplay() const
 {
-    Widget wMain = (Widget)GetMainWidget();
-    if ( wMain )
-        return (WXDisplay*) XtDisplay(wMain);
-    else
-        return (WXDisplay*) NULL;
+    return wxGetDisplay();
 }
 
-WXWidget wxWindow::GetMainWidget() const
+WXWindow wxWindowX11::GetMainWindow() const
 {
     if (m_drawingArea)
         return m_drawingArea;
@@ -1862,420 +1541,30 @@ WXWidget wxWindow::GetMainWidget() const
         return m_mainWidget;
 }
 
-WXWidget wxWindow::GetClientWidget() const
+WXWindow wxWindowX11::GetClientWindow() const
 {
-    if (m_drawingArea != (WXWidget) 0)
+    if (m_drawingArea != (WXWindow) 0)
         return m_drawingArea;
     else
-        return GetMainWidget();
+        return GetMainWindow();
 }
 
-WXWidget wxWindow::GetTopWidget() const
+WXWindow wxWindowX11::GetTopWindow() const
 {
-    return GetMainWidget();
+    return GetMainWindow();
 }
 
-WXWidget wxWindow::GetLabelWidget() const
+WXWindow wxWindowX11::GetLabelWindow() const
 {
-    return GetMainWidget();
+    return GetMainWindow();
 }
 
 // ----------------------------------------------------------------------------
-// Motif callbacks
+// callbacks
 // ----------------------------------------------------------------------------
 
-// All widgets should have this as their resize proc.
-// OnSize sent to wxWindow via client data.
-void wxWidgetResizeProc(Widget w, XConfigureEvent *WXUNUSED(event), String WXUNUSED(args)[], int *WXUNUSED(num_args))
-{
-    wxWindow *win = wxGetWindowFromTable(w);
-    if (!win)
-        return;
-
-    if (win->PreResize())
-    {
-        int width, height;
-        win->GetSize(&width, &height);
-        wxSizeEvent sizeEvent(wxSize(width, height), win->GetId());
-        sizeEvent.SetEventObject(win);
-        win->GetEventHandler()->ProcessEvent(sizeEvent);
-    }
-}
-
-static void wxCanvasRepaintProc(Widget drawingArea,
-                                XtPointer clientData,
-                                XmDrawingAreaCallbackStruct * cbs)
-{
-    if (!wxGetWindowFromTable(drawingArea))
-        return;
-
-    XEvent * event = cbs->event;
-    wxWindow * win = (wxWindow *) clientData;
-
-    switch (event->type)
-    {
-    case Expose:
-        {
-            win->AddUpdateRect(event->xexpose.x, event->xexpose.y,
-                               event->xexpose.width, event->xexpose.height);
-            
-            if (event -> xexpose.count == 0)
-            {
-                win->DoPaint();
-                win->ClearUpdateRects();
-            }
-            break;
-        }
-    }
-}
-
-// Unable to deal with Enter/Leave without a separate EventHandler (Motif 1.1.4)
-static void wxCanvasEnterLeave(Widget drawingArea,
-                               XtPointer WXUNUSED(clientData),
-                               XCrossingEvent * event)
-{
-    XmDrawingAreaCallbackStruct cbs;
-    XEvent ev;
-
-    ((XCrossingEvent &) ev) = *event;
-
-    cbs.reason = XmCR_INPUT;
-    cbs.event = &ev;
-
-    wxCanvasInputEvent(drawingArea, (XtPointer) NULL, &cbs);
-}
-
-// Fix to make it work under Motif 1.0 (!)
-static void wxCanvasMotionEvent (Widget WXUNUSED(drawingArea), XButtonEvent * WXUNUSED(event))
-{
-#if XmVersion <= 1000
-    XmDrawingAreaCallbackStruct cbs;
-    XEvent ev;
-
-    ev = *((XEvent *) event);
-    cbs.reason = XmCR_INPUT;
-    cbs.event = &ev;
-
-    wxCanvasInputEvent (drawingArea, (XtPointer) NULL, &cbs);
-#endif // XmVersion <= 1000
-}
-
-static void wxCanvasInputEvent(Widget drawingArea,
-                               XtPointer WXUNUSED(data),
-                               XmDrawingAreaCallbackStruct * cbs)
-{
-    wxWindow *canvas = wxGetWindowFromTable(drawingArea);
-    XEvent local_event;
-
-    if (canvas==NULL)
-        return;
-
-    if (cbs->reason != XmCR_INPUT)
-        return;
-
-    local_event = *(cbs->event);    // We must keep a copy!
-
-    switch (local_event.xany.type)
-    {
-    case EnterNotify:
-    case LeaveNotify:
-    case ButtonPress:
-    case ButtonRelease:
-    case MotionNotify:
-        {
-            // FIXME: most of this mouse event code is more or less
-            // duplicated in wxTranslateMouseEvent
-            //
-            wxEventType eventType = wxEVT_NULL;
-
-            if (local_event.xany.type == EnterNotify)
-            {
-                //if (local_event.xcrossing.mode!=NotifyNormal)
-                //  return ; // Ignore grab events
-                eventType = wxEVT_ENTER_WINDOW;
-                //            canvas->GetEventHandler()->OnSetFocus();
-            }
-            else if (local_event.xany.type == LeaveNotify)
-            {
-                //if (local_event.xcrossingr.mode!=NotifyNormal)
-                //  return ; // Ignore grab events
-                eventType = wxEVT_LEAVE_WINDOW;
-                //            canvas->GetEventHandler()->OnKillFocus();
-            }
-            else if (local_event.xany.type == MotionNotify)
-            {
-                eventType = wxEVT_MOTION;
-            }
-
-            else if (local_event.xany.type == ButtonPress)
-            {
-                if (local_event.xbutton.button == Button1)
-                {
-                    eventType = wxEVT_LEFT_DOWN;
-                    canvas->SetButton1(TRUE);
-                }
-                else if (local_event.xbutton.button == Button2)
-                {
-                    eventType = wxEVT_MIDDLE_DOWN;
-                    canvas->SetButton2(TRUE);
-                }
-                else if (local_event.xbutton.button == Button3)
-                {
-                    eventType = wxEVT_RIGHT_DOWN;
-                    canvas->SetButton3(TRUE);
-                }
-            }
-            else if (local_event.xany.type == ButtonRelease)
-            {
-                if (local_event.xbutton.button == Button1)
-                {
-                    eventType = wxEVT_LEFT_UP;
-                    canvas->SetButton1(FALSE);
-                }
-                else if (local_event.xbutton.button == Button2)
-                {
-                    eventType = wxEVT_MIDDLE_UP;
-                    canvas->SetButton2(FALSE);
-                }
-                else if (local_event.xbutton.button == Button3)
-                {
-                    eventType = wxEVT_RIGHT_UP;
-                    canvas->SetButton3(FALSE);
-                }
-            }
-
-            wxMouseEvent wxevent (eventType);
-
-            wxevent.m_leftDown = ((eventType == wxEVT_LEFT_DOWN)
-                || (event_left_is_down (&local_event)
-                && (eventType != wxEVT_LEFT_UP)));
-            wxevent.m_middleDown = ((eventType == wxEVT_MIDDLE_DOWN)
-                || (event_middle_is_down (&local_event)
-                && (eventType != wxEVT_MIDDLE_UP)));
-            wxevent.m_rightDown = ((eventType == wxEVT_RIGHT_DOWN)
-                || (event_right_is_down (&local_event)
-                && (eventType != wxEVT_RIGHT_UP)));
-
-            wxevent.m_shiftDown = local_event.xbutton.state & ShiftMask;
-            wxevent.m_controlDown = local_event.xbutton.state & ControlMask;
-            wxevent.m_altDown = local_event.xbutton.state & Mod3Mask;
-            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)
-            {
-                if (wxevent.ButtonDown())
-                {
-                    long dclickTime = XtGetMultiClickTime((Display*) wxGetDisplay());
-
-                    // get button and time-stamp
-                    int button = 0;
-                    if (wxevent.LeftDown())
-                        button = 1;
-                    else if (wxevent.MiddleDown())
-                        button = 2;
-                    else if (wxevent.RightDown())
-                        button = 3;
-                    long ts = wxevent.GetTimestamp();
-
-                    // check, if single or double click
-                    int buttonLast = canvas->GetLastClickedButton();
-                    long lastTS = canvas->GetLastClickTime();
-                    if ( buttonLast && buttonLast == button && (ts - lastTS) < dclickTime )
-                    {
-                        // I have a dclick
-                        canvas->SetLastClick(0, ts);
-
-                        wxEventType typeDouble;
-                        if ( eventType == wxEVT_LEFT_DOWN )
-                            typeDouble = wxEVT_LEFT_DCLICK;
-                        else if ( eventType == wxEVT_MIDDLE_DOWN )
-                            typeDouble = wxEVT_MIDDLE_DCLICK;
-                        else if ( eventType == wxEVT_RIGHT_DOWN )
-                            typeDouble = wxEVT_RIGHT_DCLICK;
-                        else
-                            typeDouble = wxEVT_NULL;
-
-                        if ( typeDouble != wxEVT_NULL )
-                        {
-                            wxevent.SetEventType(typeDouble);
-                        }
-                    }
-                    else
-                    {
-                        // not fast enough or different button
-                        canvas->SetLastClick(button, ts);
-                    }
-                }
-            }
-
-            wxevent.SetId(canvas->GetId());
-            wxevent.SetEventObject(canvas);
-            wxevent.m_x = local_event.xbutton.x;
-            wxevent.m_y = local_event.xbutton.y;
-            canvas->GetEventHandler()->ProcessEvent (wxevent);
-#if 0
-            if (eventType == wxEVT_ENTER_WINDOW ||
-                    eventType == wxEVT_LEAVE_WINDOW ||
-                    eventType == wxEVT_MOTION
-               )
-                return;
-#endif // 0
-            break;
-      }
-    case KeyPress:
-        {
-            KeySym keySym;
+// TODO: implement wxWindow scrollbar, presumably using wxScrollBar
 #if 0
-            XComposeStatus compose;
-            (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, &compose);
-#endif // 0
-
-            (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL);
-            int id = wxCharCodeXToWX (keySym);
-
-            wxEventType eventType = wxEVT_CHAR;
-
-            wxKeyEvent event (eventType);
-
-            if (local_event.xkey.state & ShiftMask)
-                event.m_shiftDown = TRUE;
-            if (local_event.xkey.state & ControlMask)
-                event.m_controlDown = TRUE;
-            if (local_event.xkey.state & Mod3Mask)
-                event.m_altDown = TRUE;
-            if (local_event.xkey.state & Mod1Mask)
-                event.m_metaDown = TRUE;
-            event.SetEventObject(canvas);
-            event.m_keyCode = id;
-            event.SetTimestamp(local_event.xkey.time);
-
-            if (id > -1)
-            {
-                // Implement wxFrame::OnCharHook by checking ancestor.
-                wxWindow *parent = canvas->GetParent();
-                while (parent && !parent->IsKindOf(CLASSINFO(wxFrame)))
-                    parent = parent->GetParent();
-
-                if (parent)
-                {
-                    event.SetEventType(wxEVT_CHAR_HOOK);
-                    if (parent->GetEventHandler()->ProcessEvent(event))
-                        return;
-                }
-
-                // For simplicity, OnKeyDown is the same as OnChar
-                // TODO: filter modifier key presses from OnChar
-                event.SetEventType(wxEVT_KEY_DOWN);
-
-                // Only process OnChar if OnKeyDown didn't swallow it
-                if (!canvas->GetEventHandler()->ProcessEvent (event))
-                {
-                  event.SetEventType(wxEVT_CHAR);
-                  canvas->GetEventHandler()->ProcessEvent (event);
-        }
-            }
-            break;
-        }
-    case KeyRelease:
-        {
-            KeySym keySym;
-            (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL);
-            int id = wxCharCodeXToWX (keySym);
-
-            wxKeyEvent event (wxEVT_KEY_UP);
-
-            if (local_event.xkey.state & ShiftMask)
-                event.m_shiftDown = TRUE;
-            if (local_event.xkey.state & ControlMask)
-                event.m_controlDown = TRUE;
-            if (local_event.xkey.state & Mod3Mask)
-                event.m_altDown = TRUE;
-            if (local_event.xkey.state & Mod1Mask)
-                event.m_metaDown = TRUE;
-            event.SetEventObject(canvas);
-            event.m_keyCode = id;
-            event.SetTimestamp(local_event.xkey.time);
-
-            if (id > -1)
-            {
-                canvas->GetEventHandler()->ProcessEvent (event);
-            }
-            break;
-        }
-    case FocusIn:
-        {
-            if (local_event.xfocus.detail != NotifyPointer)
-            {
-                wxFocusEvent event(wxEVT_SET_FOCUS, canvas->GetId());
-                event.SetEventObject(canvas);
-                canvas->GetEventHandler()->ProcessEvent(event);
-            }
-            break;
-        }
-    case FocusOut:
-        {
-            if (local_event.xfocus.detail != NotifyPointer)
-            {
-                wxFocusEvent event(wxEVT_KILL_FOCUS, canvas->GetId());
-                event.SetEventObject(canvas);
-                canvas->GetEventHandler()->ProcessEvent(event);
-            }
-            break;
-        }
-    default:
-        break;
-    }
-}
-
-static void wxPanelItemEventHandler(Widget    wid,
-                                    XtPointer WXUNUSED(client_data),
-                                    XEvent*   event,
-                                    Boolean  *continueToDispatch)
-{
-    // Widget can be a label or the actual widget.
-
-    wxWindow *window = wxGetWindowFromTable(wid);
-    if (window)
-    {
-        wxMouseEvent wxevent(0);
-        if (wxTranslateMouseEvent(wxevent, window, wid, event))
-        {
-            window->GetEventHandler()->ProcessEvent(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
-    // e.g. wxWindow::OnMouseEvent we can call Default() which sets this flag to
-    // 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.
-    *continueToDispatch = True;
-}
-
 static void wxScrollBarCallback(Widget scrollbar,
                                 XtPointer clientData,
                                 XmScrollBarCallbackStruct *cbs)
@@ -2341,48 +1630,18 @@ static void wxScrollBarCallback(Widget scrollbar,
     event.SetEventObject( win );
     win->GetEventHandler()->ProcessEvent(event);
 }
+#endif
 
-// 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)
-    {
-    case Expose:
-        {
-            window = (Window) win -> GetXWindow();
-            display = (Display *) win -> GetXDisplay();
-
-            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;
-        }
-    }
-}
 
 // ----------------------------------------------------------------------------
 // CanvaseXXXSize() functions
 // ----------------------------------------------------------------------------
 
 // SetSize, but as per old wxCanvas (with drawing widget etc.)
-void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
+void wxWindowX11::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
 {
+    // TODO
+#if 0
     // A bit of optimization to help sort out the flickers.
     int oldX, oldY, oldW, oldH;
     GetSize(& oldW, & oldH);
@@ -2508,19 +1767,14 @@ void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
     if (managed)
         XtManageChild (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow);
     XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
-
-#if 0
-    int ww, hh;
-    GetClientSize (&ww, &hh);
-    wxSizeEvent sizeEvent(wxSize(ww, hh), GetId());
-    sizeEvent.SetEventObject(this);
-
-    GetEventHandler()->ProcessEvent(sizeEvent);
-#endif // 0
+#endif
+    // 0
 }
 
-void wxWindow::CanvasSetClientSize (int w, int h)
+void wxWindowX11::CanvasSetClientSize (int w, int h)
 {
+// TODO
+#if 0
     Widget drawingArea = (Widget) m_drawingArea;
 
     XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
@@ -2530,44 +1784,26 @@ void wxWindow::CanvasSetClientSize (int w, int h)
     if (h > -1)
         XtVaSetValues(drawingArea, XmNheight, h, NULL);
 
-#if 0
-    // TODO: is this necessary?
-    allowRepainting = FALSE;
-
-    XSync (XtDisplay (drawingArea), FALSE);
-    XEvent event;
-    while (XtAppPending (wxTheApp->appContext))
-    {
-        XFlush (XtDisplay (drawingArea));
-        XtAppNextEvent (wxTheApp->appContext, &event);
-        XtDispatchEvent (&event);
-    }
-#endif // 0
-
     XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
-
-#if 0
-    allowRepainting = TRUE;
-    DoRefresh ();
-
-    wxSizeEvent sizeEvent(wxSize(w, h), GetId());
-    sizeEvent.SetEventObject(this);
-
-    GetEventHandler()->ProcessEvent(sizeEvent);
 #endif // 0
 }
 
-void wxWindow::CanvasGetClientSize (int *w, int *h) const
+void wxWindowX11::CanvasGetClientSize (int *w, int *h) const
 {
+// TODO
+#if 0
     // Must return the same thing that was set via SetClientSize
     Dimension xx, yy;
     XtVaGetValues ((Widget) m_drawingArea, XmNwidth, &xx, XmNheight, &yy, NULL);
     *w = xx;
     *h = yy;
+#endif
 }
 
-void wxWindow::CanvasGetSize (int *w, int *h) const
+void wxWindowX11::CanvasGetSize (int *w, int *h) const
 {
+// TODO
+#if 0
     Dimension xx, yy;
     if ((Widget) m_borderWidget)
         XtVaGetValues ((Widget) m_borderWidget, XmNwidth, &xx, XmNheight, &yy, NULL);
@@ -2578,10 +1814,13 @@ void wxWindow::CanvasGetSize (int *w, int *h) const
 
     *w = xx;
     *h = yy;
+#endif
 }
 
-void wxWindow::CanvasGetPosition (int *x, int *y) const
+void wxWindowX11::CanvasGetPosition (int *x, int *y) const
 {
+// TODO
+#if 0
     Position xx, yy;
     XtVaGetValues (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow, XmNx, &xx, XmNy, &yy, NULL);
 
@@ -2597,32 +1836,38 @@ void wxWindow::CanvasGetPosition (int *x, int *y) const
 
     *x = xx;
     *y = yy;
+#endif
 }
 
 // ----------------------------------------------------------------------------
 // TranslateXXXEvent() functions
 // ----------------------------------------------------------------------------
 
-bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, XEvent *xevent)
+bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Window window, XEvent *xevent)
 {
     switch (xevent->xany.type)
     {
-        case EnterNotify:  // never received here - yes ? MB
-        case LeaveNotify:  // never received here - yes ? MB
+        case EnterNotify:
+        case LeaveNotify:
         case ButtonPress:
         case ButtonRelease:
         case MotionNotify:
         {
             wxEventType eventType = wxEVT_NULL;
 
-            // FIXME: this is never true I think - MB
-            //
-            if (xevent->xany.type == LeaveNotify)
+            if (xevent->xany.type == EnterNotify)
             {
-                win->SetButton1(FALSE);
-                win->SetButton2(FALSE);
-                win->SetButton3(FALSE);
-                return FALSE;
+                //if (local_event.xcrossing.mode!=NotifyNormal)
+                //  return ; // Ignore grab events
+                eventType = wxEVT_ENTER_WINDOW;
+                //            canvas->GetEventHandler()->OnSetFocus();
+            }
+            else if (xevent->xany.type == LeaveNotify)
+            {
+                //if (local_event.xcrossingr.mode!=NotifyNormal)
+                //  return ; // Ignore grab events
+                eventType = wxEVT_LEAVE_WINDOW;
+                //            canvas->GetEventHandler()->OnKillFocus();
             }
             else if (xevent->xany.type == MotionNotify)
             {
@@ -2652,8 +1897,9 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget,
                 }
 
                 // check for a double click
-                //
-                long dclickTime = XtGetMultiClickTime((Display*) wxGetDisplay());
+                // TODO: where can we get this value from?
+                //long dclickTime = XtGetMultiClickTime((Display*) wxGetDisplay());
+                long dclickTime = 200;
                 long ts = wxevent.GetTimestamp();
 
                 int buttonLast = win->GetLastClickedButton();
@@ -2701,25 +1947,8 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget,
 
             wxevent.SetEventType(eventType);
 
-            Position x1, y1;
-            XtVaGetValues(widget, XmNx, &x1, XmNy, &y1, NULL);
-
-            int x2, y2;
-            win->GetPosition(&x2, &y2);
-
-            // The button x/y must be translated to wxWindows
-            // window space - the widget might be a label or button,
-            // within a form.
-            int dx = 0;
-            int dy = 0;
-            if (widget != (Widget)win->GetMainWidget())
-            {
-                dx = x1;
-                dy = y1;
-            }
-
-            wxevent.m_x = xevent->xbutton.x + dx;
-            wxevent.m_y = xevent->xbutton.y + dy;
+            wxevent.m_x = xevent->xbutton.x;
+            wxevent.m_y = xevent->xbutton.y;
 
             wxevent.m_leftDown = ((eventType == wxEVT_LEFT_DOWN)
                 || (event_left_is_down (xevent)
@@ -2745,7 +1974,7 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget,
     return FALSE;
 }
 
-bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget WXUNUSED(widget), XEvent *xevent)
+bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Window WXUNUSED(win), XEvent *xevent)
 {
     switch (xevent->xany.type)
     {
@@ -2755,10 +1984,6 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget WXUNUSED(wid
             char buf[20];
 
             KeySym keySym;
-#if 0
-            XComposeStatus compose;
-            (void) XLookupString ((XKeyEvent *) xevent, buf, 20, &keySym, &compose);
-#endif // 0
             (void) XLookupString ((XKeyEvent *) xevent, buf, 20, &keySym, NULL);
             int id = wxCharCodeXToWX (keySym);
 
@@ -2793,6 +2018,8 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget WXUNUSED(wid
 // Colour stuff
 // ----------------------------------------------------------------------------
 
+#if 0
+
 #define YAllocColor XAllocColor
 XColor g_itemColors[5];
 int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
@@ -2852,46 +2079,38 @@ int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
     return (result);
 
 }
+#endif
 
 // Changes the foreground and background colours to be derived from the current
 // background colour. To change the foreground colour, you must call
 // SetForegroundColour explicitly.
-void wxWindow::ChangeBackgroundColour()
+void wxWindowX11::ChangeBackgroundColour()
 {
+    // TODO
+#if 0
     WXWidget mainWidget = GetMainWidget();
     if ( mainWidget )
         DoChangeBackgroundColour(mainWidget, m_backgroundColour);
-
-    // This not necessary
-#if 0
-
-    if (m_scrolledWindow && (GetMainWidget() != m_scrolledWindow))
-    {
-        DoChangeBackgroundColour(m_scrolledWindow, m_backgroundColour);
-        // Have to set the scrollbar colours back since
-        // the scrolled window seemed to change them
-        wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-
-        if (m_hScrollBar)
-            DoChangeBackgroundColour(m_hScrollBar, backgroundColour);
-        if (m_vScrollBar)
-            DoChangeBackgroundColour(m_vScrollBar, backgroundColour);
-    }
 #endif
 }
 
-void wxWindow::ChangeForegroundColour()
+void wxWindowX11::ChangeForegroundColour()
 {
+    // TODO
+#if 0
     WXWidget mainWidget = GetMainWidget();
     if ( mainWidget )
         DoChangeForegroundColour(mainWidget, m_foregroundColour);
     if ( m_scrolledWindow && mainWidget != m_scrolledWindow )
         DoChangeForegroundColour(m_scrolledWindow, m_foregroundColour);
+#endif
 }
 
 // Change a widget's foreground and background colours.
-void wxWindow::DoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
+void wxWindowX11::DoChangeForegroundColour(WXWindow widget, wxColour& foregroundColour)
 {
+    // TODO
+#if 0
     // When should we specify the foreground, if it's calculated
     // by wxComputeColours?
     // Solution: say we start with the default (computed) foreground colour.
@@ -2907,10 +2126,13 @@ void wxWindow::DoChangeForegroundColour(WXWidget widget, wxColour& foregroundCol
                   XmNforeground, foregroundColour.AllocColour(XtDisplay(w)),
                   NULL
                  );
+#endif
 }
 
-void wxWindow::DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour)
+void wxWindowX11::DoChangeBackgroundColour(WXWindow widget, wxColour& backgroundColour, bool changeArmColour)
 {
+    // TODO
+#if 0
     wxComputeColours (XtDisplay((Widget) widget), & backgroundColour,
         (wxColour*) NULL);
 
@@ -2925,9 +2147,10 @@ void wxWindow::DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundCol
         XtVaSetValues ((Widget) widget,
         XmNarmColor, g_itemColors[wxSELE_INDEX].pixel,
         NULL);
+#endif
 }
 
-bool wxWindow::SetBackgroundColour(const wxColour& col)
+bool wxWindowX11::SetBackgroundColour(const wxColour& col)
 {
     if ( !wxWindowBase::SetBackgroundColour(col) )
         return FALSE;
@@ -2937,7 +2160,7 @@ bool wxWindow::SetBackgroundColour(const wxColour& col)
     return TRUE;
 }
 
-bool wxWindow::SetForegroundColour(const wxColour& col)
+bool wxWindowX11::SetForegroundColour(const wxColour& col)
 {
     if ( !wxWindowBase::SetForegroundColour(col) )
         return FALSE;
@@ -2947,8 +2170,10 @@ bool wxWindow::SetForegroundColour(const wxColour& col)
     return TRUE;
 }
 
-void wxWindow::ChangeFont(bool keepOriginalSize)
+void wxWindowX11::ChangeFont(bool keepOriginalSize)
 {
+    // TODO
+#if 0
     // Note that this causes the widget to be resized back
     // to its original size! We therefore have to set the size
     // back again. TODO: a better way in Motif?
@@ -2971,6 +2196,7 @@ void wxWindow::ChangeFont(bool keepOriginalSize)
             SetSize(-1, -1, width, height);
         }
     }
+#endif
 }
 
 // ----------------------------------------------------------------------------