X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e382463783f520fbbc4272dd777c9da0ce4f08a..07aec89fe1e7bad8010911aa8863efecfa909946:/src/unix/evtloopunix.cpp?ds=sidebyside diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index 784241c663..daeac691d1 100644 --- a/src/unix/evtloopunix.cpp +++ b/src/unix/evtloopunix.cpp @@ -3,8 +3,9 @@ // Purpose: wxEventLoop implementation // Author: Lukasz Michalski (lm@zork.pl) // Created: 2007-05-07 -// RCS-ID: $Id$ // Copyright: (c) 2006 Zork Lukasz Michalski +// (c) 2009, 2013 Vadim Zeitlin +// (c) 2013 Rob Bresalier // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -36,7 +37,9 @@ #include "wx/unix/private/epolldispatcher.h" #include "wx/unix/private/wakeuppipe.h" #include "wx/private/selectdispatcher.h" +#include "wx/private/eventloopsourcesmanager.h" #include "wx/private/fdioeventloopsourcehandler.h" +#include "wx/private/eventloopsourcesmanager.h" #if wxUSE_EVENTLOOP_SOURCE #include "wx/evtloopsrc.h" @@ -52,30 +55,44 @@ wxConsoleEventLoop::wxConsoleEventLoop() { - m_wakeupPipe = new wxWakeUpPipeMT; - const int pipeFD = m_wakeupPipe->GetReadFd(); + // Be pessimistic initially and assume that we failed to initialize. + m_dispatcher = NULL; + m_wakeupPipe = NULL; + m_wakeupSource = NULL; + + // Create the pipe. + wxScopedPtr wakeupPipe(new wxWakeUpPipeMT); + const int pipeFD = wakeupPipe->GetReadFd(); if ( pipeFD == wxPipe::INVALID_FD ) - { - wxDELETE(m_wakeupPipe); - m_dispatcher = NULL; return; - } - m_dispatcher = wxFDIODispatcher::Get(); - if ( !m_dispatcher ) + // And start monitoring it in our event loop. + m_wakeupSource = wxEventLoopBase::AddSourceForFD + ( + pipeFD, + wakeupPipe.get(), + wxFDIO_INPUT + ); + + if ( !m_wakeupSource ) return; - m_dispatcher->RegisterFD(pipeFD, m_wakeupPipe, wxFDIO_INPUT); + // This is a bit ugly but we know that AddSourceForFD() used the currently + // active dispatcher to register this source, so use the same one for our + // other operations. Of course, currently the dispatcher returned by + // wxFDIODispatcher::Get() is always the same one anyhow so it doesn't + // really matter, but if we started returning different things later, it + // would. + m_dispatcher = wxFDIODispatcher::Get(); + + m_wakeupPipe = wakeupPipe.release(); } wxConsoleEventLoop::~wxConsoleEventLoop() { if ( m_wakeupPipe ) { - if ( m_dispatcher ) - { - m_dispatcher->UnregisterFD(m_wakeupPipe->GetReadFd()); - } + delete m_wakeupSource; delete m_wakeupPipe; } @@ -87,27 +104,37 @@ wxConsoleEventLoop::~wxConsoleEventLoop() #if wxUSE_EVENTLOOP_SOURCE -wxEventLoopSource * -wxConsoleEventLoop::AddSourceForFD(int fd, - wxEventLoopSourceHandler *handler, - int flags) +class wxConsoleEventLoopSourcesManager : public wxEventLoopSourcesManagerBase { - wxCHECK_MSG( fd != -1, NULL, "can't monitor invalid fd" ); +public: + wxEventLoopSource* 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); + 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)); - // we need a bridge to wxFDIODispatcher - // - // TODO: refactor the code so that only wxEventLoopSourceHandler is used - wxScopedPtr - fdioHandler(new wxFDIOEventLoopSourceHandler(handler)); + if ( !wxFDIODispatcher::Get()->RegisterFD(fd, fdioHandler.get(), flags) ) + return NULL; - if ( !m_dispatcher->RegisterFD(fd, fdioHandler.get(), flags) ) - return NULL; + return new wxUnixEventLoopSource(wxFDIODispatcher::Get(), fdioHandler.release(), + fd, handler, flags); + } +}; + +wxEventLoopSourcesManagerBase* wxAppTraits::GetEventLoopSourcesManager() +{ + static wxConsoleEventLoopSourcesManager s_eventLoopSourcesManager; - return new wxUnixEventLoopSource(m_dispatcher, fdioHandler.release(), - fd, handler, flags); + return &s_eventLoopSourcesManager; } wxUnixEventLoopSource::~wxUnixEventLoopSource()