]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/frame.cpp
Fix crash in wxDC::GetMultiLineTextExtent() after last commit.
[wxWidgets.git] / src / motif / frame.cpp
index 5984fe2b591df5a80c46e3b4fa6d500e4c6a642d..c4c3d3c9521a7e235e3b13052a042cab06e31ed8 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        motif/frame.cpp
+// Name:        src/motif/frame.cpp
 // Purpose:     wxFrame
 // Author:      Julian Smart
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #pragma implementation "frame.h"
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
 
+#include "wx/frame.h"
 
-#ifdef __VMS
-#define XtDisplay XTDISPLAY
-#define XtWindow XTWINDOW
-#define XtScreen XTSCREEN
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+    #include "wx/app.h"
+    #include "wx/utils.h"
+    #include "wx/menu.h"
+    #include "wx/icon.h"
+    #include "wx/settings.h"
+    #include "wx/toolbar.h"
+    #include "wx/statusbr.h"
 #endif
 
-# include "wx/frame.h"
-#include "wx/statusbr.h"
-#include "wx/toolbar.h"
-#include "wx/menuitem.h"
-#include "wx/menu.h"
-#include "wx/dcclient.h"
-#include "wx/dialog.h"
-#include "wx/settings.h"
-#include "wx/app.h"
-#include "wx/utils.h"
-#include "wx/log.h"
-
 #ifdef __VMS__
     #pragma message disable nosimpint
 #endif
@@ -50,6 +43,7 @@
 
 #include <Xm/Xm.h>
 #include <X11/Shell.h>
+#include <X11/Core.h>
 #if XmVersion >= 1002
     #include <Xm/XmAll.h>
 #else
 #endif
 
 #include "wx/motif/private.h"
+#include "wx/unix/utilsx11.h"
 
 // ----------------------------------------------------------------------------
 // private functions
 // ----------------------------------------------------------------------------
 
-static void wxFrameEventHandler(Widget    wid,
-                             XtPointer WXUNUSED(client_data),
-                             XEvent*   event,
-                             Boolean*  continueToDispatch);
-static void wxCloseFrameCallback(Widget, XtPointer, XmAnyCallbackStruct *cbs);
-static void wxFrameFocusProc(Widget workArea, XtPointer clientData,
-                            XmAnyCallbackStruct *cbs);
 static void wxFrameMapProc(Widget frameShell, XtPointer clientData,
-                           XCrossingEvent * event);
+                           XCrossingEvent* event);
 
 // ----------------------------------------------------------------------------
 // globals
 // ----------------------------------------------------------------------------
 
 extern wxList wxModelessWindows;
-extern wxList wxPendingDelete;
-
-// TODO: this should be tidied so that any frame can be the
-// top frame
-static bool wxTopLevelUsed = FALSE;
 
 // ----------------------------------------------------------------------------
 // wxWin macros
@@ -108,8 +91,6 @@ BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
     EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
 END_EVENT_TABLE()
 
-IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow)
-
 // ============================================================================
 // implementation
 // ============================================================================
