]> git.saurik.com Git - wxWidgets.git/commitdiff
Implemented wxToplevelWindowMotif.
authorMattia Barbon <mbarbon@cpan.org>
Mon, 6 Jan 2003 16:36:23 +0000 (16:36 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Mon, 6 Jan 2003 16:36:23 +0000 (16:36 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18600 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

distrib/msw/tmake/filelist.txt
include/wx/generic/tabg.h
include/wx/motif/dialog.h
include/wx/motif/frame.h
include/wx/toplevel.h
src/motif/dialog.cpp
src/motif/files.lst
src/motif/frame.cpp
src/motif/mdi.cpp

index f1c9d4014e8fcd462c7137db97eee3c99e7449fc..c91b811b0ce84d84393c16c7762ad4d534df6245 100644 (file)
@@ -614,6 +614,7 @@ stattext.cpp        Motif
 toolbar.cpp    Motif
 textctrl.cpp   Motif
 timer.cpp      Motif
+toplevel.cpp   Motif
 utils.cpp      Motif
 window.cpp     Motif
 
@@ -1197,6 +1198,7 @@ stattext.h        MotifH
 textctrl.h     MotifH
 timer.h        MotifH
 toolbar.h      MotifH
+toplevel.h     MotifH
 window.h       MotifH
 
 app.h  X11H
index b71a4e902b59a5d5330b9e7e34444933fd0888bd..0d1bc89a0905ef57397eba80591307970942320a 100644 (file)
@@ -21,6 +21,7 @@
 #include "wx/hash.h"
 #include "wx/string.h"
 #include "wx/dialog.h"
+#include "wx/panel.h"
 
 class WXDLLEXPORT wxTabView;
 
index bdfd0a056d552be8d4a58412e3c30cec8aac5f73..9cc136d524b7f9944fb2760ebecae2a0d35d37a3 100644 (file)
@@ -25,7 +25,8 @@ class WXDLLEXPORT wxDialog : public wxDialogBase
         
 public:
     wxDialog();
-    
+
+#if WXWIN_COMPATIBILITY_2
     // Constructor with a modal flag, but no window id - the old convention
     wxDialog(wxWindow *parent,
         const wxString& title, bool modal,
@@ -36,7 +37,8 @@ public:
         long modalStyle = modal ? wxDIALOG_MODAL : wxDIALOG_MODELESS ;
         Create(parent, -1, title, wxPoint(x, y), wxSize(width, height), style|modalStyle, name);
     }
-    
+#endif
+
     // Constructor with no modal flag - the new convention.
     wxDialog(wxWindow *parent, wxWindowID id,
         const wxString& title,
@@ -58,18 +60,10 @@ public:
     ~wxDialog();
     
     virtual bool Destroy();
-    
-    bool Show(bool show);
-    void Iconize(bool iconize);
-    void Raise();
-    void Lower();
-    
-    virtual bool IsIconized() const;
-    
-    virtual bool IsTopLevel() const { return TRUE; }
-    
+
+    virtual bool Show(bool show = TRUE);
+
     void SetTitle(const wxString& title);
-    wxString GetTitle() const ;
     
     void SetModal(bool flag);
     
@@ -91,8 +85,6 @@ public:
     void OnApply(wxCommandEvent& event);
     void OnCancel(wxCommandEvent& event);
     
-    void OnPaint(wxPaintEvent &event);
-    
     // Responds to colour changes
     void OnSysColourChanged(wxSysColourChangedEvent& event);
     
@@ -100,14 +92,18 @@ public:
     void OnCharHook(wxKeyEvent& event);
     void OnCloseWindow(wxCloseEvent& event);
     
-    // Responds to size changes
-    void OnSize(wxSizeEvent& event);
-    
-public:
+private:
+    virtual bool DoCreate( wxWindow* parent, wxWindowID id,
+                           const wxString& title,
+                           const wxPoint& pos,
+                           const wxSize& size,
+                           long style,
+                           const wxString& name );
+    virtual void DoDestroy();
+
     //// Motif-specific
     bool          m_modalShowing;
-    wxString      m_dialogTitle;
-    
+
 protected:
     virtual void DoSetSize(int x, int y,
         int width, int height,
index 638e8da237d55919ed1e8e2aaee0c24c92a13165..dcc4bd221f136b38c357ed28c4e35e5992d33a5e 100644 (file)
@@ -42,15 +42,14 @@ public:
         const wxString& name = wxFrameNameStr);
     
     virtual ~wxFrame();
-    
+
     virtual bool Show(bool show = TRUE);
-    
+
     // Set menu bar
     void SetMenuBar(wxMenuBar *menu_bar);
     
     // Set title
     void SetTitle(const wxString& title);
-    wxString GetTitle() const { return m_title; }
     
     // Set icon
     virtual void SetIcon(const wxIcon& icon);
@@ -66,22 +65,6 @@ public:
     virtual void PositionToolBar();
 #endif // wxUSE_TOOLBAR
     
-    // Iconize
-    virtual void Iconize(bool iconize);
-    
-    virtual bool IsIconized() const;
-    
-    // Is the frame maximized? Returns FALSE under Motif (but TRUE for
-    // wxMDIChildFrame due to the tabbed implementation).
-    virtual bool IsMaximized() const;
-    
-    virtual void Maximize(bool maximize);
-    
-    virtual void Raise();
-    virtual void Lower();
-    
-    virtual void Restore();
-    
     // Implementation only from now on
     // -------------------------------
     
@@ -97,15 +80,18 @@ public:
     WXWidget GetClientAreaWidget() const { return m_clientArea; }
     WXWidget GetTopWidget() const { return m_frameShell; }
     
-    virtual WXWidget GetMainWidget() const { return m_frameWidget; }
+    virtual WXWidget GetMainWidget() const { return m_mainWidget; }
     
     // The widget that can have children on it
     WXWidget GetClientWidget() const;
     bool GetVisibleStatus() const { return m_visibleStatus; }
-    
+    void SetVisibleStatus( bool status ) { m_visibleStatus = status; }
+
     bool PreResize();
-    
-protected:
+
+    // for generic/mdig.h
+    virtual void DoGetClientSize(int *width, int *height) const;    
+private:
     // common part of all ctors
     void Init();
 
@@ -114,14 +100,11 @@ protected:
 
     //// Motif-specific
     WXWidget              m_frameShell;
-    WXWidget              m_frameWidget;
     WXWidget              m_workArea;
     WXWidget              m_clientArea;
-    wxString              m_title;
     bool                  m_visibleStatus;
     bool                  m_iconized;
     
-    virtual void DoGetClientSize(int *width, int *height) const;
     virtual void DoGetSize(int *width, int *height) const;
     virtual void DoGetPosition(int *x, int *y) const;
     virtual void DoSetSize(int x, int y,
@@ -130,8 +113,16 @@ protected:
     virtual void DoSetClientSize(int width, int height);
     
 private:
+    virtual bool DoCreate( wxWindow* parent, wxWindowID id,
+                           const wxString& title,
+                           const wxPoint& pos,
+                           const wxSize& size,
+                           long style,
+                           const wxString& name );
+    virtual void DoDestroy();
+
     DECLARE_EVENT_TABLE()
-        DECLARE_DYNAMIC_CLASS(wxFrame)
+    DECLARE_DYNAMIC_CLASS(wxFrame)
 };
 
 #endif
index d7a8fddd7af904cf0efa0d47ce447223cc076d98..c5ada5c6de05b1c676181cffbb9687107590d7bf 100644 (file)
@@ -173,6 +173,9 @@ protected:
 #elif defined(__WXPM__)
     #include "wx/os2/toplevel.h"
     #define wxTopLevelWindowNative wxTopLevelWindowOS2
+#elif defined(__WXMOTIF__)
+    #include "wx/motif/toplevel.h"
+    #define wxTopLevelWindowNative wxTopLevelWindowMotif
 #endif
 
 #ifdef __WXUNIVERSAL__
index 19a321cc023f3e6d532be0ed384c88f3a3ce7a10..bb4a45ea2ff1e3d739c5016a4346b9272fe78561 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "wx/dialog.h"
 #include "wx/utils.h"
-#include "wx/frame.h"
 #include "wx/app.h"
 #include "wx/settings.h"
 
 
 #include "wx/motif/private.h"
 
-static void wxCloseDialogCallback(Widget widget, XtPointer client_data, XmAnyCallbackStruct *cbs);
-static void wxDialogBoxEventHandler (Widget    wid,
-                                     XtPointer client_data,
-                                     XEvent*   event,
-                                     Boolean *continueToDispatch);
-
-static void wxUnmapBulletinBoard(Widget dialog, wxDialog *client,XtPointer call);
-
 // A stack of modal_showing flags, since we can't rely
 // on accessing wxDialog::m_modalShowing within
 // wxDialog::Show in case a callback has deleted the wxDialog.
@@ -70,15 +61,14 @@ static wxList wxModalShowingStack;
 // Lists to keep track of windows, so we can disable/enable them
 // for modal dialogs
 wxList wxModalDialogs;
-wxList wxModelessWindows;  // Frames and modeless dialogs
+extern wxList wxModelessWindows;  // Frames and modeless dialogs
 extern wxList wxPendingDelete;
 
 #define wxUSE_INVISIBLE_RESIZE 1
 
-IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxPanel)
+IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow)
 
-BEGIN_EVENT_TABLE(wxDialog, wxPanel)
-  EVT_SIZE(wxDialog::OnSize)
+BEGIN_EVENT_TABLE(wxDialog, wxTopLevelWindow)
   EVT_BUTTON(wxID_OK, wxDialog::OnOK)
   EVT_BUTTON(wxID_APPLY, wxDialog::OnApply)
   EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
@@ -101,86 +91,26 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
                       long style,
                       const wxString& name)
 {
-    m_windowStyle = style;
+    SetExtraStyle(GetExtraStyle() | wxTOPLEVEL_EX_DIALOG);
+
+    if( !wxTopLevelWindow::Create( parent, id, title, pos, size, style,
+                                   name ) )
+        return FALSE;
+
     m_modalShowing = FALSE;
-    m_dialogTitle = title;
 
     m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
     m_foregroundColour = *wxBLACK;
 
-    SetName(name);
-
-    if (!parent)
-        wxTopLevelWindows.Append(this);
-
-    if (parent) parent->AddChild(this);
-
-    if ( id == -1 )
-        m_windowId = (int)NewControlId();
-    else
-        m_windowId = id;
-
-    Widget parentWidget = (Widget) 0;
-    if (parent)
-        parentWidget = (Widget) parent->GetTopWidget();
-    if (!parent)
-        parentWidget = (Widget) wxTheApp->GetTopLevelWidget();
-
-    wxASSERT_MSG( (parentWidget != (Widget) 0), "Could not find a suitable parent shell for dialog." );
-
-    Arg args[2];
-    XtSetArg (args[0], XmNdefaultPosition, False);
-    XtSetArg (args[1], XmNautoUnmanage, False);
-    Widget dialogShell = XmCreateBulletinBoardDialog(parentWidget, (char*) (const char*) name, args, 2);
-    m_mainWidget = (WXWidget) dialogShell;
-
-    // We don't want margins, since there is enough elsewhere.
-    XtVaSetValues(dialogShell,
-        XmNmarginHeight,   0,
-        XmNmarginWidth,    0,
-        XmNresizePolicy, XmRESIZE_NONE,
-        NULL) ;
-
+    Widget dialogShell = (Widget) m_mainWidget;
     Widget shell = XtParent(dialogShell) ;
-    if (!title.IsNull())
-    {
-        XmString str = XmStringCreateSimple((char*) (const char*)title);
-        XtVaSetValues(dialogShell,
-            XmNdialogTitle, str,
-            NULL);
-        XmStringFree(str);
-    }
+
+    SetTitle( title );
 
     m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
     ChangeFont(FALSE);
 
-    wxAddWindowToTable(dialogShell, this);
-
-    // Intercept CLOSE messages from the window manager
-    Atom WM_DELETE_WINDOW = XmInternAtom(XtDisplay(shell), "WM_DELETE_WINDOW", False);
-
-    /* Remove and add WM_DELETE_WINDOW so ours is only handler */
-    /* Why do we have to do this for wxDialog, but not wxFrame? */
-    XmRemoveWMProtocols(shell, &WM_DELETE_WINDOW, 1);
-    XmAddWMProtocols(shell, &WM_DELETE_WINDOW, 1);
-    XmActivateWMProtocol(shell, WM_DELETE_WINDOW);
-
-    // Modified Steve Hammes for Motif 2.0
-#if (XmREVISION > 1 || XmVERSION > 1)
-    XmAddWMProtocolCallback(shell, WM_DELETE_WINDOW, (XtCallbackProc) wxCloseDialogCallback, (XtPointer)this);
-#elif XmREVISION == 1
-    XmAddWMProtocolCallback(shell, WM_DELETE_WINDOW, (XtCallbackProc) wxCloseDialogCallback, (caddr_t)this);
-#else
-    XmAddWMProtocolCallback(shell, WM_DELETE_WINDOW, (void (*)())wxCloseDialogCallback, (caddr_t)this);
-#endif
-
-    XtTranslations ptr ;
-    XtOverrideTranslations(dialogShell,
-        ptr = XtParseTranslationTable("<Configure>: resize()"));
-    XtFree((char *)ptr);
-
     // Can't remember what this was about... but I think it's necessary.
-
     if (wxUSE_INVISIBLE_RESIZE)
     {
         if (pos.x > -1)
@@ -196,40 +126,6 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
             XtVaSetValues(dialogShell, XmNheight, size.y, NULL);
     }
 
-    // This patch come from Torsten Liermann lier@lier1.muc.de
-    if (XmIsMotifWMRunning(shell))
-    {
-        int decor = 0 ;
-        if (m_windowStyle & wxRESIZE_BORDER)
-            decor |= MWM_DECOR_RESIZEH ;
-        if (m_windowStyle & wxSYSTEM_MENU)
-            decor |= MWM_DECOR_MENU;
-        if ((m_windowStyle & wxCAPTION) ||
-            (m_windowStyle & wxTINY_CAPTION_HORIZ) ||
-            (m_windowStyle & wxTINY_CAPTION_VERT))
-            decor |= MWM_DECOR_TITLE;
-        if (m_windowStyle & wxTHICK_FRAME)
-            decor |= MWM_DECOR_BORDER;
-        if (m_windowStyle & wxMINIMIZE_BOX)
-            decor |= MWM_DECOR_MINIMIZE;
-        if (m_windowStyle & wxMAXIMIZE_BOX)
-            decor |= MWM_DECOR_MAXIMIZE;
-
-        XtVaSetValues(shell,XmNmwmDecorations,decor,NULL) ;
-    }
-    // This allows non-Motif window managers to support at least the
-    // no-decorations case.
-    else
-    {
-        if ((m_windowStyle & wxCAPTION) != wxCAPTION)
-            XtVaSetValues((Widget) shell,XmNoverrideRedirect,TRUE,NULL);
-    }
-
-    XtRealizeWidget(dialogShell);
-
-    XtAddCallback(dialogShell,XmNunmapCallback,
-        (XtCallbackProc)wxUnmapBulletinBoard,this) ;
-
     // Positioning of the dialog doesn't work properly unless the dialog
     // is managed, so we manage without mapping to the screen.
     // To show, we map the shell (actually it's parent).
@@ -244,17 +140,54 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
     XtAddEventHandler(dialogShell,ExposureMask,FALSE,
         wxUniversalRepaintProc, (XtPointer) this);
 
-    XtAddEventHandler(dialogShell,
-        ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask,
-        FALSE,
-        wxDialogBoxEventHandler,
-        (XtPointer)this);
-
     ChangeBackgroundColour();
 
     return TRUE;
 }
 
