X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fd304d989b2c5c35ac1a849d508cb21f4d54609e..e1983ab58804a0e32ab2d832ded0349af1cc0476:/src/motif/frame.cpp diff --git a/src/motif/frame.cpp b/src/motif/frame.cpp index becd7bf078..22ec6184a3 100644 --- a/src/motif/frame.cpp +++ b/src/motif/frame.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "frame.h" #endif @@ -36,6 +36,7 @@ #include "wx/utils.h" #include "wx/log.h" #include "wx/app.h" +#include "wx/icon.h" #ifdef __VMS__ #pragma message disable nosimpint @@ -87,10 +88,6 @@ static void wxFrameMapProc(Widget frameShell, XtPointer clientData, extern wxList wxModelessWindows; extern wxList wxPendingDelete; -// TODO: this should be tidied so that any frame can be the -// top frame -// static bool wxTopLevelUsed = FALSE; - // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- @@ -100,7 +97,7 @@ BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) END_EVENT_TABLE() -IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) +IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow) // ============================================================================ // implementation @@ -119,7 +116,6 @@ void wxFrame::Init() m_mainWidget = (WXWidget) NULL;; m_workArea = (WXWidget) NULL;; m_clientArea = (WXWidget) NULL;; - // m_visibleStatus = TRUE; } bool wxFrame::Create(wxWindow *parent, @@ -169,8 +165,8 @@ bool wxFrame::Create(wxWindow *parent, 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); + "Created frame (0x%p) with work area 0x%p and client " + "area 0x%p", m_mainWidget, m_workArea, m_clientArea); XtAddEventHandler((Widget) m_clientArea, ExposureMask,FALSE, wxUniversalRepaintProc, (XtPointer) this); @@ -205,25 +201,13 @@ bool wxFrame::DoCreate( wxWindow* parent, wxWindowID id, long style, const wxString& name ) { - static bool wxTopLevelUsed = FALSE; /* this is global */ - WXWidget frameShell; + Widget frameShell; - if (wxTopLevelUsed) - { - // Change suggested by Matthew Flatt - frameShell = (WXWidget)XtAppCreateShell( name, - wxTheApp->GetClassName(), - topLevelShellWidgetClass, - (Display*) wxGetDisplay(), - NULL, 0 ); - } - else - { - frameShell = wxTheApp->GetTopLevelWidget(); - wxTopLevelUsed = TRUE; - } + frameShell = XtCreatePopupShell( name, topLevelShellWidgetClass, + (Widget)wxTheApp->GetTopLevelWidget(), + NULL, 0 ); - XtVaSetValues((Widget) frameShell, + XtVaSetValues(frameShell, // Allows menu to resize XmNallowShellResize, True, XmNdeleteResponse, XmDO_NOTHING, @@ -231,10 +215,10 @@ bool wxFrame::DoCreate( wxWindow* parent, wxWindowID id, XmNiconic, (style & wxICONIZE) ? TRUE : FALSE, NULL); - m_frameShell = frameShell; + m_frameShell = (WXWidget)frameShell; m_mainWidget = (WXWidget) XtVaCreateManagedWidget("main_window", - xmMainWindowWidgetClass, (Widget) frameShell, + xmMainWindowWidgetClass, frameShell, XmNresizePolicy, XmRESIZE_NONE, NULL); @@ -265,11 +249,11 @@ bool wxFrame::DoCreate( wxWindow* parent, wxWindowID id, XtFree( (char *)ptr ); /* Part of show-&-hide fix */ - XtAddEventHandler( (Widget)frameShell, StructureNotifyMask, + XtAddEventHandler( frameShell, StructureNotifyMask, False, (XtEventHandler)wxFrameMapProc, (XtPointer)this ); - XtRealizeWidget((Widget) frameShell); + XtRealizeWidget(frameShell); wxAddWindowToTable( (Widget)m_workArea, this); wxAddWindowToTable( (Widget)m_clientArea, this); @@ -309,15 +293,19 @@ wxFrame::~wxFrame() delete m_frameStatusBar; m_frameStatusBar = NULL; } + + PreDestroy(); + DoDestroy(); } void wxFrame::DoDestroy() { Widget frameShell = (Widget)GetShellWidget(); - XtRemoveEventHandler( frameShell, StructureNotifyMask, - False, (XtEventHandler)wxFrameMapProc, - (XtPointer)this ); + if( frameShell ) + XtRemoveEventHandler( frameShell, StructureNotifyMask, + False, (XtEventHandler)wxFrameMapProc, + (XtPointer)this ); if( m_clientArea ) { @@ -416,28 +404,6 @@ void wxFrame::DoGetSize(int *width, int *height) const *width = xx; *height = yy; } -void wxFrame::DoGetPosition(int *x, int *y) const -{ - Window parent_window = XtWindow((Widget) m_frameShell), - next_parent = XtWindow((Widget) m_frameShell), - root = RootWindowOfScreen(XtScreen((Widget) m_frameShell)); - - // search for the parent that is child of ROOT, because the WM may - // reparent twice and notify only the next parent (like FVWM) - while (next_parent != root) { - Window *theChildren; unsigned int n; - parent_window = next_parent; - XQueryTree(XtDisplay((Widget) m_frameShell), parent_window, &root, - &next_parent, &theChildren, &n); - XFree(theChildren); // not needed - } - int xx, yy; unsigned int dummy; - XGetGeometry(XtDisplay((Widget) m_frameShell), parent_window, &root, - &xx, &yy, &dummy, &dummy, &dummy, &dummy); - if (x) *x = xx; - if (y) *y = yy; -} - void wxFrame::DoSetSize(int x, int y, int width, int height, int WXUNUSED(sizeFlags)) { if (x > -1) @@ -500,10 +466,12 @@ void wxFrame::DoSetIcon(const wxIcon& icon) if (!m_frameShell) return; - if (!icon.Ok() || !icon.GetPixmap()) + if (!icon.Ok() || !icon.GetDrawable()) return; - XtVaSetValues((Widget) m_frameShell, XtNiconPixmap, icon.GetPixmap(), NULL); + XtVaSetValues((Widget) m_frameShell, + XtNiconPixmap, icon.GetDrawable(), + NULL); } void wxFrame::SetIcon(const wxIcon& icon) @@ -591,7 +559,7 @@ void wxFrame::OnActivate(wxActivateEvent& event) if (!event.GetActive()) return; - for(wxWindowList::Node *node = GetChildren().GetFirst(); node; + for(wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext()) { // Find a child that's a subwindow, but not a dialog box. @@ -655,7 +623,7 @@ void wxFrame::PositionToolBar() tw = cw; } - tb->SetSize(0, 0, tw, th, wxSIZE_NO_ADJUSTMENTS); + tb->SetSize(0, 0, -1, -1, wxSIZE_NO_ADJUSTMENTS); } } #endif // wxUSE_TOOLBAR @@ -687,13 +655,13 @@ void wxFrame::ChangeFont(bool WXUNUSED(keepOriginalSize)) void wxFrame::ChangeBackgroundColour() { if (GetClientWidget()) - DoChangeBackgroundColour(GetClientWidget(), m_backgroundColour); + wxDoChangeBackgroundColour(GetClientWidget(), m_backgroundColour); } void wxFrame::ChangeForegroundColour() { if (GetClientWidget()) - DoChangeForegroundColour(GetClientWidget(), m_foregroundColour); + wxDoChangeForegroundColour(GetClientWidget(), m_foregroundColour); } /* MATTEW: Used to insure that hide-&-show within an event cycle works */