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