@@ -120,14 +101,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow)
 
 void wxFrame::Init()
 {
-    m_iconized = FALSE;
+    m_iconized = false;
 
     //// Motif-specific
     m_frameShell = (WXWidget) NULL;
-    m_frameWidget = (WXWidget) NULL;;
-    m_workArea = (WXWidget) NULL;;
-    m_clientArea = (WXWidget) NULL;;
-    m_visibleStatus = TRUE;
+    m_mainWidget = (WXWidget) NULL;
+    m_workArea = (WXWidget) NULL;
+    m_clientArea = (WXWidget) NULL;
 }
 
 bool wxFrame::Create(wxWindow *parent,
@@ -138,25 +118,9 @@ bool wxFrame::Create(wxWindow *parent,
                      long style,
                      const wxString& name)
 {
-    if ( parent )
-        parent->AddChild(this);
-    else
-        wxTopLevelWindows.Append(this);
-
-    wxModelessWindows.Append(this);
-
-    SetName(name);
-
-    m_windowStyle = style;
-
-    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE);
-    m_foregroundColour = *wxBLACK;
-    m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
-
-    if ( id > -1 )
-        m_windowId = id;
-    else
-        m_windowId = (int)NewControlId();
+    if( !wxTopLevelWindow::Create( parent, id, title, pos, size, style,
+                                   name ) )
+        return false;
 
     int x = pos.x, y = pos.y;
     int width = size.x, height = size.y;
@@ -185,46 +149,67 @@ bool wxFrame::Create(wxWindow *parent,
         if (y < 10) y = 10;
     }
 
-    // VZ: what does this do??
-    if (wxTopLevelUsed)
-    {
-        // Change suggested by Matthew Flatt
-        m_frameShell = (WXWidget)XtAppCreateShell
-                                 (
-                                  name,
-                                  wxTheApp->GetClassName(),
-                                  topLevelShellWidgetClass,
-                                  (Display*) wxGetDisplay(),
-                                  NULL,
-                                  0
-                                 );
-    }
-    else
-    {
-        m_frameShell = wxTheApp->GetTopLevelWidget();
-        wxTopLevelUsed = TRUE;
-    }
+    SetTitle( title );
 
-    XtVaSetValues((Widget) m_frameShell,
+    wxLogTrace(wxTRACE_Messages,
+               "Created frame (0x%p) with work area 0x%p and client "
+               "area 0x%p", m_mainWidget, m_workArea, m_clientArea);
+
+    XtAddEventHandler((Widget) m_clientArea, ExposureMask,False,
+        wxUniversalRepaintProc, (XtPointer) this);
+
+    if (x > -1)
+        XtVaSetValues((Widget) m_frameShell, XmNx, x, NULL);
+    if (y > -1)
+        XtVaSetValues((Widget) m_frameShell, XmNy, y, NULL);
+    if (width > -1)
+        XtVaSetValues((Widget) m_frameShell, XmNwidth, width, NULL);
+    if (height > -1)
+        XtVaSetValues((Widget) m_frameShell, XmNheight, height, NULL);
+
+    PostCreation();
+    PreResize();
+
+    wxSize newSize(width, height);
+    wxSizeEvent sizeEvent(newSize, GetId());
+    sizeEvent.SetEventObject(this);
+
+    HandleWindowEvent(sizeEvent);
+
+    return true;
+}
+
+bool wxFrame::XmDoCreateTLW(wxWindow* WXUNUSED(parent),
+                            wxWindowID WXUNUSED(id),
+                            const wxString& WXUNUSED(title),
+                            const wxPoint& WXUNUSED(pos),
+                            const wxSize& WXUNUSED(size),
+                            long style,
+                            const wxString& name)
+{
+    Widget frameShell;
+
+    frameShell = XtCreatePopupShell( name, topLevelShellWidgetClass,
+                                     (Widget)wxTheApp->GetTopLevelWidget(),
+                                     NULL, 0 );
+
+    XtVaSetValues(frameShell,
         // Allows menu to resize
         XmNallowShellResize, True,
         XmNdeleteResponse, XmDO_NOTHING,
         XmNmappedWhenManaged, False,
-        XmNiconic, (style & wxICONIZE) ? TRUE : FALSE,
+        XmNiconic, (style & wxICONIZE) ? True : False,
         NULL);
 
-    if (!title.IsEmpty())
-        XtVaSetValues((Widget) m_frameShell,
-        XmNtitle, title.c_str(),
-        NULL);
+    m_frameShell = (WXWidget)frameShell;
 
-    m_frameWidget = (WXWidget) XtVaCreateManagedWidget("main_window",
-        xmMainWindowWidgetClass, (Widget) m_frameShell,
+    m_mainWidget = (WXWidget) XtVaCreateManagedWidget("main_window",
+        xmMainWindowWidgetClass, frameShell,
         XmNresizePolicy, XmRESIZE_NONE,
         NULL);
 
     m_workArea = (WXWidget) XtVaCreateWidget("form",
-        xmFormWidgetClass, (Widget) m_frameWidget,
+        xmFormWidgetClass, (Widget) m_mainWidget,
         XmNresizePolicy, XmRESIZE_NONE,
         NULL);
 
@@ -236,185 +221,85 @@ bool wxFrame::Create(wxWindow *parent,
         XmNleftAttachment, XmATTACH_FORM,
         XmNtopAttachment, XmATTACH_FORM,
         XmNbottomAttachment, XmATTACH_FORM,
-        //                    XmNresizePolicy, XmRESIZE_ANY,
         NULL);
 
-    wxLogTrace(wxTRACE_Messages,
-               "Created frame (0x%08x) with work area 0x%08x and client "
-               "area 0x%08x", m_frameWidget, m_workArea, m_clientArea);
-
-    XtAddEventHandler((Widget) m_clientArea, ExposureMask,FALSE,
-        wxUniversalRepaintProc, (XtPointer) this);
-
-    XtAddEventHandler((Widget) m_clientArea,
-        ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask,
-        FALSE,
-        wxFrameEventHandler,
-        (XtPointer)this);
-
-    XtVaSetValues((Widget) m_frameWidget,
+    XtVaSetValues((Widget) m_mainWidget,
         XmNworkWindow, (Widget) m_workArea,
         NULL);
 
     XtManageChild((Widget) m_clientArea);
     XtManageChild((Widget) m_workArea);
 
-    wxAddWindowToTable((Widget) m_workArea, this);
-    wxAddWindowToTable((Widget) m_clientArea, this);
-
-    XtTranslations ptr;
-
-    XtOverrideTranslations((Widget) m_workArea,
-        ptr = XtParseTranslationTable("<Configure>: resize()"));
-
-    XtFree((char *)ptr);
-
-    XtAddCallback((Widget) m_workArea, XmNfocusCallback,
-        (XtCallbackProc)wxFrameFocusProc, (XtPointer)this);
+    XtTranslations ptr = XtParseTranslationTable( "<Configure>: resize()" );
+    XtOverrideTranslations( (Widget) m_workArea, ptr );
+    XtFree( (char *)ptr );
 
     /* Part of show-&-hide fix */
-    XtAddEventHandler((Widget) m_frameShell, StructureNotifyMask,
-        False, (XtEventHandler)wxFrameMapProc,
-        (XtPointer)m_workArea);
-
-    if (x > -1)
-        XtVaSetValues((Widget) m_frameShell, XmNx, x, NULL);
-    if (y > -1)
-        XtVaSetValues((Widget) m_frameShell, XmNy, y, NULL);
-    if (width > -1)
-        XtVaSetValues((Widget) m_frameShell, XmNwidth, width, NULL);
-    if (height > -1)
-        XtVaSetValues((Widget) m_frameShell, XmNheight, height, NULL);
-
-    m_mainWidget = m_frameWidget;
-
-    ChangeFont(FALSE);
-
-    // This patch comes from Torsten Liermann lier@lier1.muc.de
-    if (XmIsMotifWMRunning( (Widget) m_frameShell ))
-    {
-        int decor = 0;
-        if (style & wxRESIZE_BORDER)
-            decor |= MWM_DECOR_RESIZEH;
-        if (style & wxSYSTEM_MENU)
-            decor |= MWM_DECOR_MENU;
-        if ((style & wxCAPTION) ||
-            (style & wxTINY_CAPTION_HORIZ) ||
-            (style & wxTINY_CAPTION_VERT))
-            decor |= MWM_DECOR_TITLE;
-        if (style & wxTHICK_FRAME)
-            decor |= MWM_DECOR_BORDER;
-        if (style & wxTHICK_FRAME)
-            decor |= MWM_DECOR_BORDER;
-        if (style & wxMINIMIZE_BOX)
-            decor |= MWM_DECOR_MINIMIZE;
-        if (style & wxMAXIMIZE_BOX)
-            decor |= MWM_DECOR_MAXIMIZE;
-        XtVaSetValues((Widget) m_frameShell,XmNmwmDecorations,decor,NULL);
-    }
-    // This allows non-Motif window managers to support at least the
-    // no-decorations case.
-    else
-    {
-        if (style == 0)
-            XtVaSetValues((Widget) m_frameShell,XmNoverrideRedirect,TRUE,NULL);
-    }
-    XtRealizeWidget((Widget) m_frameShell);
+    XtAddEventHandler( frameShell, StructureNotifyMask,
+                       False, (XtEventHandler)wxFrameMapProc,
+                       (XtPointer)this );
 
-    // Intercept CLOSE messages from the window manager
-    Atom WM_DELETE_WINDOW = XmInternAtom(XtDisplay((Widget) m_frameShell), "WM_DELETE_WINDOW", False);
-#if (XmREVISION > 1 || XmVERSION > 1)
-    XmAddWMProtocolCallback((Widget) m_frameShell, WM_DELETE_WINDOW, (XtCallbackProc) wxCloseFrameCallback, (XtPointer)this);
-#else
-#if XmREVISION == 1
-    XmAddWMProtocolCallback((Widget) m_frameShell, WM_DELETE_WINDOW, (XtCallbackProc) wxCloseFrameCallback, (caddr_t)this);
-#else
-    XmAddWMProtocolCallback((Widget) m_frameShell, WM_DELETE_WINDOW, (void (*)())wxCloseFrameCallback, (caddr_t)this);
-#endif
-#endif
-
-    ChangeBackgroundColour();
+    XtRealizeWidget(frameShell);
 
-    PreResize();
-
-    wxSizeEvent sizeEvent(wxSize(width, height), GetId());
-    sizeEvent.SetEventObject(this);
+    wxAddWindowToTable( (Widget)m_workArea, this);
+    wxAddWindowToTable( (Widget)m_clientArea, this);
 
-    GetEventHandler()->ProcessEvent(sizeEvent);
+    wxModelessWindows.Append( this );
 
-    return TRUE;
+    return true;
 }
 
 wxFrame::~wxFrame()
 {
-    m_isBeingDeleted = TRUE;
+    SendDestroyEvent();
 
     if (m_clientArea)
     {
-      XtRemoveEventHandler((Widget) m_clientArea, ExposureMask, FALSE,
+      XtRemoveEventHandler((Widget) m_clientArea, ExposureMask, False,
           wxUniversalRepaintProc, (XtPointer) this);
-      XtRemoveEventHandler((Widget) m_clientArea, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask,
-          FALSE,
-          wxFrameEventHandler, (XtPointer) this);
-      wxDeleteWindowFromTable((Widget) m_clientArea);
     }
 
     if (GetMainWidget())
-        Show(FALSE);
+        Show(false);
 
     if (m_frameMenuBar)
     {
         m_frameMenuBar->DestroyMenuBar();
-
-        // Hack to stop core dump on Ultrix, OSF, for some strange reason.
-#if MOTIF_MENUBAR_DELETE_FIX
-        GetMenuBar()->SetMainWidget((WXWidget) NULL);
-#endif
-        delete m_frameMenuBar;
-        m_frameMenuBar = NULL;
+        wxDELETE(m_frameMenuBar);
     }
 
-    wxTopLevelWindows.DeleteObject(this);
-    wxModelessWindows.DeleteObject(this);
-
-    if (m_frameStatusBar)
-    {
-        delete m_frameStatusBar;
-        m_frameStatusBar = NULL;
-    }
+    wxDELETE(m_frameStatusBar);
 
-    DestroyChildren();
+    PreDestroy();
 
-    if (m_workArea)
-    {
-        wxDeleteWindowFromTable((Widget) m_workArea);
+    Widget frameShell = (Widget)GetShellWidget();
 
-        XtDestroyWidget ((Widget) m_workArea);
-    }
+    if( frameShell )
+        XtRemoveEventHandler( frameShell, StructureNotifyMask,
+                              False, (XtEventHandler)wxFrameMapProc,
+                              (XtPointer)this );
 
-    if (m_frameWidget)
+    if( m_clientArea )
     {
-        wxDeleteWindowFromTable((Widget) m_frameWidget);
-        XtDestroyWidget ((Widget) m_frameWidget);
+        wxDeleteWindowFromTable( (Widget)m_clientArea );
+        XtDestroyWidget( (Widget)m_clientArea );
     }
 
-    if (m_frameShell)
-        XtDestroyWidget ((Widget) m_frameShell);
-
-    SetMainWidget((WXWidget) NULL);
-
-    /* Check if it's the last top-level window */
-
-    if (wxTheApp && (wxTopLevelWindows.Number() == 0))
+    if( m_workArea )
     {
-        wxTheApp->SetTopWindow(NULL);
+        XtVaSetValues( (Widget)m_mainWidget,
+                       XmNworkWindow, (Widget)NULL,
+                       NULL );
 
-        if (wxTheApp->GetExitOnFrameDelete())
-        {
-            // Signal to the app that we're going to close
-            wxTheApp->ExitMainLoop();
-        }
+        wxDeleteWindowFromTable( (Widget)m_workArea );
+        XtDestroyWidget( (Widget)m_workArea );
     }
+
+    if( m_mainWidget )
+        XtDestroyWidget( (Widget)m_mainWidget );
+
+    if( frameShell )
+        XtDestroyWidget( frameShell );
 }
 
 // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc.
@@ -427,7 +312,7 @@ void wxFrame::DoGetClientSize(int *x, int *y) const
     {
         int sbw, sbh;
         m_frameStatusBar->GetSize(& sbw, & sbh);
-        yy -= sbh;
+        yy = (Dimension)(yy - sbh);
     }
 #if wxUSE_TOOLBAR
     if (m_frameToolBar)
@@ -435,38 +320,21 @@ void wxFrame::DoGetClientSize(int *x, int *y) const
         int tbw, tbh;
         m_frameToolBar->GetSize(& tbw, & tbh);
         if (m_frameToolBar->GetWindowStyleFlag() & wxTB_VERTICAL)
-            xx -= tbw;
+            xx = (Dimension)(xx - tbw);
         else
-            yy -= tbh;
+            yy = (Dimension)(yy - tbh);
     }
 #endif // wxUSE_TOOLBAR
-    /*
-    if (GetMenuBar() != (wxMenuBar*) NULL)
-    {
-    // it seems that if a frame holds a panel, the menu bar size
-    // gets automatically taken care of --- grano@cs.helsinki.fi 4.4.95
-    bool hasSubPanel = FALSE;
-    for(wxNode* node = GetChildren().First(); node; node = node->Next())
-    {
-    wxWindow *win = (wxWindow *)node->Data();
-    hasSubPanel = (win->IsKindOf(CLASSINFO(wxPanel)) && !win->IsKindOf(CLASSINFO(wxDialog)));
-
-      if (hasSubPanel)
-      break;
-      }
-      if (! hasSubPanel) {
-      Dimension ys;
-      XtVaGetValues((Widget) GetMenuBarWidget(), XmNheight, &ys, NULL);
-      yy -= ys;
-      }
-      }
-    */
-
-    *x = xx; *y = yy;
+
+//CE found a call here with NULL y pointer
+    if (x)
+        *x = xx;
+    if (y)
+        *y = yy;
 }
 
 // Set the client size (i.e. leave the calculation of borders etc.
-// to wxWindows)
+// to wxWidgets)
 void wxFrame::DoSetClientSize(int width, int height)
 {
     // Calculate how large the new main window should be
@@ -499,42 +367,27 @@ void wxFrame::DoSetClientSize(int width, int height)
     }
     PreResize();
 
-    wxSizeEvent sizeEvent(wxSize(width, height), GetId());
+    wxSize newSize(width, height);
+    wxSizeEvent sizeEvent(newSize, GetId());
     sizeEvent.SetEventObject(this);
 
-    GetEventHandler()->ProcessEvent(sizeEvent);
+    HandleWindowEvent(sizeEvent);
 
 }
 
 void wxFrame::DoGetSize(int *width, int *height) const
 {
+    if (!m_frameShell)
+    {
+        *width = -1; *height = -1;
+        return;
+    }
+
     Dimension xx, yy;
     XtVaGetValues((Widget) m_frameShell, XmNwidth, &xx, XmNheight, &yy, NULL);
     *width = xx; *height = yy;
 }
 
-void wxFrame::DoGetPosition(int *x, int *y) const
-{
-    Window parent_window = XtWindow((Widget) m_frameShell),
-        next_parent   = XtWindow((Widget) m_frameShell),
-        root          = RootWindowOfScreen(XtScreen((Widget) m_frameShell));
-
-    // search for the parent that is child of ROOT, because the WM may
-    // reparent twice and notify only the next parent (like FVWM)
-    while (next_parent != root) {
-        Window *theChildren; unsigned int n;
-        parent_window = next_parent;
-        XQueryTree(XtDisplay((Widget) m_frameShell), parent_window, &root,
-            &next_parent, &theChildren, &n);
-        XFree(theChildren); // not needed
-    }
-    int xx, yy; unsigned int dummy;
-    XGetGeometry(XtDisplay((Widget) m_frameShell), parent_window, &root,
-        &xx, &yy, &dummy, &dummy, &dummy, &dummy);
-    if (x) *x = xx;
-    if (y) *y = yy;
-}
-
 void wxFrame::DoSetSize(int x, int y, int width, int height, int WXUNUSED(sizeFlags))
 {
     if (x > -1)
@@ -542,104 +395,78 @@ void wxFrame::DoSetSize(int x, int y, int width, int height, int WXUNUSED(sizeFl
     if (y > -1)
         XtVaSetValues((Widget) m_frameShell, XmNy, y, NULL);
     if (width > -1)
-        XtVaSetValues((Widget) m_frameWidget, XmNwidth, width, NULL);
+        XtVaSetValues((Widget) m_mainWidget, XmNwidth, width, NULL);
     if (height > -1)
-        XtVaSetValues((Widget) m_frameWidget, XmNheight, height, NULL);
+        XtVaSetValues((Widget) m_mainWidget, XmNheight, height, NULL);
 
     if (!(height == -1 && width == -1))
     {
         PreResize();
-
-        wxSizeEvent sizeEvent(wxSize(width, height), GetId());
-        sizeEvent.SetEventObject(this);
-
-        GetEventHandler()->ProcessEvent(sizeEvent);
     }
 }
 
-bool wxFrame::Show(bool show)
+bool wxFrame::Show( bool show )
 {
-    if (!m_frameShell)
-        return wxWindow::Show(show);
-
-    m_visibleStatus = show; /* show-&-hide fix */
+    if( !wxWindowBase::Show( show ) )
+        return false;
 
     m_isShown = show;
-    if (show) {
-        XtMapWidget((Widget) m_frameShell);
-        XRaiseWindow(XtDisplay((Widget) m_frameShell), XtWindow((Widget) m_frameShell));
-    } else {
-        XtUnmapWidget((Widget) m_frameShell);
-        //    XmUpdateDisplay(wxTheApp->topLevel); // Experimental: may be responsible for crashes
-    }
-    return TRUE;
-}
 
-void wxFrame::Iconize(bool iconize)
-{
-    if (!iconize)
-        Show(TRUE);
-
-    if (m_frameShell)
-        XtVaSetValues((Widget) m_frameShell, XmNiconic, (Boolean)iconize, NULL);
-}
-
-void wxFrame::Restore()
-{
-    if ( m_frameShell )
-        XtVaSetValues((Widget) m_frameShell, XmNiconic, FALSE, NULL);
-}
+    Widget shell = (Widget)GetShellWidget();
+    if (!shell)
+        return wxWindow::Show(show);
 
-void wxFrame::Maximize(bool maximize)
-{
-    Show(TRUE);
+    SetVisibleStatus(show);
+    if (show)
+    {
+        XtPopup(shell, XtGrabNone);
+    }
+    else
+    {
+        XtPopdown(shell);
+    }
 
-    if ( maximize )
-        Restore();
+    return true;
 }
 
-bool wxFrame::IsIconized() const
+void wxFrame::SetTitle(const wxString& title)
 {
-    if (!m_frameShell)
-        return FALSE;
+    wxString oldTitle = GetTitle();
+    if( title == oldTitle )
+        return;
 
-    Boolean iconic;
-    XtVaGetValues((Widget) m_frameShell, XmNiconic, &iconic, NULL);
-    return iconic;
-}
+    wxTopLevelWindow::SetTitle( title );
 
-// Is it maximized?
-bool wxFrame::IsMaximized() const
-{
-    // No maximizing in Motif (?)
-    return FALSE;
+    if( !title.empty() )
+        XtVaSetValues( (Widget)m_frameShell,
+                       XmNtitle, (const char*)title.mb_str(),
+                       XmNiconName, (const char*)title.mb_str(),
+                       NULL );
 }
 
-void wxFrame::SetTitle(const wxString& title)
+void wxFrame::DoSetIcon(const wxIcon& icon)
 {
-    if (title == m_title)
+    if (!m_frameShell)
         return;
 
-    m_title = title;
+    if (!icon.IsOk() || !icon.GetDrawable())
+        return;
 
-    if (!title.IsNull())
-        XtVaSetValues((Widget) m_frameShell,
-        XmNtitle, title.c_str(),
-        XmNiconName, title.c_str(),
-        NULL);
+    XtVaSetValues((Widget) m_frameShell,
+                  XtNiconPixmap, icon.GetDrawable(),
+                  NULL);
 }
 
-void wxFrame::SetIcon(const wxIcon& icon)
+void wxFrame::SetIcons(const wxIconBundle& icons)
 {
-    m_icon = icon;
+    wxFrameBase::SetIcons( icons );
 
     if (!m_frameShell)
         return;
 
-    if (!icon.Ok() || !icon.GetPixmap())
-        return;
-
-    XtVaSetValues((Widget) m_frameShell, XtNiconPixmap, icon.GetPixmap(), NULL);
+    DoSetIcon( m_icons.GetIcon( -1 ) );
+    wxSetIconsX11(GetXDisplay(),
+                  (WXWindow) XtWindow( (Widget) m_frameShell ), icons);
 }
 
 void wxFrame::PositionStatusBar()
@@ -674,7 +501,7 @@ void wxFrame::SetMenuBar(wxMenuBar *menuBar)
     }
 
     // Currently can't set it twice
-    //    wxASSERT_MSG( (m_frameMenuBar == (wxMenuBar*) NULL), "Cannot set the menubar more than once");
+    //    wxASSERT_MSG( (m_frameMenuBar == NULL), "Cannot set the menubar more than once");
 
     if (m_frameMenuBar)
     {
@@ -689,14 +516,14 @@ void wxFrame::SetMenuBar(wxMenuBar *menuBar)
 // Responds to colour changes, and passes event on to children.
 void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event)
 {
-    SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE));
+    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE));
     Refresh();
 
     if ( m_frameStatusBar )
     {
         wxSysColourChangedEvent event2;
         event2.SetEventObject( m_frameStatusBar );
-        m_frameStatusBar->ProcessEvent(event2);
+        m_frameStatusBar->HandleWindowEvent(event2);
     }
 
     // Propagate the event to the non-top-level children
