X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7d9f12f3b9f997b6308faf336d5381be591b71f4..096e3ea1c5d6d0f3f5aac62f44d138ff8f0cc3a8:/src/mgl/toplevel.cpp diff --git a/src/mgl/toplevel.cpp b/src/mgl/toplevel.cpp index 4a098e2a7e..80646a601f 100644 --- a/src/mgl/toplevel.cpp +++ b/src/mgl/toplevel.cpp @@ -1,9 +1,9 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: toplevel.cpp +// Name: src/mgl/toplevel.cpp // Purpose: // Author: Vaclav Slavik // Id: $Id$ -// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -15,10 +15,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "toplevel.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -26,15 +22,18 @@ #pragma hdrstop #endif -#include "wx/defs.h" -#include "wx/toplevel.h" +#ifndef WX_PRECOMP + #include "wx/defs.h" + #include "wx/toplevel.h" + #include "wx/app.h" +#endif // WX_PRECOMP + +#include "wx/mgl/private.h" // ---------------------------------------------------------------------------- // idle system // ---------------------------------------------------------------------------- -extern void wxapp_install_idle_handler(); -extern bool g_isIdle; extern int g_openDialogs; // ---------------------------------------------------------------------------- @@ -45,12 +44,6 @@ extern int g_openDialogs; IMPLEMENT_DYNAMIC_CLASS(wxTopLevelWindow, wxWindow) #endif -// ---------------------------------------------------------------------------- -// data -// ---------------------------------------------------------------------------- - -extern wxList wxPendingDelete; - // ============================================================================ // implementation @@ -58,15 +51,17 @@ extern wxList wxPendingDelete; void wxTopLevelWindowMGL::Init() { - m_isIconized = FALSE; - m_isMaximized = FALSE; - m_fsIsShowing = FALSE; + m_isShown = false; + m_isIconized = false; + m_isMaximized = false; + m_fsIsShowing = false; + m_sizeSet = false; } bool wxTopLevelWindowMGL::Create(wxWindow *parent, wxWindowID id, const wxString& title, - const wxPoint& pos, + const wxPoint& posOrig, const wxSize& sizeOrig, long style, const wxString &name) @@ -74,37 +69,57 @@ bool wxTopLevelWindowMGL::Create(wxWindow *parent, // always create a frame of some reasonable, even if arbitrary, size (at // least for MSW compatibility) wxSize size = sizeOrig; - if ( size.x == -1 || size.y == -1 ) + if ( size.x == wxDefaultCoord || size.y == wxDefaultCoord ) { - wxSize sizeDpy = wxGetDisplaySize(); - if ( size.x == -1 ) - size.x = sizeDpy.x / 3; - if ( size.y == -1 ) - size.y = sizeDpy.y / 5; + wxSize sizeDefault = GetDefaultSize(); + if ( size.x == wxDefaultCoord ) + size.x = sizeDefault.x; + if ( size.y == wxDefaultCoord ) + size.y = sizeDefault.y; } - wxTopLevelWindows.Append(this); - - m_title = title; + // for default positioning, centre the first top level window and + // cascade any addtional ones from there. + wxPoint pos = posOrig; + if ( pos.x == wxDefaultCoord || pos.y == wxDefaultCoord ) + { + wxSize sizeDisplay = wxGetDisplaySize(); + static wxPoint nextPos((sizeDisplay.x - size.x) / 2, + (sizeDisplay.y - size.y) / 2); + + if ( pos.x == wxDefaultCoord ) + pos.x = nextPos.x; + if ( pos.y == wxDefaultCoord ) + pos.y = nextPos.y; + if ( pos.x + size.x > sizeDisplay.x || pos.y + size.y > sizeDisplay.y ) + pos = wxPoint(); + + const wxSize cascadeOffset(16, 20); + nextPos = pos + cascadeOffset; + } + wxWindow::Create(NULL, id, pos, size, style, name); + SetParent(parent); + if ( parent ) + parent->AddChild(this); - if (m_parent) - m_parent->AddChild(this); + wxTopLevelWindows.Append(this); + m_title = title; - return TRUE; + return true; } wxTopLevelWindowMGL::~wxTopLevelWindowMGL() { - m_isBeingDeleted = TRUE; + m_isBeingDeleted = true; wxTopLevelWindows.DeleteObject(this); if (wxTheApp->GetTopWindow() == this) wxTheApp->SetTopWindow(NULL); - if ((wxTopLevelWindows.Number() == 0) && - (wxTheApp->GetExitOnFrameDelete())) + if (wxTopLevelWindows.IsEmpty() && + wxTheApp->GetExitOnFrameDelete()) { wxTheApp->ExitMainLoop(); } @@ -112,7 +127,7 @@ wxTopLevelWindowMGL::~wxTopLevelWindowMGL() bool wxTopLevelWindowMGL::ShowFullScreen(bool show, long style) { - if (show == m_fsIsShowing) return FALSE; // return what? + if (show == m_fsIsShowing) return false; // return what? m_fsIsShowing = show; @@ -124,7 +139,7 @@ bool wxTopLevelWindowMGL::ShowFullScreen(bool show, long style) GetSize(&m_fsSaveFrame.width, &m_fsSaveFrame.height); if ( style & wxFULLSCREEN_NOCAPTION ) - m_windowStyle &= !wxCAPTION; + m_windowStyle &= ~wxCAPTION; if ( style & wxFULLSCREEN_NOBORDER ) m_windowStyle = wxSIMPLE_BORDER; @@ -135,31 +150,55 @@ bool wxTopLevelWindowMGL::ShowFullScreen(bool show, long style) else { m_windowStyle = m_fsSaveStyle; - SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y, + SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y, m_fsSaveFrame.width, m_fsSaveFrame.height); } - return TRUE; + return true; +} + +bool wxTopLevelWindowMGL::Show(bool show) +{ + bool ret = wxTopLevelWindowBase::Show(show); + + // If this is the first time Show was called, send size event, + // so that the frame can adjust itself (think auto layout or single child) + if ( !m_sizeSet ) + { + m_sizeSet = true; + wxSizeEvent event(GetSize(), GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } + + if ( ret && show && AcceptsFocus() ) + SetFocus(); + // FIXME_MGL -- don't do this for popup windows? + return ret; } void wxTopLevelWindowMGL::Maximize(bool maximize) { + int x, y, w, h; + wxClientDisplayRect(&x, &y, &w, &h); + + rect_t screenRect = MGL_defRect(x, y, w, h); + MGL_wmInvalidateRect(g_winMng, &screenRect); + if ( maximize && !m_isMaximized ) { - int x, y, w, h; - + m_isMaximized = true; + GetPosition(&m_savedFrame.x, &m_savedFrame.y); GetSize(&m_savedFrame.width, &m_savedFrame.height); - wxClientDisplayRect(&x, &y, &w, &h); SetSize(x, y, w, h); - m_isMaximized = TRUE; } else if ( !maximize && m_isMaximized ) { - SetSize(m_savedFrame.x, m_savedFrame.y, + m_isMaximized = false; + SetSize(m_savedFrame.x, m_savedFrame.y, m_savedFrame.width, m_savedFrame.height); - m_isMaximized = FALSE; } } @@ -170,19 +209,21 @@ bool wxTopLevelWindowMGL::IsMaximized() const void wxTopLevelWindowMGL::Restore() { - if ( m_isIconized ) + if ( IsIconized() ) { - Iconize(FALSE); + Iconize(false); } - if ( m_isMaximized ) + if ( IsMaximized() ) { - Maximize(FALSE); + Maximize(false); } } -void wxTopLevelWindowMGL::Iconize(bool iconize) +void wxTopLevelWindowMGL::Iconize(bool WXUNUSED(iconize)) { - // FIXME_MGL + wxFAIL_MSG(wxT("Iconize not supported under wxMGL")); + // FIXME_MGL - Iconize is not supported in fullscreen mode. + // It will be supported in windowed mode (if ever implemented in MGL...) } bool wxTopLevelWindowMGL::IsIconized() const