X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/222ed1d678dff2f5c3c4164321dd05e8f47de487..e87b78335291c67025c5a763c2acfb22343f9908:/src/common/appcmn.cpp?ds=inline diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index 97c2f5eb2d..dd1636b598 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -40,13 +40,18 @@ #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 // ============================================================================ @@ -85,9 +90,6 @@ bool wxAppBase::Initialize(int& argc, wxChar **argv) wxPendingEventsLocker = new wxCriticalSection; #endif - wxTheColourDatabase = new wxColourDatabase; - wxTheColourDatabase->Initialize(); - wxInitializeStockLists(); wxInitializeStockObjects(); @@ -208,60 +210,48 @@ 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(); - win->ProcessInternalIdle(); + if (SendIdleEvents(win, event)) + needMore = TRUE; node = node->GetNext(); } - wxIdleEvent event; event.SetEventObject(this); - bool processed = ProcessEvent(event); + (void) ProcessEvent(event); + if (event.MoreRequested()) + needMore = TRUE; wxUpdateUIEvent::ResetUpdateTime(); - return processed && event.MoreRequested(); -} - -// Send idle event to all top-level windows -bool wxAppBase::SendIdleEvents() -{ - bool needMore = FALSE; - - wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst(); - while (node) - { - wxWindow* win = node->GetData(); - if (SendIdleEvents(win)) - needMore = TRUE; - node = node->GetNext(); - } - return needMore; } // Send idle event to window and all subwindows -bool wxAppBase::SendIdleEvents(wxWindow* win) +bool wxAppBase::SendIdleEvents(wxWindow* win, wxIdleEvent& event) { bool needMore = FALSE; - + + win->OnInternalIdle(); + if (wxIdleEvent::CanSend(win)) { - wxIdleEvent event; event.SetEventObject(win); win->GetEventHandler()->ProcessEvent(event); - needMore = event.MoreRequested(); + if (event.MoreRequested()) + needMore = TRUE; } - wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst(); while ( node ) { - wxWindow *win = node->GetData(); - if (SendIdleEvents(win)) + wxWindow *child = node->GetData(); + if (SendIdleEvents(child, event)) needMore = TRUE; node = node->GetNext(); @@ -270,6 +260,26 @@ bool wxAppBase::SendIdleEvents(wxWindow* win) 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