X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/05e2b077c6187ff4d894e4af58ccd99536c9c584..ce7208d49d5ce2ca1dc0b3b83f14f1d04f29c4bf:/src/mgl/app.cpp diff --git a/src/mgl/app.cpp b/src/mgl/app.cpp index 2e85732f90..53c61fad16 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 ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ - #pragma implementation "app.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -18,18 +14,18 @@ #pragma hdrstop #endif +#include "wx/app.h" #ifndef WX_PRECOMP #include "wx/settings.h" - #include "wx/module.h" - #include "wx/evtloop.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" #include "wx/univ/renderer.h" @@ -51,7 +47,7 @@ void wxApp::Exit() // wxYield //----------------------------------------------------------------------------- -static bool gs_inYield = FALSE; +static bool gs_inYield = false; bool wxApp::Yield(bool onlyIfNeeded) { @@ -62,18 +58,18 @@ bool wxApp::Yield(bool onlyIfNeeded) wxFAIL_MSG( wxT("wxYield called recursively" ) ); } - return FALSE; + return false; } #if wxUSE_THREADS if ( !wxThread::IsMain() ) { // can't process events from other threads, MGL is thread-unsafe - return TRUE; + return true; } #endif // wxUSE_THREADS - gs_inYield = TRUE; + gs_inYield = true; wxLog::Suspend(); @@ -90,9 +86,9 @@ bool wxApp::Yield(bool onlyIfNeeded) wxLog::Resume(); - gs_inYield = FALSE; + gs_inYield = false; - return TRUE; + return true; } @@ -123,18 +119,18 @@ void wxApp::WakeUpIdle() class wxRootWindow : public wxWindow { public: - wxRootWindow() : wxWindow(NULL, -1) + wxRootWindow() : wxWindow(NULL, wxID_ANY) { 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; } - virtual bool AcceptsFocus() const { return FALSE; } + virtual bool AcceptsFocus() const { return false; } DECLARE_DYNAMIC_CLASS(wxRootWindow) }; @@ -147,7 +143,7 @@ static wxRootWindow *gs_rootWindow = NULL; // MGL initialization //----------------------------------------------------------------------------- -static bool wxCreateMGL_WM(const wxDisplayModeInfo& displayMode) +static bool wxCreateMGL_WM(const wxVideoMode& displayMode) { int mode; int refresh = MGL_DEFAULT_REFRESH; @@ -166,21 +162,21 @@ static bool wxCreateMGL_WM(const wxDisplayModeInfo& displayMode) displayMode.GetWidth(), displayMode.GetHeight(), displayMode.GetDepth()); - return FALSE; + return false; } g_displayDC = new MGLDisplayDC(mode, 1, refresh); if ( !g_displayDC->isValid() ) { delete g_displayDC; g_displayDC = NULL; - return FALSE; + return false; } g_winMng = MGL_wmCreate(g_displayDC->getDC()); if (!g_winMng) - return FALSE; + return false; - return TRUE; + return true; } static void wxDestroyMGL_WM() @@ -204,11 +200,11 @@ static void wxDestroyMGL_WM() IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler) BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) - EVT_IDLE(wxApp::OnIdle) + EVT_IDLE(wxAppBase::OnIdle) END_EVENT_TABLE() -wxApp::wxApp() : m_mainLoop(NULL) +wxApp::wxApp() { } @@ -216,7 +212,7 @@ wxApp::~wxApp() { } -wxDisplayModeInfo wxGetDefaultDisplayMode() +wxVideoMode wxGetDefaultDisplayMode() { wxString mode; unsigned w, h, bpp; @@ -227,160 +223,49 @@ wxDisplayModeInfo wxGetDefaultDisplayMode() w = 640, h = 480, bpp = 16; } - return wxDisplayModeInfo(w, h, bpp); + return wxVideoMode(w, h, bpp); } -bool wxApp::SetDisplayMode(const wxDisplayModeInfo& mode) +bool wxApp::SetDisplayMode(const wxVideoMode& mode) { if ( !mode.IsOk() ) { - return FALSE; + 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; + return false; } if ( !wxCreateMGL_WM(mode) ) - return FALSE; + return false; gs_rootWindow = new wxRootWindow; m_displayMode = mode; - return TRUE; + return true; } bool wxApp::OnInitGui() { if ( !wxAppBase::OnInitGui() ) - return FALSE; + 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 + // it to file in debug build. Do it only when WXSTDERR environment variable is set wxString redirect; if ( wxGetEnv(wxT("WXSTDERR"), &redirect) ) freopen(redirect.mb_str(), "wt", stderr); -#endif +#endif // __WXDEBUG__ wxLog *oldLog = wxLog::SetActiveTarget(new wxLogGui); if ( oldLog ) delete oldLog; - return TRUE; -} - -bool wxApp::ProcessIdle() -{ - wxIdleEvent event; - event.SetEventObject(this); - ProcessEvent(event); - - return event.MoreRequested(); -} - -void wxApp::OnIdle(wxIdleEvent &event) -{ - static bool s_inOnIdle = FALSE; - - /* Avoid recursion (via ProcessEvent default case) */ - if (s_inOnIdle) - return; - - s_inOnIdle = TRUE; - - /* Resend in the main thread events which have been prepared in other - threads */ - ProcessPendingEvents(); - - // '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); - - s_inOnIdle = FALSE; -} - -bool wxApp::SendIdleEvents() -{ - bool needMore = FALSE; - - wxWindowList::Node* node = wxTopLevelWindows.GetFirst(); - while (node) - { - wxWindow* win = node->GetData(); - if ( SendIdleEvents(win) ) - needMore = TRUE; - node = node->GetNext(); - } - - return needMore; -} - -bool wxApp::SendIdleEvents(wxWindow* win) -{ - bool needMore = FALSE; - - wxIdleEvent event; - event.SetEventObject(win); - - win->GetEventHandler()->ProcessEvent(event); - - if ( event.MoreRequested() ) - needMore = TRUE; - - wxNode* node = win->GetChildren().First(); - while (node) - { - wxWindow* win = (wxWindow*) node->Data(); - if ( SendIdleEvents(win) ) - needMore = TRUE; - - node = node->Next(); - } - return needMore; -} - -int wxApp::MainLoop() -{ - int rt; - m_mainLoop = new wxEventLoop; - - rt = m_mainLoop->Run(); - - delete m_mainLoop; - m_mainLoop = NULL; - return rt; -} - -void wxApp::ExitMainLoop() -{ - if ( m_mainLoop ) - m_mainLoop->Exit(0); -} - -bool wxApp::Initialized() -{ - return (wxTopLevelWindows.GetCount() != 0); -} - -bool wxApp::Pending() -{ - return wxEventLoop::GetActive()->Pending(); -} - -void wxApp::Dispatch() -{ - wxEventLoop::GetActive()->Dispatch(); + return true; } bool wxApp::Initialize(int& argc, wxChar **argv) @@ -391,19 +276,22 @@ bool wxApp::Initialize(int& argc, wxChar **argv) wxSetEnv(wxT("LFN"), wxT("N")); #endif + // intialize MGL before creating wxFontsManager since it uses MGL funcs + if ( MGL_init(".", NULL) == 0 ) + { + wxLogError(_("Cannot initialize SciTech MGL!")); + return false; + } + // 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; - - if ( MGL_init(".", NULL) == 0 ) { - wxLogError(_("Cannot initialize SciTech MGL!")); - - wxAppBase::CleanUp(); - + delete wxTheFontsManager; + wxTheFontsManager = NULL; + MGL_exit(); return false; } @@ -414,17 +302,30 @@ 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() + { + delete wxTheFontsManager; + wxTheFontsManager = (wxFontsManager*) NULL; + + 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); } -