+bool wxDialog::DoCreate( wxWindow* parent, wxWindowID id,
+                         const wxString& title,
+                         const wxPoint& pos,
+                         const wxSize& size,
+                         long style,
+                         const wxString& name )
+{
+    Widget parentWidget = (Widget) 0;
+    if( parent )
+        parentWidget = (Widget) parent->GetTopWidget();
+    if( !parent )
+        parentWidget = (Widget) wxTheApp->GetTopLevelWidget();
+
+    wxASSERT_MSG( (parentWidget != (Widget) 0),
+                  "Could not find a suitable parent shell for dialog." );
+
+    Arg args[2];
+    XtSetArg (args[0], XmNdefaultPosition, False);
+    XtSetArg (args[1], XmNautoUnmanage, False);
+    Widget dialogShell =
+        XmCreateBulletinBoardDialog( parentWidget, (char*)name.c_str(),
+                                     args, 2);
+    m_mainWidget = (WXWidget) dialogShell;
+
+    // We don't want margins, since there is enough elsewhere.
+    XtVaSetValues( dialogShell,
+                   XmNmarginHeight,   0,
+                   XmNmarginWidth,    0,
+                   XmNresizePolicy, XmRESIZE_NONE,
+                   NULL ) ;
+
+    XtTranslations ptr ;
+    XtOverrideTranslations(dialogShell,
+        ptr = XtParseTranslationTable("<Configure>: resize()"));
+    XtFree((char *)ptr);
+
+    XtRealizeWidget(dialogShell);
+
+    wxAddWindowToTable( (Widget)m_mainWidget, this );
+
+    return TRUE;
+}
+
 void wxDialog::SetModal(bool flag)
 {
     if ( flag )
@@ -271,46 +204,26 @@ void wxDialog::SetModal(bool flag)
 wxDialog::~wxDialog()
 {
     m_isBeingDeleted = TRUE;
-    
+
     if (m_mainWidget)
-      XtRemoveEventHandler((Widget) m_mainWidget, ExposureMask, FALSE,
-          wxUniversalRepaintProc, (XtPointer) this);
+    {
+        XtRemoveEventHandler((Widget) m_mainWidget, ExposureMask, FALSE,
+                             wxUniversalRepaintProc, (XtPointer) this);
+    }
 
     m_modalShowing = FALSE;
     if (!wxUSE_INVISIBLE_RESIZE && m_mainWidget)
     {
         XtUnmapWidget((Widget) m_mainWidget);
     }
+}
 
-    wxTopLevelWindows.DeleteObject(this);
-
-    if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
-        wxModelessWindows.DeleteObject(this);
-
-    // If this is the last top-level window, exit.
-    if (wxTheApp && (wxTopLevelWindows.Number() == 0))
-    {
-        wxTheApp->SetTopWindow(NULL);
-
-        if (wxTheApp->GetExitOnFrameDelete())
-        {
-            wxTheApp->ExitMainLoop();
-        }
-    }
-
-    // This event-flushing code used to be in wxWindow::PostDestroyChildren (wx_dialog.cpp)
-    // but I think this should work, if we destroy the children first.
-    // Note that this might need to be done for wxFrame also.
-    DestroyChildren();
-
-    // The idea about doing it here is that if you have to remove the
-    // XtDestroyWidget from ~wxWindow, at least top-level windows
-    // will still be deleted (and destroy children implicitly).
-    if (GetMainWidget())
+void wxDialog::DoDestroy()
+{
+    if( m_mainWidget )
     {
-      DetachWidget(GetMainWidget()); // Removes event handlers
-      XtDestroyWidget((Widget) GetMainWidget());
-      SetMainWidget((WXWidget) NULL);
+        wxDeleteWindowFromTable( (Widget)m_mainWidget );
+        XtDestroyWidget( (Widget)m_mainWidget );
     }
 }
 
@@ -331,63 +244,6 @@ void wxDialog::OnCharHook(wxKeyEvent& event)
     event.Skip();
 }
 