@@ -710,12 +537,12 @@ void wxFrame::OnActivate(wxActivateEvent& event)
     if (!event.GetActive())
         return;
 
-    for(wxNode *node = GetChildren().First(); node; node = node->Next())
+    for(wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node;
+        node = node->GetNext())
     {
         // Find a child that's a subwindow, but not a dialog box.
-        wxWindow *child = (wxWindow *)node->Data();
-        if (!child->IsKindOf(CLASSINFO(wxFrame)) &&
-            !child->IsKindOf(CLASSINFO(wxDialog)))
+        wxWindow *child = node->GetData();
+        if (!child->IsTopLevel())
         {
             child->SetFocus();
             return;
@@ -737,99 +564,40 @@ wxToolBar* wxFrame::CreateToolBar(long style,
     return m_frameToolBar;
 }
 
+void wxFrame::SetToolBar(wxToolBar *toolbar)
+{
+    wxFrameBase::SetToolBar(toolbar);
+    SendSizeEvent();
+}
+
 void wxFrame::PositionToolBar()
 {
-    if (GetToolBar())
+    wxToolBar* tb = GetToolBar();
+    if (tb)
     {
         int cw, ch;
         GetClientSize(& cw, &ch);
 
         int tw, th;
-        GetToolBar()->GetSize(& tw, & th);
+        tb->GetSize(& tw, & th);
 
-        if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL)
+        if (tb->GetWindowStyleFlag() & wxTB_VERTICAL)
         {
             // Use the 'real' position. wxSIZE_NO_ADJUSTMENTS
             // means, pretend we don't have toolbar/status bar, so we
             // have the original client size.
-            GetToolBar()->SetSize(0, 0, tw, ch + th, wxSIZE_NO_ADJUSTMENTS);
+            th = ch + th;
         }
         else
         {
             // Use the 'real' position
-            GetToolBar()->SetSize(0, 0, cw, th, wxSIZE_NO_ADJUSTMENTS);
+            tw = cw;
         }
-    }
-}
-#endif // wxUSE_TOOLBAR
-
-void wxFrame::Raise()
-{
-    Window parent_window = XtWindow((Widget) m_frameShell),
-        next_parent   = XtWindow((Widget) m_frameShell),
-        root          = RootWindowOfScreen(XtScreen((Widget) m_frameShell));
-    // search for the parent that is child of ROOT, because the WM may
-    // reparent twice and notify only the next parent (like FVWM)
-    while (next_parent != root) {
-        Window *theChildren; unsigned int n;
-        parent_window = next_parent;
-        XQueryTree(XtDisplay((Widget) m_frameShell), parent_window, &root,
-            &next_parent, &theChildren, &n);
-        XFree(theChildren); // not needed
-    }
-    XRaiseWindow(XtDisplay((Widget) m_frameShell), parent_window);
-}
-
-void wxFrame::Lower()
-{
-    Window parent_window = XtWindow((Widget) m_frameShell),
-        next_parent   = XtWindow((Widget) m_frameShell),
-        root          = RootWindowOfScreen(XtScreen((Widget) m_frameShell));
-    // search for the parent that is child of ROOT, because the WM may
-    // reparent twice and notify only the next parent (like FVWM)
-    while (next_parent != root) {
-        Window *theChildren; unsigned int n;
-        parent_window = next_parent;
-        XQueryTree(XtDisplay((Widget) m_frameShell), parent_window, &root,
-            &next_parent, &theChildren, &n);
-        XFree(theChildren); // not needed
-    }
-    XLowerWindow(XtDisplay((Widget) m_frameShell), parent_window);
-}
-
-void wxFrameFocusProc(Widget WXUNUSED(workArea), XtPointer WXUNUSED(clientData),
-                      XmAnyCallbackStruct *WXUNUSED(cbs))
-{
-    // wxDebugMsg("focus proc from frame %ld\n",(long)frame);
-    // TODO
-    // wxFrame *frame = (wxFrame *)clientData;
-    // frame->GetEventHandler()->OnSetFocus();
-}
-
-/* MATTEW: Used to insure that hide-&-show within an event cycle works */
-static void wxFrameMapProc(Widget frameShell, XtPointer clientData,
-                           XCrossingEvent * event)
-{
-    wxFrame *frame = (wxFrame *)wxGetWindowFromTable((Widget)clientData);
-
-    if (frame) {
-        XEvent *e = (XEvent *)event;
 
-        if (e->xany.type == MapNotify)
-        {
-            // Iconize fix
-            XtVaSetValues(frameShell, XmNiconic, (Boolean)False, NULL);
-            if (!frame->GetVisibleStatus())
-            {
-                /* We really wanted this to be hidden! */
-                XtUnmapWidget((Widget) frame->GetShellWidget());
-            }
-        }
-        else if (e->xany.type == UnmapNotify)
-            // Iconize fix
-            XtVaSetValues(frameShell, XmNiconic, (Boolean)True, NULL);
+        tb->SetSize(0, 0, -1, -1, wxSIZE_NO_ADJUSTMENTS);
     }
 }
+#endif // wxUSE_TOOLBAR
 
 //// Motif-specific
 bool wxFrame::PreResize()
@@ -842,7 +610,7 @@ bool wxFrame::PreResize()
     PositionStatusBar();
 #endif // wxUSE_STATUSBAR
 
-    return TRUE;
+    return true;
 }
 
 WXWidget wxFrame::GetClientWidget() const
