X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a1873279648582e6af46f9103460da50bf5e03b9..69659fd770f615210efac4b4fa741b3ad6223616:/src/common/gsocketiohandler.cpp?ds=sidebyside diff --git a/src/common/gsocketiohandler.cpp b/src/common/gsocketiohandler.cpp index e8e6dfcd62..ece535c02c 100644 --- a/src/common/gsocketiohandler.cpp +++ b/src/common/gsocketiohandler.cpp @@ -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); } }