-void wxDialog::Iconize(bool WXUNUSED(iconize))
-{
-    // Can't iconize a dialog in Motif, apparently
-    // TODO: try using the parent of m_mainShell.
-    //  XtVaSetValues((Widget) m_mainWidget, XmNiconic, iconize, NULL);
-}
-
-// Default resizing behaviour - if only ONE subwindow,
-// resize to client rectangle size
-void wxDialog::OnSize(wxSizeEvent& WXUNUSED(event))
-{
-    // if we're using constraints - do use them
-#if wxUSE_CONSTRAINTS
-    if ( GetAutoLayout() ) {
-        Layout();
-        return;
-    }
-#endif
-
-    // do we have _exactly_ one child?
-    wxWindow *child = NULL;
-    for ( wxNode *node = GetChildren().First(); node; node = node->Next() )
-    {
-        wxWindow *win = (wxWindow *)node->Data();
-        if ( !win->IsKindOf(CLASSINFO(wxFrame))  &&
-            !win->IsKindOf(CLASSINFO(wxDialog))  )
-        {
-            if ( child )
-                return;     // it's our second subwindow - nothing to do
-            child = win;
-        }
-    }
-
-    if ( child ) {
-        // we have exactly one child - set it's size to fill the whole frame
-        int clientW, clientH;
-        GetClientSize(&clientW, &clientH);
-
-        int x = 0;
-        int y = 0;
-
-        child->SetSize(x, y, clientW, clientH);
-    }
-}
-
-
-bool wxDialog::IsIconized() const
-{
-/*
-Boolean iconic;
-XtVaGetValues((Widget) m_mainWidget, XmNiconic, &iconic, NULL);
-
-  return iconic;
-    */
-    return FALSE;
-}
-
 void wxDialog::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
     XtVaSetValues((Widget) m_mainWidget, XmNresizePolicy, XmRESIZE_ANY, NULL);