@@ -858,73 +626,34 @@ void wxFrame::ChangeFont(bool WXUNUSED(keepOriginalSize))
 void wxFrame::ChangeBackgroundColour()
 {
     if (GetClientWidget())
-        DoChangeBackgroundColour(GetClientWidget(), m_backgroundColour);
+        wxDoChangeBackgroundColour(GetClientWidget(), m_backgroundColour);
 }
 
 void wxFrame::ChangeForegroundColour()
 {
     if (GetClientWidget())
-        DoChangeForegroundColour(GetClientWidget(), m_foregroundColour);
+        wxDoChangeForegroundColour(GetClientWidget(), m_foregroundColour);
 }
 
-void wxCloseFrameCallback(Widget WXUNUSED(widget), XtPointer client_data, XmAnyCallbackStruct *WXUNUSED(cbs))
+/* MATTEW: Used to insure that hide-&-show within an event cycle works */
+static void wxFrameMapProc( Widget frameShell, XtPointer clientData,
+                            XCrossingEvent* event )
 {
-    wxFrame *frame = (wxFrame *)client_data;
-
-    wxCloseEvent closeEvent(wxEVT_CLOSE_WINDOW, frame->GetId());
-    closeEvent.SetEventObject(frame);
+    wxFrame *tli = (wxFrame*)clientData;
 
-    // May delete the frame (with delayed deletion)
-    frame->GetEventHandler()->ProcessEvent(closeEvent);
-}
+    XEvent *e = (XEvent *)event;
 
