tGet rid of deprecated gdk_input_(add|remove) - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit f19f8aaba7004c96d82945b3401c6d22cd1a014b
 (DIR) parent f97050905377cdc0ca7d1f49e34f6cb364725766
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon, 16 Nov 2020 00:19:58 -0800
       
       Get rid of deprecated gdk_input_(add|remove)
       
       Use GIOChannel functions rather than gdk_input_add
       and gdk_input_remove, since the old functions are
       no longer present in GTK+3. Relates #53.
       
       Diffstat:
         M src/gtkport/gtkenums.h              |       6 ------
         M src/gtkport/gtkport.c               |      56 -------------------------------
         M src/gtkport/gtkport.h               |       5 -----
         M src/gui_client/gtk_client.c         |      27 ++++++++++++++-------------
         M src/network.c                       |      17 ++++++++++++++++-
         M src/network.h                       |       3 ++-
         M src/serverside.c                    |      27 ++++++++++++++++-----------
       
       7 files changed, 48 insertions(+), 93 deletions(-)
       ---
 (DIR) diff --git a/src/gtkport/gtkenums.h b/src/gtkport/gtkenums.h
       t@@ -80,12 +80,6 @@ typedef enum {
        } GtkSelectionMode;
        
        typedef enum {
       -  GDK_INPUT_READ      = 1 << 0,
       -  GDK_INPUT_WRITE     = 1 << 1,
       -  GDK_INPUT_EXCEPTION = 1 << 2
       -} GdkInputCondition;
       -
       -typedef enum {
          GTK_SHADOW_NONE,
          GTK_SHADOW_IN,
          GTK_SHADOW_OUT,
 (DIR) diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c
       t@@ -239,15 +239,6 @@ static void gtk_accel_group_set_id(GtkAccelGroup *accel_group, gint ind,
                                           gint ID);
        static void EnableParent(GtkWindow *window);
        
       -typedef struct _GdkInput GdkInput;
       -
       -struct _GdkInput {
       -  gint source;
       -  GdkInputCondition condition;
       -  GdkInputFunction function;
       -  gpointer data;
       -};
       -
        struct _OurSource {
          guint id;     /* Unique identifier */
        
       t@@ -646,7 +637,6 @@ HINSTANCE hInst;
        HFONT defFont;
        static HFONT urlFont;
        static GSList *WindowList = NULL;
       -static GSList *GdkInputs = NULL;
        static GSList *OurSources = NULL;
        static HWND TopLevel = NULL;
        
       t@@ -671,20 +661,8 @@ GtkObject *GtkNewObject(GtkClass *klass)
        static void DispatchSocketEvent(SOCKET sock, long event)
        {
          GSList *list;
       -  GdkInput *input;
          OurSource *s;
        
       -  for (list = GdkInputs; list; list = g_slist_next(list)) {
       -    input = (GdkInput *)(list->data);
       -    if (input->source == sock) {
       -      (*input->function) (input->data, input->source,
       -                          (event & (FD_READ | FD_CLOSE | FD_ACCEPT) ?
       -                           GDK_INPUT_READ : 0) |
       -                          (event & (FD_WRITE | FD_CONNECT) ?
       -                           GDK_INPUT_WRITE : 0));
       -      break;
       -    }
       -  }
          for (list = OurSources; list; list = g_slist_next(list)) {
            s = (OurSource *)(list->data);
            if (s->socket == sock) {
       t@@ -4482,40 +4460,6 @@ void gtk_spin_button_update(GtkSpinButton *spin_button)
        {
        }
        
       -void gdk_input_remove(gint tag)
       -{
       -  GSList *list;
       -  GdkInput *input;
       -
       -  for (list = GdkInputs; list; list = g_slist_next(list)) {
       -    input = (GdkInput *)list->data;
       -    if (input->source == tag) {
       -      WSAAsyncSelect(input->source, TopLevel, 0, 0);
       -      GdkInputs = g_slist_remove(GdkInputs, input);
       -      g_free(input);
       -      break;
       -    }
       -  }
       -}
       -
       -gint gdk_input_add(gint source, GdkInputCondition condition,
       -                   GdkInputFunction function, gpointer data)
       -{
       -  GdkInput *input;
       -
       -  input = g_new(GdkInput, 1);
       -  input->source = source;
       -  input->condition = condition;
       -  input->function = function;
       -  input->data = data;
       -  WSAAsyncSelect(source, TopLevel, MYWM_SOCKETDATA,
       -                 (condition & GDK_INPUT_READ ? FD_READ | FD_CLOSE |
       -                  FD_ACCEPT : 0) | (condition & GDK_INPUT_WRITE ?
       -                                    FD_WRITE | FD_CONNECT : 0));
       -  GdkInputs = g_slist_append(GdkInputs, input);
       -  return source;
       -}
       -
        GtkWidget *gtk_hseparator_new()
        {
          return GTK_WIDGET(GtkNewObject(&GtkHSeparatorClass));
 (DIR) diff --git a/src/gtkport/gtkport.h b/src/gtkport/gtkport.h
       t@@ -60,8 +60,6 @@ extern HICON mainIcon;
        #define GDK_KP_9 0xFFB9
        
        typedef gint (*GtkFunction) (gpointer data);
       -typedef void (*GdkInputFunction) (gpointer data, gint source,
       -                                  GdkInputCondition condition);
        typedef gchar *(*GtkTranslateFunc) (const gchar *path, gpointer func_data);
        typedef void (*GtkDestroyNotify) (gpointer data);
        
       t@@ -617,9 +615,6 @@ GtkObject *gtk_adjustment_new(gfloat value, gfloat lower, gfloat upper,
                                      gfloat page_size);
        GtkWidget *gtk_spin_button_new(GtkAdjustment *adjustment,
                                       gfloat climb_rate, guint digits);
       -void gdk_input_remove(gint tag);
       -gint gdk_input_add(gint source, GdkInputCondition condition,
       -                   GdkInputFunction function, gpointer data);
        
        guint dp_g_io_add_watch(GIOChannel *channel, GIOCondition condition,
                                GIOFunc func, gpointer user_data);
 (DIR) diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c
       t@@ -105,8 +105,8 @@ static void Jet(GtkWidget *parent);
        static void UpdateMenus(void);
        
        #ifdef NETWORKING
       -static void GetClientMessage(gpointer data, gint socket,
       -                             GdkInputCondition condition);
       +gboolean GetClientMessage(GIOChannel *source, GIOCondition condition,
       +                          gpointer data);
        void SocketStatus(NetworkBuffer *NetBuf, gboolean Read, gboolean Write,
                          gboolean Exception, gboolean CallNow);
        
       t@@ -358,8 +358,8 @@ void ListInventory(GtkWidget *widget, gpointer data)
        }
        
        #ifdef NETWORKING
       -void GetClientMessage(gpointer data, gint socket,
       -                      GdkInputCondition condition)
       +gboolean GetClientMessage(GIOChannel *source, GIOCondition condition,
       +                          gpointer data)
        {
          gchar *pt;
          NetworkBuffer *NetBuf;
       t@@ -373,9 +373,9 @@ void GetClientMessage(gpointer data, gint socket,
          oldsocks = NetBuf->sockstat;
        
          datawaiting =
       -      PlayerHandleNetwork(ClientData.Play, condition & GDK_INPUT_READ,
       -                          condition & GDK_INPUT_WRITE,
       -                          condition & GDK_INPUT_EXCEPTION, &DoneOK);
       +      PlayerHandleNetwork(ClientData.Play, condition & G_IO_IN,
       +                          condition & G_IO_OUT,
       +                          condition & G_IO_ERR, &DoneOK);
          status = NetBuf->status;
        
          /* Handle pre-game stuff */
       t@@ -405,24 +405,25 @@ void GetClientMessage(gpointer data, gint socket,
              ShutdownNetworkBuffer(&ClientData.Play->NetBuf);
            }
          }
       +  return TRUE;
        }
        
        void SocketStatus(NetworkBuffer *NetBuf, gboolean Read, gboolean Write,
                          gboolean Exception, gboolean CallNow)
        {
          if (NetBuf->InputTag)
       -    gdk_input_remove(NetBuf->InputTag);
       +    dp_g_source_remove(NetBuf->InputTag);
          NetBuf->InputTag = 0;
          if (Read || Write || Exception) {
       -    NetBuf->InputTag = gdk_input_add(NetBuf->fd,
       -                                     (Read ? GDK_INPUT_READ : 0) |
       -                                     (Write ? GDK_INPUT_WRITE : 0) |
       -                                     (Exception ? GDK_INPUT_EXCEPTION : 0),
       +    NetBuf->InputTag = dp_g_io_add_watch(NetBuf->ioch,
       +                                     (Read ? G_IO_IN : 0) |
       +                                     (Write ? G_IO_OUT : 0) |
       +                                     (Exception ? G_IO_ERR : 0),
                                             GetClientMessage,
                                             NetBuf->CallBackData);
          }
          if (CallNow)
       -    GetClientMessage(NetBuf->CallBackData, NetBuf->fd, 0);
       +    GetClientMessage(NetBuf->ioch, 0, NetBuf->CallBackData);
        }
        #endif /* NETWORKING */
        
 (DIR) diff --git a/src/network.c b/src/network.c
       t@@ -190,6 +190,7 @@ void InitNetworkBuffer(NetworkBuffer *NetBuf, char Terminator,
                               char StripChar, SocksServer *socks)
        {
          NetBuf->fd = -1;
       +  NetBuf->ioch = NULL;
          NetBuf->InputTag = 0;
          NetBuf->CallBack = NULL;
          NetBuf->CallBackData = NULL;
       t@@ -233,6 +234,12 @@ void SetNetworkBufferUserPasswdFunc(NetworkBuffer *NetBuf,
        void BindNetworkBufferToSocket(NetworkBuffer *NetBuf, int fd)
        {
          NetBuf->fd = fd;
       +#ifdef CYGIN
       +  NetBuf->ioch = g_io_channel_win32_new_socket(fd);
       +#else
       +  NetBuf->ioch = g_io_channel_unix_new(fd);
       +#endif
       +
          SetBlocking(fd, FALSE);       /* We only deal with non-blocking sockets */
          NetBuf->status = NBS_CONNECTED;       /* Assume the socket is connected */
        }
       t@@ -266,6 +273,11 @@ gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf,
        
          if (StartConnect(&NetBuf->fd, bindaddr, realhost, realport, &doneOK,
                           &NetBuf->error)) {
       +#ifdef CYGIN
       +    NetBuf->ioch = g_io_channel_win32_new_socket(NetBuf->fd);
       +#else
       +    NetBuf->ioch = g_io_channel_unix_new(NetBuf->fd);
       +#endif
            /* If we connected immediately, then set status, otherwise signal that 
             * we're waiting for the connect to complete */
            if (doneOK) {
       t@@ -298,8 +310,11 @@ void ShutdownNetworkBuffer(NetworkBuffer *NetBuf)
        {
          NetBufCallBackStop(NetBuf);
        
       -  if (NetBuf->fd >= 0)
       +  if (NetBuf->fd >= 0) {
            CloseSocket(NetBuf->fd);
       +    g_io_channel_unref(NetBuf->ioch);
       +    NetBuf->fd = -1;
       +  }
        
          FreeConnBuf(&NetBuf->ReadBuf);
          FreeConnBuf(&NetBuf->WriteBuf);
 (DIR) diff --git a/src/network.h b/src/network.h
       t@@ -133,7 +133,8 @@ typedef enum {
        /* Handles reading and writing messages from/to a network connection */
        struct _NetworkBuffer {
          int fd;                       /* File descriptor of the socket */
       -  gint InputTag;                /* Identifier for gdk_input routines */
       +  GIOChannel *ioch;             /* GLib representation of the descriptor */
       +  gint InputTag;                /* Identifier for GLib event routines */
          NBCallBack CallBack;          /* Function called when the socket
                                         * status changes */
          gpointer CallBackData;        /* Data accessible to the callback
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -1477,26 +1477,26 @@ void SocketStatus(NetworkBuffer *NetBuf, gboolean Read, gboolean Write,
                          gboolean Exception, gboolean CallNow)
        {
          if (NetBuf->InputTag)
       -    gdk_input_remove(NetBuf->InputTag);
       +    dp_g_source_remove(NetBuf->InputTag);
          NetBuf->InputTag = 0;
          if (Read || Write) {
       -    NetBuf->InputTag = gdk_input_add(NetBuf->fd,
       -                                     (Read ? GDK_INPUT_READ : 0) |
       -                                     (Write ? GDK_INPUT_WRITE : 0) |
       -                                     (Exception ? GDK_INPUT_EXCEPTION : 0),
       +    NetBuf->InputTag = dp_g_io_add_watch(NetBuf->ioch,
       +                                     (Read ? G_IO_IN : 0) |
       +                                     (Write ? G_IO_OUT : 0) |
       +                                     (Exception ? G_IO_ERR : 0),
                                             GuiHandleSocket,
                                             NetBuf->CallBackData);
          }
          if (CallNow)
       -    GuiHandleSocket(NetBuf->CallBackData, NetBuf->fd, 0);
       +    GuiHandleSocket(NetBuf->ioch, 0, NetBuf->CallBackData);
        }
        
       -static void GuiNewConnect(gpointer data, gint socket,
       -                          GdkInputCondition condition)
       +static void GuiNewConnect(GIOChannel *source, GIOCondition condition,
       +                          gpointer data)
        {
          Player *Play;
        
       -  if (condition & GDK_INPUT_READ) {
       +  if (condition & G_IO_IN) {
            Play = HandleNewConnection();
            SetNetworkBufferCallBack(&Play->NetBuf, SocketStatus, (gpointer)Play);
          }
       t@@ -1643,6 +1643,7 @@ static void SetupTaskBarIcon(GtkWidget *widget)
        void GuiServerLoop(struct CMDLINE *cmdline, gboolean is_service)
        {
          GtkWidget *window, *text, *hbox, *vbox, *entry, *label;
       +  GIOChannel *listench;
        
          if (HaveUnicodeSupport()) {
            /* GTK+2 (and the GTK emulation code on WinNT systems) expects all
       t@@ -1699,8 +1700,12 @@ void GuiServerLoop(struct CMDLINE *cmdline, gboolean is_service)
          if (!StartServer())
            return;
        
       -  ListenTag =
       -      gdk_input_add(ListenSock, GDK_INPUT_READ, GuiNewConnect, NULL);
       +#ifdef CYGIN
       +  listench = g_io_channel_win32_new_socket(ListenSock);
       +#else
       +  listench = g_io_channel_unix_new(ListenSock);
       +#endif
       +  ListenTag = dp_g_io_add_watch(listench, G_IO_IN, GuiNewConnect, NULL);
        #ifdef CYGWIN
          mainhwnd = window->hWnd;
          SetupTaskBarIcon(window);