X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e1218bd636881ea42715c64b5da9c926ce2d74ec..d728116a27b358e5b002337d96268fb51be128eb:/src/mgl/app.cpp diff --git a/src/mgl/app.cpp b/src/mgl/app.cpp index a5aba35432..77a30f0220 100644 --- a/src/mgl/app.cpp +++ b/src/mgl/app.cpp @@ -27,12 +27,14 @@ #include "wx/dialog.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/resource.h" #endif #include "wx/app.h" #include "wx/fontutil.h" #include "wx/univ/theme.h" #include "wx/univ/renderer.h" +#include "wx/univ/colschem.h" #include "wx/mgl/private.h" #define MGL_DEBUG @@ -127,6 +129,83 @@ void wxWakeUpIdle() #endif } +//----------------------------------------------------------------------------- +// Root window +//----------------------------------------------------------------------------- + +class wxRootWindow : public wxWindow +{ + public: + wxRootWindow() : wxWindow(NULL, -1) + { + SetMGLwindow_t(MGL_wmGetRootWindow(g_winMng)); + SetBackgroundColour(wxTHEME_COLOUR(DESKTOP)); + } + ~wxRootWindow() + { + // we don't want to delete MGL_WM's rootWnd + m_wnd = NULL; + } + + virtual bool AcceptsFocus() { return FALSE; } +}; + +static wxRootWindow *gs_rootWindow = NULL; + +//----------------------------------------------------------------------------- +// MGL initialization +//----------------------------------------------------------------------------- + +static bool wxCreateMGL_WM(const wxDisplayModeInfo& displayMode) +{ + int mode; + int refresh = MGL_DEFAULT_REFRESH; + +#if wxUSE_SYSTEM_OPTIONS + if ( wxSystemOptions::HasOption(wxT("mgl.screen-refresh") ) + refresh = wxSystemOptions::GetOptionInt(wxT("mgl.screen-refresh")); +#endif + + mode = MGL_findMode(displayMode.GetScreenSize().x, + displayMode.GetScreenSize().y, + displayMode.GetDepth()); + if ( mode == -1 ) + { + wxLogError(_("Mode %ix%i-%i not available."), + displayMode.GetScreenSize().x, + displayMode.GetScreenSize().y, + displayMode.GetDepth()); + return FALSE; + } + g_displayDC = new MGLDisplayDC(mode, 1, refresh); + if ( !g_displayDC->isValid() ) + { + delete g_displayDC; + g_displayDC = NULL; + return FALSE; + } + + g_winMng = MGL_wmCreate(g_displayDC->getDC()); + if (!g_winMng) + return FALSE; + + return TRUE; +} + +static void wxDestroyMGL_WM() +{ + if ( g_winMng ) + { + MGL_wmDestroy(g_winMng); + g_winMng = NULL; + } + if ( g_displayDC ) + { + delete g_displayDC; + g_displayDC = NULL; + } +} + //----------------------------------------------------------------------------- // wxApp //----------------------------------------------------------------------------- @@ -146,13 +225,31 @@ wxApp::~wxApp() { } -bool wxApp::OnInitGui() +bool wxApp::SetDisplayMode(const wxDisplayModeInfo& mode) { - if ( !wxCreateMGL_WM() ) + if ( !mode.IsOk() ) + { return FALSE; + } + if ( g_displayDC != NULL ) + { + // FIXME_MGL -- we currently don't allow to switch video mode + // more than once. This can hopefully be changed... + wxFAIL_MSG(wxT("Can't change display mode after intialization!")); + return FALSE; + } + + if ( !wxCreateMGL_WM(mode) ) + return FALSE; + gs_rootWindow = new wxRootWindow; + + m_displayMode = mode; - // This has to be done *after* wxCreateMGL_WM() because it initializes - // wxUniv's themes + return TRUE; +} + +bool wxApp::OnInitGui() +{ if ( !wxAppBase::OnInitGui() ) return FALSE; @@ -335,6 +432,8 @@ wxIcon wxApp::GetStdIcon(int which) const void wxApp::CleanUp() { + delete gs_rootWindow; + #if wxUSE_LOG // flush the logged messages if any wxLog *log = wxLog::GetActiveTarget();