-static void wxFrameEventHandler(Widget    wid,
-                             XtPointer WXUNUSED(client_data),
-                             XEvent*   event,
-                             Boolean*  continueToDispatch)
-{
-    wxFrame *frame = (wxFrame *)wxGetWindowFromTable(wid);
-    if (frame)
+    if( e->xany.type == MapNotify )
     {
-        wxMouseEvent wxevent(wxEVT_NULL);
-        if (wxTranslateMouseEvent(wxevent, frame, wid, event))
-        {
-            wxevent.SetEventObject(frame);
-            wxevent.SetId(frame->GetId());
-            frame->GetEventHandler()->ProcessEvent(wxevent);
-        }
-        else
+        // Iconize fix
+        XtVaSetValues( frameShell, XmNiconic, (Boolean)False, NULL );
+        if( !tli->GetVisibleStatus() )
         {
-            // An attempt to implement OnCharHook by calling OnCharHook first;
-            // if this returns TRUE, set continueToDispatch to False
-            // (don't continue processing).
-            // Otherwise set it to True and call OnChar.
-            wxKeyEvent keyEvent(wxEVT_CHAR);
-            if (wxTranslateKeyEvent(keyEvent, frame, wid, event))
-            {
-                keyEvent.SetEventObject(frame);
-                keyEvent.SetId(frame->GetId());
-                keyEvent.SetEventType(wxEVT_CHAR_HOOK);
-                if (frame->GetEventHandler()->ProcessEvent(keyEvent))
-                {
-                    *continueToDispatch = False;
-                    return;
-                }
-                else
-                {
-                    // For simplicity, OnKeyDown is the same as OnChar
-                    // TODO: filter modifier key presses from OnChar
-                    keyEvent.SetEventType(wxEVT_KEY_DOWN);
-
-                    // Only process OnChar if OnKeyDown didn't swallow it
-                    if (!frame->GetEventHandler()->ProcessEvent (keyEvent))
-                    {
-                        keyEvent.SetEventType(wxEVT_CHAR);
-                        frame->GetEventHandler()->ProcessEvent(keyEvent);
-                    }
-                }
-            }
+            /* We really wanted this to be hidden! */
+            XtUnmapWidget( frameShell );
         }
     }
-    *continueToDispatch = True;
+    else if( e->xany.type == UnmapNotify )
+        // Iconize fix
+        XtVaSetValues( frameShell, XmNiconic, (Boolean)True, NULL );
 }