From 798a4529fe37bfd1864b4ed350e7de603bd40f2b Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Mon, 6 Jan 2003 16:36:23 +0000 Subject: [PATCH] Implemented wxToplevelWindowMotif. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18600 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/msw/tmake/filelist.txt | 2 + include/wx/generic/tabg.h | 1 + include/wx/motif/dialog.h | 38 ++- include/wx/motif/frame.h | 45 ++- include/wx/toplevel.h | 3 + src/motif/dialog.cpp | 424 +++++--------------------- src/motif/files.lst | 3 + src/motif/frame.cpp | 542 +++++++++------------------------ src/motif/mdi.cpp | 4 +- 9 files changed, 276 insertions(+), 786 deletions(-) diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index f1c9d4014e..c91b811b0c 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -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 diff --git a/include/wx/generic/tabg.h b/include/wx/generic/tabg.h index b71a4e902b..0d1bc89a09 100644 --- a/include/wx/generic/tabg.h +++ b/include/wx/generic/tabg.h @@ -21,6 +21,7 @@ #include "wx/hash.h" #include "wx/string.h" #include "wx/dialog.h" +#include "wx/panel.h" class WXDLLEXPORT wxTabView; diff --git a/include/wx/motif/dialog.h b/include/wx/motif/dialog.h index bdfd0a056d..9cc136d524 100644 --- a/include/wx/motif/dialog.h +++ b/include/wx/motif/dialog.h @@ -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, diff --git a/include/wx/motif/frame.h b/include/wx/motif/frame.h index 638e8da237..dcc4bd221f 100644 --- a/include/wx/motif/frame.h +++ b/include/wx/motif/frame.h @@ -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 diff --git a/include/wx/toplevel.h b/include/wx/toplevel.h index d7a8fddd7a..c5ada5c6de 100644 --- a/include/wx/toplevel.h +++ b/include/wx/toplevel.h @@ -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__ diff --git a/src/motif/dialog.cpp b/src/motif/dialog.cpp index 19a321cc02..bb4a45ea2f 100644 --- a/src/motif/dialog.cpp +++ b/src/motif/dialog.cpp @@ -22,7 +22,6 @@ #include "wx/dialog.h" #include "wx/utils.h" -#include "wx/frame.h" #include "wx/app.h" #include "wx/settings.h" @@ -54,14 +53,6 @@ #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(": 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(": 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); } - diff --git a/src/motif/files.lst b/src/motif/files.lst index fe5504cee1..3982478400 100644 --- a/src/motif/files.lst +++ b/src/motif/files.lst @@ -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 diff --git a/src/motif/frame.cpp b/src/motif/frame.cpp index 2d07cc18c0..4dd023b994 100644 --- a/src/motif/frame.cpp +++ b/src/motif/frame.cpp @@ -28,17 +28,14 @@ #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 @@ -80,15 +77,8 @@ // 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(": resize()")); - - XtFree((char *)ptr); - - XtAddCallback((Widget) m_workArea, XmNfocusCallback, - (XtCallbackProc)wxFrameFocusProc, (XtPointer)this); + XtTranslations ptr = XtParseTranslationTable( ": 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 ); } diff --git a/src/motif/mdi.cpp b/src/motif/mdi.cpp index 4fa16b4cfe..4ee31d8bbc 100644 --- a/src/motif/mdi.cpp +++ b/src/motif/mdi.cpp @@ -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) -- 2.45.2