X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/71e9885be0a84f3c544b992aeb3a842f821035b5..6f026b5b63fe7ccb025e84509886f74772b9df13:/src/unix/evtloopunix.cpp diff --git a/src/unix/evtloopunix.cpp b/src/unix/evtloopunix.cpp index 763b73ef73..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 ///////////////////////////////////////////////////////////////////////////// @@ -54,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; }