X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a1873279648582e6af46f9103460da50bf5e03b9..30767dfe33da2b5b5cea6f3eaa88d5509c40c08b:/src/unix/evtloopunix.cpp diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index 39afb42db0..7f27c1c2a2 100644 --- a/src/unix/evtloopunix.cpp +++ b/src/unix/evtloopunix.cpp @@ -27,6 +27,7 @@ #endif #include +#include "wx/apptrait.h" #include "wx/evtloop.h" #include "wx/thread.h" #include "wx/module.h" @@ -125,15 +126,9 @@ wxConsoleEventLoop::wxConsoleEventLoop() return; } -#ifdef wxUSE_EPOLL_DISPATCHER - m_dispatcher = wxEpollDispatcher::Get(); + m_dispatcher = wxFDIODispatcher::Get(); if ( !m_dispatcher ) -#endif // wxUSE_EPOLL_DISPATCHER -#if wxUSE_SELECT_DISPATCHER - m_dispatcher = wxSelectDispatcher::Get(); -#endif // wxUSE_WCHAR_T - - wxCHECK_RET( m_dispatcher, _T("failed to create IO dispatcher") ); + return; m_dispatcher->RegisterFD ( @@ -154,41 +149,51 @@ bool wxConsoleEventLoop::Pending() const bool wxConsoleEventLoop::Dispatch() { - wxTheApp->ProcessPendingEvents(); - return true; -} + DispatchTimeout(wxFDIODispatcher::TIMEOUT_INFINITE); -void wxConsoleEventLoop::WakeUp() -{ - m_wakeupPipe.WakeUp(); + return true; } -void wxConsoleEventLoop::OnNextIteration() +int wxConsoleEventLoop::DispatchTimeout(unsigned long timeout) { - // 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); #if wxUSE_TIMER - wxTimerScheduler::Get().NotifyExpired(); -#endif + if ( wxTimerScheduler::Get().NotifyExpired() ) + hadEvent = true; +#endif // wxUSE_TIMER + wxTheApp->ProcessPendingEvents(); + + 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(); } + +wxEventLoopBase *wxConsoleAppTraits::CreateEventLoop() +{ + return new wxEventLoop(); +} + #endif // wxUSE_CONSOLE_EVENTLOOP