@@ -402,60 +258,24 @@ void wxDialog::DoSetClientSize(int width, int height)
 
 void wxDialog::SetTitle(const wxString& title)
 {
-    m_dialogTitle = title;
-    if (!title.IsNull())
-    {
-        XmString str = XmStringCreateSimple((char*) (const char*) title);
-        XtVaSetValues((Widget) m_mainWidget,
-            XmNtitle, (char*) (const char*) title,
-            XmNdialogTitle, str, // Roberto Cocchi
-            XmNiconName, (char*) (const char*) title,
-            NULL);
-        XmStringFree(str);
-    }
-}
+    wxTopLevelWindow::SetTitle( title );
 
-wxString wxDialog::GetTitle() const
-{
-    return m_dialogTitle;
-}
-
-void wxDialog::Raise()
-{
-    Window parent_window = XtWindow((Widget) m_mainWidget),
-        next_parent   = XtWindow((Widget) m_mainWidget),
-        root          = RootWindowOfScreen(XtScreen((Widget) m_mainWidget));
-    // 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_mainWidget), parent_window, &root,
-            &next_parent, &theChildren, &n);
-        XFree(theChildren); // not needed
+    if( !title.empty() )
+    {
+        wxXmString str( title );
+        XtVaSetValues( (Widget)m_mainWidget,
+                       XmNtitle, title.c_str(),
+                       XmNdialogTitle, str(), // Roberto Cocchi
+                       XmNiconName, title.c_str(),
+                       NULL );
     }
