X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b46b1d59d6f69ad80dcf5955375578a6504d100a..74a8f67d96591cec101def2a7d47c64072aff7fd:/src/mgl/evtloop.cpp diff --git a/src/mgl/evtloop.cpp b/src/mgl/evtloop.cpp index ff5d985cce..5e89f6b8b8 100644 --- a/src/mgl/evtloop.cpp +++ b/src/mgl/evtloop.cpp @@ -4,7 +4,7 @@ // Author: Vaclav Slavik // RCS-ID: $Id$ // Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) -// License: wxWindows licence +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------- @@ -73,9 +73,9 @@ void wxEventLoopImpl::Dispatch() { event_t evt; - // VS: The code bellow is equal to MGL's EVT_halt implementation, with - // two things added: sleeping (busy waiting is stupid, lets make CPU's - // life a bit easier) and timers updating + // VS: The code below is equal to MGL's EVT_halt implementation, with + // two things added: sleeping (busy waiting is stupid, let's make CPU's + // life a bit easier) and timers updating. // EVT_halt(&evt, EVT_EVERYEVT); for (;;) @@ -109,13 +109,13 @@ bool wxEventLoopImpl::SendIdleEvent() wxGUIEventLoop::~wxGUIEventLoop() { - wxASSERT_MSG( !m_impl, _T("should have been deleted in Run()") ); + wxASSERT_MSG( !m_impl, wxT("should have been deleted in Run()") ); } int wxGUIEventLoop::Run() { // event loops are not recursive, you need to create another loop! - wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message loop") ); + wxCHECK_MSG( !IsRunning(), -1, wxT("can't reenter a message loop") ); m_impl = new wxEventLoopImpl; @@ -143,15 +143,14 @@ int wxGUIEventLoop::Run() OnExit(); int exitcode = m_impl->GetExitCode(); - delete m_impl; - m_impl = NULL; + wxDELETE(m_impl); return exitcode; } void wxGUIEventLoop::Exit(int rc) { - wxCHECK_RET( IsRunning(), _T("can't call Exit() if not running") ); + wxCHECK_RET( IsRunning(), wxT("can't call Exit() if not running") ); m_impl->SetExitCode(rc); m_impl->SetKeepLooping(false); @@ -178,9 +177,45 @@ bool wxGUIEventLoop::Pending() const bool wxGUIEventLoop::Dispatch() { - wxCHECK_MSG( IsRunning(), false, _T("can't call Dispatch() if not running") ); + wxCHECK_MSG( IsRunning(), false, wxT("can't call Dispatch() if not running") ); m_impl->Dispatch(); return m_impl->GetKeepLooping(); } + +//----------------------------------------------------------------------------- +// wxYield +//----------------------------------------------------------------------------- + +bool wxGUIEventLoop::YieldFor(long eventsToProcess) +{ +#if wxUSE_THREADS + if ( !wxThread::IsMain() ) + { + // can't process events from other threads, MGL is thread-unsafe + return true; + } +#endif // wxUSE_THREADS + + m_isInsideYield = true; + m_eventsToProcessInsideYield = eventsToProcess; + + wxLog::Suspend(); + + // TODO: implement event filtering using the eventsToProcess mask + + while (Pending()) + Dispatch(); + + /* it's necessary to call ProcessIdle() to update the frames sizes which + might have been changed (it also will update other things set from + OnUpdateUI() which is a nice (and desired) side effect) */ + while (wxTheApp->ProcessIdle()) { } + + wxLog::Resume(); + + m_isInsideYield = false; + + return true; +}