tBug with modal dialogs and networking fixed (at least temporarily); better sta… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 641ceb86f1622dde5ede23c7b61461820464615a | |
parent 4dcd7012b54fe13702489f2c1604789ab09a0198 | |
Author: Ben Webb <[email protected]> | |
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(-) | |
--- | |
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 circumstanc… | |
+ (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 | |
diff --git a/src/gtk_client.c b/src/gtk_client.c | |
t@@ -184,7 +184,7 @@ static void LogMessage(const gchar *log_domain,GLogLevelFl… | |
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); | |
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; | |
} | |
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 */ | |
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 *NetBu… | |
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; |