X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e04d2bf54dcb336e20a27e906dcebdca368790b..d2e66707deb10dea6f92e3e4092f8a43ef942a5d:/src/unix/evtloopunix.cpp diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index 4edf70e696..b219d1b2dc 100644 --- a/src/unix/evtloopunix.cpp +++ b/src/unix/evtloopunix.cpp @@ -30,6 +30,7 @@ #include #include "wx/apptrait.h" +#include "wx/scopedptr.h" #include "wx/thread.h" #include "wx/module.h" #include "wx/unix/pipe.h" @@ -37,7 +38,11 @@ #include "wx/unix/private/epolldispatcher.h" #include "wx/private/selectdispatcher.h" -#define TRACE_EVENTS _T("events") +#if wxUSE_EVENTLOOP_SOURCE + #include "wx/evtloopsrc.h" +#endif // wxUSE_EVENTLOOP_SOURCE + +#define TRACE_EVENTS wxT("events") // =========================================================================== // wxEventLoop::PipeIOHandler implementation @@ -83,17 +88,14 @@ bool PipeIOHandler::Create() return false; } - const int fdRead = GetReadFd(); - - int flags = fcntl(fdRead, F_GETFL, 0); - if ( flags == -1 || fcntl(fdRead, F_SETFL, flags | O_NONBLOCK) == -1 ) + if ( !m_pipe.MakeNonBlocking(wxPipe::Read) ) { wxLogSysError(_("Failed to switch wake up pipe to non-blocking mode")); return false; } wxLogTrace(TRACE_EVENTS, wxT("Wake up pipe (%d, %d) created"), - fdRead, m_pipe[wxPipe::Write]); + m_pipe[wxPipe::Read], m_pipe[wxPipe::Write]); return true; } @@ -176,9 +178,85 @@ wxConsoleEventLoop::wxConsoleEventLoop() wxConsoleEventLoop::~wxConsoleEventLoop() { - delete m_wakeupPipe; + if ( m_wakeupPipe ) + { + if ( m_dispatcher ) + { + m_dispatcher->UnregisterFD(m_wakeupPipe->GetReadFd()); + } + + delete m_wakeupPipe; + } } +//----------------------------------------------------------------------------- +// adding & removing sources +//----------------------------------------------------------------------------- + +#if wxUSE_EVENTLOOP_SOURCE + +// This class is a temporary bridge between event loop sources and +// FDIODispatcher. It is going to be removed soon, when all subject interfaces +// are modified +class wxFDIOEventLoopSourceHandler : public wxFDIOHandler +{ +public: + wxFDIOEventLoopSourceHandler(wxEventLoopSourceHandler* handler) : + m_impl(handler) { } + + virtual void OnReadWaiting() + { + m_impl->OnReadWaiting(); + } + virtual void OnWriteWaiting() + { + m_impl->OnWriteWaiting(); + } + + virtual void OnExceptionWaiting() + { + m_impl->OnExceptionWaiting(); + } + +protected: + wxEventLoopSourceHandler* m_impl; +}; + +wxEventLoopSource * +wxConsoleEventLoop::AddSourceForFD(int fd, + wxEventLoopSourceHandler *handler, + int flags) +{ + wxCHECK_MSG( fd != -1, NULL, "can't monitor invalid fd" ); + + wxLogTrace(wxTRACE_EVT_SOURCE, + "Adding event loop source for fd=%d", fd); + + // we need a bridge to wxFDIODispatcher + // + // TODO: refactor the code so that only wxEventLoopSourceHandler is used + wxScopedPtr + fdioHandler(new wxFDIOEventLoopSourceHandler(handler)); + + if ( !m_dispatcher->RegisterFD(fd, fdioHandler.get(), flags) ) + return NULL; + + return new wxUnixEventLoopSource(m_dispatcher, fdioHandler.release(), + fd, handler, flags); +} + +wxUnixEventLoopSource::~wxUnixEventLoopSource() +{ + wxLogTrace(wxTRACE_EVT_SOURCE, + "Removing event loop source for fd=%d", m_fd); + + m_dispatcher->UnregisterFD(m_fd); + + delete m_fdioHandler; +} + +#endif // wxUSE_EVENTLOOP_SOURCE + //----------------------------------------------------------------------------- // events dispatch and loop handling //----------------------------------------------------------------------------- @@ -200,7 +278,8 @@ bool wxConsoleEventLoop::Pending() const bool wxConsoleEventLoop::Dispatch() { - DispatchTimeout(wxFDIODispatcher::TIMEOUT_INFINITE); + DispatchTimeout(static_cast( + wxFDIODispatcher::TIMEOUT_INFINITE)); return true; }