tGTK+ client "new game" dialog split out into its own file - vaccinewars - be a… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 0b0900487675ad81cf31a8e1c559cdd267e02836 | |
parent ce6614bddab8d6289b9250c15335d75c8c49efad | |
Author: Ben Webb <[email protected]> | |
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(-) | |
--- | |
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@ | |
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) $(… | |
t@@ -121,7 +121,7 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFO… | |
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) | |
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 */ | |
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 hPrevInstanc… | |
gboolean GtkLoop(int *argc, char **argv[], gboolean ReturnOnFail); | |
#endif | |
+void GuiStartGame(void); | |
+ | |
#endif | |
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: [email protected] * | |
+ * 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 */ | |
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: [email protected] * | |
+ * 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 |