// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "frame.h"
#endif
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
// ----------------------------------------------------------------------------
EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
END_EVENT_TABLE()
-IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow)
+IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow)
// ============================================================================
// implementation
m_mainWidget = (WXWidget) NULL;;
m_workArea = (WXWidget) NULL;;
m_clientArea = (WXWidget) NULL;;
- // m_visibleStatus = TRUE;
}
bool wxFrame::Create(wxWindow *parent,
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,
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);
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);
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 )
{
*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)
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)
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.
tw = cw;
}
- tb->SetSize(0, 0, tw, th, wxSIZE_NO_ADJUSTMENTS);
+ tb->SetSize(0, 0, -1, -1, wxSIZE_NO_ADJUSTMENTS);
}
}
#endif // wxUSE_TOOLBAR
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 */