-    XRaiseWindow(XtDisplay((Widget) m_mainWidget), parent_window);
 }
 
-void wxDialog::Lower()
+bool wxDialog::Show( bool show )
 {
-    Window parent_window = XtWindow((Widget) m_mainWidget),
-        next_parent   = XtWindow((Widget) m_mainWidget),
-        root          = RootWindowOfScreen(XtScreen((Widget) m_mainWidget));
-    // 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_mainWidget), parent_window, &root,
-            &next_parent, &theChildren, &n);
-        XFree(theChildren); // not needed
-    }
-    XLowerWindow(XtDisplay((Widget) m_mainWidget), parent_window);
-}
+    if( !wxTopLevelWindowMotif::Show( show ) )
+        return FALSE;
 
-bool wxDialog::Show(bool show)
-{
     m_isShown = show;
 
     if (show)
@@ -463,9 +283,10 @@ bool wxDialog::Show(bool show)
         if (!wxUSE_INVISIBLE_RESIZE)
             XtMapWidget(XtParent((Widget) m_mainWidget));
         else
-            XtManageChild((Widget) m_mainWidget) ;
+            XtManageChild((Widget)m_mainWidget) ;
 
-        XRaiseWindow(XtDisplay((Widget) m_mainWidget), XtWindow((Widget) m_mainWidget));
+        XRaiseWindow( XtDisplay( (Widget)m_mainWidget ), 
+                      XtWindow( (Widget)m_mainWidget) );
 
     }
     else
@@ -473,7 +294,7 @@ bool wxDialog::Show(bool show)
         if (!wxUSE_INVISIBLE_RESIZE)
             XtUnmapWidget(XtParent((Widget) m_mainWidget));
         else
-            XtUnmanageChild((Widget) m_mainWidget) ;
+            XtUnmanageChild((Widget)m_mainWidget) ;
 
         XFlush(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()));
         XSync(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()), FALSE);
@@ -531,7 +352,8 @@ int wxDialog::ShowModal()
     XSync(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()), FALSE);
     while (XtAppPending((XtAppContext) wxTheApp->GetAppContext()))
     {
-        XFlush(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()));
+        // MBN: is this necessary? why?
+        // XFlush(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()));
         XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
 
         wxTheApp->ProcessXEvent((WXEvent*) &event);
@@ -624,11 +446,6 @@ void wxDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
     closing.DeleteObject(this);
 }
 
-void wxDialog::OnPaint(wxPaintEvent &WXUNUSED(event))
-{
-  // added for compatiblity only
-}
-
 // Destroy the window (delayed, if a managed window)
 bool wxDialog::Destroy()
 {
@@ -643,78 +460,6 @@ void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event))
     Refresh();
 }
 
