tGTK+ client "new game" dialog split out into its own file - 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 0b0900487675ad81cf31a8e1c559cdd267e02836
 (DIR) parent ce6614bddab8d6289b9250c15335d75c8c49efad
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Tue, 26 Feb 2002 14:16:51 +0000
       
       GTK+ client "new game" dialog split out into its own file
       
       
       Diffstat:
         M src/gui_client/Makefile.am          |       2 +-
         M src/gui_client/Makefile.in          |       6 +++---
         M src/gui_client/gtk_client.c         |     855 +------------------------------
         M src/gui_client/gtk_client.h         |       2 ++
         A src/gui_client/newgamedia.c         |     859 +++++++++++++++++++++++++++++++
         A src/gui_client/newgamedia.h         |      43 ++++++++++++++++++++++++++++++
       
       6 files changed, 921 insertions(+), 846 deletions(-)
       ---
 (DIR) diff --git a/src/gui_client/Makefile.am b/src/gui_client/Makefile.am
       t@@ -1,5 +1,5 @@
        noinst_LIBRARIES = libguiclient.a
       -libguiclient_a_SOURCES = gtk_client.c optdialog.c
       +libguiclient_a_SOURCES = gtk_client.c optdialog.c newgamedia.c
        libguiclient_a_DEPENDENCIES = @INTLLIBS@
        INCLUDES   = @GTK_CFLAGS@ -I.. -I../.. -I.
        LDADD      = @GTK_LIBS@ @INTLLIBS@
 (DIR) diff --git a/src/gui_client/Makefile.in b/src/gui_client/Makefile.in
       t@@ -94,7 +94,7 @@ WNDRES = @WNDRES@
        localedir = @localedir@
        
        noinst_LIBRARIES = libguiclient.a
       -libguiclient_a_SOURCES = gtk_client.c optdialog.c
       +libguiclient_a_SOURCES = gtk_client.c optdialog.c newgamedia.c
        libguiclient_a_DEPENDENCIES = @INTLLIBS@
        INCLUDES = @GTK_CFLAGS@ -I.. -I../.. -I.
        LDADD = @GTK_LIBS@ @INTLLIBS@
       t@@ -108,7 +108,7 @@ CPPFLAGS = @CPPFLAGS@
        LDFLAGS = @LDFLAGS@
        LIBS = @LIBS@
        libguiclient_a_LIBADD = 
       -libguiclient_a_OBJECTS =  gtk_client.o optdialog.o
       +libguiclient_a_OBJECTS =  gtk_client.o optdialog.o newgamedia.o
        AR = ar
        CFLAGS = @CFLAGS@
        COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
       t@@ -121,7 +121,7 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
        
        TAR = gtar
        GZIP_ENV = --best
       -DEP_FILES =  .deps/gtk_client.P .deps/optdialog.P
       +DEP_FILES =  .deps/gtk_client.P .deps/newgamedia.P .deps/optdialog.P
        SOURCES = $(libguiclient_a_SOURCES)
        OBJECTS = $(libguiclient_a_OBJECTS)
        
 (DIR) diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c
       t@@ -38,6 +38,7 @@
        #include "gtkport/gtkport.h"
        #include "dopewars-pill.xpm"
        #include "optdialog.h"
       +#include "newgamedia.h"
        
        #define BT_BUY  (GINT_TO_POINTER(1))
        #define BT_SELL (GINT_TO_POINTER(2))
       t@@ -46,9 +47,6 @@
        #define ET_SPY    0
        #define ET_TIPOFF 1
        
       -/* Which notebook page to display in the New Game dialog */
       -static gint NewGameType = 0;
       -
        struct InventoryWidgets {
          GtkWidget *HereList, *CarriedList;
          GtkWidget *HereFrame, *CarriedFrame;
       t@@ -75,14 +73,6 @@ struct ClientDataStruct {
        
        GtkWidget *MainWindow;
        
       -struct StartGameStruct {
       -  GtkWidget *dialog, *name, *hostname, *port, *antique, *status, *metaserv;
       -#ifdef NETWORKING
       -  HttpConnection *MetaConn;
       -  GSList *NewMetaList;
       -#endif
       -};
       -
        static struct ClientDataStruct ClientData;
        static gboolean InGame = FALSE;
        
       t@@ -97,32 +87,15 @@ static void NewGame(GtkWidget *widget, gpointer data);
        static void AbandonGame(GtkWidget *widget, gpointer data);
        static void ListScores(GtkWidget *widget, gpointer data);
        static void ListInventory(GtkWidget *widget, gpointer data);
       -static void NewGameDialog(void);
       -static void StartGame(void);
        static void EndGame(void);
        static void Jet(GtkWidget *parent);
        static void UpdateMenus(void);
        
        #ifdef NETWORKING
       -static void DisplayConnectStatus(struct StartGameStruct *widgets,
       -                                 gboolean meta, NBStatus oldstatus,
       -                                 NBSocksStatus oldsocks);
       -static void AuthDialog(HttpConnection *conn, gboolean proxyauth,
       -                       gchar *realm, gpointer data);
       -static void MetaSocksAuthDialog(NetworkBuffer *netbuf, gpointer data);
       -static void SocksAuthDialog(NetworkBuffer *netbuf, gpointer data);
        static void GetClientMessage(gpointer data, gint socket,
                                     GdkInputCondition condition);
       -static void SocketStatus(NetworkBuffer *NetBuf, gboolean Read,
       -                         gboolean Write, gboolean CallNow);
       -static void MetaSocketStatus(NetworkBuffer *NetBuf, gboolean Read,
       -                             gboolean Write, gboolean CallNow);
       -static void FinishServerConnect(struct StartGameStruct *widgets,
       -                                gboolean ConnectOK);
       -
       -/* List of servers on the metaserver */
       -static GSList *MetaList = NULL;
       -
       +void SocketStatus(NetworkBuffer *NetBuf, gboolean Read, gboolean Write,
       +                  gboolean CallNow);
        #endif /* NETWORKING */
        
        static void HandleClientMessage(char *buf, Player *Play);
       t@@ -248,7 +221,11 @@ void NewGame(GtkWidget *widget, gpointer data)
           * overwritten when we connect to a dopewars server */
          BackupConfig();
        
       -  NewGameDialog();
       +#ifdef NETWORKING
       +  NewGameDialog(ClientData.Play, SocketStatus);
       +#else
       +  NewGameDialog(ClientData.Play);
       +#endif
        }
        
        void AbandonGame(GtkWidget *widget, gpointer data)
       t@@ -342,15 +319,15 @@ void GetClientMessage(gpointer data, gint socket,
        
          status = NetBuf->status;
        
       +  /* Handle pre-game stuff */
          if (status != NBS_CONNECTED) {
            /* The start game dialog isn't visible once we're connected... */
       -    DisplayConnectStatus((struct StartGameStruct *)data, FALSE,
       -                         oldstatus, oldsocks);
       +    DisplayConnectStatus(FALSE, oldstatus, oldsocks);
          }
       -
          if (oldstatus != NBS_CONNECTED && (status == NBS_CONNECTED || !DoneOK)) {
       -    FinishServerConnect(data, DoneOK);
       +    FinishServerConnect(DoneOK);
          }
       +
          if (status == NBS_CONNECTED && datawaiting) {
            while ((pt = GetWaitingPlayerMessage(ClientData.Play)) != NULL) {
              HandleClientMessage(pt, ClientData.Play);
       t@@ -1846,7 +1823,7 @@ void QuestionDialog(char *Data, Player *From)
          g_strfreev(split);
        }
        
       -void StartGame(void)
       +void GuiStartGame(void)
        {
          Player *Play = ClientData.Play;
        
       t@@ -2295,578 +2272,6 @@ void display_intro(GtkWidget *widget, gpointer data)
          gtk_widget_show_all(dialog);
        }
        
       -static gboolean GetStartGamePlayerName(struct StartGameStruct *widgets,
       -                                       gchar **PlayerName)
       -{
       -  g_free(*PlayerName);
       -  *PlayerName = gtk_editable_get_chars(GTK_EDITABLE(widgets->name), 0, -1);
       -  if (*PlayerName && (*PlayerName)[0])
       -    return TRUE;
       -  else {
       -    GtkMessageBox(widgets->dialog,
       -                  _("You can't start the game without giving a name first!"),
       -                  _("New Game"), MB_OK);
       -    return FALSE;
       -  }
       -}
       -
       -static void SetStartGameStatus(struct StartGameStruct *widgets, gchar *msg)
       -{
       -  gtk_label_set_text(GTK_LABEL(widgets->status),
       -                     msg ? msg : _("Status: Waiting for user input"));
       -}
       -
       -#ifdef NETWORKING
       -static void ConnectError(struct StartGameStruct *widgets, gboolean meta)
       -{
       -  GString *neterr;
       -  gchar *text;
       -  LastError *error;
       -
       -  if (meta)
       -    error = widgets->MetaConn->NetBuf.error;
       -  else
       -    error = ClientData.Play->NetBuf.error;
       -
       -  neterr = g_string_new("");
       -
       -  if (error) {
       -    g_string_assign_error(neterr, error);
       -  } else {
       -    g_string_assign(neterr, _("Connection closed by remote host"));
       -  }
       -
       -  if (meta) {
       -    /* Error: GTK+ client could not connect to the metaserver */
       -    text =
       -        g_strdup_printf(_("Status: Could not connect to metaserver (%s)"),
       -                        neterr->str);
       -  } else {
       -    /* Error: GTK+ client could not connect to the given dopewars server */
       -    text =
       -        g_strdup_printf(_("Status: Could not connect (%s)"), neterr->str);
       -  }
       -
       -  SetStartGameStatus(widgets, text);
       -  g_free(text);
       -  g_string_free(neterr, TRUE);
       -}
       -
       -void FinishServerConnect(struct StartGameStruct *widgets,
       -                         gboolean ConnectOK)
       -{
       -  if (ConnectOK) {
       -    Client = Network = TRUE;
       -    gtk_widget_destroy(widgets->dialog);
       -    StartGame();
       -  } else {
       -    ConnectError(widgets, FALSE);
       -  }
       -}
       -
       -static void DoConnect(struct StartGameStruct *widgets)
       -{
       -  gchar *text;
       -  NetworkBuffer *NetBuf;
       -  NBStatus oldstatus;
       -  NBSocksStatus oldsocks;
       -
       -  NetBuf = &ClientData.Play->NetBuf;
       -
       -  /* Message displayed during the attempted connect to a dopewars server */
       -  text = g_strdup_printf(_("Status: Attempting to contact %s..."),
       -                         ServerName);
       -  SetStartGameStatus(widgets, text);
       -  g_free(text);
       -
       -  /* Terminate any existing connection attempts */
       -  ShutdownNetworkBuffer(NetBuf);
       -  if (widgets->MetaConn) {
       -    CloseHttpConnection(widgets->MetaConn);
       -    widgets->MetaConn = NULL;
       -  }
       -
       -  oldstatus = NetBuf->status;
       -  oldsocks = NetBuf->sockstat;
       -  if (StartNetworkBufferConnect(NetBuf, ServerName, Port)) {
       -    DisplayConnectStatus(widgets, FALSE, oldstatus, oldsocks);
       -    SetNetworkBufferUserPasswdFunc(NetBuf, SocksAuthDialog, NULL);
       -    SetNetworkBufferCallBack(NetBuf, SocketStatus, (gpointer)widgets);
       -  } else {
       -    ConnectError(widgets, FALSE);
       -  }
       -}
       -
       -static void ConnectToServer(GtkWidget *widget,
       -                            struct StartGameStruct *widgets)
       -{
       -  gchar *text;
       -
       -  g_free(ServerName);
       -  ServerName = gtk_editable_get_chars(GTK_EDITABLE(widgets->hostname),
       -                                      0, -1);
       -  text = gtk_editable_get_chars(GTK_EDITABLE(widgets->port), 0, -1);
       -  Port = atoi(text);
       -  g_free(text);
       -
       -  if (!GetStartGamePlayerName(widgets, &ClientData.Play->Name))
       -    return;
       -  DoConnect(widgets);
       -}
       -
       -static void FillMetaServerList(struct StartGameStruct *widgets,
       -                               gboolean UseNewList)
       -{
       -  GtkWidget *metaserv;
       -  ServerData *ThisServer;
       -  gchar *titles[5];
       -  GSList *ListPt;
       -  gint row;
       -
       -  if (UseNewList && !widgets->NewMetaList)
       -    return;
       -
       -  metaserv = widgets->metaserv;
       -  gtk_clist_freeze(GTK_CLIST(metaserv));
       -  gtk_clist_clear(GTK_CLIST(metaserv));
       -
       -  if (UseNewList) {
       -    ClearServerList(&MetaList);
       -    MetaList = widgets->NewMetaList;
       -    widgets->NewMetaList = NULL;
       -  }
       -
       -  for (ListPt = MetaList; ListPt; ListPt = g_slist_next(ListPt)) {
       -    ThisServer = (ServerData *)(ListPt->data);
       -    titles[0] = ThisServer->Name;
       -    titles[1] = g_strdup_printf("%d", ThisServer->Port);
       -    titles[2] = ThisServer->Version;
       -    if (ThisServer->CurPlayers == -1) {
       -      /* Displayed if we don't know how many players are logged on to a
       -       * server */
       -      titles[3] = _("Unknown");
       -    } else {
       -      /* e.g. "5 of 20" means 5 players are logged on to a server, out of
       -       * a maximum of 20 */
       -      titles[3] = g_strdup_printf(_("%d of %d"), ThisServer->CurPlayers,
       -                                  ThisServer->MaxPlayers);
       -    }
       -    titles[4] = ThisServer->Comment;
       -    row = gtk_clist_append(GTK_CLIST(metaserv), titles);
       -    gtk_clist_set_row_data(GTK_CLIST(metaserv), row, (gpointer)ThisServer);
       -    g_free(titles[1]);
       -    if (ThisServer->CurPlayers != -1)
       -      g_free(titles[3]);
       -  }
       -  gtk_clist_thaw(GTK_CLIST(metaserv));
       -}
       -
       -void DisplayConnectStatus(struct StartGameStruct *widgets, gboolean meta,
       -                          NBStatus oldstatus, NBSocksStatus oldsocks)
       -{
       -  NBStatus status;
       -  NBSocksStatus sockstat;
       -  gchar *text;
       -
       -  if (meta) {
       -    status = widgets->MetaConn->NetBuf.status;
       -    sockstat = widgets->MetaConn->NetBuf.sockstat;
       -  } else {
       -    status = ClientData.Play->NetBuf.status;
       -    sockstat = ClientData.Play->NetBuf.sockstat;
       -  }
       -  if (oldstatus == status && sockstat == oldsocks)
       -    return;
       -
       -  switch (status) {
       -  case NBS_PRECONNECT:
       -    break;
       -  case NBS_SOCKSCONNECT:
       -    switch (sockstat) {
       -    case NBSS_METHODS:
       -      text = g_strdup_printf(_("Status: Connected to SOCKS server %s..."),
       -                             Socks.name);
       -      SetStartGameStatus(widgets, text);
       -      g_free(text);
       -      break;
       -    case NBSS_USERPASSWD:
       -      SetStartGameStatus(widgets,
       -                         _("Status: Authenticating with SOCKS server"));
       -      break;
       -    case NBSS_CONNECT:
       -      text =
       -          g_strdup_printf(_("Status: Asking SOCKS for connect to %s..."),
       -                          meta ? MetaServer.Name : ServerName);
       -      SetStartGameStatus(widgets, text);
       -      g_free(text);
       -      break;
       -    }
       -    break;
       -  case NBS_CONNECTED:
       -    if (meta) {
       -      SetStartGameStatus(widgets,
       -                         _("Status: Obtaining server information "
       -                           "from metaserver..."));
       -    }
       -    break;
       -  }
       -}
       -
       -static void MetaDone(struct StartGameStruct *widgets)
       -{
       -  if (IsHttpError(widgets->MetaConn)) {
       -    ConnectError(widgets, TRUE);
       -  } else {
       -    SetStartGameStatus(widgets, NULL);
       -  }
       -  CloseHttpConnection(widgets->MetaConn);
       -  widgets->MetaConn = NULL;
       -  FillMetaServerList(widgets, TRUE);
       -}
       -
       -static void HandleMetaSock(gpointer data, gint socket,
       -                           GdkInputCondition condition)
       -{
       -  struct StartGameStruct *widgets;
       -  gboolean DoneOK;
       -  NBStatus oldstatus;
       -  NBSocksStatus oldsocks;
       -
       -  widgets = (struct StartGameStruct *)data;
       -  if (!widgets->MetaConn)
       -    return;
       -
       -  oldstatus = widgets->MetaConn->NetBuf.status;
       -  oldsocks = widgets->MetaConn->NetBuf.sockstat;
       -
       -  if (NetBufHandleNetwork
       -      (&widgets->MetaConn->NetBuf, condition & GDK_INPUT_READ,
       -       condition & GDK_INPUT_WRITE, &DoneOK)) {
       -    while (HandleWaitingMetaServerData
       -           (widgets->MetaConn, &widgets->NewMetaList, &DoneOK)) {
       -    }
       -  }
       -
       -  if (!DoneOK && HandleHttpCompletion(widgets->MetaConn)) {
       -    MetaDone(widgets);
       -  } else {
       -    DisplayConnectStatus(widgets, TRUE, oldstatus, oldsocks);
       -  }
       -}
       -
       -void MetaSocketStatus(NetworkBuffer *NetBuf, gboolean Read, gboolean Write,
       -                      gboolean CallNow)
       -{
       -  if (NetBuf->InputTag)
       -    gdk_input_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),
       -                                     HandleMetaSock, NetBuf->CallBackData);
       -  }
       -  if (CallNow)
       -    HandleMetaSock(NetBuf->CallBackData, NetBuf->fd, 0);
       -}
       -
       -static void UpdateMetaServerList(GtkWidget *widget,
       -                                 struct StartGameStruct *widgets)
       -{
       -  GtkWidget *metaserv;
       -  gchar *text;
       -
       -  /* Terminate any existing connection attempts */
       -  ShutdownNetworkBuffer(&ClientData.Play->NetBuf);
       -  if (widgets->MetaConn) {
       -    CloseHttpConnection(widgets->MetaConn);
       -    widgets->MetaConn = NULL;
       -  }
       -
       -  ClearServerList(&widgets->NewMetaList);
       -
       -  /* Message displayed during the attempted connect to the metaserver */
       -  text = g_strdup_printf(_("Status: Attempting to contact %s..."),
       -                         MetaServer.Name);
       -  SetStartGameStatus(widgets, text);
       -  g_free(text);
       -
       -  if (OpenMetaHttpConnection(&widgets->MetaConn)) {
       -    metaserv = widgets->metaserv;
       -    SetHttpAuthFunc(widgets->MetaConn, AuthDialog, NULL);
       -    SetNetworkBufferUserPasswdFunc(&widgets->MetaConn->NetBuf,
       -                                   MetaSocksAuthDialog, NULL);
       -    SetNetworkBufferCallBack(&widgets->MetaConn->NetBuf,
       -                             MetaSocketStatus, (gpointer)widgets);
       -  } else {
       -    ConnectError(widgets, TRUE);
       -    CloseHttpConnection(widgets->MetaConn);
       -    widgets->MetaConn = NULL;
       -  }
       -}
       -
       -static void MetaServerConnect(GtkWidget *widget,
       -                              struct StartGameStruct *widgets)
       -{
       -  GList *selection;
       -  gint row;
       -  GtkWidget *clist;
       -  ServerData *ThisServer;
       -
       -  clist = widgets->metaserv;
       -  selection = GTK_CLIST(clist)->selection;
       -  if (selection) {
       -    row = GPOINTER_TO_INT(selection->data);
       -    ThisServer = (ServerData *)gtk_clist_get_row_data(GTK_CLIST(clist), row);
       -    AssignName(&ServerName, ThisServer->Name);
       -    Port = ThisServer->Port;
       -
       -    if (!GetStartGamePlayerName(widgets, &ClientData.Play->Name))
       -      return;
       -    DoConnect(widgets);
       -  }
       -}
       -#endif /* NETWORKING */
       -
       -static void StartSinglePlayer(GtkWidget *widget,
       -                              struct StartGameStruct *widgets)
       -{
       -  WantAntique =
       -      gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->antique));
       -  if (!GetStartGamePlayerName(widgets, &ClientData.Play->Name))
       -    return;
       -  StartGame();
       -  gtk_widget_destroy(widgets->dialog);
       -}
       -
       -static void CloseNewGameDia(GtkWidget *widget,
       -                            struct StartGameStruct *widgets)
       -{
       -#ifdef NETWORKING
       -  /* Terminate any existing connection attempts */
       -  if (ClientData.Play->NetBuf.status != NBS_CONNECTED) {
       -    ShutdownNetworkBuffer(&ClientData.Play->NetBuf);
       -  }
       -  if (widgets->MetaConn) {
       -    CloseHttpConnection(widgets->MetaConn);
       -    widgets->MetaConn = NULL;
       -  }
       -  ClearServerList(&widgets->NewMetaList);
       -#endif
       -}
       -
       -void NewGameDialog(void)
       -{
       -  GtkWidget *vbox, *vbox2, *hbox, *label, *entry, *notebook;
       -  GtkWidget *frame, *button, *dialog;
       -  GtkAccelGroup *accel_group;
       -  static struct StartGameStruct widgets;
       -  guint AccelKey;
       -
       -#ifdef NETWORKING
       -  GtkWidget *clist, *scrollwin, *table, *hbbox;
       -  gchar *server_titles[5], *ServerEntry, *text;
       -  gboolean UpdateMeta = FALSE;
       -
       -  /* Column titles of metaserver information */
       -  server_titles[0] = _("Server");
       -  server_titles[1] = _("Port");
       -  server_titles[2] = _("Version");
       -  server_titles[3] = _("Players");
       -  server_titles[4] = _("Comment");
       -
       -  widgets.MetaConn = NULL;
       -  widgets.NewMetaList = NULL;
       -
       -#endif /* NETWORKING */
       -
       -  widgets.dialog = dialog = gtk_window_new(GTK_WINDOW_DIALOG);
       -  gtk_signal_connect(GTK_OBJECT(dialog), "destroy",
       -                     GTK_SIGNAL_FUNC(CloseNewGameDia), (gpointer)&widgets);
       -
       -  gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
       -  gtk_window_set_transient_for(GTK_WINDOW(dialog),
       -                               GTK_WINDOW(ClientData.window));
       -#ifdef NETWORKING
       -  gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
       -#endif
       -  accel_group = gtk_accel_group_new();
       -
       -  /* Title of 'New Game' dialog */
       -  gtk_window_set_title(GTK_WINDOW(widgets.dialog), _("New Game"));
       -  gtk_container_set_border_width(GTK_CONTAINER(widgets.dialog), 7);
       -  gtk_window_add_accel_group(GTK_WINDOW(widgets.dialog), accel_group);
       -
       -  vbox = gtk_vbox_new(FALSE, 7);
       -  hbox = gtk_hbox_new(FALSE, 7);
       -
       -  label = gtk_label_new("");
       -
       -  AccelKey = gtk_label_parse_uline(GTK_LABEL(label),
       -                                   /* Prompt for player's name in 'New
       -                                    * Game' dialog */
       -                                   _("Hey dude, what's your _name?"));
       -  gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
       -
       -  entry = widgets.name = gtk_entry_new();
       -  gtk_widget_add_accelerator(entry, "grab-focus", accel_group, AccelKey, 0,
       -                             GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE);
       -  gtk_entry_set_text(GTK_ENTRY(entry), GetPlayerName(ClientData.Play));
       -  gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
       -
       -  gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
       -
       -  notebook = gtk_notebook_new();
       -
       -#ifdef NETWORKING
       -  frame = gtk_frame_new(_("Server"));
       -  gtk_container_set_border_width(GTK_CONTAINER(frame), 4);
       -  vbox2 = gtk_vbox_new(FALSE, 7);
       -  gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
       -  table = gtk_table_new(2, 2, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 4);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 4);
       -
       -  /* Prompt for hostname to connect to in GTK+ new game dialog */
       -  label = gtk_label_new(_("Host name"));
       -
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       -  entry = widgets.hostname = gtk_entry_new();
       -
       -  ServerEntry = "localhost";
       -  if (g_strcasecmp(ServerName, SN_META) == 0) {
       -    NewGameType = 2;
       -    UpdateMeta = TRUE;
       -  } else if (g_strcasecmp(ServerName, SN_PROMPT) == 0)
       -    NewGameType = 0;
       -  else if (g_strcasecmp(ServerName, SN_SINGLE) == 0)
       -    NewGameType = 1;
       -  else
       -    ServerEntry = ServerName;
       -
       -  gtk_entry_set_text(GTK_ENTRY(entry), ServerEntry);
       -  gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 0, 1,
       -                   GTK_EXPAND | GTK_SHRINK | GTK_FILL,
       -                   GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       -  label = gtk_label_new(_("Port"));
       -  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
       -                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       -  entry = widgets.port = gtk_entry_new();
       -  text = g_strdup_printf("%d", Port);
       -  gtk_entry_set_text(GTK_ENTRY(entry), text);
       -  g_free(text);
       -  gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 1, 2,
       -                   GTK_EXPAND | GTK_SHRINK | GTK_FILL,
       -                   GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       -
       -  gtk_box_pack_start(GTK_BOX(vbox2), table, FALSE, FALSE, 0);
       -
       -  button = gtk_button_new_with_label("");
       -  /* Button to connect to a named dopewars server */
       -  SetAccelerator(button, _("_Connect"), button, "clicked", accel_group);
       -  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       -                     GTK_SIGNAL_FUNC(ConnectToServer), (gpointer)&widgets);
       -  gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
       -  gtk_container_add(GTK_CONTAINER(frame), vbox2);
       -  GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
       -  gtk_widget_grab_default(button);
       -
       -  label = gtk_label_new(_("Server"));
       -  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
       -#endif /* NETWORKING */
       -
       -  /* Title of 'New Game' dialog notebook tab for single-player mode */
       -  frame = gtk_frame_new(_("Single player"));
       -  gtk_container_set_border_width(GTK_CONTAINER(frame), 4);
       -  vbox2 = gtk_vbox_new(FALSE, 7);
       -  gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
       -  widgets.antique = gtk_check_button_new_with_label("");
       -
       -  /* Checkbox to activate 'antique mode' in single-player games */
       -  SetAccelerator(widgets.antique, _("_Antique mode"), widgets.antique,
       -                 "clicked", accel_group);
       -  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets.antique),
       -                               WantAntique);
       -  gtk_box_pack_start(GTK_BOX(vbox2), widgets.antique, FALSE, FALSE, 0);
       -  button = gtk_button_new_with_label("");
       -
       -  /* Button to start a new single-player (standalone, non-network) game */
       -  SetAccelerator(button, _("_Start single-player game"), button,
       -                 "clicked", accel_group);
       -
       -  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       -                     GTK_SIGNAL_FUNC(StartSinglePlayer),
       -                     (gpointer)&widgets);
       -  gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
       -  gtk_container_add(GTK_CONTAINER(frame), vbox2);
       -  label = gtk_label_new(_("Single player"));
       -  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
       -
       -#ifdef NETWORKING
       -  /* Title of Metaserver frame in New Game dialog */
       -  frame = gtk_frame_new(_("Metaserver"));
       -  gtk_container_set_border_width(GTK_CONTAINER(frame), 4);
       -
       -  vbox2 = gtk_vbox_new(FALSE, 7);
       -  gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
       -
       -  clist = widgets.metaserv =
       -      gtk_scrolled_clist_new_with_titles(5, server_titles, &scrollwin);
       -  gtk_clist_column_titles_passive(GTK_CLIST(clist));
       -  gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE);
       -  gtk_clist_set_column_width(GTK_CLIST(clist), 0, 130);
       -  gtk_clist_set_column_width(GTK_CLIST(clist), 1, 35);
       -
       -  gtk_box_pack_start(GTK_BOX(vbox2), scrollwin, TRUE, TRUE, 0);
       -
       -  hbbox = gtk_hbutton_box_new();
       -  button = gtk_button_new_with_label("");
       -
       -  /* Button to update metaserver information */
       -  SetAccelerator(button, _("_Update"), button, "clicked", accel_group);
       -  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       -                     GTK_SIGNAL_FUNC(UpdateMetaServerList),
       -                     (gpointer)&widgets);
       -  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       -
       -  button = gtk_button_new_with_label("");
       -  SetAccelerator(button, _("_Connect"), button, "clicked", accel_group);
       -  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       -                     GTK_SIGNAL_FUNC(MetaServerConnect),
       -                     (gpointer)&widgets);
       -  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       -
       -  gtk_box_pack_start(GTK_BOX(vbox2), hbbox, FALSE, FALSE, 0);
       -  gtk_container_add(GTK_CONTAINER(frame), vbox2);
       -
       -  label = gtk_label_new(_("Metaserver"));
       -  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
       -#endif /* NETWORKING */
       -
       -  gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
       -
       -  /* Caption of status label in New Game dialog before anything has
       -   * happened */
       -  label = widgets.status = gtk_label_new("");
       -  gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
       -
       -  gtk_container_add(GTK_CONTAINER(widgets.dialog), vbox);
       -
       -  gtk_widget_grab_focus(widgets.name);
       -#ifdef NETWORKING
       -  if (UpdateMeta) {
       -    UpdateMetaServerList(NULL, &widgets);
       -  } else {
       -    FillMetaServerList(&widgets, FALSE);
       -  }
       -#endif
       -
       -  SetStartGameStatus(&widgets, NULL);
       -  gtk_widget_show_all(widgets.dialog);
       -  gtk_notebook_set_page(GTK_NOTEBOOK(notebook), NewGameType);
       -}
       -
        static void SendDoneMessage(GtkWidget *widget, gpointer data)
        {
          SendClientMessage(ClientData.Play, C_NONE, C_DONE, NULL, NULL);
       t@@ -3692,237 +3097,3 @@ void DisplaySpyReports(Player *Play)
        
          gtk_widget_show_all(notebook);
        }
       -
       -#ifdef NETWORKING
       -static void OKAuthDialog(GtkWidget *widget, GtkWidget *window)
       -{
       -  gtk_object_set_data(GTK_OBJECT(window), "authok", GINT_TO_POINTER(TRUE));
       -  gtk_widget_destroy(window);
       -}
       -
       -static void DestroyAuthDialog(GtkWidget *window, gpointer data)
       -{
       -  GtkWidget *userentry, *passwdentry;
       -  gchar *username = NULL, *password = NULL;
       -  gpointer proxy, authok;
       -  HttpConnection *conn;
       -
       -  authok = gtk_object_get_data(GTK_OBJECT(window), "authok");
       -  proxy = gtk_object_get_data(GTK_OBJECT(window), "proxy");
       -  userentry =
       -      (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), "username");
       -  passwdentry =
       -      (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), "password");
       -  conn =
       -      (HttpConnection *)gtk_object_get_data(GTK_OBJECT(window),
       -                                            "httpconn");
       -  g_assert(userentry && passwdentry && conn);
       -
       -  if (authok) {
       -    username = gtk_editable_get_chars(GTK_EDITABLE(userentry), 0, -1);
       -    password = gtk_editable_get_chars(GTK_EDITABLE(passwdentry), 0, -1);
       -  }
       -
       -  SetHttpAuthentication(conn, GPOINTER_TO_INT(proxy), username, password);
       -
       -  g_free(username);
       -  g_free(password);
       -}
       -
       -void AuthDialog(HttpConnection *conn, gboolean proxy, gchar *realm,
       -                gpointer data)
       -{
       -  GtkWidget *window, *button, *hsep, *vbox, *label, *entry, *table, *hbbox;
       -
       -  window = gtk_window_new(GTK_WINDOW_DIALOG);
       -  gtk_signal_connect(GTK_OBJECT(window), "destroy",
       -                     GTK_SIGNAL_FUNC(DestroyAuthDialog), NULL);
       -  gtk_object_set_data(GTK_OBJECT(window), "proxy", GINT_TO_POINTER(proxy));
       -  gtk_object_set_data(GTK_OBJECT(window), "httpconn", (gpointer)conn);
       -
       -  if (proxy) {
       -    gtk_window_set_title(GTK_WINDOW(window),
       -                         /* Title of dialog for authenticating with a
       -                          * proxy server */
       -                         _("Proxy Authentication Required"));
       -  } else {
       -    /* Title of dialog for authenticating with a web server */
       -    gtk_window_set_title(GTK_WINDOW(window), _("Authentication Required"));
       -  }
       -
       -  gtk_window_set_modal(GTK_WINDOW(window), TRUE);
       -  gtk_window_set_transient_for(GTK_WINDOW(window),
       -                               GTK_WINDOW(ClientData.window));
       -  gtk_container_set_border_width(GTK_CONTAINER(window), 7);
       -
       -  vbox = gtk_vbox_new(FALSE, 7);
       -
       -  table = gtk_table_new(3, 2, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 10);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       -
       -  label = gtk_label_new("Realm:");
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
       -
       -  label = gtk_label_new(realm);
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1);
       -
       -  label = gtk_label_new("User name:");
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
       -
       -  entry = gtk_entry_new();
       -  gtk_object_set_data(GTK_OBJECT(window), "username", (gpointer)entry);
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2);
       -
       -  label = gtk_label_new("Password:");
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3);
       -
       -  entry = gtk_entry_new();
       -  gtk_object_set_data(GTK_OBJECT(window), "password", (gpointer)entry);
       -
       -#ifdef HAVE_FIXED_GTK
       -  /* GTK+ versions earlier than 1.2.10 do bad things with this */
       -  gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
       -#endif
       -
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 2, 3);
       -
       -  gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
       -
       -  hsep = gtk_hseparator_new();
       -  gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0);
       -
       -  hbbox = gtk_hbutton_box_new();
       -
       -  button = gtk_button_new_with_label(_("OK"));
       -  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       -                     GTK_SIGNAL_FUNC(OKAuthDialog), (gpointer)window);
       -  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       -
       -  button = gtk_button_new_with_label(_("Cancel"));
       -  gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
       -                            GTK_SIGNAL_FUNC(gtk_widget_destroy),
       -                            (gpointer)window);
       -  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       -
       -  gtk_box_pack_start(GTK_BOX(vbox), hbbox, TRUE, TRUE, 0);
       -
       -  gtk_container_add(GTK_CONTAINER(window), vbox);
       -  gtk_widget_show_all(window);
       -}
       -
       -static void OKSocksAuth(GtkWidget *widget, GtkWidget *window)
       -{
       -  gtk_object_set_data(GTK_OBJECT(window), "authok", GINT_TO_POINTER(TRUE));
       -  gtk_widget_destroy(window);
       -}
       -
       -static void DestroySocksAuth(GtkWidget *window, gpointer data)
       -{
       -  GtkWidget *userentry, *passwdentry;
       -  gchar *username = NULL, *password = NULL;
       -  gpointer authok, meta;
       -  NetworkBuffer *netbuf;
       -
       -  authok = gtk_object_get_data(GTK_OBJECT(window), "authok");
       -  meta = gtk_object_get_data(GTK_OBJECT(window), "meta");
       -  userentry =
       -      (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), "username");
       -  passwdentry =
       -      (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), "password");
       -  netbuf =
       -      (NetworkBuffer *)gtk_object_get_data(GTK_OBJECT(window), "netbuf");
       -
       -  g_assert(userentry && passwdentry && netbuf);
       -
       -  if (authok) {
       -    username = gtk_editable_get_chars(GTK_EDITABLE(userentry), 0, -1);
       -    password = gtk_editable_get_chars(GTK_EDITABLE(passwdentry), 0, -1);
       -  }
       -
       -  SendSocks5UserPasswd(netbuf, username, password);
       -  g_free(username);
       -  g_free(password);
       -}
       -
       -static void RealSocksAuthDialog(NetworkBuffer *netbuf, gboolean meta,
       -                                gpointer data)
       -{
       -  GtkWidget *window, *button, *hsep, *vbox, *label, *entry, *table, *hbbox;
       -
       -  window = gtk_window_new(GTK_WINDOW_DIALOG);
       -  gtk_signal_connect(GTK_OBJECT(window), "destroy",
       -                     GTK_SIGNAL_FUNC(DestroySocksAuth), NULL);
       -  gtk_object_set_data(GTK_OBJECT(window), "netbuf", (gpointer)netbuf);
       -  gtk_object_set_data(GTK_OBJECT(window), "meta", GINT_TO_POINTER(meta));
       -
       -  /* Title of dialog for authenticating with a SOCKS server */
       -  gtk_window_set_title(GTK_WINDOW(window),
       -                       _("SOCKS Authentication Required"));
       -
       -  gtk_window_set_modal(GTK_WINDOW(window), TRUE);
       -  gtk_window_set_transient_for(GTK_WINDOW(window),
       -                               GTK_WINDOW(ClientData.window));
       -  gtk_container_set_border_width(GTK_CONTAINER(window), 7);
       -
       -  vbox = gtk_vbox_new(FALSE, 7);
       -
       -  table = gtk_table_new(2, 2, FALSE);
       -  gtk_table_set_row_spacings(GTK_TABLE(table), 10);
       -  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       -
       -  label = gtk_label_new("User name:");
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
       -
       -  entry = gtk_entry_new();
       -  gtk_object_set_data(GTK_OBJECT(window), "username", (gpointer)entry);
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 0, 1);
       -
       -  label = gtk_label_new("Password:");
       -  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
       -
       -  entry = gtk_entry_new();
       -  gtk_object_set_data(GTK_OBJECT(window), "password", (gpointer)entry);
       -
       -#ifdef HAVE_FIXED_GTK
       -  /* GTK+ versions earlier than 1.2.10 do bad things with this */
       -  gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
       -#endif
       -
       -  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2);
       -
       -  gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
       -
       -  hsep = gtk_hseparator_new();
       -  gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0);
       -
       -  hbbox = gtk_hbutton_box_new();
       -
       -  button = gtk_button_new_with_label(_("OK"));
       -  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       -                     GTK_SIGNAL_FUNC(OKSocksAuth), (gpointer)window);
       -  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       -
       -  button = gtk_button_new_with_label(_("Cancel"));
       -  gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
       -                            GTK_SIGNAL_FUNC(gtk_widget_destroy),
       -                            (gpointer)window);
       -  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       -
       -  gtk_box_pack_start(GTK_BOX(vbox), hbbox, TRUE, TRUE, 0);
       -
       -  gtk_container_add(GTK_CONTAINER(window), vbox);
       -  gtk_widget_show_all(window);
       -}
       -
       -void MetaSocksAuthDialog(NetworkBuffer *netbuf, gpointer data)
       -{
       -  RealSocksAuthDialog(netbuf, TRUE, data);
       -}
       -
       -void SocksAuthDialog(NetworkBuffer *netbuf, gpointer data)
       -{
       -  RealSocksAuthDialog(netbuf, FALSE, data);
       -}
       -
       -#endif /* NETWORKING */
 (DIR) diff --git a/src/gui_client/gtk_client.h b/src/gui_client/gtk_client.h
       t@@ -38,4 +38,6 @@ gboolean GtkLoop(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        gboolean GtkLoop(int *argc, char **argv[], gboolean ReturnOnFail);
        #endif
        
       +void GuiStartGame(void);
       +
        #endif
 (DIR) diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c
       t@@ -0,0 +1,859 @@
       +/************************************************************************
       + * newgamedia.c   New game dialog                                       *
       + * Copyright (C)  1998-2002  Ben Webb                                   *
       + *                Email: ben@bellatrix.pcl.ox.ac.uk                     *
       + *                WWW: http://dopewars.sourceforge.net/                 *
       + *                                                                      *
       + * This program is free software; you can redistribute it and/or        *
       + * modify it under the terms of the GNU General Public License          *
       + * as published by the Free Software Foundation; either version 2       *
       + * of the License, or (at your option) any later version.               *
       + *                                                                      *
       + * This program is distributed in the hope that it will be useful,      *
       + * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
       + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
       + * GNU General Public License for more details.                         *
       + *                                                                      *
       + * You should have received a copy of the GNU General Public License    *
       + * along with this program; if not, write to the Free Software          *
       + * Foundation, Inc., 59 Temple Place - Suite 330, Boston,               *
       + *                   MA  02111-1307, USA.                               *
       + ************************************************************************/
       +
       +#ifdef HAVE_CONFIG_H
       +#include <config.h>
       +#endif
       +
       +#include <stdlib.h>              /* For atoi */
       +#include <glib.h>
       +
       +#include "dopewars.h"
       +#include "network.h"
       +#include "message.h"
       +#include "nls.h"
       +#include "gtkport/gtkport.h"
       +#include "gtk_client.h"
       +#include "newgamedia.h"
       +
       +struct StartGameStruct {
       +  GtkWidget *dialog, *name, *hostname, *port, *antique, *status, *metaserv;
       +  Player *play;
       +#ifdef NETWORKING
       +  HttpConnection *MetaConn;
       +  GSList *NewMetaList;
       +  NBCallBack sockstat;
       +#endif
       +};
       +
       +static struct StartGameStruct stgam;
       +
       +#ifdef NETWORKING
       +static void AuthDialog(HttpConnection *conn, gboolean proxyauth,
       +                       gchar *realm, gpointer data);
       +static void MetaSocksAuthDialog(NetworkBuffer *netbuf, gpointer data);
       +static void SocksAuthDialog(NetworkBuffer *netbuf, gpointer data);
       +static void MetaSocketStatus(NetworkBuffer *NetBuf, gboolean Read,
       +                             gboolean Write, gboolean CallNow);
       +
       +/* List of servers on the metaserver */
       +static GSList *MetaList = NULL;
       +
       +#endif /* NETWORKING */
       +
       +/* Which notebook page to display in the New Game dialog */
       +static gint NewGameType = 0;
       +
       +static gboolean GetStartGamePlayerName(gchar **PlayerName)
       +{
       +  g_free(*PlayerName);
       +  *PlayerName = gtk_editable_get_chars(GTK_EDITABLE(stgam.name), 0, -1);
       +  if (*PlayerName && (*PlayerName)[0])
       +    return TRUE;
       +  else {
       +    GtkMessageBox(stgam.dialog,
       +                  _("You can't start the game without giving a name first!"),
       +                  _("New Game"), MB_OK);
       +    return FALSE;
       +  }
       +}
       +
       +static void SetStartGameStatus(gchar *msg)
       +{
       +  gtk_label_set_text(GTK_LABEL(stgam.status),
       +                     msg ? msg : _("Status: Waiting for user input"));
       +}
       +
       +#ifdef NETWORKING
       +static void ConnectError(gboolean meta)
       +{
       +  GString *neterr;
       +  gchar *text;
       +  LastError *error;
       +
       +  if (meta)
       +    error = stgam.MetaConn->NetBuf.error;
       +  else
       +    error = stgam.play->NetBuf.error;
       +
       +  neterr = g_string_new("");
       +
       +  if (error) {
       +    g_string_assign_error(neterr, error);
       +  } else {
       +    g_string_assign(neterr, _("Connection closed by remote host"));
       +  }
       +
       +  if (meta) {
       +    /* Error: GTK+ client could not connect to the metaserver */
       +    text =
       +        g_strdup_printf(_("Status: Could not connect to metaserver (%s)"),
       +                        neterr->str);
       +  } else {
       +    /* Error: GTK+ client could not connect to the given dopewars server */
       +    text =
       +        g_strdup_printf(_("Status: Could not connect (%s)"), neterr->str);
       +  }
       +
       +  SetStartGameStatus(text);
       +  g_free(text);
       +  g_string_free(neterr, TRUE);
       +}
       +
       +void FinishServerConnect(gboolean ConnectOK)
       +{
       +  if (ConnectOK) {
       +    Client = Network = TRUE;
       +    gtk_widget_destroy(stgam.dialog);
       +    GuiStartGame();
       +  } else {
       +    ConnectError(FALSE);
       +  }
       +}
       +
       +static void DoConnect(void)
       +{
       +  gchar *text;
       +  NetworkBuffer *NetBuf;
       +  NBStatus oldstatus;
       +  NBSocksStatus oldsocks;
       +
       +  NetBuf = &stgam.play->NetBuf;
       +
       +  /* Message displayed during the attempted connect to a dopewars server */
       +  text = g_strdup_printf(_("Status: Attempting to contact %s..."),
       +                         ServerName);
       +  SetStartGameStatus(text);
       +  g_free(text);
       +
       +  /* Terminate any existing connection attempts */
       +  ShutdownNetworkBuffer(NetBuf);
       +  if (stgam.MetaConn) {
       +    CloseHttpConnection(stgam.MetaConn);
       +    stgam.MetaConn = NULL;
       +  }
       +
       +  oldstatus = NetBuf->status;
       +  oldsocks = NetBuf->sockstat;
       +  if (StartNetworkBufferConnect(NetBuf, ServerName, Port)) {
       +    DisplayConnectStatus(FALSE, oldstatus, oldsocks);
       +    SetNetworkBufferUserPasswdFunc(NetBuf, SocksAuthDialog, NULL);
       +    SetNetworkBufferCallBack(NetBuf, stgam.sockstat, NULL);
       +  } else {
       +    ConnectError(FALSE);
       +  }
       +}
       +
       +static void ConnectToServer(GtkWidget *widget, gpointer data)
       +{
       +  gchar *text;
       +
       +  g_free(ServerName);
       +  ServerName = gtk_editable_get_chars(GTK_EDITABLE(stgam.hostname),
       +                                      0, -1);
       +  text = gtk_editable_get_chars(GTK_EDITABLE(stgam.port), 0, -1);
       +  Port = atoi(text);
       +  g_free(text);
       +
       +  if (GetStartGamePlayerName(&stgam.play->Name)) {
       +    DoConnect();
       +  }
       +}
       +
       +static void FillMetaServerList(gboolean UseNewList)
       +{
       +  GtkWidget *metaserv;
       +  ServerData *ThisServer;
       +  gchar *titles[5];
       +  GSList *ListPt;
       +  gint row;
       +
       +  if (UseNewList && !stgam.NewMetaList)
       +    return;
       +
       +  metaserv = stgam.metaserv;
       +  gtk_clist_freeze(GTK_CLIST(metaserv));
       +  gtk_clist_clear(GTK_CLIST(metaserv));
       +
       +  if (UseNewList) {
       +    ClearServerList(&MetaList);
       +    MetaList = stgam.NewMetaList;
       +    stgam.NewMetaList = NULL;
       +  }
       +
       +  for (ListPt = MetaList; ListPt; ListPt = g_slist_next(ListPt)) {
       +    ThisServer = (ServerData *)(ListPt->data);
       +    titles[0] = ThisServer->Name;
       +    titles[1] = g_strdup_printf("%d", ThisServer->Port);
       +    titles[2] = ThisServer->Version;
       +    if (ThisServer->CurPlayers == -1) {
       +      /* Displayed if we don't know how many players are logged on to a
       +       * server */
       +      titles[3] = _("Unknown");
       +    } else {
       +      /* e.g. "5 of 20" means 5 players are logged on to a server, out of
       +       * a maximum of 20 */
       +      titles[3] = g_strdup_printf(_("%d of %d"), ThisServer->CurPlayers,
       +                                  ThisServer->MaxPlayers);
       +    }
       +    titles[4] = ThisServer->Comment;
       +    row = gtk_clist_append(GTK_CLIST(metaserv), titles);
       +    gtk_clist_set_row_data(GTK_CLIST(metaserv), row, (gpointer)ThisServer);
       +    g_free(titles[1]);
       +    if (ThisServer->CurPlayers != -1)
       +      g_free(titles[3]);
       +  }
       +  gtk_clist_thaw(GTK_CLIST(metaserv));
       +}
       +
       +void DisplayConnectStatus(gboolean meta,
       +                          NBStatus oldstatus, NBSocksStatus oldsocks)
       +{
       +  NBStatus status;
       +  NBSocksStatus sockstat;
       +  gchar *text;
       +
       +  if (meta) {
       +    status = stgam.MetaConn->NetBuf.status;
       +    sockstat = stgam.MetaConn->NetBuf.sockstat;
       +  } else {
       +    status = stgam.play->NetBuf.status;
       +    sockstat = stgam.play->NetBuf.sockstat;
       +  }
       +  if (oldstatus == status && sockstat == oldsocks)
       +    return;
       +
       +  switch (status) {
       +  case NBS_PRECONNECT:
       +    break;
       +  case NBS_SOCKSCONNECT:
       +    switch (sockstat) {
       +    case NBSS_METHODS:
       +      text = g_strdup_printf(_("Status: Connected to SOCKS server %s..."),
       +                             Socks.name);
       +      SetStartGameStatus(text);
       +      g_free(text);
       +      break;
       +    case NBSS_USERPASSWD:
       +      SetStartGameStatus(_("Status: Authenticating with SOCKS server"));
       +      break;
       +    case NBSS_CONNECT:
       +      text =
       +          g_strdup_printf(_("Status: Asking SOCKS for connect to %s..."),
       +                          meta ? MetaServer.Name : ServerName);
       +      SetStartGameStatus(text);
       +      g_free(text);
       +      break;
       +    }
       +    break;
       +  case NBS_CONNECTED:
       +    if (meta) {
       +      SetStartGameStatus(_("Status: Obtaining server information "
       +                           "from metaserver..."));
       +    }
       +    break;
       +  }
       +}
       +
       +static void MetaDone(void)
       +{
       +  if (IsHttpError(stgam.MetaConn)) {
       +    ConnectError(TRUE);
       +  } else {
       +    SetStartGameStatus(NULL);
       +  }
       +  CloseHttpConnection(stgam.MetaConn);
       +  stgam.MetaConn = NULL;
       +  FillMetaServerList(TRUE);
       +}
       +
       +static void HandleMetaSock(gpointer data, gint socket,
       +                           GdkInputCondition condition)
       +{
       +  gboolean DoneOK;
       +  NBStatus oldstatus;
       +  NBSocksStatus oldsocks;
       +
       +  if (!stgam.MetaConn)
       +    return;
       +
       +  oldstatus = stgam.MetaConn->NetBuf.status;
       +  oldsocks = stgam.MetaConn->NetBuf.sockstat;
       +
       +  if (NetBufHandleNetwork
       +      (&stgam.MetaConn->NetBuf, condition & GDK_INPUT_READ,
       +       condition & GDK_INPUT_WRITE, &DoneOK)) {
       +    while (HandleWaitingMetaServerData
       +           (stgam.MetaConn, &stgam.NewMetaList, &DoneOK)) {
       +    }
       +  }
       +
       +  if (!DoneOK && HandleHttpCompletion(stgam.MetaConn)) {
       +    MetaDone();
       +  } else {
       +    DisplayConnectStatus(TRUE, oldstatus, oldsocks);
       +  }
       +}
       +
       +static void MetaSocketStatus(NetworkBuffer *NetBuf, gboolean Read,
       +                             gboolean Write, gboolean CallNow)
       +{
       +  if (NetBuf->InputTag)
       +    gdk_input_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),
       +                                     HandleMetaSock, NetBuf->CallBackData);
       +  }
       +  if (CallNow)
       +    HandleMetaSock(NetBuf->CallBackData, NetBuf->fd, 0);
       +}
       +
       +static void UpdateMetaServerList(GtkWidget *widget)
       +{
       +  GtkWidget *metaserv;
       +  gchar *text;
       +
       +  /* Terminate any existing connection attempts */
       +  ShutdownNetworkBuffer(&stgam.play->NetBuf);
       +  if (stgam.MetaConn) {
       +    CloseHttpConnection(stgam.MetaConn);
       +    stgam.MetaConn = NULL;
       +  }
       +
       +  ClearServerList(&stgam.NewMetaList);
       +
       +  /* Message displayed during the attempted connect to the metaserver */
       +  text = g_strdup_printf(_("Status: Attempting to contact %s..."),
       +                         MetaServer.Name);
       +  SetStartGameStatus(text);
       +  g_free(text);
       +
       +  if (OpenMetaHttpConnection(&stgam.MetaConn)) {
       +    metaserv = stgam.metaserv;
       +    SetHttpAuthFunc(stgam.MetaConn, AuthDialog, NULL);
       +    SetNetworkBufferUserPasswdFunc(&stgam.MetaConn->NetBuf,
       +                                   MetaSocksAuthDialog, NULL);
       +    SetNetworkBufferCallBack(&stgam.MetaConn->NetBuf,
       +                             MetaSocketStatus, NULL);
       +  } else {
       +    ConnectError(TRUE);
       +    CloseHttpConnection(stgam.MetaConn);
       +    stgam.MetaConn = NULL;
       +  }
       +}
       +
       +static void MetaServerConnect(GtkWidget *widget, gpointer data)
       +{
       +  GList *selection;
       +  gint row;
       +  GtkWidget *clist;
       +  ServerData *ThisServer;
       +
       +  clist = stgam.metaserv;
       +  selection = GTK_CLIST(clist)->selection;
       +  if (selection) {
       +    row = GPOINTER_TO_INT(selection->data);
       +    ThisServer = (ServerData *)gtk_clist_get_row_data(GTK_CLIST(clist), row);
       +    AssignName(&ServerName, ThisServer->Name);
       +    Port = ThisServer->Port;
       +
       +    if (GetStartGamePlayerName(&stgam.play->Name)) {
       +      DoConnect();
       +    }
       +  }
       +}
       +#endif /* NETWORKING */
       +
       +static void StartSinglePlayer(GtkWidget *widget, gpointer data)
       +{
       +  WantAntique =
       +      gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stgam.antique));
       +  if (!GetStartGamePlayerName(&stgam.play->Name))
       +    return;
       +  GuiStartGame();
       +  gtk_widget_destroy(stgam.dialog);
       +}
       +
       +static void CloseNewGameDia(GtkWidget *widget, gpointer data)
       +{
       +#ifdef NETWORKING
       +  /* Terminate any existing connection attempts */
       +  if (stgam.play->NetBuf.status != NBS_CONNECTED) {
       +    ShutdownNetworkBuffer(&stgam.play->NetBuf);
       +  }
       +  if (stgam.MetaConn) {
       +    CloseHttpConnection(stgam.MetaConn);
       +    stgam.MetaConn = NULL;
       +  }
       +  ClearServerList(&stgam.NewMetaList);
       +#endif
       +}
       +
       +#ifdef NETWORKING
       +void NewGameDialog(Player *play, NBCallBack sockstat)
       +#else
       +void NewGameDialog(Player *play)
       +#endif
       +{
       +  GtkWidget *vbox, *vbox2, *hbox, *label, *entry, *notebook;
       +  GtkWidget *frame, *button, *dialog;
       +  GtkAccelGroup *accel_group;
       +  guint AccelKey;
       +
       +#ifdef NETWORKING
       +  GtkWidget *clist, *scrollwin, *table, *hbbox;
       +  gchar *server_titles[5], *ServerEntry, *text;
       +  gboolean UpdateMeta = FALSE;
       +
       +  /* Column titles of metaserver information */
       +  server_titles[0] = _("Server");
       +  server_titles[1] = _("Port");
       +  server_titles[2] = _("Version");
       +  server_titles[3] = _("Players");
       +  server_titles[4] = _("Comment");
       +
       +  stgam.MetaConn = NULL;
       +  stgam.NewMetaList = NULL;
       +  stgam.sockstat = sockstat;
       +
       +#endif /* NETWORKING */
       +
       +  stgam.play = play;
       +  stgam.dialog = dialog = gtk_window_new(GTK_WINDOW_DIALOG);
       +  gtk_signal_connect(GTK_OBJECT(dialog), "destroy",
       +                     GTK_SIGNAL_FUNC(CloseNewGameDia), NULL);
       +
       +  gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
       +  gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(MainWindow));
       +#ifdef NETWORKING
       +  gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
       +#endif
       +  accel_group = gtk_accel_group_new();
       +
       +  /* Title of 'New Game' dialog */
       +  gtk_window_set_title(GTK_WINDOW(dialog), _("New Game"));
       +  gtk_container_set_border_width(GTK_CONTAINER(dialog), 7);
       +  gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group);
       +
       +  vbox = gtk_vbox_new(FALSE, 7);
       +  hbox = gtk_hbox_new(FALSE, 7);
       +
       +  label = gtk_label_new("");
       +
       +  AccelKey = gtk_label_parse_uline(GTK_LABEL(label),
       +                                   /* Prompt for player's name in 'New
       +                                    * Game' dialog */
       +                                   _("Hey dude, what's your _name?"));
       +  gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
       +
       +  entry = stgam.name = gtk_entry_new();
       +  gtk_widget_add_accelerator(entry, "grab-focus", accel_group, AccelKey, 0,
       +                             GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE);
       +  gtk_entry_set_text(GTK_ENTRY(entry), GetPlayerName(stgam.play));
       +  gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
       +
       +  gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
       +
       +  notebook = gtk_notebook_new();
       +
       +#ifdef NETWORKING
       +  frame = gtk_frame_new(_("Server"));
       +  gtk_container_set_border_width(GTK_CONTAINER(frame), 4);
       +  vbox2 = gtk_vbox_new(FALSE, 7);
       +  gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
       +  table = gtk_table_new(2, 2, FALSE);
       +  gtk_table_set_row_spacings(GTK_TABLE(table), 4);
       +  gtk_table_set_col_spacings(GTK_TABLE(table), 4);
       +
       +  /* Prompt for hostname to connect to in GTK+ new game dialog */
       +  label = gtk_label_new(_("Host name"));
       +
       +  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
       +                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  entry = stgam.hostname = gtk_entry_new();
       +
       +  ServerEntry = "localhost";
       +  if (g_strcasecmp(ServerName, SN_META) == 0) {
       +    NewGameType = 2;
       +    UpdateMeta = TRUE;
       +  } else if (g_strcasecmp(ServerName, SN_PROMPT) == 0)
       +    NewGameType = 0;
       +  else if (g_strcasecmp(ServerName, SN_SINGLE) == 0)
       +    NewGameType = 1;
       +  else
       +    ServerEntry = ServerName;
       +
       +  gtk_entry_set_text(GTK_ENTRY(entry), ServerEntry);
       +  gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 0, 1,
       +                   GTK_EXPAND | GTK_SHRINK | GTK_FILL,
       +                   GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       +  label = gtk_label_new(_("Port"));
       +  gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
       +                   GTK_SHRINK, GTK_SHRINK, 0, 0);
       +  entry = stgam.port = gtk_entry_new();
       +  text = g_strdup_printf("%d", Port);
       +  gtk_entry_set_text(GTK_ENTRY(entry), text);
       +  g_free(text);
       +  gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 1, 2,
       +                   GTK_EXPAND | GTK_SHRINK | GTK_FILL,
       +                   GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
       +
       +  gtk_box_pack_start(GTK_BOX(vbox2), table, FALSE, FALSE, 0);
       +
       +  button = gtk_button_new_with_label("");
       +  /* Button to connect to a named dopewars server */
       +  SetAccelerator(button, _("_Connect"), button, "clicked", accel_group);
       +  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       +                     GTK_SIGNAL_FUNC(ConnectToServer), NULL);
       +  gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
       +  gtk_container_add(GTK_CONTAINER(frame), vbox2);
       +  GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
       +  gtk_widget_grab_default(button);
       +
       +  label = gtk_label_new(_("Server"));
       +  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
       +#endif /* NETWORKING */
       +
       +  /* Title of 'New Game' dialog notebook tab for single-player mode */
       +  frame = gtk_frame_new(_("Single player"));
       +  gtk_container_set_border_width(GTK_CONTAINER(frame), 4);
       +  vbox2 = gtk_vbox_new(FALSE, 7);
       +  gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
       +  stgam.antique = gtk_check_button_new_with_label("");
       +
       +  /* Checkbox to activate 'antique mode' in single-player games */
       +  SetAccelerator(stgam.antique, _("_Antique mode"), stgam.antique,
       +                 "clicked", accel_group);
       +  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(stgam.antique),
       +                               WantAntique);
       +  gtk_box_pack_start(GTK_BOX(vbox2), stgam.antique, FALSE, FALSE, 0);
       +  button = gtk_button_new_with_label("");
       +
       +  /* Button to start a new single-player (standalone, non-network) game */
       +  SetAccelerator(button, _("_Start single-player game"), button,
       +                 "clicked", accel_group);
       +
       +  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       +                     GTK_SIGNAL_FUNC(StartSinglePlayer), NULL);
       +  gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, FALSE, 0);
       +  gtk_container_add(GTK_CONTAINER(frame), vbox2);
       +  label = gtk_label_new(_("Single player"));
       +  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
       +
       +#ifdef NETWORKING
       +  /* Title of Metaserver frame in New Game dialog */
       +  frame = gtk_frame_new(_("Metaserver"));
       +  gtk_container_set_border_width(GTK_CONTAINER(frame), 4);
       +
       +  vbox2 = gtk_vbox_new(FALSE, 7);
       +  gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
       +
       +  clist = stgam.metaserv =
       +      gtk_scrolled_clist_new_with_titles(5, server_titles, &scrollwin);
       +  gtk_clist_column_titles_passive(GTK_CLIST(clist));
       +  gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE);
       +  gtk_clist_set_column_width(GTK_CLIST(clist), 0, 130);
       +  gtk_clist_set_column_width(GTK_CLIST(clist), 1, 35);
       +
       +  gtk_box_pack_start(GTK_BOX(vbox2), scrollwin, TRUE, TRUE, 0);
       +
       +  hbbox = gtk_hbutton_box_new();
       +  button = gtk_button_new_with_label("");
       +
       +  /* Button to update metaserver information */
       +  SetAccelerator(button, _("_Update"), button, "clicked", accel_group);
       +  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       +                     GTK_SIGNAL_FUNC(UpdateMetaServerList), NULL);
       +  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       +
       +  button = gtk_button_new_with_label("");
       +  SetAccelerator(button, _("_Connect"), button, "clicked", accel_group);
       +  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       +                     GTK_SIGNAL_FUNC(MetaServerConnect), NULL);
       +  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       +
       +  gtk_box_pack_start(GTK_BOX(vbox2), hbbox, FALSE, FALSE, 0);
       +  gtk_container_add(GTK_CONTAINER(frame), vbox2);
       +
       +  label = gtk_label_new(_("Metaserver"));
       +  gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, label);
       +#endif /* NETWORKING */
       +
       +  gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
       +
       +  /* Caption of status label in New Game dialog before anything has
       +   * happened */
       +  label = stgam.status = gtk_label_new("");
       +  gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
       +
       +  gtk_container_add(GTK_CONTAINER(stgam.dialog), vbox);
       +
       +  gtk_widget_grab_focus(stgam.name);
       +#ifdef NETWORKING
       +  if (UpdateMeta) {
       +    UpdateMetaServerList(NULL);
       +  } else {
       +    FillMetaServerList(FALSE);
       +  }
       +#endif
       +
       +  SetStartGameStatus(NULL);
       +  gtk_widget_show_all(dialog);
       +  gtk_notebook_set_page(GTK_NOTEBOOK(notebook), NewGameType);
       +}
       +
       +#ifdef NETWORKING
       +static void OKAuthDialog(GtkWidget *widget, GtkWidget *window)
       +{
       +  gtk_object_set_data(GTK_OBJECT(window), "authok", GINT_TO_POINTER(TRUE));
       +  gtk_widget_destroy(window);
       +}
       +
       +static void DestroyAuthDialog(GtkWidget *window, gpointer data)
       +{
       +  GtkWidget *userentry, *passwdentry;
       +  gchar *username = NULL, *password = NULL;
       +  gpointer proxy, authok;
       +  HttpConnection *conn;
       +
       +  authok = gtk_object_get_data(GTK_OBJECT(window), "authok");
       +  proxy = gtk_object_get_data(GTK_OBJECT(window), "proxy");
       +  userentry =
       +      (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), "username");
       +  passwdentry =
       +      (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), "password");
       +  conn =
       +      (HttpConnection *)gtk_object_get_data(GTK_OBJECT(window),
       +                                            "httpconn");
       +  g_assert(userentry && passwdentry && conn);
       +
       +  if (authok) {
       +    username = gtk_editable_get_chars(GTK_EDITABLE(userentry), 0, -1);
       +    password = gtk_editable_get_chars(GTK_EDITABLE(passwdentry), 0, -1);
       +  }
       +
       +  SetHttpAuthentication(conn, GPOINTER_TO_INT(proxy), username, password);
       +
       +  g_free(username);
       +  g_free(password);
       +}
       +
       +void AuthDialog(HttpConnection *conn, gboolean proxy, gchar *realm,
       +                gpointer data)
       +{
       +  GtkWidget *window, *button, *hsep, *vbox, *label, *entry, *table, *hbbox;
       +
       +  window = gtk_window_new(GTK_WINDOW_DIALOG);
       +  gtk_signal_connect(GTK_OBJECT(window), "destroy",
       +                     GTK_SIGNAL_FUNC(DestroyAuthDialog), NULL);
       +  gtk_object_set_data(GTK_OBJECT(window), "proxy", GINT_TO_POINTER(proxy));
       +  gtk_object_set_data(GTK_OBJECT(window), "httpconn", (gpointer)conn);
       +
       +  if (proxy) {
       +    gtk_window_set_title(GTK_WINDOW(window),
       +                         /* Title of dialog for authenticating with a
       +                          * proxy server */
       +                         _("Proxy Authentication Required"));
       +  } else {
       +    /* Title of dialog for authenticating with a web server */
       +    gtk_window_set_title(GTK_WINDOW(window), _("Authentication Required"));
       +  }
       +
       +  gtk_window_set_modal(GTK_WINDOW(window), TRUE);
       +  gtk_window_set_transient_for(GTK_WINDOW(window),
       +                               GTK_WINDOW(MainWindow));
       +  gtk_container_set_border_width(GTK_CONTAINER(window), 7);
       +
       +  vbox = gtk_vbox_new(FALSE, 7);
       +
       +  table = gtk_table_new(3, 2, FALSE);
       +  gtk_table_set_row_spacings(GTK_TABLE(table), 10);
       +  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       +
       +  label = gtk_label_new("Realm:");
       +  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
       +
       +  label = gtk_label_new(realm);
       +  gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 0, 1);
       +
       +  label = gtk_label_new("User name:");
       +  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
       +
       +  entry = gtk_entry_new();
       +  gtk_object_set_data(GTK_OBJECT(window), "username", (gpointer)entry);
       +  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2);
       +
       +  label = gtk_label_new("Password:");
       +  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3);
       +
       +  entry = gtk_entry_new();
       +  gtk_object_set_data(GTK_OBJECT(window), "password", (gpointer)entry);
       +
       +#ifdef HAVE_FIXED_GTK
       +  /* GTK+ versions earlier than 1.2.10 do bad things with this */
       +  gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
       +#endif
       +
       +  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 2, 3);
       +
       +  gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
       +
       +  hsep = gtk_hseparator_new();
       +  gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0);
       +
       +  hbbox = gtk_hbutton_box_new();
       +
       +  button = gtk_button_new_with_label(_("OK"));
       +  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       +                     GTK_SIGNAL_FUNC(OKAuthDialog), (gpointer)window);
       +  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       +
       +  button = gtk_button_new_with_label(_("Cancel"));
       +  gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
       +                            GTK_SIGNAL_FUNC(gtk_widget_destroy),
       +                            (gpointer)window);
       +  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       +
       +  gtk_box_pack_start(GTK_BOX(vbox), hbbox, TRUE, TRUE, 0);
       +
       +  gtk_container_add(GTK_CONTAINER(window), vbox);
       +  gtk_widget_show_all(window);
       +}
       +
       +static void OKSocksAuth(GtkWidget *widget, GtkWidget *window)
       +{
       +  gtk_object_set_data(GTK_OBJECT(window), "authok", GINT_TO_POINTER(TRUE));
       +  gtk_widget_destroy(window);
       +}
       +
       +static void DestroySocksAuth(GtkWidget *window, gpointer data)
       +{
       +  GtkWidget *userentry, *passwdentry;
       +  gchar *username = NULL, *password = NULL;
       +  gpointer authok, meta;
       +  NetworkBuffer *netbuf;
       +
       +  authok = gtk_object_get_data(GTK_OBJECT(window), "authok");
       +  meta = gtk_object_get_data(GTK_OBJECT(window), "meta");
       +  userentry =
       +      (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), "username");
       +  passwdentry =
       +      (GtkWidget *)gtk_object_get_data(GTK_OBJECT(window), "password");
       +  netbuf =
       +      (NetworkBuffer *)gtk_object_get_data(GTK_OBJECT(window), "netbuf");
       +
       +  g_assert(userentry && passwdentry && netbuf);
       +
       +  if (authok) {
       +    username = gtk_editable_get_chars(GTK_EDITABLE(userentry), 0, -1);
       +    password = gtk_editable_get_chars(GTK_EDITABLE(passwdentry), 0, -1);
       +  }
       +
       +  SendSocks5UserPasswd(netbuf, username, password);
       +  g_free(username);
       +  g_free(password);
       +}
       +
       +static void RealSocksAuthDialog(NetworkBuffer *netbuf, gboolean meta,
       +                                gpointer data)
       +{
       +  GtkWidget *window, *button, *hsep, *vbox, *label, *entry, *table, *hbbox;
       +
       +  window = gtk_window_new(GTK_WINDOW_DIALOG);
       +  gtk_signal_connect(GTK_OBJECT(window), "destroy",
       +                     GTK_SIGNAL_FUNC(DestroySocksAuth), NULL);
       +  gtk_object_set_data(GTK_OBJECT(window), "netbuf", (gpointer)netbuf);
       +  gtk_object_set_data(GTK_OBJECT(window), "meta", GINT_TO_POINTER(meta));
       +
       +  /* Title of dialog for authenticating with a SOCKS server */
       +  gtk_window_set_title(GTK_WINDOW(window),
       +                       _("SOCKS Authentication Required"));
       +
       +  gtk_window_set_modal(GTK_WINDOW(window), TRUE);
       +  gtk_window_set_transient_for(GTK_WINDOW(window),
       +                               GTK_WINDOW(MainWindow));
       +  gtk_container_set_border_width(GTK_CONTAINER(window), 7);
       +
       +  vbox = gtk_vbox_new(FALSE, 7);
       +
       +  table = gtk_table_new(2, 2, FALSE);
       +  gtk_table_set_row_spacings(GTK_TABLE(table), 10);
       +  gtk_table_set_col_spacings(GTK_TABLE(table), 5);
       +
       +  label = gtk_label_new("User name:");
       +  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
       +
       +  entry = gtk_entry_new();
       +  gtk_object_set_data(GTK_OBJECT(window), "username", (gpointer)entry);
       +  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 0, 1);
       +
       +  label = gtk_label_new("Password:");
       +  gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
       +
       +  entry = gtk_entry_new();
       +  gtk_object_set_data(GTK_OBJECT(window), "password", (gpointer)entry);
       +
       +#ifdef HAVE_FIXED_GTK
       +  /* GTK+ versions earlier than 1.2.10 do bad things with this */
       +  gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
       +#endif
       +
       +  gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2);
       +
       +  gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
       +
       +  hsep = gtk_hseparator_new();
       +  gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0);
       +
       +  hbbox = gtk_hbutton_box_new();
       +
       +  button = gtk_button_new_with_label(_("OK"));
       +  gtk_signal_connect(GTK_OBJECT(button), "clicked",
       +                     GTK_SIGNAL_FUNC(OKSocksAuth), (gpointer)window);
       +  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       +
       +  button = gtk_button_new_with_label(_("Cancel"));
       +  gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
       +                            GTK_SIGNAL_FUNC(gtk_widget_destroy),
       +                            (gpointer)window);
       +  gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0);
       +
       +  gtk_box_pack_start(GTK_BOX(vbox), hbbox, TRUE, TRUE, 0);
       +
       +  gtk_container_add(GTK_CONTAINER(window), vbox);
       +  gtk_widget_show_all(window);
       +}
       +
       +void MetaSocksAuthDialog(NetworkBuffer *netbuf, gpointer data)
       +{
       +  RealSocksAuthDialog(netbuf, TRUE, data);
       +}
       +
       +void SocksAuthDialog(NetworkBuffer *netbuf, gpointer data)
       +{
       +  RealSocksAuthDialog(netbuf, FALSE, data);
       +}
       +
       +#endif /* NETWORKING */
 (DIR) diff --git a/src/gui_client/newgamedia.h b/src/gui_client/newgamedia.h
       t@@ -0,0 +1,43 @@
       +/************************************************************************
       + * newgamedia.h   New game dialog                                       *
       + * Copyright (C)  1998-2002  Ben Webb                                   *
       + *                Email: ben@bellatrix.pcl.ox.ac.uk                     *
       + *                WWW: http://dopewars.sourceforge.net/                 *
       + *                                                                      *
       + * This program is free software; you can redistribute it and/or        *
       + * modify it under the terms of the GNU General Public License          *
       + * as published by the Free Software Foundation; either version 2       *
       + * of the License, or (at your option) any later version.               *
       + *                                                                      *
       + * This program is distributed in the hope that it will be useful,      *
       + * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
       + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
       + * GNU General Public License for more details.                         *
       + *                                                                      *
       + * You should have received a copy of the GNU General Public License    *
       + * along with this program; if not, write to the Free Software          *
       + * Foundation, Inc., 59 Temple Place - Suite 330, Boston,               *
       + *                   MA  02111-1307, USA.                               *
       + ************************************************************************/
       +
       +#ifndef __NEWGAME_DIA_H__
       +#define __NEWGAME_DIA_H__
       +
       +#ifdef HAVE_CONFIG_H
       +#include <config.h>
       +#endif
       +
       +#include <glib.h>
       +#include "dopewars.h"
       +#include "network.h"
       +
       +#ifdef NETWORKING
       +void NewGameDialog(Player *play, NBCallBack sockstat);
       +void DisplayConnectStatus(gboolean meta, NBStatus oldstatus,
       +                          NBSocksStatus oldsocks);
       +void FinishServerConnect(gboolean ConnectOK);
       +#else
       +void NewGameDialog(Player *play);
       +#endif
       +
       +#endif