X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/580616706f52835ee5ee48e6ef2ad15b822df971..b763ff43863beb0d416e1f492d4cbbaa915b479d:/src/mgl/app.cpp diff --git a/src/mgl/app.cpp b/src/mgl/app.cpp index 39d708ed0b..089ea11ad0 100644 --- a/src/mgl/app.cpp +++ b/src/mgl/app.cpp @@ -3,7 +3,7 @@ // Author: Vaclav Slavik // based on GTK and MSW implementations // Id: $Id$ -// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -27,6 +27,7 @@ #include "wx/dialog.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/resource.h" #endif #include "wx/app.h" @@ -34,14 +35,9 @@ #include "wx/univ/theme.h" #include "wx/univ/renderer.h" #include "wx/univ/colschem.h" +#include "wx/sysopt.h" #include "wx/mgl/private.h" -#define MGL_DEBUG - -#if defined(MGL_DEBUG) && !defined(__WXDEBUG__) -#undef MGL_DEBUG -#endif - //----------------------------------------------------------------------------- // Global data //----------------------------------------------------------------------------- @@ -146,31 +142,39 @@ class wxRootWindow : public wxWindow m_wnd = NULL; } - virtual bool AcceptsFocus() { return FALSE; } + virtual bool AcceptsFocus() const { return FALSE; } + + DECLARE_DYNAMIC_CLASS(wxRootWindow) }; +IMPLEMENT_DYNAMIC_CLASS(wxRootWindow, wxWindow) + static wxRootWindow *gs_rootWindow = NULL; //----------------------------------------------------------------------------- // MGL initialization //----------------------------------------------------------------------------- -static bool wxCreateMGL_WM() +static bool wxCreateMGL_WM(const wxDisplayModeInfo& displayMode) { int mode; - int width = 640, height = 480, depth = 16; int refresh = MGL_DEFAULT_REFRESH; #if wxUSE_SYSTEM_OPTIONS - if ( wxSystemOptions::HasOption(wxT("mgl.screen-refresh") ) + if ( wxSystemOptions::HasOption(wxT("mgl.screen-refresh")) ) refresh = wxSystemOptions::GetOptionInt(wxT("mgl.screen-refresh")); #endif - mode = MGL_findMode(width, height, depth); + mode = MGL_findMode(displayMode.GetWidth(), + displayMode.GetHeight(), + displayMode.GetDepth()); if ( mode == -1 ) { - wxLogWarning(_("Mode %ix%i-%i not available, falling back to default mode."), width, height, depth); - mode = 0; // always available + wxLogError(_("Mode %ix%i-%i not available."), + displayMode.GetWidth(), + displayMode.GetHeight(), + displayMode.GetDepth()); + return FALSE; } g_displayDC = new MGLDisplayDC(mode, 1, refresh); if ( !g_displayDC->isValid() ) @@ -183,7 +187,7 @@ static bool wxCreateMGL_WM() g_winMng = MGL_wmCreate(g_displayDC->getDC()); if (!g_winMng) return FALSE; - + return TRUE; } @@ -220,25 +224,59 @@ wxApp::~wxApp() { } -bool wxApp::OnInitGui() +wxDisplayModeInfo wxGetDefaultDisplayMode() +{ + wxString mode; + unsigned w, h, bpp; + + if ( !wxGetEnv(wxT("WXMODE"), &mode) || + (wxSscanf(mode.c_str(), _T("%ux%u-%u"), &w, &h, &bpp) != 3) ) + { + w = 640, h = 480, bpp = 16; + } + + return wxDisplayModeInfo(w, h, bpp); +} + +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; + } - // This has to be done *after* wxCreateMGL_WM() because it initializes - // wxUniv's themes - if ( !wxAppBase::OnInitGui() ) + if ( !wxCreateMGL_WM(mode) ) return FALSE; - - // ...and this has to be done after wxUniv themes were initialized gs_rootWindow = new wxRootWindow; -#ifdef MGL_DEBUG - // That damn MGL redirects stdin and stdout to physical console - FILE *file = fopen("stderr", "wt"); - wxLog::SetActiveTarget(new wxLogStderr(file)); + m_displayMode = mode; + + return TRUE; +} + +bool wxApp::OnInitGui() +{ + if ( !wxAppBase::OnInitGui() ) + return FALSE; + +#ifdef __WXDEBUG__ + // MGL redirects stdout and stderr to physical console, so lets redirect + // it to file. Do it only when WXDEBUG environment variable is set + wxString redirect; + if ( wxGetEnv(wxT("WXSTDERR"), &redirect) ) + freopen(redirect.mb_str(), "wt", stderr); #endif + wxLog *oldLog = wxLog::SetActiveTarget(new wxLogGui); + if ( oldLog ) delete oldLog; + return TRUE; } @@ -268,6 +306,11 @@ void wxApp::OnIdle(wxIdleEvent &event) // 'Garbage' collection of windows deleted with Close(). DeletePendingObjects(); +#if wxUSE_LOG + // flush the logged messages if any + wxLog::FlushActive(); +#endif // wxUSE_LOG + // Send OnIdle events to all windows if ( SendIdleEvents() ) event.RequestMore(TRUE); @@ -369,12 +412,8 @@ bool wxApp::Initialize() if ( MGL_init(".", NULL) == 0 ) return FALSE; - wxBuffer = new wxChar[BUFSIZ + 512]; - wxClassInfo::InitializeClasses(); - wxSystemSettings::Init(); - #if wxUSE_INTL wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding()); #endif @@ -405,21 +444,9 @@ bool wxApp::Initialize() return TRUE; } -wxIcon wxApp::GetStdIcon(int which) const -{ - return wxTheme::Get()->GetRenderer()->GetStdIcon(which); -} - void wxApp::CleanUp() { - delete gs_rootWindow; - #if wxUSE_LOG - // flush the logged messages if any - wxLog *log = wxLog::GetActiveTarget(); - if (log != NULL && log->HasPendingMessages()) - log->Flush(); - // continuing to use user defined log target is unsafe from now on because // some resources may be already unavailable, so replace it by something // more safe @@ -428,6 +455,8 @@ void wxApp::CleanUp() delete oldlog; #endif // wxUSE_LOG + delete gs_rootWindow; + wxModule::CleanUpModules(); #if wxUSE_WX_RESOURCES @@ -442,13 +471,10 @@ void wxApp::CleanUp() wxDeleteStockObjects(); wxDeleteStockLists(); - // Can't do this in wxModule, because fonts are needed by stock lists - delete wxTheFontsManager; - wxTheFontsManager = (wxFontsManager*) NULL; - delete wxTheApp; wxTheApp = (wxApp*) NULL; + // GL: I'm annoyed ... I don't know where to put this and I don't want to // create a module for that as it's part of the core. #if wxUSE_THREADS @@ -456,12 +482,14 @@ void wxApp::CleanUp() delete wxPendingEventsLocker; #endif - wxSystemSettings::Done(); - - delete[] wxBuffer; - wxClassInfo::CleanUpClasses(); + // Can't do this in wxModule, because fonts are needed by stock lists + // (do it after deleting wxTheApp and cleaning modules up, since somebody + // may be deleting fonts that lately) + delete wxTheFontsManager; + wxTheFontsManager = (wxFontsManager*) NULL; + // check for memory leaks #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT if (wxDebugContext::CountObjectsLeft(TRUE) > 0) @@ -507,6 +535,12 @@ void wxEntryCleanup() int wxEntry(int argc, char *argv[]) { +#ifdef __DJGPP__ + // VS: disable long filenames under DJGPP as the very first thing, + // since SciTech MGL doesn't like them much... + wxSetEnv(wxT("LFN"), wxT("N")); +#endif + #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT // This seems to be necessary since there are 'rogue' // objects present at this point (perhaps global objects?) @@ -591,6 +625,12 @@ int wxEntry(int argc, char *argv[]) } } +#if wxUSE_LOG + // flush the logged messages if any + wxLog *log = wxLog::GetActiveTarget(); + if (log != NULL && log->HasPendingMessages()) + log->Flush(); +#endif // wxUSE_LOG retValue = wxTheApp->OnExit(); } }