-// Handle a close event from the window manager
-static void wxCloseDialogCallback( Widget WXUNUSED(widget), XtPointer client_data,
-                                  XmAnyCallbackStruct *WXUNUSED(cbs))
-{
-    wxDialog *dialog = (wxDialog *)client_data;
-    wxCloseEvent closeEvent(wxEVT_CLOSE_WINDOW, dialog->GetId());
-    closeEvent.SetEventObject(dialog);
-
-    // May delete the dialog (with delayed deletion)
-    dialog->GetEventHandler()->ProcessEvent(closeEvent);
-}
-
-void wxDialogBoxEventHandler(Widget    wid,
-                             XtPointer WXUNUSED(client_data),
-                             XEvent*   event,
-                             Boolean*  continueToDispatch)
-{
-    wxDialog *dialog = (wxDialog *)wxGetWindowFromTable(wid);
-    if (dialog)
-    {
-        wxMouseEvent wxevent(wxEVT_NULL);
-        if (wxTranslateMouseEvent(wxevent, dialog, wid, event))
-        {
-            wxevent.SetEventObject(dialog);
-            wxevent.SetId(dialog->GetId());
-            dialog->GetEventHandler()->ProcessEvent(wxevent);
-        }
-        else
-        {
-            // 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, dialog, wid, event))
-            {
-                keyEvent.SetEventObject(dialog);
-                keyEvent.SetId(dialog->GetId());
-                keyEvent.SetEventType(wxEVT_CHAR_HOOK);
-                if (dialog->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 (!dialog->GetEventHandler()->ProcessEvent (keyEvent))
-                    {
-                        keyEvent.SetEventType(wxEVT_CHAR);
-                        dialog->GetEventHandler()->ProcessEvent(keyEvent);
-                    }
-                }
-            }
-        }
-    }
-    *continueToDispatch = True;
-}
-
-static void wxUnmapBulletinBoard(Widget WXUNUSED(dialog), wxDialog *WXUNUSED(client), XtPointer WXUNUSED(call) )
-{
-/* This gets called when the dialog is being shown, which
-* defeats modal showing.
-client->m_modalShowing = FALSE ;
-client->m_isShown = FALSE;
-    */
-}
-
 void wxDialog::ChangeFont(bool keepOriginalSize)
 {
     wxWindow::ChangeFont(keepOriginalSize);
@@ -731,4 +476,3 @@ void wxDialog::ChangeForegroundColour()
     if (GetMainWidget())
         DoChangeForegroundColour(GetMainWidget(), m_foregroundColour);
 }
-
index fe5504cee15c5936892be6a2ebdae5d292650d26..39824784004e0685364eba432612d9a3a7052323 100644 (file)
@@ -229,6 +229,7 @@ ALL_SOURCES = \
                motif/textctrl.cpp \
                motif/timer.cpp \
                motif/toolbar.cpp \
+               motif/toplevel.cpp \
                motif/utils.cpp \
                motif/window.cpp \
                unix/dialup.cpp \
@@ -561,6 +562,7 @@ ALL_HEADERS = \
                motif/textctrl.h \
                motif/timer.h \
                motif/toolbar.h \
+               motif/toplevel.h \
                motif/window.h \
                generic/accel.h \
                generic/calctrl.h \
@@ -859,6 +861,7 @@ GUIOBJS = \
                textctrl.o \
                timer.o \
                toolbar.o \
+               toplevel.o \
                utils.o \
                window.o
 
index 2d07cc18c09eb38d1c773aa37e6cb99a022f8622..4dd023b994e587922a6394729a8282c00a740689 100644 (file)
 #define XtScreen XTSCREEN
 #endif
 
-# include "wx/frame.h"
+#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"
+#include "wx/app.h"
 
 #ifdef __VMS__
     #pragma message disable nosimpint
 // 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
@@ -99,7 +89,7 @@ extern wxList wxPendingDelete;
 
 // TODO: this should be tidied so that any frame can be the
 // top frame
-static bool wxTopLevelUsed = FALSE;
+// static bool wxTopLevelUsed = FALSE;
 
 // ----------------------------------------------------------------------------
 // wxWin macros
@@ -126,10 +116,10 @@ void wxFrame::Init()
 
     //// Motif-specific
     m_frameShell = (WXWidget) NULL;
-    m_frameWidget = (WXWidget) NULL;;
+    m_mainWidget = (WXWidget) NULL;;
     m_workArea = (WXWidget) NULL;;
     m_clientArea = (WXWidget) NULL;;
-    m_visibleStatus = TRUE;
+    // m_visibleStatus = TRUE;
 }
 
 bool wxFrame::Create(wxWindow *parent,
@@ -140,26 +130,15 @@ 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;
+    if( !wxTopLevelWindow::Create( parent, id, title, pos, size, style,
+                                   name ) )
+        return FALSE;
 
-    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
+    m_backgroundColour = 
+        wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE);
     m_foregroundColour = *wxBLACK;
     m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
 
-    if ( id > -1 )
-        m_windowId = id;
-    else
-        m_windowId = (int)NewControlId();
-
     int x = pos.x, y = pos.y;
     int width = size.x, height = size.y;
 
