tBug with modal dialogs and networking fixed (at least temporarily); better status reporting with metaserver - 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 641ceb86f1622dde5ede23c7b61461820464615a
 (DIR) parent 4dcd7012b54fe13702489f2c1604789ab09a0198
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Tue,  9 Oct 2001 21:54:44 +0000
       
       Bug with modal dialogs and networking fixed (at least temporarily);
       better status reporting with metaserver
       
       
       Diffstat:
         M TODO                                |       5 +++++
         M src/gtk_client.c                    |      15 ++++++++++++++-
         M src/gtkport.c                       |      14 ++++++++++----
         M src/gtkport.h                       |       5 ++++-
         M src/network.c                       |       6 +++++-
       
       5 files changed, 38 insertions(+), 7 deletions(-)
       ---
 (DIR) diff --git a/TODO b/TODO
       t@@ -1,3 +1,8 @@
       +- Do something about modal dialogs & networking - ideally we want to suspend
       +  network processing while a modal dialog is active, otherwise you get nasty
       +  double g_free()'s, etc. when the modal dialog returns under some circumstances
       +  (Temporary fix, for GTK+ at least, is to introduce MB_IMMRETURN flag to 
       +  GtkMessageBox, which causes an immediate return, without calling gtk_main)
        - Improve error reporting for network operations (e.g. metaserver)
        - GSS_API SOCKS support?
        - Busy loop in GTK+ client on server crash - seems to be a GLib bug
 (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
       t@@ -184,7 +184,7 @@ static void LogMessage(const gchar *log_domain,GLogLevelFlags log_level,
           GtkMessageBox(NULL,message,
        /* Titles of the message boxes for warnings and errors */
                         log_level&G_LOG_LEVEL_WARNING ? _("Warning") : _("Message"),
       -                 MB_OK);
       +                 MB_OK|MB_IMMRETURN);
        }
        
        void QuitGame(GtkWidget *widget,gpointer data) {
       t@@ -2052,15 +2052,28 @@ static void HandleMetaSock(gpointer data,gint socket,
                                   GdkInputCondition condition) {
           struct StartGameStruct *widgets;
           gboolean DoneOK;
       +   NBStatus oldstatus,newstatus;
       +   gchar *text;
        
           widgets=(struct StartGameStruct *)data;
           if (!widgets->MetaConn) return;
        
       +   oldstatus = widgets->MetaConn->NetBuf.status;
       +
           if (NetBufHandleNetwork(&widgets->MetaConn->NetBuf,condition&GDK_INPUT_READ,
                                   condition&GDK_INPUT_WRITE,&DoneOK)) {
              while (HandleWaitingMetaServerData(widgets->MetaConn,
                                                 &widgets->NewMetaList,&DoneOK)) {}
           }
       +   newstatus = widgets->MetaConn->NetBuf.status;
       +   if (newstatus == NBS_SOCKSCONNECT && oldstatus==NBS_PRECONNECT) {
       +      text=g_strdup_printf(_("Status: Connected to SOCKS server %s..."),
       +                           Socks.name);
       +      SetStartGameStatus(widgets,text); g_free(text);
       +   } else if (newstatus == NBS_CONNECTED && oldstatus!=NBS_CONNECTED) {
       +      SetStartGameStatus(widgets,
       +           _("Status: Obtaining server information from metaserver"));
       +   }
           if (!DoneOK && HandleHttpCompletion(widgets->MetaConn)) {
              ConnectError(widgets,TRUE);
              CloseHttpConnection(widgets->MetaConn);
 (DIR) diff --git a/src/gtkport.c b/src/gtkport.c
       t@@ -4525,9 +4525,11 @@ gint GtkMessageBox(GtkWidget *parent,const gchar *Text,
           GtkAccelGroup *accel_group;
           gint i;
           static gint retval;
       +   gboolean imm_return;
           gchar *ButtonData[MB_MAX] = { N_("OK"), N_("Cancel"),
                                         N_("_Yes"), N_("_No") };
        
       +   imm_return = Options & MB_IMMRETURN;
           dialog=gtk_window_new(GTK_WINDOW_DIALOG);
           accel_group=gtk_accel_group_new();
           gtk_window_add_accel_group(GTK_WINDOW(dialog),accel_group);
       t@@ -4535,8 +4537,10 @@ gint GtkMessageBox(GtkWidget *parent,const gchar *Text,
           gtk_container_set_border_width(GTK_CONTAINER(dialog),7);
           if (parent) gtk_window_set_transient_for(GTK_WINDOW(dialog),
                                                    GTK_WINDOW(parent));
       -   gtk_signal_connect(GTK_OBJECT(dialog),"destroy",
       -                      GTK_SIGNAL_FUNC(DestroyGtkMessageBox),NULL);
       +   if (!imm_return) {
       +      gtk_signal_connect(GTK_OBJECT(dialog),"destroy",
       +                         GTK_SIGNAL_FUNC(DestroyGtkMessageBox),NULL);
       +   }
           if (Title) gtk_window_set_title(GTK_WINDOW(dialog),Title);
        
           vbox=gtk_vbox_new(FALSE,7);
       t@@ -4557,7 +4561,9 @@ gint GtkMessageBox(GtkWidget *parent,const gchar *Text,
                 button=gtk_button_new_with_label("");
                 SetAccelerator(button,_(ButtonData[i]),button,
                               "clicked",accel_group);
       -         gtk_object_set_data(GTK_OBJECT(button),"retval",&retval);
       +         if (!imm_return) {
       +            gtk_object_set_data(GTK_OBJECT(button),"retval",&retval);
       +         }
                 gtk_signal_connect(GTK_OBJECT(button),"clicked",
                                    GTK_SIGNAL_FUNC(GtkMessageBoxCallback),
                                    GINT_TO_POINTER(1<<i));
       t@@ -4567,7 +4573,7 @@ gint GtkMessageBox(GtkWidget *parent,const gchar *Text,
           gtk_box_pack_start(GTK_BOX(vbox),hbbox,TRUE,TRUE,0);
           gtk_container_add(GTK_CONTAINER(dialog),vbox);
           gtk_widget_show_all(dialog);
       -   gtk_main();
       +   if (!imm_return) gtk_main();
           return retval;
        }
        
 (DIR) diff --git a/src/gtkport.h b/src/gtkport.h
       t@@ -713,12 +713,15 @@ void gtk_timeout_remove(guint timeout_handler_id);
        #define MB_CANCEL 2
        #define MB_YES    4
        #define MB_NO     8
       +#define MB_MAX    4
        #define MB_YESNO  (MB_YES|MB_NO)
        #define IDOK      1
        #define IDCANCEL  2
        #define IDYES     4
        #define IDNO      8
       -#define MB_MAX    4
       +
       +/* Other flags */
       +#define MB_IMMRETURN 16
        
        #endif  /* CYGWIN */
        
 (DIR) diff --git a/src/network.c b/src/network.c
       t@@ -475,6 +475,7 @@ g_print("FIXME: SOCKS5 connect reply\n");
                    SetError(&NetBuf->error,&ETSocks,SEC_REPLYVERSION);
                 } else {
                    if (data[1]==90) {
       +               g_print("FIXME: SOCKS4 sucessful connect\n");
                       NetBuf->status = NBS_CONNECTED;
                       NetBufCallBack(NetBuf); /* status has changed */
                       retval=TRUE;
       t@@ -508,7 +509,10 @@ static gboolean DoNetworkBufferStuff(NetworkBuffer *NetBuf,gboolean ReadReady,
                 retval=FinishConnect(NetBuf->fd,&NetBuf->error);
                 ConnectDone=TRUE;
                 NetBuf->WaitConnect=FALSE;
       -         if (!NetBuf->socks) NetBuf->status = NBS_CONNECTED;
       +         if (!NetBuf->socks) {
       +g_print("FIXME: Non-SOCKS successful connect\n");
       +            NetBuf->status = NBS_CONNECTED;
       +         }
        
                 if (!retval) {
                    *WriteOK=FALSE;