X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/90eb13e62eb92049da20ca45ff1456e38808a37a..6bc176b4ab7ed858d558546bcdd0a05229b64a3b:/src/mgl/app.cpp diff --git a/src/mgl/app.cpp b/src/mgl/app.cpp index b76b94ddd5..0c0a1ac7d4 100644 --- a/src/mgl/app.cpp +++ b/src/mgl/app.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: app.cpp +// Name: src/mgl/app.cpp // Author: Vaclav Slavik // based on GTK and MSW implementations // Id: $Id$ @@ -7,10 +7,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "app.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -18,17 +14,17 @@ #pragma hdrstop #endif +#include "wx/app.h" #ifndef WX_PRECOMP #include "wx/settings.h" - #include "wx/module.h" #include "wx/frame.h" #include "wx/dialog.h" #include "wx/log.h" #include "wx/intl.h" + #include "wx/module.h" #endif -#include "wx/app.h" #include "wx/evtloop.h" #include "wx/fontutil.h" #include "wx/univ/theme.h" @@ -36,6 +32,7 @@ #include "wx/univ/colschem.h" #include "wx/sysopt.h" #include "wx/mgl/private.h" +#include "wx/private/fontmgr.h" //----------------------------------------------------------------------------- // wxApp::Exit() @@ -51,11 +48,9 @@ void wxApp::Exit() // wxYield //----------------------------------------------------------------------------- -static bool gs_inYield = false; - bool wxApp::Yield(bool onlyIfNeeded) { - if ( gs_inYield ) + if ( m_isInsideYield ) { if ( !onlyIfNeeded ) { @@ -73,14 +68,15 @@ bool wxApp::Yield(bool onlyIfNeeded) } #endif // wxUSE_THREADS - gs_inYield = true; + m_isInsideYield = true; wxLog::Suspend(); - if ( wxEventLoop::GetActive() ) + wxEventLoopBase * const eventLoop = wxEventLoop::GetActive(); + if ( eventLoop ) { - while (wxEventLoop::GetActive()->Pending()) - wxEventLoop::GetActive()->Dispatch(); + while (eventLoop->Pending()) + eventLoop->Dispatch(); } /* it's necessary to call ProcessIdle() to update the frames sizes which @@ -90,7 +86,7 @@ bool wxApp::Yield(bool onlyIfNeeded) wxLog::Resume(); - gs_inYield = false; + m_isInsideYield = false; return true; } @@ -128,7 +124,7 @@ class wxRootWindow : public wxWindow SetMGLwindow_t(MGL_wmGetRootWindow(g_winMng)); SetBackgroundColour(wxTHEME_COLOUR(DESKTOP)); } - ~wxRootWindow() + virtual ~wxRootWindow() { // we don't want to delete MGL_WM's rootWnd m_wnd = NULL; @@ -203,11 +199,6 @@ static void wxDestroyMGL_WM() IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler) -BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) - EVT_IDLE(wxAppBase::OnIdle) -END_EVENT_TABLE() - - wxApp::wxApp() { } @@ -280,19 +271,16 @@ bool wxApp::Initialize(int& argc, wxChar **argv) wxSetEnv(wxT("LFN"), wxT("N")); #endif - // must do it before calling wxAppBase::Initialize(), because fonts are - // needed by stock lists which are created there - wxTheFontsManager = new wxFontsManager; - - if ( !wxAppBase::Initialize(argc, argv) ) - return false; - + // intialize MGL before creating wxFontsManager since it uses MGL funcs if ( MGL_init(".", NULL) == 0 ) { wxLogError(_("Cannot initialize SciTech MGL!")); + return false; + } - wxAppBase::CleanUp(); - + if ( !wxAppBase::Initialize(argc, argv) ) + { + MGL_exit(); return false; } @@ -303,17 +291,29 @@ bool wxApp::Initialize(int& argc, wxChar **argv) return true; } +// Modules are cleaned up after wxApp::CleanUp(), and some modules may +// require MGL to still be alive, e.g. the stock fonts need the fonts +// manager. So append this module last minute in wxApp::CleanUp() to close +// down MGL after all the other modules have been cleaned up. +// +struct wxMGLFinalCleanup: public wxModule +{ + bool OnInit() { return true; } + + void OnExit() + { + wxFontsManager::CleanUp(); + + wxDestroyMGL_WM(); + MGL_exit(); + } +}; + void wxApp::CleanUp() { delete gs_rootWindow; wxAppBase::CleanUp(); - // must do this after calling base class CleanUp() - delete wxTheFontsManager; - wxTheFontsManager = (wxFontsManager*) NULL; - - wxDestroyMGL_WM(); - MGL_exit(); + wxModule::RegisterModule(new wxMGLFinalCleanup); } -