X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b79dfbca98c3b48a954675393c07abfd4eed7dea..6bcc1145fea1fbe4f4fd492199d1482f95fac5fd:/src/unix/fdiounix.cpp?ds=sidebyside diff --git a/src/unix/fdiounix.cpp b/src/unix/fdiounix.cpp new file mode 100644 index 0000000000..746d8ed9bb --- /dev/null +++ b/src/unix/fdiounix.cpp @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/unix/fdiounix.cpp +// Purpose: wxFDIOManager implementation for console Unix applications +// Author: Vadim Zeitlin +// Created: 2009-08-17 +// RCS-ID: $Id: wxhead.cpp,v 1.10 2009-06-29 10:23:04 zeitlin Exp $ +// Copyright: (c) 2009 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include "wx/apptrait.h" +#include "wx/private/fdiodispatcher.h" +#include "wx/unix/private/fdiounix.h" + +// ============================================================================ +// wxFDIOManagerUnix implementation +// ============================================================================ + +int wxFDIOManagerUnix::AddInput(wxFDIOHandler *handler, int fd, Direction d) +{ + wxFDIODispatcher * const dispatcher = wxFDIODispatcher::Get(); + wxCHECK_MSG( dispatcher, -1, "can't monitor FDs without FD IO dispatcher" ); + + // translate our direction to dispatcher flags + const int flag = d == INPUT ? wxFDIO_INPUT : wxFDIO_OUTPUT; + + // we need to either register this FD with the dispatcher or update an + // existing registration depending on whether it had been previously + // registered for anything or not + bool ok; + const int regmask = handler->GetRegisteredEvents(); + if ( !regmask ) + { + ok = dispatcher->RegisterFD(fd, handler, flag); + } + else + { + ok = dispatcher->ModifyFD(fd, handler, regmask | flag); + } + + if ( !ok ) + return -1; + + // update the stored mask of registered events + handler->SetRegisteredEvent(flag); + + return fd; +} + +void wxFDIOManagerUnix::RemoveInput(wxFDIOHandler *handler, int fd, Direction d) +{ + wxFDIODispatcher * const dispatcher = wxFDIODispatcher::Get(); + if ( !dispatcher ) + return; + + const int flag = d == INPUT ? wxFDIO_INPUT : wxFDIO_OUTPUT; + + // just as in AddInput() above we may need to either just modify the FD or + // remove it completely if we don't need to monitor it any more + bool ok; + const int regmask = handler->GetRegisteredEvents(); + if ( regmask == flag ) + { + ok = dispatcher->UnregisterFD(fd); + } + else + { + ok = dispatcher->ModifyFD(fd, handler, regmask & ~flag); + } + + if ( !ok ) + { + wxLogDebug("Failed to unregister %d in direction %d", fd, d); + } + + // do this even after a failure to unregister it, we still tried... + handler->ClearRegisteredEvent(flag); +} + +wxFDIOManager *wxAppTraits::GetFDIOManager() +{ + static wxFDIOManagerUnix s_manager; + return &s_manager; +} +