X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3c029873c66cfdc0dcbf52958970273435ba02fc..591cc82deb5bc6dd0af6047ecfa7ce7cf4f8d859:/src/unix/evtloopunix.cpp diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index 34dd79ab9b..fbaa4c775a 100644 --- a/src/unix/evtloopunix.cpp +++ b/src/unix/evtloopunix.cpp @@ -19,7 +19,7 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/evtloop.h" +#if wxUSE_CONSOLE_EVENTLOOP #ifndef WX_PRECOMP #include "wx/app.h" @@ -27,19 +27,16 @@ #endif #include +#include "wx/apptrait.h" +#include "wx/evtloop.h" #include "wx/thread.h" #include "wx/module.h" +#include "wx/unix/private/timer.h" #include "wx/unix/private/epolldispatcher.h" #include "wx/private/selectdispatcher.h" -#include "wx/generic/private/timer.h" - #define TRACE_EVENTS _T("events") -//this code should not be compiled when GUI is defined -//(monolithic build issue) -#if !wxUSE_GUI - // =========================================================================== // wxEventLoop::PipeIOHandler implementation // =========================================================================== @@ -88,7 +85,7 @@ void wxConsoleEventLoop::PipeIOHandler::WakeUp() void wxConsoleEventLoop::PipeIOHandler::OnReadWaiting() { // got wakeup from child thread: read all data available in pipe just to - // make it empty (evevn though we write one byte at a time from WakeUp(), + // make it empty (even though we write one byte at a time from WakeUp(), // it could have been called several times) char buf[4]; for ( ;; ) @@ -110,7 +107,9 @@ void wxConsoleEventLoop::PipeIOHandler::OnReadWaiting() } } - wxTheApp->ProcessPendingEvents(); + // writing to the wake up pipe will make wxConsoleEventLoop return from + // wxFDIODispatcher::Dispatch() it might be currently blocking in, nothing + // else needs to be done } // =========================================================================== @@ -129,15 +128,9 @@ wxConsoleEventLoop::wxConsoleEventLoop() return; } -#ifdef HAVE_SYS_EPOLL_H - m_dispatcher = wxEpollDispatcher::Get(); + m_dispatcher = wxFDIODispatcher::Get(); if ( !m_dispatcher ) -#endif // HAVE_SYS_EPOLL_H - { - m_dispatcher = wxSelectDispatcher::Get(); - } - - wxCHECK_RET( m_dispatcher, _T("failed to create IO dispatcher") ); + return; m_dispatcher->RegisterFD ( @@ -145,7 +138,7 @@ wxConsoleEventLoop::wxConsoleEventLoop() &m_wakeupPipe, wxFDIO_INPUT ); -}; +} //----------------------------------------------------------------------------- // events dispatch and loop handling @@ -153,46 +146,64 @@ wxConsoleEventLoop::wxConsoleEventLoop() bool wxConsoleEventLoop::Pending() const { - return wxTheApp->HasPendingEvents(); + if ( m_dispatcher->HasPending() ) + return true; + +#if wxUSE_TIMER + wxUsecClock_t nextTimer; + if ( wxTimerScheduler::Get().GetNext(&nextTimer) && + !wxMilliClockToLong(nextTimer) ) + return true; +#endif // wxUSE_TIMER + + return false; } bool wxConsoleEventLoop::Dispatch() { - wxTheApp->ProcessPendingEvents(); + DispatchTimeout(wxFDIODispatcher::TIMEOUT_INFINITE); + return true; } -void wxConsoleEventLoop::WakeUp() +int wxConsoleEventLoop::DispatchTimeout(unsigned long timeout) { - m_wakeupPipe.WakeUp(); -} - -void wxConsoleEventLoop::OnNextIteration() -{ - // calculate the timeout until the next timer expiration - int timeout; - #if wxUSE_TIMER + // check if we need to decrease the timeout to account for a timer wxUsecClock_t nextTimer; if ( wxTimerScheduler::Get().GetNext(&nextTimer) ) { - // timeout is in ms - timeout = (nextTimer / 1000).ToLong(); + unsigned long timeUntilNextTimer = wxMilliClockToLong(nextTimer / 1000); + if ( timeUntilNextTimer < timeout ) + timeout = timeUntilNextTimer; } - else // no timers, we can block forever #endif // wxUSE_TIMER - { - timeout = wxFDIODispatcher::TIMEOUT_INFINITE; - } - m_dispatcher->RunLoop(timeout); + bool hadEvent = m_dispatcher->Dispatch(timeout) > 0; #if wxUSE_TIMER - wxTimerScheduler::Get().NotifyExpired(); -#endif + if ( wxTimerScheduler::Get().NotifyExpired() ) + hadEvent = true; +#endif // wxUSE_TIMER + + return hadEvent ? 1 : -1; +} +void wxConsoleEventLoop::WakeUp() +{ + m_wakeupPipe.WakeUp(); +} + +void wxConsoleEventLoop::OnNextIteration() +{ // call the signal handlers for any signals we caught recently wxTheApp->CheckSignal(); } -#endif // !wxUSE_GUI + +wxEventLoopBase *wxConsoleAppTraits::CreateEventLoop() +{ + return new wxEventLoop(); +} + +#endif // wxUSE_CONSOLE_EVENTLOOP