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;