X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9482617091b084d4ee006679a450176715d465e0..2d34a3036ee7d4f1d2b6caf8a1e47f67930a430a:/src/common/appcmn.cpp diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index 21466c15ec..dd1636b598 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -30,20 +30,28 @@ #ifndef WX_PRECOMP #include "wx/app.h" + #include "wx/bitmap.h" #include "wx/intl.h" #include "wx/list.h" #include "wx/log.h" #include "wx/msgdlg.h" + #include "wx/bitmap.h" + #include "wx/confbase.h" #endif #include "wx/apptrait.h" -#if wxUSE_FONTMAP - #include "wx/fontmap.h" -#endif // wxUSE_FONTMAP #include "wx/msgout.h" #include "wx/thread.h" #include "wx/utils.h" +#if defined(__WXMSW__) + #include "wx/msw/private.h" // includes windows.h for LOGFONT +#endif + +#if wxUSE_FONTMAP + #include "wx/fontmap.h" +#endif // wxUSE_FONTMAP + // ============================================================================ // wxAppBase implementation // ============================================================================ @@ -73,26 +81,15 @@ wxAppBase::wxAppBase() m_exitOnFrameDelete = Later; } -bool wxAppBase::Initialize(int argc, wxChar **argv) +bool wxAppBase::Initialize(int& argc, wxChar **argv) { if ( !wxAppConsole::Initialize(argc, argv) ) return false; - // for compatibility call the old initialization function too - if ( !OnInitGui() ) - { - wxAppConsole::CleanUp(); - - return false; - } - #if wxUSE_THREADS wxPendingEventsLocker = new wxCriticalSection; #endif - wxTheColourDatabase = new wxColourDatabase(wxKEY_STRING); - wxTheColourDatabase->Initialize(); - wxInitializeStockLists(); wxInitializeStockObjects(); @@ -172,7 +169,7 @@ void wxAppBase::Exit() wxAppTraits *wxAppBase::CreateTraits() { - return wxAppTraits::CreateGUI(); + return new wxGUIAppTraits; } // ---------------------------------------------------------------------------- @@ -194,7 +191,7 @@ void wxAppBase::SetActive(bool active, wxWindow * WXUNUSED(lastFocus)) void wxAppBase::DeletePendingObjects() { - wxNode *node = wxPendingDelete.GetFirst(); + wxList::compatibility_iterator node = wxPendingDelete.GetFirst(); while (node) { wxObject *obj = node->GetData(); @@ -202,7 +199,7 @@ void wxAppBase::DeletePendingObjects() delete obj; if (wxPendingDelete.Member(obj)) - delete node; + wxPendingDelete.Erase(node); // Deleting one object may have deleted other pending // objects, so start from beginning of list again. @@ -210,6 +207,80 @@ void wxAppBase::DeletePendingObjects() } } +// Returns TRUE if more time is needed. +bool wxAppBase::ProcessIdle() +{ + wxIdleEvent event; + bool needMore = FALSE; + wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); + node = wxTopLevelWindows.GetFirst(); + while (node) + { + wxWindow* win = node->GetData(); + if (SendIdleEvents(win, event)) + needMore = TRUE; + node = node->GetNext(); + } + + event.SetEventObject(this); + (void) ProcessEvent(event); + if (event.MoreRequested()) + needMore = TRUE; + + wxUpdateUIEvent::ResetUpdateTime(); + + return needMore; +} + +// Send idle event to window and all subwindows +bool wxAppBase::SendIdleEvents(wxWindow* win, wxIdleEvent& event) +{ + bool needMore = FALSE; + + win->OnInternalIdle(); + + if (wxIdleEvent::CanSend(win)) + { + event.SetEventObject(win); + win->GetEventHandler()->ProcessEvent(event); + + if (event.MoreRequested()) + needMore = TRUE; + } + wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst(); + while ( node ) + { + wxWindow *child = node->GetData(); + if (SendIdleEvents(child, event)) + needMore = TRUE; + + node = node->GetNext(); + } + + return needMore; +} + +void wxAppBase::OnIdle(wxIdleEvent& WXUNUSED(event)) +{ + // If there are pending events, we must process them: pending events + // are either events to the threads other than main or events posted + // with wxPostEvent() functions + // GRG: I have moved this here so that all pending events are processed + // before starting to delete any objects. This behaves better (in + // particular, wrt wxPostEvent) and is coherent with wxGTK's current + // behaviour. Changed Feb/2000 before 2.1.14 + ProcessPendingEvents(); + + // 'Garbage' collection of windows deleted with Close(). + DeletePendingObjects(); + +#if wxUSE_LOG + // flush the logged messages if any + wxLog::FlushActive(); +#endif // wxUSE_LOG + +} + // ---------------------------------------------------------------------------- // wxGUIAppTraitsBase // ---------------------------------------------------------------------------- @@ -310,12 +381,3 @@ void wxGUIAppTraitsBase::RemoveFromPendingDelete(wxObject *object) wxPendingDelete.DeleteObject(object); } -// ---------------------------------------------------------------------------- -// wxAppTraits -// ---------------------------------------------------------------------------- - -wxAppTraits *wxAppTraitsBase::CreateGUI() -{ - return new wxGUIAppTraits; -} -