@@ -187,27 +166,64 @@ bool wxFrame::Create(wxWindow *parent,
         if (y < 10) y = 10;
     }
 
-    // VZ: what does this do??
+    SetTitle( title );
+
+    wxLogTrace(wxTRACE_Messages,
+               "Created frame (0x%08x) with work area 0x%08x and client "
+               "area 0x%08x", 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);
+
+    ChangeFont(FALSE);
+
+    ChangeBackgroundColour();
+
+    PreResize();
+
+    wxSizeEvent sizeEvent(wxSize(width, height), GetId());
+    sizeEvent.SetEventObject(this);
+
+    GetEventHandler()->ProcessEvent(sizeEvent);
+
+    return TRUE;
+}
+
+bool wxFrame::DoCreate( wxWindow* parent, wxWindowID id,
+                        const wxString& title,
+                        const wxPoint& pos,
+                        const wxSize& size,
+                        long style,
+                        const wxString& name )
+{
+    static bool wxTopLevelUsed = FALSE; /* this is global */
+    WXWidget frameShell;
+
     if (wxTopLevelUsed)
     {
         // Change suggested by Matthew Flatt
-        m_frameShell = (WXWidget)XtAppCreateShell
-                                 (
-                                  name,
-                                  wxTheApp->GetClassName(),
-                                  topLevelShellWidgetClass,
-                                  (Display*) wxGetDisplay(),
-                                  NULL,
-                                  0
-                                 );
+        frameShell = (WXWidget)XtAppCreateShell( name,
+                                                 wxTheApp->GetClassName(),
+                                                 topLevelShellWidgetClass,
+                                                 (Display*) wxGetDisplay(),
+                                                 NULL, 0 );
     }
     else
     {
-        m_frameShell = wxTheApp->GetTopLevelWidget();
+        frameShell = wxTheApp->GetTopLevelWidget();
         wxTopLevelUsed = TRUE;
     }
 
-    XtVaSetValues((Widget) m_frameShell,
+    XtVaSetValues((Widget) frameShell,
         // Allows menu to resize
         XmNallowShellResize, True,
         XmNdeleteResponse, XmDO_NOTHING,
@@ -215,18 +231,15 @@ bool wxFrame::Create(wxWindow *parent,
         XmNiconic, (style & wxICONIZE) ? TRUE : FALSE,
         NULL);
 
-    if (!title.IsEmpty())
-        XtVaSetValues((Widget) m_frameShell,
-        XmNtitle, title.c_str(),
-        NULL);
+    m_frameShell = frameShell;
 
-    m_frameWidget = (WXWidget) XtVaCreateManagedWidget("main_window",
-        xmMainWindowWidgetClass, (Widget) m_frameShell,
+    m_mainWidget = (WXWidget) XtVaCreateManagedWidget("main_window",
+        xmMainWindowWidgetClass, (Widget) frameShell,
         XmNresizePolicy, XmRESIZE_NONE,
         NULL);
 
     m_workArea = (WXWidget) XtVaCreateWidget("form",
-        xmFormWidgetClass, (Widget) m_frameWidget,
+        xmFormWidgetClass, (Widget) m_mainWidget,
         XmNresizePolicy, XmRESIZE_NONE,
         NULL);
 
@@ -238,109 +251,30 @@ 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 & 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);
-
-    // 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
+    XtAddEventHandler( (Widget)frameShell, StructureNotifyMask,
+                       False, (XtEventHandler)wxFrameMapProc,
+                       (XtPointer)this );
 
-    ChangeBackgroundColour();
-
-    PreResize();
+    XtRealizeWidget((Widget) frameShell);
 
-    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;
 }
@@ -353,10 +287,6 @@ wxFrame::~wxFrame()
     {
       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())
@@ -374,58 +304,42 @@ wxFrame::~wxFrame()
         m_frameMenuBar = NULL;
     }
 
-    wxTopLevelWindows.DeleteObject(this);
-    wxModelessWindows.DeleteObject(this);
-
     if (m_frameStatusBar)
     {
         delete m_frameStatusBar;
         m_frameStatusBar = NULL;
     }
+}
 
-    if (m_frameToolBar)
-    {
-        delete m_frameToolBar;
-        m_frameToolBar = NULL;
-    }
+void wxFrame::DoDestroy()
+{
+    Widget frameShell = (Widget)GetShellWidget();
 
-    DestroyChildren();
+    XtRemoveEventHandler( frameShell, StructureNotifyMask,
+                          False, (XtEventHandler)wxFrameMapProc,
+                          (XtPointer)this );
 
-    if (m_workArea)
+    if( m_clientArea )
     {
-        wxDeleteWindowFromTable((Widget) m_workArea);
-
-        XtDestroyWidget ((Widget) m_workArea);
+        wxDeleteWindowFromTable( (Widget)m_clientArea );
+        XtDestroyWidget( (Widget)m_clientArea );
     }
 
-    // We need to destroy the base class icons here before we stop
-    // the event loop. This is a hack until we have a real top level
-    // window (which would be responsible for killing the event loop).
-    m_icons.m_icons.Empty();
-
-    if (m_frameWidget)
+    if( m_workArea )
     {
-        wxDeleteWindowFromTable((Widget) m_frameWidget);
-        XtDestroyWidget ((Widget) m_frameWidget);
-    }
-
-    if (m_frameShell)
-        XtDestroyWidget ((Widget) m_frameShell);
-
-    SetMainWidget((WXWidget) NULL);
+        XtVaSetValues( (Widget)m_mainWidget,
+                       XmNworkWindow, (Widget)NULL,
+                       NULL );
 
-    /* Check if it's the last top-level window */
+        wxDeleteWindowFromTable( (Widget)m_workArea );
+        XtDestroyWidget( (Widget)m_workArea );
+    }
 
