X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3f8cdda4851796e5f5f5bcd82d9e867a30581a6f..43fd7dbd797dc3977376146b5d0751d974e089a1:/src/unix/evtloopunix.cpp diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index 99d9c1e34e..453f1c354a 100644 --- a/src/unix/evtloopunix.cpp +++ b/src/unix/evtloopunix.cpp @@ -21,6 +21,8 @@ #if wxUSE_CONSOLE_EVENTLOOP +#include "wx/evtloop.h" + #ifndef WX_PRECOMP #include "wx/app.h" #include "wx/log.h" @@ -28,7 +30,7 @@ #include #include "wx/apptrait.h" -#include "wx/evtloop.h" +#include "wx/scopedptr.h" #include "wx/thread.h" #include "wx/module.h" #include "wx/unix/pipe.h" @@ -36,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 @@ -175,9 +181,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 //----------------------------------------------------------------------------- @@ -199,7 +281,8 @@ bool wxConsoleEventLoop::Pending() const bool wxConsoleEventLoop::Dispatch() { - DispatchTimeout(wxFDIODispatcher::TIMEOUT_INFINITE); + DispatchTimeout(static_cast( + wxFDIODispatcher::TIMEOUT_INFINITE)); return true; }