From: Julian Smart Date: Sun, 13 Jul 2003 16:59:30 +0000 (+0000) Subject: Improvements to OnIdle processing X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/5109ae5d178fb4025c6b92bb2f840c07dae99a82?ds=inline Improvements to OnIdle processing git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21934 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/app.h b/include/wx/app.h index c479f17df7..0850ae3b72 100644 --- a/include/wx/app.h +++ b/include/wx/app.h @@ -381,13 +381,15 @@ public: // it should return TRUE if more idle events are needed, FALSE if not virtual bool ProcessIdle() ; +#if 0 // Send idle event to all top-level windows. // Returns TRUE if more idle time is requested. virtual bool SendIdleEvents(); +#endif // Send idle event to window and all subwindows // Returns TRUE if more idle time is requested. - virtual bool SendIdleEvents(wxWindow* win); + virtual bool SendIdleEvents(wxWindow* win, wxIdleEvent& event); // top level window functions diff --git a/include/wx/window.h b/include/wx/window.h index 877456d967..dce69059f9 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -877,7 +877,7 @@ public: virtual void OnInternalIdle() {} // call internal idle recursively - void ProcessInternalIdle() ; +// void ProcessInternalIdle() ; // get the handle of the window for the underlying window system: this // is only used for wxWin itself or for user code which wants to call diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index abc9545e04..8fa4b91bd4 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -210,24 +210,29 @@ 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(); + return needMore; } +#if 0 // Send idle event to all top-level windows bool wxAppBase::SendIdleEvents() { @@ -244,26 +249,28 @@ bool wxAppBase::SendIdleEvents() return needMore; } +#endif // 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)) + if (SendIdleEvents(win, event)) needMore = TRUE; node = node->GetNext(); diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 6cc620cf4f..c7c5001fd1 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -1830,7 +1830,9 @@ void wxWindowBase::DoUpdateWindowUI(wxUpdateUIEvent& event) #endif } +#if 0 // call internal idle recursively +// may be obsolete (wait until OnIdle scheme stabilises) void wxWindowBase::ProcessInternalIdle() { OnInternalIdle(); @@ -1843,6 +1845,7 @@ void wxWindowBase::ProcessInternalIdle() node = node->GetNext(); } } +#endif // ---------------------------------------------------------------------------- // dialog units translations diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 06afb50f12..3235c6fbe5 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -551,11 +551,14 @@ void wxApp::OnIdle( wxIdleEvent &event ) // 'Garbage' collection of windows deleted with Close() DeletePendingObjects(); + // Now done in ProcessIdle() +#if 0 // Send OnIdle events to all windows bool needMore = SendIdleEvents(); if (needMore) event.RequestMore(TRUE); +#endif s_inOnIdle = FALSE; } diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index 06afb50f12..3235c6fbe5 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -551,11 +551,14 @@ void wxApp::OnIdle( wxIdleEvent &event ) // 'Garbage' collection of windows deleted with Close() DeletePendingObjects(); + // Now done in ProcessIdle() +#if 0 // Send OnIdle events to all windows bool needMore = SendIdleEvents(); if (needMore) event.RequestMore(TRUE); +#endif s_inOnIdle = FALSE; } diff --git a/src/mac/app.cpp b/src/mac/app.cpp index d53f06edaf..324f39baed 100644 --- a/src/mac/app.cpp +++ b/src/mac/app.cpp @@ -1029,7 +1029,6 @@ void wxApp::OnIdle(wxIdleEvent& event) if ( s_inOnIdle ) return; - s_inOnIdle = TRUE; // 'Garbage' collection of windows deleted with Close(). @@ -1040,11 +1039,14 @@ void wxApp::OnIdle(wxIdleEvent& event) if ( pLog != NULL && pLog->HasPendingMessages() ) pLog->Flush(); + // Now done in ProcessIdle() +#if 0 // Send OnIdle events to all windows bool needMore = SendIdleEvents(); if (needMore) event.RequestMore(TRUE); +#endif // If they are pending events, we must process them: pending events are // either events to the threads other than main or events posted with diff --git a/src/mac/carbon/app.cpp b/src/mac/carbon/app.cpp index d53f06edaf..324f39baed 100644 --- a/src/mac/carbon/app.cpp +++ b/src/mac/carbon/app.cpp @@ -1029,7 +1029,6 @@ void wxApp::OnIdle(wxIdleEvent& event) if ( s_inOnIdle ) return; - s_inOnIdle = TRUE; // 'Garbage' collection of windows deleted with Close(). @@ -1040,11 +1039,14 @@ void wxApp::OnIdle(wxIdleEvent& event) if ( pLog != NULL && pLog->HasPendingMessages() ) pLog->Flush(); + // Now done in ProcessIdle() +#if 0 // Send OnIdle events to all windows bool needMore = SendIdleEvents(); if (needMore) event.RequestMore(TRUE); +#endif // If they are pending events, we must process them: pending events are // either events to the threads other than main or events posted with diff --git a/src/mgl/app.cpp b/src/mgl/app.cpp index 45f77b88ae..2c505d83c2 100644 --- a/src/mgl/app.cpp +++ b/src/mgl/app.cpp @@ -294,9 +294,12 @@ void wxApp::OnIdle(wxIdleEvent &event) wxLog::FlushActive(); #endif // wxUSE_LOG + // Now done in ProcessIdle() +#if 0 // Send OnIdle events to all windows if ( SendIdleEvents() ) event.RequestMore(TRUE); +#endif s_inOnIdle = FALSE; } diff --git a/src/motif/app.cpp b/src/motif/app.cpp index c391382b47..c01b74f67c 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -233,11 +233,14 @@ void wxApp::OnIdle(wxIdleEvent& event) if ( pLog != NULL && pLog->HasPendingMessages() ) pLog->Flush(); + // Now done in ProcessIdle() +#if 0 // Send OnIdle events to all windows bool needMore = SendIdleEvents(); if (needMore) event.RequestMore(TRUE); +#endif inOnIdle = FALSE; } diff --git a/src/msw/app.cpp b/src/msw/app.cpp index bcd5771bd1..79153ef858 100644 --- a/src/msw/app.cpp +++ b/src/msw/app.cpp @@ -828,6 +828,8 @@ void wxApp::OnIdle(wxIdleEvent& event) wxDC::ClearCache(); #endif // wxUSE_DC_CACHEING + // Now done in ProcessIdle() +#if 0 // Send OnIdle events to all windows if ( SendIdleEvents() ) { @@ -835,6 +837,7 @@ void wxApp::OnIdle(wxIdleEvent& event) // idle events event.RequestMore(TRUE); } +#endif wxIsInOnIdleFlag = FALSE; } diff --git a/src/os2/app.cpp b/src/os2/app.cpp index bc7b9bd18e..8af1146ac7 100644 --- a/src/os2/app.cpp +++ b/src/os2/app.cpp @@ -807,6 +807,8 @@ void wxApp::OnIdle( wxDC::ClearCache(); #endif // wxUSE_DC_CACHEING + // Now done in ProcessIdle() +#if 0 // // Send OnIdle events to all windows // @@ -818,6 +820,8 @@ void wxApp::OnIdle( // rEvent.RequestMore(TRUE); } +#endif + gbInOnIdle = FALSE; } // end of wxApp::OnIdle diff --git a/src/x11/app.cpp b/src/x11/app.cpp index ff91c2fb6b..4aa78528cc 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -717,11 +717,14 @@ void wxApp::OnIdle(wxIdleEvent& event) // 'Garbage' collection of windows deleted with Close() DeletePendingObjects(); + // Now done in ProcessIdle() +#if 0 // Send OnIdle events to all windows bool needMore = SendIdleEvents(); if (needMore) event.RequestMore(TRUE); +#endif s_inOnIdle = FALSE; }