X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/60913641356f364a5efee5966d3a3b0b48c01001..4e15d1caa03346c126015019c1fdf093033ef40b:/src/gtk/sockgtk.cpp diff --git a/src/gtk/sockgtk.cpp b/src/gtk/sockgtk.cpp index bd80f85942..c0f1b4f6cb 100644 --- a/src/gtk/sockgtk.cpp +++ b/src/gtk/sockgtk.cpp @@ -1,66 +1,70 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: gtk/gsockgtk.cpp +// Name: src/gtk/sockgtk.cpp // Purpose: implementation of wxGTK-specific socket event handling // Author: Guilhem Lavaux, Vadim Zeitlin // Created: 1999 // RCS-ID: $Id$ // Copyright: (c) 1999, 2007 wxWidgets dev team +// (c) 2009 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#if wxUSE_SOCKETS +#if wxUSE_SOCKETS && defined(__UNIX__) -#include -#include +#include "wx/apptrait.h" +#include "wx/private/fdiomanager.h" -#include #include -#include "wx/private/socket.h" -#include "wx/apptrait.h" - extern "C" { -static -void wxSocket_GDK_Input(gpointer data, - gint WXUNUSED(source), - GdkInputCondition condition) +static gboolean wxSocket_Input(GIOChannel*, GIOCondition condition, gpointer data) { - wxSocketImpl * const socket = static_cast(data); + wxFDIOHandler * const handler = static_cast(data); + + if (condition & G_IO_IN) + { + handler->OnReadWaiting(); + + // we could have lost connection while reading in which case we + // shouldn't call OnWriteWaiting() as the socket is now closed and it + // would assert + if ( !handler->IsOk() ) + return true; + } + + if (condition & G_IO_OUT) + handler->OnWriteWaiting(); - if ( condition & GDK_INPUT_READ ) - socket->Detected_Read(); - if ( condition & GDK_INPUT_WRITE ) - socket->Detected_Write(); + return true; } } -class GTKSocketManager : public wxSocketInputBasedManager +class GTKFDIOManager : public wxFDIOManager { public: - virtual int AddInput(wxSocketImpl *socket, SocketDir d) + virtual int AddInput(wxFDIOHandler *handler, int fd, Direction d) { - return gdk_input_add - ( - socket->m_fd, - d == FD_OUTPUT ? GDK_INPUT_WRITE : GDK_INPUT_READ, - wxSocket_GDK_Input, - socket - ); + return g_io_add_watch( + g_io_channel_unix_new(fd), + d == OUTPUT ? G_IO_OUT : G_IO_IN, + wxSocket_Input, + handler); } - virtual void RemoveInput(int fd) + virtual void + RemoveInput(wxFDIOHandler* WXUNUSED(handler), int fd, Direction WXUNUSED(d)) { - gdk_input_remove(fd); + g_source_remove(fd); } }; -wxSocketManager *wxGUIAppTraits::GetSocketManager() +wxFDIOManager *wxGUIAppTraits::GetFDIOManager() { - static GTKSocketManager s_manager; + static GTKFDIOManager s_manager; return &s_manager; } -#endif // wxUSE_SOCKETS +#endif // wxUSE_SOCKETS && __UNIX__