X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b46b1d59d6f69ad80dcf5955375578a6504d100a..74dea0decfee896aa5197df82f3ffda65afb3aec:/src/common/gsocketiohandler.cpp diff --git a/src/common/gsocketiohandler.cpp b/src/common/gsocketiohandler.cpp index 7a8d2badba..ece535c02c 100644 --- a/src/common/gsocketiohandler.cpp +++ b/src/common/gsocketiohandler.cpp @@ -19,7 +19,7 @@ // for compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#if wxUSE_SOCKETS +#if wxUSE_SOCKETS && wxUSE_SELECT_DISPATCHER #include "wx/private/gsocketiohandler.h" #include "wx/unix/private.h" @@ -127,14 +127,21 @@ void GSocketGUIFunctionsTableConcrete::Install_Callback(GSocket *socket, default: return; } - wxSelectDispatcher * const dispatcher = wxSelectDispatcher::Get(); + wxFDIODispatcher * const dispatcher = wxFDIODispatcher::Get(); if ( !dispatcher ) return; - wxGSocketIOHandler * - handler = (wxGSocketIOHandler*)dispatcher->FindHandler(fd); - if ( !handler ) + wxGSocketIOHandler *& handler = socket->m_handler; + + // we should register the new handlers but modify the existing ones in place + bool registerHandler; + if ( handler ) + { + registerHandler = false; + } + else // no existing handler { + registerHandler = true; handler = new wxGSocketIOHandler(socket); } @@ -149,7 +156,10 @@ void GSocketGUIFunctionsTableConcrete::Install_Callback(GSocket *socket, handler->AddFlag(wxFDIO_OUTPUT); } - dispatcher->RegisterFD(fd, handler, handler->GetFlags()); + if ( registerHandler ) + dispatcher->RegisterFD(fd, handler, handler->GetFlags()); + else + dispatcher->ModifyFD(fd, handler, handler->GetFlags()); } void GSocketGUIFunctionsTableConcrete::Uninstall_Callback(GSocket *socket, @@ -175,18 +185,28 @@ void GSocketGUIFunctionsTableConcrete::Uninstall_Callback(GSocket *socket, const wxFDIODispatcherEntryFlags flag = c == 0 ? wxFDIO_INPUT : wxFDIO_OUTPUT; - wxSelectDispatcher * const dispatcher = wxSelectDispatcher::Get(); + wxFDIODispatcher * const dispatcher = wxFDIODispatcher::Get(); if ( !dispatcher ) return; - wxGSocketIOHandler * const - handler = (wxGSocketIOHandler*)dispatcher->UnregisterFD(fd, flag); + wxGSocketIOHandler *& handler = socket->m_handler; if ( handler ) { handler->RemoveFlag(flag); if ( !handler->GetFlags() ) + { + dispatcher->UnregisterFD(fd); delete handler; + } + else + { + dispatcher->ModifyFD(fd, handler, handler->GetFlags()); + } + } + else + { + dispatcher->UnregisterFD(fd); } }