X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6b8ef0b35d674bc262eb2005ac1321762c831d31..8a07956565ddccd1720abf4e510945593128d774:/src/unix/evtloopunix.cpp diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index b082984019..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,6 +38,10 @@ #include "wx/unix/private/epolldispatcher.h" #include "wx/private/selectdispatcher.h" +#if wxUSE_EVENTLOOP_SOURCE + #include "wx/evtloopsrc.h" +#endif // wxUSE_EVENTLOOP_SOURCE + #define TRACE_EVENTS wxT("events") // =========================================================================== @@ -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; } @@ -220,36 +222,40 @@ protected: wxEventLoopSourceHandler* m_impl; }; -bool wxConsoleEventLoop::DoAddSource(wxAbstractEventLoopSource* src) +wxEventLoopSource * +wxConsoleEventLoop::AddSourceForFD(int fd, + wxEventLoopSourceHandler *handler, + int flags) { - Source* source = dynamic_cast(src); - wxCHECK_MSG( source, false, "Invalid source type" ); + wxCHECK_MSG( fd != -1, NULL, "can't monitor invalid fd" ); wxLogTrace(wxTRACE_EVT_SOURCE, - "wxConsoleEventLoop::AddSource() source=%d", - source->GetResource()); + "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)); - // translating into wxFDIOHandler - // XXX this is a memory leak of course, but this is really temporary, so - // we are not creating another map of handlers - wxFDIOHandler* h = new wxFDIOEventLoopSourceHandler(source->GetHandler()); + if ( !m_dispatcher->RegisterFD(fd, fdioHandler.get(), flags) ) + return NULL; - return m_dispatcher->RegisterFD(source->GetResource(), h, - source->GetFlags()); + return new wxUnixEventLoopSource(m_dispatcher, fdioHandler.release(), + fd, handler, flags); } -bool wxConsoleEventLoop::DoRemoveSource(wxAbstractEventLoopSource* src) +wxUnixEventLoopSource::~wxUnixEventLoopSource() { - Source* source = dynamic_cast(src); - wxCHECK_MSG( source, false, "Invalid source type" ); - wxLogTrace(wxTRACE_EVT_SOURCE, - "wxConsoleEventLoop::RemoveSource() source=%d", - source->GetResource()); + "Removing event loop source for fd=%d", m_fd); + + m_dispatcher->UnregisterFD(m_fd); - return m_dispatcher->UnregisterFD(source->GetResource()); + delete m_fdioHandler; } -#endif + +#endif // wxUSE_EVENTLOOP_SOURCE //----------------------------------------------------------------------------- // events dispatch and loop handling