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;