-    if (wxTheApp && (wxTopLevelWindows.Number() == 0))
-    {
-        wxTheApp->SetTopWindow(NULL);
+    if( m_mainWidget )
+        XtDestroyWidget( (Widget)m_mainWidget );
 
-        if (wxTheApp->GetExitOnFrameDelete())
-        {
-            // Signal to the app that we're going to close
-            wxTheApp->ExitMainLoop();
-        }
-    }
+    if( frameShell )
+        XtDestroyWidget( frameShell );
 }
 
 // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc.
@@ -451,28 +365,6 @@ void wxFrame::DoGetClientSize(int *x, int *y) const
             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;
 }
 
@@ -553,91 +445,54 @@ 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( !wxTopLevelWindowMotif::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);
-}
 
-void wxFrame::Maximize(bool maximize)
-{
-    Show(TRUE);
-
-    if ( maximize )
-        Restore();
-}
-
-bool wxFrame::IsIconized() const
-{
-    if (!m_frameShell)
-        return FALSE;
+    Widget shell = (Widget)GetShellWidget();
+    if (!shell)
+        return wxWindow::Show(show);
 
-    Boolean iconic;
-    XtVaGetValues((Widget) m_frameShell, XmNiconic, &iconic, NULL);
-    return iconic;
-}
+    SetVisibleStatus(show);
+    if (show)
+    {
+        XtMapWidget (shell);
+        XRaiseWindow (XtDisplay(shell), XtWindow(shell));
+    }
+    else
+    {
+        XtUnmapWidget(shell);
+    }
 
-// Is it maximized?
-bool wxFrame::IsMaximized() const
-{
-    // No maximizing in Motif (?)
-    return FALSE;
+    return TRUE;
 }
 
 void wxFrame::SetTitle(const wxString& title)
 {
-    if (title == m_title)
+    wxString oldTitle = GetTitle();
+    if( title == oldTitle )
         return;
 
-    m_title = title;
+    wxTopLevelWindow::SetTitle( title );
 
-    if (!title.IsNull())
-        XtVaSetValues((Widget) m_frameShell,
-        XmNtitle, title.c_str(),
-        XmNiconName, title.c_str(),
-        NULL);
+    if( !title.empty() )
+        XtVaSetValues( (Widget)m_frameShell,
+                       XmNtitle, title.c_str(),
+                       XmNiconName, title.c_str(),
+                       NULL );
 }
 
 void wxFrame::DoSetIcon(const wxIcon& icon)
@@ -740,8 +595,7 @@ void wxFrame::OnActivate(wxActivateEvent& event)
     {
         // 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)))
+        if (!child->IsTopLevel())
         {
             child->SetFocus();
             return;
@@ -765,97 +619,32 @@ wxToolBar* wxFrame::CreateToolBar(long style,
 
 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, tw, th, wxSIZE_NO_ADJUSTMENTS);
     }
 }
+#endif // wxUSE_TOOLBAR
 
 //// Motif-specific
 bool wxFrame::PreResize()
@@ -893,64 +682,25 @@ void wxFrame::ChangeForegroundColour()
         DoChangeForegroundColour(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;
+    wxFrame *tli = (wxFrame*)clientData;
 
-    wxCloseEvent closeEvent(wxEVT_CLOSE_WINDOW, frame->GetId());
-    closeEvent.SetEventObject(frame);
+    XEvent *e = (XEvent *)event;
 
-    // May delete the frame (with delayed deletion)
-    frame->GetEventHandler()->ProcessEvent(closeEvent);
-}
-
-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 );
 }
index 4fa16b4cfe044b1c17efb048d89d95332c9c8022..4ee31d8bbc6adb2f832cf2ccea72c3d75131287e 100644 (file)
@@ -509,7 +509,7 @@ void wxMDIChildFrame::DoGetPosition(int *x, int *y) const
 
 bool wxMDIChildFrame::Show(bool show)
 {
-    m_visibleStatus = show; /* show-&-hide fix */
+    SetVisibleStatus( show );
     return wxWindow::Show(show);
 }
 
@@ -543,7 +543,7 @@ void wxMDIChildFrame::SetIcons(const wxIconBundle& icons)
 
 void wxMDIChildFrame::SetTitle(const wxString& title)
 {
-    m_title = title;
+    wxTopLevelWindow::SetTitle( title );
     wxMDIClientWindow* clientWindow = GetMDIParentFrame()->GetClientWindow();
     int pageNo = clientWindow->FindPagePosition(this);
     if (pageNo > -1)