tEntire codebase run through "indent -kr -i2" to tidy it up and make things nic… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit abe583e0a854064d289b0a6c85a37251ae73cf60 | |
parent 8c06aa89b30fe56246729b768b2ee44eefc09c2c | |
Author: Ben Webb <[email protected]> | |
Date: Mon, 18 Feb 2002 13:44:07 +0000 | |
Entire codebase run through "indent -kr -i2" to tidy it up and make things | |
nice and consistent | |
Diffstat: | |
M src/AIPlayer.c | 1076 +++++++++++++++++------------… | |
M src/AIPlayer.h | 41 ++++++++++++++++-------------… | |
M src/admin.c | 133 ++++++++++++++++++-----------… | |
M src/admin.h | 41 ++++++++++++++++-------------… | |
M src/curses_client.c | 3547 +++++++++++++++++------------… | |
M src/curses_client.h | 41 ++++++++++++++++-------------… | |
M src/dopeos.c | 690 +++++++++++++++++++----------… | |
M src/dopeos.h | 127 ++++++++++++++++-------------… | |
M src/dopewars.c | 3992 +++++++++++++++++------------… | |
M src/dopewars.h | 401 ++++++++++++++++-------------… | |
M src/error.c | 216 +++++++++++++++++------------… | |
M src/error.h | 63 ++++++++++++++++-------------… | |
M src/gtk_client.c | 6457 ++++++++++++++++-------------… | |
M src/gtk_client.h | 45 ++++++++++++++++-------------… | |
M src/gtkport.c | 8216 +++++++++++++++++------------… | |
M src/gtkport.h | 673 ++++++++++++++++-------------… | |
M src/message.c | 2081 +++++++++++++++++------------… | |
M src/message.h | 177 ++++++++++++++++-------------… | |
M src/network.c | 2405 +++++++++++++++++------------… | |
M src/network.h | 270 +++++++++++++++++------------… | |
M src/nls.h | 41 ++++++++++++++++-------------… | |
M src/serverside.c | 5686 +++++++++++++++++------------… | |
M src/serverside.h | 68 ++++++++++++++++-------------… | |
M src/tstring.c | 499 ++++++++++++++++++-----------… | |
M src/tstring.h | 40 ++++++++++++++++-------------… | |
M src/winmain.c | 285 +++++++++++++++++------------… | |
M src/winmain.h | 41 ++++++++++++++++-------------… | |
M win32/guifunc.c | 137 +++++++++++++++++------------… | |
M win32/guifunc.h | 40 ++++++++++++++++-------------… | |
M win32/makeinstall.c | 336 +++++++++++++++++------------… | |
M win32/setup.c | 1089 +++++++++++++++++------------… | |
M win32/uninstall.c | 217 +++++++++++++++++------------… | |
M win32/util.c | 768 +++++++++++++++++------------… | |
M win32/util.h | 99 ++++++++++++++++-------------… | |
34 files changed, 21798 insertions(+), 18240 deletions(-) | |
--- | |
diff --git a/src/AIPlayer.c b/src/AIPlayer.c | |
t@@ -1,23 +1,24 @@ | |
-/* AIPlayer.c Code for dopewars computer players */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * AIPlayer.c Code for dopewars computer players * | |
+ * 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. * | |
+ ************************************************************************/ | |
#include <stdio.h> | |
#include <string.h> | |
t@@ -36,7 +37,7 @@ | |
#include "AIPlayer.h" | |
#if NETWORKING | |
-static int HandleAIMessage(char *Message,Player *AIPlay); | |
+static int HandleAIMessage(char *Message, Player *AIPlay); | |
static void PrintAIMessage(char *Text); | |
static void AIDealDrugs(Player *AIPlay); | |
static void AIJet(Player *AIPlay); | |
t@@ -44,7 +45,8 @@ static void AIGunShop(Player *AIPlay); | |
static void AIPayLoan(Player *AIPlay); | |
static void AISendRandomMessage(Player *AIPlay); | |
static void AISetName(Player *AIPlay); | |
-static void AIHandleQuestion(char *Data,AICode AI,Player *AIPlay,Player *From); | |
+static void AIHandleQuestion(char *Data, AICode AI, Player *AIPlay, | |
+ Player *From); | |
#define MINSAFECASH 300 | |
#define MINSAFEHEALTH 140 | |
t@@ -52,27 +54,32 @@ static void AIHandleQuestion(char *Data,AICode AI,Player *… | |
/* Reserve some space for picking up new guns */ | |
#define SPACERESERVE 10 | |
-/* Locations of the loan shark, bank, gun shop and pub */ | |
-/* Note: these are not the same as the global variables */ | |
-/* LoanSharkLoc, BankLoc, GunShopLoc and RoughPubLoc, */ | |
-/* which are set locally. The remote server could */ | |
-/* have different locations set, and the AI must work */ | |
-/* out where these locations are for itself. */ | |
-int RealLoanShark,RealBank,RealGunShop,RealPub; | |
- | |
-static void AIConnectFailed(NetworkBuffer *netbuf) { | |
+/* | |
+ * Locations of the loan shark, bank, gun shop and pub | |
+ * Note: these are not the same as the global variables | |
+ * LoanSharkLoc, BankLoc, GunShopLoc and RoughPubLoc, | |
+ * which are set locally. The remote server could | |
+ * have different locations set, and the AI must work | |
+ * out where these locations are for itself. | |
+ */ | |
+int RealLoanShark, RealBank, RealGunShop, RealPub; | |
+ | |
+static void AIConnectFailed(NetworkBuffer *netbuf) | |
+{ | |
GString *errstr; | |
errstr = g_string_new(_("Connection closed by remote host")); | |
- if (netbuf->error) g_string_assign_error(errstr,netbuf->error); | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL, | |
+ if (netbuf->error) | |
+ g_string_assign_error(errstr, netbuf->error); | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
_("Could not connect to dopewars server\n(%s)\n" | |
- "AI Player terminating abnormally."),errstr->str); | |
- g_string_free(errstr,TRUE); | |
+ "AI Player terminating abnormally."), errstr->str); | |
+ g_string_free(errstr, TRUE); | |
} | |
-static void AIStartGame(Player *AIPlay) { | |
- Client=Network=TRUE; | |
+static void AIStartGame(Player *AIPlay) | |
+{ | |
+ Client = Network = TRUE; | |
InitAbilities(AIPlay); | |
SendAbilities(AIPlay); | |
t@@ -80,515 +87,602 @@ static void AIStartGame(Player *AIPlay) { | |
g_message(_("Connection established\n")); | |
} | |
-static void DisplayConnectStatus(NetworkBuffer *netbuf,NBStatus oldstatus, | |
- NBSocksStatus oldsocks) { | |
+static void DisplayConnectStatus(NetworkBuffer *netbuf, NBStatus oldstatus, | |
+ NBSocksStatus oldsocks) | |
+{ | |
NBStatus status; | |
NBSocksStatus sockstat; | |
status = netbuf->status; | |
sockstat = netbuf->sockstat; | |
- if (oldstatus==status && oldsocks==sockstat) return; | |
- | |
- switch(status) { | |
- case NBS_PRECONNECT: | |
+ if (oldstatus == status && oldsocks == sockstat) | |
+ return; | |
+ | |
+ switch (status) { | |
+ case NBS_PRECONNECT: | |
+ break; | |
+ case NBS_SOCKSCONNECT: | |
+ switch (sockstat) { | |
+ case NBSS_METHODS: | |
+ g_print(_("Connected to SOCKS server %s...\n"), Socks.name); | |
break; | |
- case NBS_SOCKSCONNECT: | |
- switch(sockstat) { | |
- case NBSS_METHODS: | |
- g_print(_("Connected to SOCKS server %s...\n"),Socks.name); | |
- break; | |
- case NBSS_USERPASSWD: | |
- g_print(_("Authenticating with SOCKS server\n")); | |
- break; | |
- case NBSS_CONNECT: | |
- g_print(_("Asking SOCKS for connect to %s...\n"),ServerName); | |
- break; | |
- } | |
+ case NBSS_USERPASSWD: | |
+ g_print(_("Authenticating with SOCKS server\n")); | |
break; | |
- case NBS_CONNECTED: | |
+ case NBSS_CONNECT: | |
+ g_print(_("Asking SOCKS for connect to %s...\n"), ServerName); | |
break; | |
+ } | |
+ break; | |
+ case NBS_CONNECTED: | |
+ break; | |
} | |
} | |
-static void NetBufAuth(NetworkBuffer *netbuf,gpointer data) { | |
+static void NetBufAuth(NetworkBuffer *netbuf, gpointer data) | |
+{ | |
g_print(_("Using Socks.Auth.User and Socks.Auth.Password " | |
"for SOCKS5 authentication\n")); | |
- SendSocks5UserPasswd(netbuf,Socks.authuser,Socks.authpassword); | |
+ SendSocks5UserPasswd(netbuf, Socks.authuser, Socks.authpassword); | |
} | |
-void AIPlayerLoop() { | |
-/* Main loop for AI players. Connects to server, plays game, */ | |
-/* and then disconnects. */ | |
- GString *errstr; | |
- gchar *msg; | |
- Player *AIPlay; | |
- fd_set readfs,writefs; | |
- gboolean DoneOK,QuitRequest,datawaiting; | |
- int MaxSock; | |
- NBStatus oldstatus; | |
- NBSocksStatus oldsocks; | |
- NetworkBuffer *netbuf; | |
- | |
- errstr=g_string_new(""); | |
- AIPlay=g_new(Player,1); | |
- FirstClient=AddPlayer(0,AIPlay,FirstClient); | |
- g_message(_("AI Player started; attempting to contact server at %s:%d..."), | |
- ServerName,Port); | |
- | |
- /* Forget where the "special" locations are */ | |
- RealLoanShark=RealBank=RealGunShop=RealPub=-1; | |
- | |
- netbuf = &AIPlay->NetBuf; | |
- oldstatus = netbuf->status; | |
- oldsocks = netbuf->sockstat; | |
- | |
- if (!StartNetworkBufferConnect(netbuf,ServerName,Port)) { | |
- AIConnectFailed(netbuf); return; | |
- } else { | |
- SetNetworkBufferUserPasswdFunc(netbuf,NetBufAuth,NULL); | |
- if (netbuf->status==NBS_CONNECTED) { | |
- AIStartGame(AIPlay); | |
- } else { | |
- DisplayConnectStatus(netbuf,oldstatus,oldsocks); | |
- } | |
- } | |
- | |
- while (1) { | |
- FD_ZERO(&readfs); | |
- FD_ZERO(&writefs); | |
- MaxSock=0; | |
- | |
- SetSelectForNetworkBuffer(netbuf,&readfs,&writefs,NULL,&MaxSock); | |
- | |
- oldstatus = netbuf->status; | |
- oldsocks = netbuf->sockstat; | |
- if (bselect(MaxSock,&readfs,&writefs,NULL,NULL)==-1) { | |
- if (errno==EINTR) continue; | |
- printf("Error in select\n"); exit(1); | |
- } | |
- | |
- datawaiting=RespondToSelect(netbuf,&readfs,&writefs,NULL,&DoneOK); | |
+/* | |
+ * Main loop for AI players. Connects to server, plays game, | |
+ * and then disconnects. | |
+ */ | |
+void AIPlayerLoop() | |
+{ | |
+ GString *errstr; | |
+ gchar *msg; | |
+ Player *AIPlay; | |
+ fd_set readfs, writefs; | |
+ gboolean DoneOK, QuitRequest, datawaiting; | |
+ int MaxSock; | |
+ NBStatus oldstatus; | |
+ NBSocksStatus oldsocks; | |
+ NetworkBuffer *netbuf; | |
+ | |
+ errstr = g_string_new(""); | |
+ AIPlay = g_new(Player, 1); | |
+ | |
+ FirstClient = AddPlayer(0, AIPlay, FirstClient); | |
+ g_message(_("AI Player started; attempting to contact " | |
+ "server at %s:%d..."), ServerName, Port); | |
+ | |
+ /* Forget where the "special" locations are */ | |
+ RealLoanShark = RealBank = RealGunShop = RealPub = -1; | |
+ | |
+ netbuf = &AIPlay->NetBuf; | |
+ oldstatus = netbuf->status; | |
+ oldsocks = netbuf->sockstat; | |
+ | |
+ if (!StartNetworkBufferConnect(netbuf, ServerName, Port)) { | |
+ AIConnectFailed(netbuf); | |
+ return; | |
+ } else { | |
+ SetNetworkBufferUserPasswdFunc(netbuf, NetBufAuth, NULL); | |
+ if (netbuf->status == NBS_CONNECTED) { | |
+ AIStartGame(AIPlay); | |
+ } else { | |
+ DisplayConnectStatus(netbuf, oldstatus, oldsocks); | |
+ } | |
+ } | |
- if (oldstatus!=NBS_CONNECTED && | |
- (netbuf->status==NBS_CONNECTED || !DoneOK)) { | |
- if (DoneOK) AIStartGame(AIPlay); | |
- else { | |
- AIConnectFailed(netbuf); break; | |
- } | |
- } else if (netbuf->status!=NBS_CONNECTED) { | |
- DisplayConnectStatus(netbuf,oldstatus,oldsocks); | |
+ while (1) { | |
+ FD_ZERO(&readfs); | |
+ FD_ZERO(&writefs); | |
+ MaxSock = 0; | |
+ | |
+ SetSelectForNetworkBuffer(netbuf, &readfs, &writefs, NULL, &MaxSock); | |
+ | |
+ oldstatus = netbuf->status; | |
+ oldsocks = netbuf->sockstat; | |
+ if (bselect(MaxSock, &readfs, &writefs, NULL, NULL) == -1) { | |
+ if (errno == EINTR) | |
+ continue; | |
+ printf("Error in select\n"); | |
+ exit(1); | |
+ } | |
+ | |
+ datawaiting = | |
+ RespondToSelect(netbuf, &readfs, &writefs, NULL, &DoneOK); | |
+ | |
+ if (oldstatus != NBS_CONNECTED && | |
+ (netbuf->status == NBS_CONNECTED || !DoneOK)) { | |
+ if (DoneOK) | |
+ AIStartGame(AIPlay); | |
+ else { | |
+ AIConnectFailed(netbuf); | |
+ break; | |
} | |
- if (datawaiting && netbuf->status==NBS_CONNECTED) { | |
- QuitRequest=FALSE; | |
- while ((msg=GetWaitingPlayerMessage(AIPlay))!=NULL) { | |
- if (HandleAIMessage(msg,AIPlay)) { | |
- QuitRequest=TRUE; | |
- break; | |
- } | |
- } | |
- if (QuitRequest) { | |
- g_print(_("AI Player terminated OK.\n")); | |
- break; | |
- } | |
+ } else if (netbuf->status != NBS_CONNECTED) { | |
+ DisplayConnectStatus(netbuf, oldstatus, oldsocks); | |
+ } | |
+ if (datawaiting && netbuf->status == NBS_CONNECTED) { | |
+ QuitRequest = FALSE; | |
+ while ((msg = GetWaitingPlayerMessage(AIPlay)) != NULL) { | |
+ if (HandleAIMessage(msg, AIPlay)) { | |
+ QuitRequest = TRUE; | |
+ break; | |
+ } | |
} | |
- if (!DoneOK) { | |
- g_print(_("Connection to server lost!\n")); | |
- break; | |
+ if (QuitRequest) { | |
+ g_print(_("AI Player terminated OK.\n")); | |
+ break; | |
} | |
- } | |
- ShutdownNetwork(AIPlay); | |
- g_string_free(errstr,TRUE); | |
- FirstClient=RemovePlayer(AIPlay,FirstClient); | |
+ } | |
+ if (!DoneOK) { | |
+ g_print(_("Connection to server lost!\n")); | |
+ break; | |
+ } | |
+ } | |
+ ShutdownNetwork(AIPlay); | |
+ g_string_free(errstr, TRUE); | |
+ FirstClient = RemovePlayer(AIPlay, FirstClient); | |
} | |
-void AISetName(Player *AIPlay) { | |
-/* Chooses a random name for the AI player, and informs the server */ | |
- char *AINames[] = { | |
- "Chip", "Dopey", "Al", "Dan", "Bob", "Fred", "Bert", "Jim" | |
- }; | |
- const gint NumNames = sizeof(AINames)/sizeof(AINames[0]); | |
- gchar *text; | |
- | |
- text=g_strdup_printf("AI) %s",AINames[brandom(0,NumNames)]); | |
- SetPlayerName(AIPlay,text); | |
- g_free(text); | |
- SendNullClientMessage(AIPlay,C_NONE,C_NAME,NULL,GetPlayerName(AIPlay)); | |
- g_print(_("Using name %s\n"),GetPlayerName(AIPlay)); | |
+/* | |
+ * Chooses a random name for the AI player, and informs the server | |
+ */ | |
+void AISetName(Player *AIPlay) | |
+{ | |
+ char *AINames[] = { | |
+ "Chip", "Dopey", "Al", "Dan", "Bob", "Fred", "Bert", "Jim" | |
+ }; | |
+ const gint NumNames = sizeof(AINames) / sizeof(AINames[0]); | |
+ gchar *text; | |
+ | |
+ text = g_strdup_printf("AI) %s", AINames[brandom(0, NumNames)]); | |
+ SetPlayerName(AIPlay, text); | |
+ g_free(text); | |
+ SendNullClientMessage(AIPlay, C_NONE, C_NAME, NULL, | |
+ GetPlayerName(AIPlay)); | |
+ g_print(_("Using name %s\n"), GetPlayerName(AIPlay)); | |
} | |
-gboolean ShouldRun(Player *AIPlay) { | |
-/* Returns TRUE if it would be prudent to run away... */ | |
- gint TotalHealth; | |
+/* | |
+ * Returns TRUE if it would be prudent to run away... | |
+ */ | |
+gboolean ShouldRun(Player *AIPlay) | |
+{ | |
+ gint TotalHealth; | |
- if (TotalGunsCarried(AIPlay)==0) return TRUE; | |
+ if (TotalGunsCarried(AIPlay) == 0) | |
+ return TRUE; | |
- TotalHealth=AIPlay->Health + AIPlay->Bitches.Carried*100; | |
- return (TotalHealth < MINSAFEHEALTH); | |
+ TotalHealth = AIPlay->Health + AIPlay->Bitches.Carried * 100; | |
+ return (TotalHealth < MINSAFEHEALTH); | |
} | |
-static void HandleCombat(Player *AIPlay,gchar *Msg) { | |
-/* Decodes the fighting-related message "Msg", and then decides whether */ | |
-/* to stand or run... */ | |
- gchar *text; | |
- gchar *AttackName,*DefendName,*BitchName; | |
- FightPoint fp; | |
- int DefendHealth,DefendBitches,BitchesKilled,ArmPercent; | |
- gboolean CanRunHere,Loot,CanFire; | |
- | |
- if (HaveAbility(AIPlay,A_NEWFIGHT)) { | |
- ReceiveFightMessage(Msg,&AttackName,&DefendName,&DefendHealth, | |
- &DefendBitches,&BitchName,&BitchesKilled, | |
- &ArmPercent,&fp,&CanRunHere,&Loot, | |
- &CanFire,&text); | |
- } else { | |
- text=Msg; | |
- if (AIPlay->Flags&FIGHTING) fp=F_MSG; | |
- else fp=F_LASTLEAVE; | |
- CanFire = (AIPlay->Flags&CANSHOOT); | |
- CanRunHere=FALSE; | |
- } | |
- PrintAIMessage(text); | |
- | |
- if (ShouldRun(AIPlay)) { | |
- if (CanRunHere) { | |
- SendClientMessage(AIPlay,C_NONE,C_FIGHTACT,NULL,"R"); | |
- } else { | |
- AIDealDrugs(AIPlay); | |
- AIJet(AIPlay); | |
- } | |
- } else if (fp==F_LASTLEAVE) { | |
+/* | |
+ * Decodes the fighting-related message "Msg", and then decides whether | |
+ * to stand or run... | |
+ */ | |
+static void HandleCombat(Player *AIPlay, gchar *Msg) | |
+{ | |
+ gchar *text; | |
+ gchar *AttackName, *DefendName, *BitchName; | |
+ FightPoint fp; | |
+ int DefendHealth, DefendBitches, BitchesKilled, ArmPercent; | |
+ gboolean CanRunHere, Loot, CanFire; | |
+ | |
+ if (HaveAbility(AIPlay, A_NEWFIGHT)) { | |
+ ReceiveFightMessage(Msg, &AttackName, &DefendName, &DefendHealth, | |
+ &DefendBitches, &BitchName, &BitchesKilled, | |
+ &ArmPercent, &fp, &CanRunHere, &Loot, | |
+ &CanFire, &text); | |
+ } else { | |
+ text = Msg; | |
+ if (AIPlay->Flags & FIGHTING) | |
+ fp = F_MSG; | |
+ else | |
+ fp = F_LASTLEAVE; | |
+ CanFire = (AIPlay->Flags & CANSHOOT); | |
+ CanRunHere = FALSE; | |
+ } | |
+ PrintAIMessage(text); | |
+ | |
+ if (ShouldRun(AIPlay)) { | |
+ if (CanRunHere) { | |
+ SendClientMessage(AIPlay, C_NONE, C_FIGHTACT, NULL, "R"); | |
+ } else { | |
+ AIDealDrugs(AIPlay); | |
AIJet(AIPlay); | |
- } else { | |
- SendClientMessage(AIPlay,C_NONE,C_FIGHTACT,NULL,"F"); | |
- } | |
+ } | |
+ } else if (fp == F_LASTLEAVE) { | |
+ AIJet(AIPlay); | |
+ } else { | |
+ SendClientMessage(AIPlay, C_NONE, C_FIGHTACT, NULL, "F"); | |
+ } | |
} | |
-int HandleAIMessage(char *Message,Player *AIPlay) { | |
-/* Performs appropriate processing on an incoming network message */ | |
-/* "Message" for AI player "AIPlay". Returns 1 if the game should */ | |
-/* be ended as a result, 0 otherwise. */ | |
- char *Data,WasFighting; | |
- AICode AI; | |
- MsgCode Code; | |
- Player *From,*tmp; | |
- GSList *list; | |
- struct timeval tv; | |
- gboolean Handled; | |
- | |
- if (ProcessMessage(Message,AIPlay,&From,&AI,&Code, | |
- &Data,FirstClient)==-1) { | |
- g_warning("Bad network message. Oops."); return 0; | |
- } | |
- Handled=HandleGenericClientMessage(From,AI,Code,AIPlay,Data,NULL); | |
- switch(Code) { | |
- case C_ENDLIST: | |
- g_print(_("Players in this game:-\n")); | |
- for (list=FirstClient;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- g_print(" %s\n",GetPlayerName(tmp)); | |
- } | |
- break; | |
- case C_NEWNAME: | |
- AISetName(AIPlay); | |
- break; | |
- case C_FIGHTPRINT: | |
- HandleCombat(AIPlay,Data); | |
- break; | |
- case C_PRINTMESSAGE: | |
- PrintAIMessage(Data); | |
- break; | |
- case C_MSG: | |
- g_print("%s: %s\n",GetPlayerName(From),Data); | |
- break; | |
- case C_MSGTO: | |
- g_print("%s->%s: %s\n",GetPlayerName(From),GetPlayerName(AIPlay),Data… | |
- break; | |
- case C_JOIN: | |
- g_print(_("%s joins the game.\n"),Data); break; | |
- case C_LEAVE: | |
- if (From!=&Noone) { | |
- g_print(_("%s has left the game.\n"),Data); | |
- } | |
- break; | |
- case C_SUBWAYFLASH: | |
- dpg_print(_("Jetting to %tde with %P cash and %P debt\n"), | |
- Location[(int)AIPlay->IsAt].Name,AIPlay->Cash,AIPlay->Debt); | |
- /* Use bselect rather than sleep, as this is portable to Win32 */ | |
- tv.tv_sec=AITurnPause; | |
- tv.tv_usec=0; | |
- bselect(0,NULL,NULL,NULL,&tv); | |
- if (brandom(0,100)<10) AISendRandomMessage(AIPlay); | |
- break; | |
- case C_UPDATE: | |
- WasFighting=FALSE; | |
- if (From==&Noone) { | |
- if (AIPlay->Flags & FIGHTING) WasFighting=TRUE; | |
- ReceivePlayerData(AIPlay,Data,AIPlay); | |
- } else { | |
- ReceivePlayerData(AIPlay,Data,From); /* spy reports */ | |
- } | |
- if (!(AIPlay->Flags & FIGHTING) && WasFighting) { | |
- AIDealDrugs(AIPlay); | |
- AIJet(AIPlay); | |
- } | |
- if (AIPlay->Health==0) { | |
- g_print(_("AI Player killed. Terminating normally.\n")); | |
- return 1; | |
- } | |
- break; | |
- case C_DRUGHERE: | |
- AIDealDrugs(AIPlay); | |
- AIJet(AIPlay); | |
- break; | |
- case C_GUNSHOP: | |
- AIGunShop(AIPlay); | |
- break; | |
- case C_LOANSHARK: | |
- AIPayLoan(AIPlay); | |
- break; | |
- case C_QUESTION: | |
- AIHandleQuestion(Data,AI,AIPlay,From); | |
- break; | |
- case C_HISCORE: case C_STARTHISCORE: | |
- break; | |
- case C_ENDHISCORE: | |
- g_print(_("Game time is up. Leaving game.\n")); | |
- return 1; | |
- case C_PUSH: | |
- g_print(_("AI Player pushed from the server.\n")); | |
- return 1; | |
- case C_QUIT: | |
- g_print(_("The server has terminated.\n")); | |
- return 1; | |
- default: | |
- if (!Handled) g_message("%s^%c^%s%s\n",GetPlayerName(From),Code, | |
- GetPlayerName(AIPlay),Data); | |
- break; | |
- } | |
- return 0; | |
+/* | |
+ * Performs appropriate processing on an incoming network message | |
+ * "Message" for AI player "AIPlay". Returns 1 if the game should | |
+ * be ended as a result, 0 otherwise. | |
+ */ | |
+int HandleAIMessage(char *Message, Player *AIPlay) | |
+{ | |
+ char *Data, WasFighting; | |
+ AICode AI; | |
+ MsgCode Code; | |
+ Player *From, *tmp; | |
+ GSList *list; | |
+ struct timeval tv; | |
+ gboolean Handled; | |
+ | |
+ if (ProcessMessage(Message, AIPlay, &From, &AI, &Code, | |
+ &Data, FirstClient) == -1) { | |
+ g_warning("Bad network message. Oops."); | |
+ return 0; | |
+ } | |
+ Handled = HandleGenericClientMessage(From, AI, Code, AIPlay, Data, NULL); | |
+ switch (Code) { | |
+ case C_ENDLIST: | |
+ g_print(_("Players in this game:-\n")); | |
+ for (list = FirstClient; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ g_print(" %s\n", GetPlayerName(tmp)); | |
+ } | |
+ break; | |
+ case C_NEWNAME: | |
+ AISetName(AIPlay); | |
+ break; | |
+ case C_FIGHTPRINT: | |
+ HandleCombat(AIPlay, Data); | |
+ break; | |
+ case C_PRINTMESSAGE: | |
+ PrintAIMessage(Data); | |
+ break; | |
+ case C_MSG: | |
+ g_print("%s: %s\n", GetPlayerName(From), Data); | |
+ break; | |
+ case C_MSGTO: | |
+ g_print("%s->%s: %s\n", GetPlayerName(From), GetPlayerName(AIPlay), | |
+ Data); | |
+ break; | |
+ case C_JOIN: | |
+ g_print(_("%s joins the game.\n"), Data); | |
+ break; | |
+ case C_LEAVE: | |
+ if (From != &Noone) { | |
+ g_print(_("%s has left the game.\n"), Data); | |
+ } | |
+ break; | |
+ case C_SUBWAYFLASH: | |
+ dpg_print(_("Jetting to %tde with %P cash and %P debt\n"), | |
+ Location[(int)AIPlay->IsAt].Name, AIPlay->Cash, | |
+ AIPlay->Debt); | |
+ /* Use bselect rather than sleep, as this is portable to Win32 */ | |
+ tv.tv_sec = AITurnPause; | |
+ tv.tv_usec = 0; | |
+ bselect(0, NULL, NULL, NULL, &tv); | |
+ if (brandom(0, 100) < 10) | |
+ AISendRandomMessage(AIPlay); | |
+ break; | |
+ case C_UPDATE: | |
+ WasFighting = FALSE; | |
+ if (From == &Noone) { | |
+ if (AIPlay->Flags & FIGHTING) | |
+ WasFighting = TRUE; | |
+ ReceivePlayerData(AIPlay, Data, AIPlay); | |
+ } else { | |
+ ReceivePlayerData(AIPlay, Data, From); /* spy reports */ | |
+ } | |
+ if (!(AIPlay->Flags & FIGHTING) && WasFighting) { | |
+ AIDealDrugs(AIPlay); | |
+ AIJet(AIPlay); | |
+ } | |
+ if (AIPlay->Health == 0) { | |
+ g_print(_("AI Player killed. Terminating normally.\n")); | |
+ return 1; | |
+ } | |
+ break; | |
+ case C_DRUGHERE: | |
+ AIDealDrugs(AIPlay); | |
+ AIJet(AIPlay); | |
+ break; | |
+ case C_GUNSHOP: | |
+ AIGunShop(AIPlay); | |
+ break; | |
+ case C_LOANSHARK: | |
+ AIPayLoan(AIPlay); | |
+ break; | |
+ case C_QUESTION: | |
+ AIHandleQuestion(Data, AI, AIPlay, From); | |
+ break; | |
+ case C_HISCORE: | |
+ case C_STARTHISCORE: | |
+ break; | |
+ case C_ENDHISCORE: | |
+ g_print(_("Game time is up. Leaving game.\n")); | |
+ return 1; | |
+ case C_PUSH: | |
+ g_print(_("AI Player pushed from the server.\n")); | |
+ return 1; | |
+ case C_QUIT: | |
+ g_print(_("The server has terminated.\n")); | |
+ return 1; | |
+ default: | |
+ if (!Handled) | |
+ g_message("%s^%c^%s%s\n", GetPlayerName(From), Code, | |
+ GetPlayerName(AIPlay), Data); | |
+ break; | |
+ } | |
+ return 0; | |
} | |
-void PrintAIMessage(char *Text) { | |
-/* Prints a message received via a printmessage or question */ | |
-/* network message, stored in "Text" */ | |
- unsigned i; | |
- gboolean SomeText=FALSE; | |
- for (i=0;i<strlen(Text);i++) { | |
- if (Text[i]=='^') { | |
- if (SomeText) putchar('\n'); | |
- } else { | |
- putchar(Text[i]); | |
- SomeText=TRUE; | |
- } | |
- } | |
- putchar('\n'); | |
+/* | |
+ * Prints a message received via a printmessage or question | |
+ * network message, stored in "Text". | |
+ */ | |
+void PrintAIMessage(char *Text) | |
+{ | |
+ unsigned i; | |
+ gboolean SomeText = FALSE; | |
+ | |
+ for (i = 0; i < strlen(Text); i++) { | |
+ if (Text[i] == '^') { | |
+ if (SomeText) | |
+ putchar('\n'); | |
+ } else { | |
+ putchar(Text[i]); | |
+ SomeText = TRUE; | |
+ } | |
+ } | |
+ putchar('\n'); | |
} | |
-void AIDealDrugs(Player *AIPlay) { | |
-/* Buy and sell drugs for AI player "AIPlay" */ | |
- price_t *Profit,MaxProfit; | |
- gchar *text; | |
- int i,LastHighest,Highest,Num,MinProfit; | |
- Profit = g_new(price_t,NumDrug); | |
- for (i=0;i<NumDrug;i++) { | |
- Profit[i]=AIPlay->Drugs[i].Price-(Drug[i].MaxPrice+Drug[i].MinPrice)/2; | |
- } | |
- MinProfit=0; | |
- for (i=0;i<NumDrug;i++) if (Profit[i]<MinProfit) MinProfit=Profit[i]; | |
- MinProfit--; | |
- for (i=0;i<NumDrug;i++) if (Profit[i]<0) Profit[i]=MinProfit-Profit[i]; | |
- LastHighest=-1; | |
- do { | |
- MaxProfit=MinProfit; | |
- Highest=-1; | |
- for (i=0;i<NumDrug;i++) { | |
- if (Profit[i]>MaxProfit && i!=LastHighest && | |
- (LastHighest==-1 || Profit[LastHighest]>Profit[i])) { | |
- Highest=i; | |
- MaxProfit=Profit[i]; | |
- } | |
+/* | |
+ * Buys and sell drugs for AI player "AIPlay". | |
+ */ | |
+void AIDealDrugs(Player *AIPlay) | |
+{ | |
+ price_t *Profit, MaxProfit; | |
+ gchar *text; | |
+ int i, LastHighest, Highest, Num, MinProfit; | |
+ Profit = g_new(price_t, NumDrug); | |
+ | |
+ for (i = 0; i < NumDrug; i++) { | |
+ Profit[i] = | |
+ AIPlay->Drugs[i].Price - (Drug[i].MaxPrice + Drug[i].MinPrice) / 2; | |
+ } | |
+ MinProfit = 0; | |
+ for (i = 0; i < NumDrug; i++) | |
+ if (Profit[i] < MinProfit) | |
+ MinProfit = Profit[i]; | |
+ MinProfit--; | |
+ for (i = 0; i < NumDrug; i++) | |
+ if (Profit[i] < 0) | |
+ Profit[i] = MinProfit - Profit[i]; | |
+ LastHighest = -1; | |
+ do { | |
+ MaxProfit = MinProfit; | |
+ Highest = -1; | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if (Profit[i] > MaxProfit && i != LastHighest && | |
+ (LastHighest == -1 || Profit[LastHighest] > Profit[i])) { | |
+ Highest = i; | |
+ MaxProfit = Profit[i]; | |
+ } | |
+ } | |
+ LastHighest = Highest; | |
+ if (Highest >= 0) { | |
+ Num = AIPlay->Drugs[Highest].Carried; | |
+ if (MaxProfit > 0 && Num > 0) { | |
+ dpg_print(_("Selling %d %tde at %P\n"), Num, Drug[Highest].Name, | |
+ AIPlay->Drugs[Highest].Price); | |
+ AIPlay->CoatSize += Num; | |
+ AIPlay->Cash += Num * AIPlay->Drugs[Highest].Price; | |
+ text = g_strdup_printf("drug^%d^%d", Highest, -Num); | |
+ SendClientMessage(AIPlay, C_NONE, C_BUYOBJECT, NULL, text); | |
+ g_free(text); | |
} | |
- LastHighest=Highest; | |
- if (Highest>=0) { | |
- Num=AIPlay->Drugs[Highest].Carried; | |
- if (MaxProfit>0 && Num>0) { | |
- dpg_print(_("Selling %d %tde at %P\n"),Num,Drug[Highest].Name, | |
- AIPlay->Drugs[Highest].Price); | |
- AIPlay->CoatSize+=Num; | |
- AIPlay->Cash+=Num*AIPlay->Drugs[Highest].Price; | |
- text=g_strdup_printf("drug^%d^%d",Highest,-Num); | |
- SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text); | |
- g_free(text); | |
+ if (AIPlay->Drugs[Highest].Price != 0 && | |
+ AIPlay->CoatSize > SPACERESERVE) { | |
+ Num = AIPlay->Cash / AIPlay->Drugs[Highest].Price; | |
+ if (Num > AIPlay->CoatSize - SPACERESERVE) { | |
+ Num = AIPlay->CoatSize - SPACERESERVE; | |
} | |
- if (AIPlay->Drugs[Highest].Price != 0 && | |
- AIPlay->CoatSize>SPACERESERVE) { | |
- Num=AIPlay->Cash/AIPlay->Drugs[Highest].Price; | |
- if (Num>AIPlay->CoatSize-SPACERESERVE) { | |
- Num=AIPlay->CoatSize-SPACERESERVE; | |
- } | |
- if (MaxProfit<0 && Num>0) { | |
- dpg_print(_("Buying %d %tde at %P\n"),Num,Drug[Highest].Name, | |
- AIPlay->Drugs[Highest].Price); | |
- text=g_strdup_printf("drug^%d^%d",Highest,Num); | |
- AIPlay->CoatSize-=Num; | |
- AIPlay->Cash-=Num*AIPlay->Drugs[Highest].Price; | |
- SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text); | |
- g_free(text); | |
- } | |
+ if (MaxProfit < 0 && Num > 0) { | |
+ dpg_print(_("Buying %d %tde at %P\n"), Num, Drug[Highest].Name, | |
+ AIPlay->Drugs[Highest].Price); | |
+ text = g_strdup_printf("drug^%d^%d", Highest, Num); | |
+ AIPlay->CoatSize -= Num; | |
+ AIPlay->Cash -= Num * AIPlay->Drugs[Highest].Price; | |
+ SendClientMessage(AIPlay, C_NONE, C_BUYOBJECT, NULL, text); | |
+ g_free(text); | |
} | |
} | |
- } while (Highest>=0); | |
- g_free(Profit); | |
+ } | |
+ } while (Highest >= 0); | |
+ g_free(Profit); | |
} | |
-void AIGunShop(Player *AIPlay) { | |
-/* Handles a visit to the gun shop by AI player "AIPlay" */ | |
- int i; | |
- int Bought; | |
- gchar *text; | |
- do { | |
- Bought=0; | |
- for (i=0;i<NumGun;i++) { | |
- if (TotalGunsCarried(AIPlay)<AIPlay->Bitches.Carried+2 && | |
- Gun[i].Space<=AIPlay->CoatSize && | |
- Gun[i].Price<=AIPlay->Cash-MINSAFECASH) { | |
- AIPlay->Cash-=Gun[i].Price; | |
- AIPlay->CoatSize-=Gun[i].Space; | |
- AIPlay->Guns[i].Carried++; | |
- Bought++; | |
- dpg_print(_("Buying a %tde for %P at the gun shop\n"), | |
- Gun[i].Name,Gun[i].Price); | |
- text=g_strdup_printf("gun^%d^1",i); | |
- SendClientMessage(AIPlay,C_NONE,C_BUYOBJECT,NULL,text); | |
- g_free(text); | |
- } | |
+/* | |
+ * Handles a visit to the gun shop by AI player "AIPlay". | |
+ */ | |
+void AIGunShop(Player *AIPlay) | |
+{ | |
+ int i; | |
+ int Bought; | |
+ gchar *text; | |
+ | |
+ do { | |
+ Bought = 0; | |
+ for (i = 0; i < NumGun; i++) { | |
+ if (TotalGunsCarried(AIPlay) < AIPlay->Bitches.Carried + 2 && | |
+ Gun[i].Space <= AIPlay->CoatSize && | |
+ Gun[i].Price <= AIPlay->Cash - MINSAFECASH) { | |
+ AIPlay->Cash -= Gun[i].Price; | |
+ AIPlay->CoatSize -= Gun[i].Space; | |
+ AIPlay->Guns[i].Carried++; | |
+ Bought++; | |
+ dpg_print(_("Buying a %tde for %P at the gun shop\n"), | |
+ Gun[i].Name, Gun[i].Price); | |
+ text = g_strdup_printf("gun^%d^1", i); | |
+ SendClientMessage(AIPlay, C_NONE, C_BUYOBJECT, NULL, text); | |
+ g_free(text); | |
} | |
- } while (Bought); | |
- SendClientMessage(AIPlay,C_NONE,C_DONE,NULL,NULL); | |
+ } | |
+ } while (Bought); | |
+ SendClientMessage(AIPlay, C_NONE, C_DONE, NULL, NULL); | |
} | |
-void AIJet(Player *AIPlay) { | |
-/* Decides on a new game location for AI player "AIPlay" and jets there */ | |
- int NewLocation; | |
- char text[40]; | |
- if (!AIPlay) return; | |
- NewLocation=AIPlay->IsAt; | |
- if (RealLoanShark>=0 && AIPlay->Cash > (price_t)((float)AIPlay->Debt*1.2)) { | |
- NewLocation=RealLoanShark; | |
- } else if (RealPub>=0 && brandom(0,100)<30 && AIPlay->Cash>MINSAFECASH*10) { | |
- NewLocation=RealPub; | |
- } else if (RealGunShop>=0 && brandom(0,100)<70 && | |
- TotalGunsCarried(AIPlay)<AIPlay->Bitches.Carried+2 && | |
- AIPlay->Cash>MINSAFECASH*5) { | |
- NewLocation=RealGunShop; | |
- } | |
- while (NewLocation==AIPlay->IsAt) NewLocation=brandom(0,NumLocation); | |
- sprintf(text,"%d",NewLocation); | |
- SendClientMessage(AIPlay,C_NONE,C_REQUESTJET,NULL,text); | |
+/* | |
+ * Decides on a new game location for AI player "AIPlay" and jets there. | |
+ */ | |
+void AIJet(Player *AIPlay) | |
+{ | |
+ int NewLocation; | |
+ char text[40]; | |
+ | |
+ if (!AIPlay) | |
+ return; | |
+ NewLocation = AIPlay->IsAt; | |
+ if (RealLoanShark >= 0 | |
+ && AIPlay->Cash > (price_t)((float)AIPlay->Debt * 1.2)) { | |
+ NewLocation = RealLoanShark; | |
+ } else if (RealPub >= 0 && brandom(0, 100) < 30 | |
+ && AIPlay->Cash > MINSAFECASH * 10) { | |
+ NewLocation = RealPub; | |
+ } else if (RealGunShop >= 0 && brandom(0, 100) < 70 && | |
+ TotalGunsCarried(AIPlay) < AIPlay->Bitches.Carried + 2 && | |
+ AIPlay->Cash > MINSAFECASH * 5) { | |
+ NewLocation = RealGunShop; | |
+ } | |
+ while (NewLocation == AIPlay->IsAt) | |
+ NewLocation = brandom(0, NumLocation); | |
+ sprintf(text, "%d", NewLocation); | |
+ SendClientMessage(AIPlay, C_NONE, C_REQUESTJET, NULL, text); | |
} | |
-void AIPayLoan(Player *AIPlay) { | |
-/* Pays off the loan of AI player "AIPlay" if this doesn't leave */ | |
-/* the player with insufficient funds for further dealing */ | |
- gchar *prstr; | |
- if (AIPlay->Cash-AIPlay->Debt >= MINSAFECASH) { | |
- prstr=pricetostr(AIPlay->Debt); | |
- SendClientMessage(AIPlay,C_NONE,C_PAYLOAN,NULL,prstr); | |
- g_free(prstr); | |
- dpg_print(_("Debt of %P paid off to loan shark\n"),AIPlay->Debt); | |
- } | |
- SendClientMessage(AIPlay,C_NONE,C_DONE,NULL,NULL); | |
+/* | |
+ * Pays off the loan of AI player "AIPlay" if this doesn't leave | |
+ * the player with insufficient funds for further dealing. | |
+ */ | |
+void AIPayLoan(Player *AIPlay) | |
+{ | |
+ gchar *prstr; | |
+ | |
+ if (AIPlay->Cash - AIPlay->Debt >= MINSAFECASH) { | |
+ prstr = pricetostr(AIPlay->Debt); | |
+ SendClientMessage(AIPlay, C_NONE, C_PAYLOAN, NULL, prstr); | |
+ g_free(prstr); | |
+ dpg_print(_("Debt of %P paid off to loan shark\n"), AIPlay->Debt); | |
+ } | |
+ SendClientMessage(AIPlay, C_NONE, C_DONE, NULL, NULL); | |
} | |
-void AISendAnswer(Player *From,Player *To,char *answer) { | |
-/* Sends the answer "answer" from AI player "From" to the server, */ | |
-/* claiming to be for player "To". Also prints the answer on the screen. */ | |
- SendClientMessage(From,C_NONE,C_ANSWER,To,answer); puts(answer); | |
+/* | |
+ * Sends the answer "answer" from AI player "From" to the server, | |
+ * claiming to be for player "To". Also prints the answer on the screen. | |
+ */ | |
+void AISendAnswer(Player *From, Player *To, char *answer) | |
+{ | |
+ SendClientMessage(From, C_NONE, C_ANSWER, To, answer); | |
+ puts(answer); | |
} | |
-void AIHandleQuestion(char *Data,AICode AI,Player *AIPlay,Player *From) { | |
-/* Works out a sensible response to the question coded in "Data" and with */ | |
-/* computer-readable code "AI", claiming to be from "From" and for AI */ | |
-/* player "AIPlay", and sends it */ | |
- char *Prompt,*allowed; | |
- if (From==&Noone) From=NULL; | |
- Prompt=Data; | |
- allowed=GetNextWord(&Prompt,""); | |
- PrintAIMessage(Prompt); | |
- switch (AI) { | |
- case C_ASKLOAN: | |
- if (RealLoanShark==-1) { | |
- g_print(_("Loan shark located at %s\n"), | |
- Location[(int)AIPlay->IsAt].Name); | |
- } | |
- RealLoanShark=AIPlay->IsAt; | |
- AISendAnswer(AIPlay,From,"Y"); | |
- break; | |
- case C_ASKGUNSHOP: | |
- if (RealGunShop==-1) { | |
- g_print(_("Gun shop located at %s\n"), | |
- Location[(int)AIPlay->IsAt].Name); | |
- } | |
- RealGunShop=AIPlay->IsAt; | |
- AISendAnswer(AIPlay,From,"Y"); | |
- break; | |
- case C_ASKPUB: | |
- if (RealPub==-1) { | |
- g_print(_("Pub located at %s\n"),Location[(int)AIPlay->IsAt].Name); | |
- } | |
- RealPub=AIPlay->IsAt; | |
- AISendAnswer(AIPlay,From,"Y"); | |
- break; | |
- case C_ASKBITCH: case C_ASKRUN: case C_ASKGUN: | |
- AISendAnswer(AIPlay,From,"Y"); | |
- break; | |
- case C_ASKRUNFIGHT: | |
- AISendAnswer(AIPlay,From,ShouldRun(AIPlay) ? "R" : "F"); | |
- break; | |
- case C_ASKBANK: | |
- if (RealBank==-1) { | |
- g_print(_("Bank located at %s\n"),Location[(int)AIPlay->IsAt].Name… | |
- } | |
- RealBank=AIPlay->IsAt; | |
- AISendAnswer(AIPlay,From,"N"); | |
- break; | |
- case C_MEETPLAYER: | |
- if (TotalGunsCarried(AIPlay)>0) AISendAnswer(AIPlay,From,"A"); | |
- else { | |
- AISendAnswer(AIPlay,From,"E"); | |
- AIJet(AIPlay); | |
- } | |
- break; | |
- case C_ASKSEW: | |
- AISendAnswer(AIPlay,From,AIPlay->Health<MINSAFEHEALTH ? "Y" : "N"); | |
- break; | |
- default: | |
- AISendAnswer(AIPlay,From,"N"); | |
- break; | |
- } | |
+/* | |
+ * Works out a sensible response to the question coded in "Data" and with | |
+ * computer-readable code "AI", claiming to be from "From" and for AI | |
+ * player "AIPlay", and sends it. | |
+ */ | |
+void AIHandleQuestion(char *Data, AICode AI, Player *AIPlay, Player *From) | |
+{ | |
+ char *Prompt, *allowed; | |
+ | |
+ if (From == &Noone) | |
+ From = NULL; | |
+ Prompt = Data; | |
+ allowed = GetNextWord(&Prompt, ""); | |
+ PrintAIMessage(Prompt); | |
+ switch (AI) { | |
+ case C_ASKLOAN: | |
+ if (RealLoanShark == -1) { | |
+ g_print(_("Loan shark located at %s\n"), | |
+ Location[(int)AIPlay->IsAt].Name); | |
+ } | |
+ RealLoanShark = AIPlay->IsAt; | |
+ AISendAnswer(AIPlay, From, "Y"); | |
+ break; | |
+ case C_ASKGUNSHOP: | |
+ if (RealGunShop == -1) { | |
+ g_print(_("Gun shop located at %s\n"), | |
+ Location[(int)AIPlay->IsAt].Name); | |
+ } | |
+ RealGunShop = AIPlay->IsAt; | |
+ AISendAnswer(AIPlay, From, "Y"); | |
+ break; | |
+ case C_ASKPUB: | |
+ if (RealPub == -1) { | |
+ g_print(_("Pub located at %s\n"), Location[(int)AIPlay->IsAt].Name); | |
+ } | |
+ RealPub = AIPlay->IsAt; | |
+ AISendAnswer(AIPlay, From, "Y"); | |
+ break; | |
+ case C_ASKBITCH: | |
+ case C_ASKRUN: | |
+ case C_ASKGUN: | |
+ AISendAnswer(AIPlay, From, "Y"); | |
+ break; | |
+ case C_ASKRUNFIGHT: | |
+ AISendAnswer(AIPlay, From, ShouldRun(AIPlay) ? "R" : "F"); | |
+ break; | |
+ case C_ASKBANK: | |
+ if (RealBank == -1) { | |
+ g_print(_("Bank located at %s\n"), Location[(int)AIPlay->IsAt].Name); | |
+ } | |
+ RealBank = AIPlay->IsAt; | |
+ AISendAnswer(AIPlay, From, "N"); | |
+ break; | |
+ case C_MEETPLAYER: | |
+ if (TotalGunsCarried(AIPlay) > 0) | |
+ AISendAnswer(AIPlay, From, "A"); | |
+ else { | |
+ AISendAnswer(AIPlay, From, "E"); | |
+ AIJet(AIPlay); | |
+ } | |
+ break; | |
+ case C_ASKSEW: | |
+ AISendAnswer(AIPlay, From, AIPlay->Health < MINSAFEHEALTH ? "Y" : "N"); | |
+ break; | |
+ default: | |
+ AISendAnswer(AIPlay, From, "N"); | |
+ break; | |
+ } | |
} | |
-void AISendRandomMessage(Player *AIPlay) { | |
-/* Sends a random message to all other dopewars players */ | |
- char *RandomInsult[5]= { | |
-/* Random messages to send from the AI player to other players */ | |
- N_("Call yourselves drug dealers?"), | |
- N_("A trained monkey could do better..."), | |
- N_("Think you\'re hard enough to deal with the likes of me?"), | |
- N_("Zzzzz... are you dealing in candy or what?"), | |
- N_("Reckon I'll just have to shoot you for your own good.") | |
- }; | |
- SendClientMessage(AIPlay,C_NONE,C_MSG,NULL,_(RandomInsult[brandom(0,5)])); | |
+/* | |
+ * Sends a random message to all other dopewars players. | |
+ */ | |
+void AISendRandomMessage(Player *AIPlay) | |
+{ | |
+ char *RandomInsult[5] = { | |
+ /* Random messages to send from the AI player to other players */ | |
+ N_("Call yourselves drug dealers?"), | |
+ N_("A trained monkey could do better..."), | |
+ N_("Think you\'re hard enough to deal with the likes of me?"), | |
+ N_("Zzzzz... are you dealing in candy or what?"), | |
+ N_("Reckon I'll just have to shoot you for your own good.") | |
+ }; | |
+ | |
+ SendClientMessage(AIPlay, C_NONE, C_MSG, NULL, | |
+ _(RandomInsult[brandom(0, 5)])); | |
} | |
#else /* NETWORKING */ | |
-void AIPlayerLoop() { | |
-/* Whoops - the user asked that we run an AI player, but the binary was | |
- built without that compiled in. */ | |
- g_print(_("This binary has been compiled without networking support, and " | |
- "thus cannot act as an AI player.\nRecompile passing " | |
- "--enable-networking to the configure script.")); | |
+/* | |
+ * Whoops - the user asked that we run an AI player, but the binary was | |
+ * built without that compiled in. | |
+ */ | |
+void AIPlayerLoop() | |
+{ | |
+ g_print(_("This binary has been compiled without networking support, " | |
+ "and thus cannot act as an AI player.\nRecompile passing " | |
+ "--enable-networking to the configure script.")); | |
} | |
#endif /* NETWORKING */ | |
diff --git a/src/AIPlayer.h b/src/AIPlayer.h | |
t@@ -1,23 +1,24 @@ | |
-/* AIPlayer.h Header file for dopewars computer player code */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * AIPlayer.h Header file for dopewars computer player code * | |
+ * 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 __AIPLAYER_H__ | |
#define __AIPLAYER_H__ | |
diff --git a/src/admin.c b/src/admin.c | |
t@@ -1,22 +1,24 @@ | |
-/* admin.c Dopewars server administration */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * admin.c dopewars server administration * | |
+ * 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> | |
t@@ -38,74 +40,91 @@ | |
#include "nls.h" | |
#include "serverside.h" | |
-static int OpenSocket(void) { | |
+static int OpenSocket(void) | |
+{ | |
struct sockaddr_un addr; | |
int sock; | |
gchar *sockname; | |
- sockname=GetLocalSocket(); | |
+ sockname = GetLocalSocket(); | |
- g_print(_("Attempting to connect to local dopewars server via. Unix domain\n" | |
- "socket %s...\n"),sockname); | |
- sock = socket(PF_UNIX,SOCK_STREAM,0); | |
- if (sock==-1) { perror("socket"); exit(1); } | |
+ g_print(_("Attempting to connect to local dopewars server via. " | |
+ "Unix domain\n socket %s...\n"), sockname); | |
+ sock = socket(PF_UNIX, SOCK_STREAM, 0); | |
+ if (sock == -1) { | |
+ perror("socket"); | |
+ exit(1); | |
+ } | |
addr.sun_family = AF_UNIX; | |
- strncpy(addr.sun_path,sockname,sizeof(addr.sun_path)); | |
- addr.sun_path[sizeof(addr.sun_path)-1]='\0'; | |
+ strncpy(addr.sun_path, sockname, sizeof(addr.sun_path)); | |
+ addr.sun_path[sizeof(addr.sun_path) - 1] = '\0'; | |
- if (connect(sock,(struct sockaddr *)&addr,sizeof(struct sockaddr_un))==-1) { | |
- perror("connect"); exit(1); | |
+ if (connect(sock, (struct sockaddr *)&addr, | |
+ sizeof(struct sockaddr_un)) == -1) { | |
+ perror("connect"); | |
+ exit(1); | |
} | |
- g_print(_("Connection established; use Ctrl-D to close your session.\n\n")); | |
+ g_print(_("Connection established; use Ctrl-D to " | |
+ "close your session.\n\n")); | |
g_free(sockname); | |
return sock; | |
} | |
-void AdminServer(void) { | |
- int sock,topsock; | |
+void AdminServer(void) | |
+{ | |
+ int sock, topsock; | |
NetworkBuffer *netbuf; | |
- fd_set readfds,writefds,errorfds; | |
- gchar *msg,inbuf[200]; | |
+ fd_set readfds, writefds, errorfds; | |
+ gchar *msg, inbuf[200]; | |
gboolean doneOK; | |
- sock=OpenSocket(); | |
- netbuf = g_new(NetworkBuffer,1); | |
- InitNetworkBuffer(netbuf,'\n','\r',NULL); | |
- BindNetworkBufferToSocket(netbuf,sock); | |
+ sock = OpenSocket(); | |
+ netbuf = g_new(NetworkBuffer, 1); | |
+ | |
+ InitNetworkBuffer(netbuf, '\n', '\r', NULL); | |
+ BindNetworkBufferToSocket(netbuf, sock); | |
- while(1) { | |
+ while (1) { | |
FD_ZERO(&readfds); | |
FD_ZERO(&writefds); | |
FD_ZERO(&errorfds); | |
- FD_SET(0,&readfds); | |
- topsock=1; | |
- SetSelectForNetworkBuffer(netbuf,&readfds,&writefds,&errorfds,&topsock); | |
- | |
- if (select(topsock,&readfds,&writefds,&errorfds,NULL)==-1) { | |
- if (errno==EINTR) continue; | |
- else perror("select"); break; | |
+ FD_SET(0, &readfds); | |
+ topsock = 1; | |
+ SetSelectForNetworkBuffer(netbuf, &readfds, &writefds, &errorfds, | |
+ &topsock); | |
+ | |
+ if (select(topsock, &readfds, &writefds, &errorfds, NULL) == -1) { | |
+ if (errno == EINTR) | |
+ continue; | |
+ else | |
+ perror("select"); | |
+ break; | |
} | |
- if (FD_ISSET(0,&readfds)) { | |
- if (fgets(inbuf,sizeof(inbuf),stdin)) { | |
- inbuf[sizeof(inbuf)-1]='\0'; | |
- if (strlen(inbuf)>0) { | |
- if (inbuf[strlen(inbuf)-1]=='\n') inbuf[strlen(inbuf)-1]='\0'; | |
- QueueMessageForSend(netbuf,inbuf); | |
+ if (FD_ISSET(0, &readfds)) { | |
+ if (fgets(inbuf, sizeof(inbuf), stdin)) { | |
+ inbuf[sizeof(inbuf) - 1] = '\0'; | |
+ if (strlen(inbuf) > 0) { | |
+ if (inbuf[strlen(inbuf) - 1] == '\n') | |
+ inbuf[strlen(inbuf) - 1] = '\0'; | |
+ QueueMessageForSend(netbuf, inbuf); | |
} | |
- } else break; | |
+ } else | |
+ break; | |
} | |
- if (RespondToSelect(netbuf,&readfds,&writefds,&errorfds,&doneOK)) { | |
- while((msg=GetWaitingMessage(netbuf))!=NULL) { | |
- g_print("%s\n",msg); g_free(msg); | |
+ if (RespondToSelect(netbuf, &readfds, &writefds, &errorfds, &doneOK)) { | |
+ while ((msg = GetWaitingMessage(netbuf)) != NULL) { | |
+ g_print("%s\n", msg); | |
+ g_free(msg); | |
} | |
} | |
- if (!doneOK) break; | |
+ if (!doneOK) | |
+ break; | |
} | |
ShutdownNetworkBuffer(netbuf); | |
g_free(netbuf); | |
diff --git a/src/admin.h b/src/admin.h | |
t@@ -1,23 +1,24 @@ | |
-/* admin.h Header file for dopewars server administration */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * admin.h Header file for dopewars server administration * | |
+ * 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 __ADMIN_H__ | |
#define __ADMIN_H__ | |
diff --git a/src/curses_client.c b/src/curses_client.c | |
t@@ -1,22 +1,24 @@ | |
-/* curses_client.c dopewars client using the (n)curses console library */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * curses_client.c dopewars client using the (n)curses console library * | |
+ * 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> | |
t@@ -50,297 +52,353 @@ static SCREEN *cur_screen; | |
#ifdef NETWORKING | |
static enum { | |
- CM_SERVER,CM_PROMPT,CM_META,CM_SINGLE | |
+ CM_SERVER, CM_PROMPT, CM_META, CM_SINGLE | |
} ConnectMethod = CM_SERVER; | |
#endif | |
-static gboolean CanFire=FALSE,RunHere=FALSE; | |
+static gboolean CanFire = FALSE, RunHere = FALSE; | |
static FightPoint fp; | |
-/* Function definitions; make them static so as not to clash with functions | |
- of the same name in different clients */ | |
+/* Function definitions; make them static so as not to clash with | |
+ * functions of the same name in different clients */ | |
static void display_intro(void); | |
static void ResizeHandle(int sig); | |
static void CheckForResize(Player *Play); | |
-static int GetKey(char *allowed,char *orig_allowed,gboolean AllowOther, | |
- gboolean PrintAllowed,gboolean ExpandOut); | |
+static int GetKey(char *allowed, char *orig_allowed, gboolean AllowOther, | |
+ gboolean PrintAllowed, gboolean ExpandOut); | |
static void clear_bottom(void), clear_screen(void); | |
static void clear_line(int line), clear_exceptfor(int skip); | |
static void nice_wait(void); | |
-static void DisplayFightMessage(Player *Play,char *text); | |
-static void DisplaySpyReports(char *Data,Player *From,Player *To); | |
+static void DisplayFightMessage(Player *Play, char *text); | |
+static void DisplaySpyReports(char *Data, Player *From, Player *To); | |
static void display_message(char *buf); | |
static void print_location(char *text); | |
-static void print_status(Player *Play,gboolean DispDrug); | |
-static char *nice_input(char *prompt,int sy,int sx,gboolean digitsonly, | |
- char *displaystr,char passwdchar); | |
-static Player *ListPlayers(Player *Play,gboolean Select,char *Prompt); | |
-static void HandleClientMessage(char *buf,Player *Play); | |
+static void print_status(Player *Play, gboolean DispDrug); | |
+static char *nice_input(char *prompt, int sy, int sx, gboolean digitsonly, | |
+ char *displaystr, char passwdchar); | |
+static Player *ListPlayers(Player *Play, gboolean Select, char *Prompt); | |
+static void HandleClientMessage(char *buf, Player *Play); | |
static void PrintMessage(const gchar *text); | |
static void GunShop(Player *Play); | |
static void LoanShark(Player *Play); | |
static void Bank(Player *Play); | |
+ | |
#ifdef NETWORKING | |
-static void HttpAuthFunc(HttpConnection *conn,gboolean proxyauth, | |
- gchar *realm,gpointer data); | |
-static void SocksAuthFunc(NetworkBuffer *netbuf,gpointer data); | |
+static void HttpAuthFunc(HttpConnection *conn, gboolean proxyauth, | |
+ gchar *realm, gpointer data); | |
+static void SocksAuthFunc(NetworkBuffer *netbuf, gpointer data); | |
#endif | |
static DispMode DisplayMode; | |
static gboolean QuitRequest; | |
-static void start_curses(void) { | |
-/* Initialises the curses library for accessing the screen */ | |
- cur_screen=newterm(NULL,stdout,stdin); | |
- if (WantColour) { | |
- start_color(); | |
- init_pair(1,COLOR_MAGENTA,COLOR_WHITE); | |
- init_pair(2,COLOR_BLACK,COLOR_WHITE); | |
- init_pair(3,COLOR_BLACK,COLOR_WHITE); | |
- init_pair(4,COLOR_BLUE,COLOR_WHITE); | |
- init_pair(5,COLOR_WHITE,COLOR_BLUE); | |
- init_pair(6,COLOR_RED,COLOR_WHITE); | |
- } | |
- cbreak(); | |
- noecho(); | |
- nodelay(stdscr,FALSE); | |
- keypad(stdscr,TRUE); | |
- curs_set(0); | |
+/* | |
+ * Initialises the curses library for accessing the screen. | |
+ */ | |
+static void start_curses(void) | |
+{ | |
+ cur_screen = newterm(NULL, stdout, stdin); | |
+ if (WantColour) { | |
+ start_color(); | |
+ init_pair(1, COLOR_MAGENTA, COLOR_WHITE); | |
+ init_pair(2, COLOR_BLACK, COLOR_WHITE); | |
+ init_pair(3, COLOR_BLACK, COLOR_WHITE); | |
+ init_pair(4, COLOR_BLUE, COLOR_WHITE); | |
+ init_pair(5, COLOR_WHITE, COLOR_BLUE); | |
+ init_pair(6, COLOR_RED, COLOR_WHITE); | |
+ } | |
+ cbreak(); | |
+ noecho(); | |
+ nodelay(stdscr, FALSE); | |
+ keypad(stdscr, TRUE); | |
+ curs_set(0); | |
} | |
-static void end_curses(void) { | |
-/* Shuts down the curses screen library */ | |
- keypad(stdscr,FALSE); | |
- curs_set(1); | |
- erase(); | |
- refresh(); | |
- endwin(); | |
+/* | |
+ * Shuts down the curses screen library. | |
+ */ | |
+static void end_curses(void) | |
+{ | |
+ keypad(stdscr, FALSE); | |
+ curs_set(1); | |
+ erase(); | |
+ refresh(); | |
+ endwin(); | |
} | |
-void ResizeHandle(int sig) { | |
-/* Handles a SIGWINCH signal, which is sent to indicate that the */ | |
-/* size of the curses screen has changed. */ | |
- ResizedFlag=1; | |
+/* | |
+ * Handles a SIGWINCH signal, which is sent to indicate that the | |
+ * size of the curses screen has changed. | |
+ */ | |
+void ResizeHandle(int sig) | |
+{ | |
+ ResizedFlag = 1; | |
} | |
-void CheckForResize(Player *Play) { | |
-/* Checks to see if the curses window needs to be resized - i.e. if a */ | |
-/* SIGWINCH signal has been received */ | |
- sigset_t sigset; | |
- sigemptyset(&sigset); | |
- sigaddset(&sigset,SIGWINCH); | |
- sigprocmask(SIG_BLOCK,&sigset,NULL); | |
- if (ResizedFlag) { | |
- ResizedFlag=0; | |
- end_curses(); start_curses(); | |
- Width=COLS; Depth=LINES; | |
- attrset(TextAttr); clear_screen(); | |
- display_message(""); | |
- DisplayFightMessage(Play,""); | |
- print_status(Play,TRUE); | |
- } | |
- sigprocmask(SIG_UNBLOCK,&sigset,NULL); | |
+/* | |
+ * Checks to see if the curses window needs to be resized - i.e. if a | |
+ * SIGWINCH signal has been received. | |
+ */ | |
+void CheckForResize(Player *Play) | |
+{ | |
+ sigset_t sigset; | |
+ | |
+ sigemptyset(&sigset); | |
+ sigaddset(&sigset, SIGWINCH); | |
+ sigprocmask(SIG_BLOCK, &sigset, NULL); | |
+ if (ResizedFlag) { | |
+ ResizedFlag = 0; | |
+ end_curses(); | |
+ start_curses(); | |
+ Width = COLS; | |
+ Depth = LINES; | |
+ attrset(TextAttr); | |
+ clear_screen(); | |
+ display_message(""); | |
+ DisplayFightMessage(Play, ""); | |
+ print_status(Play, TRUE); | |
+ } | |
+ sigprocmask(SIG_UNBLOCK, &sigset, NULL); | |
} | |
-static void LogMessage(const gchar *log_domain,GLogLevelFlags log_level, | |
- const gchar *message,gpointer user_data) { | |
- attrset(TextAttr); clear_bottom(); | |
- PrintMessage(message); | |
- nice_wait(); | |
- attrset(TextAttr); clear_bottom(); | |
+static void LogMessage(const gchar *log_domain, GLogLevelFlags log_level, | |
+ const gchar *message, gpointer user_data) | |
+{ | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ PrintMessage(message); | |
+ nice_wait(); | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
} | |
-void display_intro(void) { | |
-/* Displays a dopewars introduction screen */ | |
- GString *text; | |
- attrset(TextAttr); | |
- clear_screen(); | |
- attrset(TitleAttr); | |
- | |
-/* Curses client introduction screen */ | |
- text=g_string_new(_("D O P E W A R S")); | |
- mvaddstr(1,(Width-text->len)/2,text->str); | |
- | |
- attrset(TextAttr); | |
- | |
- mvaddstr(3,1,_("Based on John E. Dell's old Drug Wars game, dopewars " | |
- "is a simulation of an")); | |
- mvaddstr(4,1,_("imaginary drug market. dopewars is an All-American " | |
- "game which features")); | |
- mvaddstr(5,1,_("buying, selling, and trying to get past the cops!")); | |
- | |
- mvaddstr(7,1,_("The first thing you need to do is pay off your " | |
- "debt to the Loan Shark. After")); | |
- mvaddstr(8,1,_("that, your goal is to make as much money as " | |
- "possible (and stay alive)! You")); | |
- mvaddstr(9,1,_("have one month of game time to make your fortune.")); | |
- | |
- mvaddstr(11,18,_("Copyright (C) 1998-2002 Ben Webb " | |
- "[email protected]")); | |
- g_string_sprintf(text,_("Version %s"),VERSION); | |
- mvaddstr(11,2,text->str); | |
- g_string_assign(text, | |
- _("dopewars is released under the GNU General Public Licence")); | |
- mvaddstr(12,(Width-text->len)/2,text->str); | |
- | |
- mvaddstr(14,7,_("Icons and Graphics Ocelot Mantis")); | |
- mvaddstr(15,7,_("Drug Dealing and Research Dan Wolf")); | |
- mvaddstr(16,7,_("Play Testing Phil Davis " | |
- "Owen Walsh")); | |
- mvaddstr(17,7,_("Extensive Play Testing Katherine Holt " | |
- "Caroline Moore")); | |
- mvaddstr(18,7,_("Constructive Criticism Andrea Elliot-Smith " | |
- "Pete Winn")); | |
- mvaddstr(19,7,_("Unconstructive Criticism James Matthews")); | |
- | |
- mvaddstr(21,3,_("For information on the command line options, type " | |
- "dopewars -h at your")); | |
- mvaddstr(22,1,_("Unix prompt. This will display a help screen, listing " | |
- "the available options.")); | |
- | |
- g_string_free(text,TRUE); | |
- nice_wait(); | |
- attrset(TextAttr); clear_screen(); refresh(); | |
+/* | |
+ * Displays a dopewars introduction screen. | |
+ */ | |
+void display_intro(void) | |
+{ | |
+ GString *text; | |
+ | |
+ attrset(TextAttr); | |
+ clear_screen(); | |
+ attrset(TitleAttr); | |
+ | |
+ /* Curses client introduction screen */ | |
+ text = g_string_new(_("D O P E W A R S")); | |
+ mvaddstr(1, (Width - text->len) / 2, text->str); | |
+ | |
+ attrset(TextAttr); | |
+ | |
+ mvaddstr(3, 1, _("Based on John E. Dell's old Drug Wars game, dopewars " | |
+ "is a simulation of an")); | |
+ mvaddstr(4, 1, _("imaginary drug market. dopewars is an All-American " | |
+ "game which features")); | |
+ mvaddstr(5, 1, _("buying, selling, and trying to get past the cops!")); | |
+ | |
+ mvaddstr(7, 1, _("The first thing you need to do is pay off your " | |
+ "debt to the Loan Shark. After")); | |
+ mvaddstr(8, 1, _("that, your goal is to make as much money as " | |
+ "possible (and stay alive)! You")); | |
+ mvaddstr(9, 1, _("have one month of game time to make your fortune.")); | |
+ | |
+ mvaddstr(11, 18, _("Copyright (C) 1998-2002 Ben Webb " | |
+ "[email protected]")); | |
+ g_string_sprintf(text, _("Version %s"), VERSION); | |
+ mvaddstr(11, 2, text->str); | |
+ g_string_assign(text, _("dopewars is released under the GNU " | |
+ "General Public Licence")); | |
+ mvaddstr(12, (Width - text->len) / 2, text->str); | |
+ | |
+ mvaddstr(14, 7, _("Icons and Graphics Ocelot Mantis")); | |
+ mvaddstr(15, 7, _("Drug Dealing and Research Dan Wolf")); | |
+ mvaddstr(16, 7, _("Play Testing Phil Davis " | |
+ "Owen Walsh")); | |
+ mvaddstr(17, 7, _("Extensive Play Testing Katherine Holt " | |
+ "Caroline Moore")); | |
+ mvaddstr(18, 7, _("Constructive Criticism Andrea Elliot-Smith " | |
+ "Pete Winn")); | |
+ mvaddstr(19, 7, _("Unconstructive Criticism James Matthews")); | |
+ | |
+ mvaddstr(21, 3, _("For information on the command line options, type " | |
+ "dopewars -h at your")); | |
+ mvaddstr(22, 1, | |
+ _("Unix prompt. This will display a help screen, listing " | |
+ "the available options.")); | |
+ | |
+ g_string_free(text, TRUE); | |
+ nice_wait(); | |
+ attrset(TextAttr); | |
+ clear_screen(); | |
+ refresh(); | |
} | |
#ifdef NETWORKING | |
-static void SelectServerManually(void) { | |
-/* Prompts the user to enter a server name and port to connect to */ | |
- gchar *text,*PortText; | |
- if (ServerName[0]=='(') AssignName(&ServerName,"localhost"); | |
- attrset(TextAttr); | |
- clear_bottom(); | |
- mvaddstr(17,1, | |
-/* Prompts for hostname and port when selecting a server manually */ | |
- _("Please enter the hostname and port of a dopewars server:-")); | |
- text=nice_input(_("Hostname: "),18,1,FALSE,ServerName,'\0'); | |
- AssignName(&ServerName,text); g_free(text); | |
- PortText=g_strdup_printf("%d",Port); | |
- text=nice_input(_("Port: "),19,1,TRUE,PortText,'\0'); | |
- Port=atoi(text); | |
- g_free(text); g_free(PortText); | |
+/* | |
+ * Prompts the user to enter a server name and port to connect to. | |
+ */ | |
+static void SelectServerManually(void) | |
+{ | |
+ gchar *text, *PortText; | |
+ | |
+ if (ServerName[0] == '(') | |
+ AssignName(&ServerName, "localhost"); | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ mvaddstr(17, 1, | |
+ /* Prompts for hostname and port when selecting a server | |
+ * manually */ | |
+ _("Please enter the hostname and port of a dopewars server:-")); | |
+ text = nice_input(_("Hostname: "), 18, 1, FALSE, ServerName, '\0'); | |
+ AssignName(&ServerName, text); | |
+ g_free(text); | |
+ PortText = g_strdup_printf("%d", Port); | |
+ text = nice_input(_("Port: "), 19, 1, TRUE, PortText, '\0'); | |
+ Port = atoi(text); | |
+ g_free(text); | |
+ g_free(PortText); | |
} | |
-static gboolean SelectServerFromMetaServer(Player *Play,GString *errstr) { | |
-/* Contacts the dopewars metaserver, and obtains a list of valid */ | |
-/* server/port pairs, one of which the user should select. */ | |
-/* Returns TRUE on success; on failure FALSE is returned, and */ | |
-/* errstr is assigned an error message. */ | |
- int c; | |
- GSList *ListPt; | |
- ServerData *ThisServer; | |
- GString *text; | |
- gint index; | |
- fd_set readfds,writefds; | |
- int maxsock; | |
- gboolean DoneOK; | |
- HttpConnection *MetaConn; | |
- | |
- attrset(TextAttr); | |
- clear_bottom(); | |
- mvaddstr(17,1,_("Please wait... attempting to contact metaserver...")); | |
- refresh(); | |
- | |
- if (OpenMetaHttpConnection(&MetaConn)) { | |
- SetHttpAuthFunc(MetaConn,HttpAuthFunc,NULL); | |
- SetNetworkBufferUserPasswdFunc(&MetaConn->NetBuf,SocksAuthFunc,NULL); | |
- } else { | |
- g_string_assign_error(errstr,MetaConn->NetBuf.error); | |
- CloseHttpConnection(MetaConn); | |
- return FALSE; | |
- } | |
- | |
- ClearServerList(&ServerList); | |
- | |
- do { | |
- FD_ZERO(&readfds); FD_ZERO(&writefds); | |
- FD_SET(0,&readfds); maxsock=1; | |
- SetSelectForNetworkBuffer(&MetaConn->NetBuf,&readfds,&writefds, | |
- NULL,&maxsock); | |
- if (bselect(maxsock,&readfds,&writefds,NULL,NULL)==-1) { | |
- if (errno==EINTR) { CheckForResize(Play); continue; } | |
- perror("bselect"); exit(1); | |
+/* | |
+ * Contacts the dopewars metaserver, and obtains a list of valid | |
+ * server/port pairs, one of which the user should select. | |
+ * Returns TRUE on success; on failure FALSE is returned, and | |
+ * errstr is assigned an error message. | |
+ */ | |
+static gboolean SelectServerFromMetaServer(Player *Play, GString *errstr) | |
+{ | |
+ int c; | |
+ GSList *ListPt; | |
+ ServerData *ThisServer; | |
+ GString *text; | |
+ gint index; | |
+ fd_set readfds, writefds; | |
+ int maxsock; | |
+ gboolean DoneOK; | |
+ HttpConnection *MetaConn; | |
+ | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ mvaddstr(17, 1, _("Please wait... attempting to contact metaserver...")); | |
+ refresh(); | |
+ | |
+ if (OpenMetaHttpConnection(&MetaConn)) { | |
+ SetHttpAuthFunc(MetaConn, HttpAuthFunc, NULL); | |
+ SetNetworkBufferUserPasswdFunc(&MetaConn->NetBuf, SocksAuthFunc, NULL); | |
+ } else { | |
+ g_string_assign_error(errstr, MetaConn->NetBuf.error); | |
+ CloseHttpConnection(MetaConn); | |
+ return FALSE; | |
+ } | |
+ | |
+ ClearServerList(&ServerList); | |
+ | |
+ do { | |
+ FD_ZERO(&readfds); | |
+ FD_ZERO(&writefds); | |
+ FD_SET(0, &readfds); | |
+ maxsock = 1; | |
+ SetSelectForNetworkBuffer(&MetaConn->NetBuf, &readfds, &writefds, | |
+ NULL, &maxsock); | |
+ if (bselect(maxsock, &readfds, &writefds, NULL, NULL) == -1) { | |
+ if (errno == EINTR) { | |
+ CheckForResize(Play); | |
+ continue; | |
} | |
- if (FD_ISSET(0,&readfds)) { | |
- /* So that Ctrl-L works */ | |
- c = getch(); | |
+ perror("bselect"); | |
+ exit(1); | |
+ } | |
+ if (FD_ISSET(0, &readfds)) { | |
+ /* So that Ctrl-L works */ | |
+ c = getch(); | |
#ifndef CYGWIN | |
- if (c=='\f') wrefresh(curscr); | |
+ if (c == '\f') | |
+ wrefresh(curscr); | |
#endif | |
+ } | |
+ if (RespondToSelect | |
+ (&MetaConn->NetBuf, &readfds, &writefds, NULL, &DoneOK)) { | |
+ while (HandleWaitingMetaServerData(MetaConn, &ServerList, &DoneOK)) { | |
} | |
- if (RespondToSelect(&MetaConn->NetBuf,&readfds,&writefds,NULL,&DoneOK)) { | |
- while (HandleWaitingMetaServerData(MetaConn,&ServerList,&DoneOK)) {} | |
- } | |
- if (!DoneOK && HandleHttpCompletion(MetaConn)) { | |
- if (IsHttpError(MetaConn)) { | |
- g_string_assign_error(errstr,MetaConn->NetBuf.error); | |
- CloseHttpConnection(MetaConn); | |
- return FALSE; | |
- } | |
+ } | |
+ if (!DoneOK && HandleHttpCompletion(MetaConn)) { | |
+ if (IsHttpError(MetaConn)) { | |
+ g_string_assign_error(errstr, MetaConn->NetBuf.error); | |
+ CloseHttpConnection(MetaConn); | |
+ return FALSE; | |
} | |
- } while (DoneOK); | |
- CloseHttpConnection(MetaConn); | |
+ } | |
+ } while (DoneOK); | |
+ CloseHttpConnection(MetaConn); | |
- text=g_string_new(""); | |
+ text = g_string_new(""); | |
- ListPt=ServerList; | |
- while (ListPt) { | |
- ThisServer=(ServerData *)(ListPt->data); | |
- attrset(TextAttr); | |
- clear_bottom(); | |
-/* Printout of metaserver information in curses client */ | |
- g_string_sprintf(text,_("Server : %s"),ThisServer->Name); | |
- mvaddstr(17,1,text->str); | |
- g_string_sprintf(text,_("Port : %d"),ThisServer->Port); | |
- mvaddstr(18,1,text->str); | |
- g_string_sprintf(text,_("Version : %s"),ThisServer->Version); | |
- mvaddstr(18,40,text->str); | |
- if (ThisServer->CurPlayers==-1) { | |
- g_string_sprintf(text,_("Players: -unknown- (maximum %d)"), | |
- ThisServer->MaxPlayers); | |
- } else { | |
- g_string_sprintf(text,_("Players: %d (maximum %d)"), | |
- ThisServer->CurPlayers,ThisServer->MaxPlayers); | |
- } | |
- mvaddstr(19,1,text->str); | |
- g_string_sprintf(text,_("Up since : %s"),ThisServer->UpSince); | |
- mvaddstr(19,40,text->str); | |
- g_string_sprintf(text,_("Comment: %s"),ThisServer->Comment); | |
- mvaddstr(20,1,text->str); | |
- attrset(PromptAttr); | |
- mvaddstr(23,1, | |
- _("N>ext server; P>revious server; S>elect this server... ")); | |
- | |
-/* The three keys that are valid responses to the previous question - if you | |
- translate them, keep the keys in the same order (N>ext, P>revious, S>elect) | |
- as they are here, otherwise they'll do the wrong things. */ | |
- c=GetKey(_("NPS"),"NPS",FALSE,FALSE,FALSE); | |
- switch(c) { | |
- case 'S': AssignName(&ServerName,ThisServer->Name); | |
- Port=ThisServer->Port; | |
- ListPt=NULL; | |
- break; | |
- case 'N': ListPt=g_slist_next(ListPt); | |
- if (!ListPt) ListPt=ServerList; | |
- break; | |
- case 'P': index=g_slist_position(ServerList,ListPt)-1; | |
- if (index>=0) ListPt=g_slist_nth(ServerList,(guint)index); | |
- else ListPt=g_slist_last(ListPt); | |
- break; | |
- } | |
- } | |
- if (!ServerList) { | |
- g_string_assign(errstr,"No servers listed on metaserver"); | |
- return FALSE; | |
- } | |
- clear_line(17); | |
- refresh(); | |
- g_string_free(text,TRUE); | |
- return TRUE; | |
+ ListPt = ServerList; | |
+ while (ListPt) { | |
+ ThisServer = (ServerData *)(ListPt->data); | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ /* Printout of metaserver information in curses client */ | |
+ g_string_sprintf(text, _("Server : %s"), ThisServer->Name); | |
+ mvaddstr(17, 1, text->str); | |
+ g_string_sprintf(text, _("Port : %d"), ThisServer->Port); | |
+ mvaddstr(18, 1, text->str); | |
+ g_string_sprintf(text, _("Version : %s"), ThisServer->Version); | |
+ mvaddstr(18, 40, text->str); | |
+ if (ThisServer->CurPlayers == -1) { | |
+ g_string_sprintf(text, _("Players: -unknown- (maximum %d)"), | |
+ ThisServer->MaxPlayers); | |
+ } else { | |
+ g_string_sprintf(text, _("Players: %d (maximum %d)"), | |
+ ThisServer->CurPlayers, ThisServer->MaxPlayers); | |
+ } | |
+ mvaddstr(19, 1, text->str); | |
+ g_string_sprintf(text, _("Up since : %s"), ThisServer->UpSince); | |
+ mvaddstr(19, 40, text->str); | |
+ g_string_sprintf(text, _("Comment: %s"), ThisServer->Comment); | |
+ mvaddstr(20, 1, text->str); | |
+ attrset(PromptAttr); | |
+ mvaddstr(23, 1, | |
+ _("N>ext server; P>revious server; S>elect this server... ")); | |
+ | |
+ /* The three keys that are valid responses to the previous question - | |
+ * if you translate them, keep the keys in the same order (N>ext, | |
+ * P>revious, S>elect) as they are here, otherwise they'll do the | |
+ * wrong things. */ | |
+ c = GetKey(_("NPS"), "NPS", FALSE, FALSE, FALSE); | |
+ switch (c) { | |
+ case 'S': | |
+ AssignName(&ServerName, ThisServer->Name); | |
+ Port = ThisServer->Port; | |
+ ListPt = NULL; | |
+ break; | |
+ case 'N': | |
+ ListPt = g_slist_next(ListPt); | |
+ if (!ListPt) | |
+ ListPt = ServerList; | |
+ break; | |
+ case 'P': | |
+ index = g_slist_position(ServerList, ListPt) - 1; | |
+ if (index >= 0) | |
+ ListPt = g_slist_nth(ServerList, (guint)index); | |
+ else | |
+ ListPt = g_slist_last(ListPt); | |
+ break; | |
+ } | |
+ } | |
+ if (!ServerList) { | |
+ g_string_assign(errstr, "No servers listed on metaserver"); | |
+ return FALSE; | |
+ } | |
+ clear_line(17); | |
+ refresh(); | |
+ g_string_free(text, TRUE); | |
+ return TRUE; | |
} | |
static void DisplayConnectStatus(NetworkBuffer *netbuf, | |
- NBStatus oldstatus,NBSocksStatus oldsocks) { | |
+ NBStatus oldstatus, | |
+ NBSocksStatus oldsocks) | |
+{ | |
NBStatus status; | |
NBSocksStatus sockstat; | |
GString *text; | |
t@@ -348,41 +406,43 @@ static void DisplayConnectStatus(NetworkBuffer *netbuf, | |
status = netbuf->status; | |
sockstat = netbuf->sockstat; | |
- if (oldstatus==status && oldsocks==sockstat) return; | |
+ if (oldstatus == status && oldsocks == sockstat) | |
+ return; | |
- text=g_string_new(""); | |
+ text = g_string_new(""); | |
- switch(status) { | |
- case NBS_PRECONNECT: | |
+ switch (status) { | |
+ case NBS_PRECONNECT: | |
+ break; | |
+ case NBS_SOCKSCONNECT: | |
+ switch (sockstat) { | |
+ case NBSS_METHODS: | |
+ g_string_sprintf(text, _("Connected to SOCKS server %s..."), | |
+ Socks.name); | |
break; | |
- case NBS_SOCKSCONNECT: | |
- switch(sockstat) { | |
- case NBSS_METHODS: | |
- g_string_sprintf(text,_("Connected to SOCKS server %s..."), | |
- Socks.name); | |
- break; | |
- case NBSS_USERPASSWD: | |
- g_string_assign(text,_("Authenticating with SOCKS server")); | |
- break; | |
- case NBSS_CONNECT: | |
- g_string_sprintf(text,_("Asking SOCKS for connect to %s..."), | |
- ServerName); | |
- break; | |
- } | |
+ case NBSS_USERPASSWD: | |
+ g_string_assign(text, _("Authenticating with SOCKS server")); | |
break; | |
- case NBS_CONNECTED: | |
+ case NBSS_CONNECT: | |
+ g_string_sprintf(text, _("Asking SOCKS for connect to %s..."), | |
+ ServerName); | |
break; | |
+ } | |
+ break; | |
+ case NBS_CONNECTED: | |
+ break; | |
} | |
if (text->str[0]) { | |
- mvaddstr(17,1,text->str); | |
+ mvaddstr(17, 1, text->str); | |
refresh(); | |
} | |
- g_string_free(text,TRUE); | |
+ g_string_free(text, TRUE); | |
} | |
-void HttpAuthFunc(HttpConnection *conn,gboolean proxyauth, | |
- gchar *realm,gpointer data) { | |
- gchar *text,*user,*password=NULL; | |
+void HttpAuthFunc(HttpConnection *conn, gboolean proxyauth, | |
+ gchar *realm, gpointer data) | |
+{ | |
+ gchar *text, *user, *password = NULL; | |
attrset(TextAttr); | |
clear_bottom(); | |
t@@ -390,306 +450,358 @@ void HttpAuthFunc(HttpConnection *conn,gboolean proxya… | |
text = g_strdup_printf(_("Proxy authentication required for realm %s"), | |
realm); | |
} else { | |
- text = g_strdup_printf(_("Authentication required for realm %s"),realm); | |
+ text = | |
+ g_strdup_printf(_("Authentication required for realm %s"), realm); | |
} | |
- mvaddstr(17,1,text); | |
- mvaddstr(18,1,_("(Enter a blank username to cancel)")); | |
+ mvaddstr(17, 1, text); | |
+ mvaddstr(18, 1, _("(Enter a blank username to cancel)")); | |
g_free(text); | |
- | |
- user=nice_input(_("User name: "),19,1,FALSE,NULL,'\0'); | |
+ | |
+ user = nice_input(_("User name: "), 19, 1, FALSE, NULL, '\0'); | |
if (user && user[0]) { | |
- password=nice_input(_("Password: "),20,1,FALSE,NULL,'*'); | |
+ password = nice_input(_("Password: "), 20, 1, FALSE, NULL, '*'); | |
} | |
- SetHttpAuthentication(conn,proxyauth,user,password); | |
- g_free(user); g_free(password); | |
+ SetHttpAuthentication(conn, proxyauth, user, password); | |
+ g_free(user); | |
+ g_free(password); | |
} | |
-void SocksAuthFunc(NetworkBuffer *netbuf,gpointer data) { | |
- gchar *user,*password=NULL; | |
+void SocksAuthFunc(NetworkBuffer *netbuf, gpointer data) | |
+{ | |
+ gchar *user, *password = NULL; | |
attrset(TextAttr); | |
clear_bottom(); | |
- mvaddstr(17,1, | |
- _("SOCKS authentication required (enter a blank username to cancel)")); | |
- | |
- user=nice_input(_("User name: "),18,1,FALSE,NULL,'\0'); | |
+ mvaddstr(17, 1, _("SOCKS authentication required (enter a blank " | |
+ "username to cancel)")); | |
+ | |
+ user = nice_input(_("User name: "), 18, 1, FALSE, NULL, '\0'); | |
if (user && user[0]) { | |
- password=nice_input(_("Password: "),19,1,FALSE,NULL,'*'); | |
+ password = nice_input(_("Password: "), 19, 1, FALSE, NULL, '*'); | |
} | |
- SendSocks5UserPasswd(netbuf,user,password); | |
- g_free(user); g_free(password); | |
+ SendSocks5UserPasswd(netbuf, user, password); | |
+ g_free(user); | |
+ g_free(password); | |
} | |
-static gboolean DoConnect(Player *Play,GString *errstr) { | |
+static gboolean DoConnect(Player *Play, GString *errstr) | |
+{ | |
NetworkBuffer *netbuf; | |
- fd_set readfds,writefds; | |
- int maxsock,c; | |
- gboolean doneOK=TRUE; | |
+ fd_set readfds, writefds; | |
+ int maxsock, c; | |
+ gboolean doneOK = TRUE; | |
NBStatus oldstatus; | |
NBSocksStatus oldsocks; | |
- netbuf=&Play->NetBuf; | |
+ netbuf = &Play->NetBuf; | |
oldstatus = netbuf->status; | |
- oldsocks = netbuf->sockstat; | |
+ oldsocks = netbuf->sockstat; | |
- if (!StartNetworkBufferConnect(netbuf,ServerName,Port)) { | |
- doneOK=FALSE; | |
+ if (!StartNetworkBufferConnect(netbuf, ServerName, Port)) { | |
+ doneOK = FALSE; | |
} else { | |
- SetNetworkBufferUserPasswdFunc(netbuf,SocksAuthFunc,NULL); | |
- while (netbuf->status!=NBS_CONNECTED) { | |
- DisplayConnectStatus(netbuf,oldstatus,oldsocks); | |
+ SetNetworkBufferUserPasswdFunc(netbuf, SocksAuthFunc, NULL); | |
+ while (netbuf->status != NBS_CONNECTED) { | |
+ DisplayConnectStatus(netbuf, oldstatus, oldsocks); | |
oldstatus = netbuf->status; | |
- oldsocks = netbuf->sockstat; | |
- FD_ZERO(&readfds); FD_ZERO(&writefds); | |
- FD_SET(0,&readfds); maxsock=1; | |
- SetSelectForNetworkBuffer(netbuf,&readfds,&writefds,NULL,&maxsock); | |
- if (bselect(maxsock,&readfds,&writefds,NULL,NULL)==-1) { | |
- if (errno==EINTR) { CheckForResize(Play); continue; } | |
- perror("bselect"); exit(1); | |
+ oldsocks = netbuf->sockstat; | |
+ FD_ZERO(&readfds); | |
+ FD_ZERO(&writefds); | |
+ FD_SET(0, &readfds); | |
+ maxsock = 1; | |
+ SetSelectForNetworkBuffer(netbuf, &readfds, &writefds, NULL, | |
+ &maxsock); | |
+ if (bselect(maxsock, &readfds, &writefds, NULL, NULL) == -1) { | |
+ if (errno == EINTR) { | |
+ CheckForResize(Play); | |
+ continue; | |
+ } | |
+ perror("bselect"); | |
+ exit(1); | |
} | |
- if (FD_ISSET(0,&readfds)) { | |
+ if (FD_ISSET(0, &readfds)) { | |
/* So that Ctrl-L works */ | |
c = getch(); | |
#ifndef CYGWIN | |
- if (c=='\f') wrefresh(curscr); | |
+ if (c == '\f') | |
+ wrefresh(curscr); | |
#endif | |
} | |
- RespondToSelect(netbuf,&readfds,&writefds,NULL,&doneOK); | |
+ RespondToSelect(netbuf, &readfds, &writefds, NULL, &doneOK); | |
} | |
} | |
- if (!doneOK) g_string_assign_error(errstr,netbuf->error); | |
+ if (!doneOK) | |
+ g_string_assign_error(errstr, netbuf->error); | |
return doneOK; | |
} | |
-static gboolean ConnectToServer(Player *Play) { | |
-/* Connects to a dopewars server. Prompts the user to select a server */ | |
-/* if necessary. Returns TRUE, unless the user elected to quit the */ | |
-/* program rather than choose a valid server. */ | |
- gboolean MetaOK=TRUE,NetOK=TRUE,firstrun=FALSE; | |
- GString *errstr; | |
- gchar *text; | |
- int c; | |
- | |
- errstr = g_string_new(""); | |
- | |
- if (g_strcasecmp(ServerName,SN_META)==0 || ConnectMethod==CM_META) { | |
- ConnectMethod=CM_META; | |
- MetaOK=SelectServerFromMetaServer(Play,errstr); | |
- } else if (g_strcasecmp(ServerName,SN_PROMPT)==0 || | |
- ConnectMethod==CM_PROMPT) { | |
- ConnectMethod=CM_PROMPT; | |
- SelectServerManually(); | |
- } else if (g_strcasecmp(ServerName,SN_SINGLE)==0 || | |
- ConnectMethod==CM_SINGLE) { | |
- ConnectMethod=CM_SINGLE; | |
- g_string_free(errstr,TRUE); | |
- return TRUE; | |
- } else firstrun=TRUE; | |
- | |
- while (1) { | |
+/* | |
+ * Connects to a dopewars server. Prompts the user to select a server | |
+ * if necessary. Returns TRUE, unless the user elected to quit the | |
+ * program rather than choose a valid server. | |
+ */ | |
+static gboolean ConnectToServer(Player *Play) | |
+{ | |
+ gboolean MetaOK = TRUE, NetOK = TRUE, firstrun = FALSE; | |
+ GString *errstr; | |
+ gchar *text; | |
+ int c; | |
+ | |
+ errstr = g_string_new(""); | |
+ | |
+ if (g_strcasecmp(ServerName, SN_META) == 0 || ConnectMethod == CM_META) { | |
+ ConnectMethod = CM_META; | |
+ MetaOK = SelectServerFromMetaServer(Play, errstr); | |
+ } else if (g_strcasecmp(ServerName, SN_PROMPT) == 0 || | |
+ ConnectMethod == CM_PROMPT) { | |
+ ConnectMethod = CM_PROMPT; | |
+ SelectServerManually(); | |
+ } else if (g_strcasecmp(ServerName, SN_SINGLE) == 0 || | |
+ ConnectMethod == CM_SINGLE) { | |
+ ConnectMethod = CM_SINGLE; | |
+ g_string_free(errstr, TRUE); | |
+ return TRUE; | |
+ } else | |
+ firstrun = TRUE; | |
+ | |
+ while (1) { | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ if (MetaOK && !firstrun) { | |
+ mvaddstr(17, 1, _("Please wait... attempting to contact " | |
+ "dopewars server...")); | |
+ refresh(); | |
+ NetOK = DoConnect(Play, errstr); | |
+ } | |
+ if (!NetOK || !MetaOK || firstrun) { | |
+ firstrun = FALSE; | |
+ clear_line(16); | |
+ clear_line(17); | |
+ if (!MetaOK) { | |
+ /* Display of an error while contacting the metaserver */ | |
+ mvaddstr(16, 1, _("Cannot get metaserver details")); | |
+ text = g_strdup_printf(" (%s)", errstr->str); | |
+ mvaddstr(17, 1, text); | |
+ g_free(text); | |
+ } else if (!NetOK) { | |
+ /* Display of an error message while trying to contact a dopewars | |
+ * server (the error message itself is displayed on the next | |
+ * screen line) */ | |
+ mvaddstr(16, 1, _("Could not start multiplayer dopewars")); | |
+ text = g_strdup_printf(" (%s)", errstr->str); | |
+ mvaddstr(17, 1, text); | |
+ g_free(text); | |
+ } | |
+ MetaOK = NetOK = TRUE; | |
+ attrset(PromptAttr); | |
+ mvaddstr(18, 1, | |
+ _("Will you... C>onnect to a named dopewars server")); | |
+ mvaddstr(19, 1, | |
+ _(" L>ist the servers on the metaserver, and " | |
+ "select one")); | |
+ mvaddstr(20, 1, | |
+ _(" Q>uit (where you can start a server " | |
+ "by typing \"dopewars -s\")")); | |
+ mvaddstr(21, 1, _(" or P>lay single-player ? ")); | |
attrset(TextAttr); | |
- clear_bottom(); | |
- if (MetaOK && !firstrun) { | |
- mvaddstr(17,1, | |
- _("Please wait... attempting to contact dopewars server...")… | |
- refresh(); | |
- NetOK=DoConnect(Play,errstr); | |
+ | |
+ /* Translate these 4 keys in line with the above options, keeping | |
+ * the order the same (C>onnect, L>ist, Q>uit, P>lay single-player) */ | |
+ c = GetKey(_("CLQP"), "CLQP", FALSE, FALSE, FALSE); | |
+ switch (c) { | |
+ case 'Q': | |
+ g_string_free(errstr, TRUE); | |
+ return FALSE; | |
+ case 'P': | |
+ g_string_free(errstr, TRUE); | |
+ return TRUE; | |
+ case 'L': | |
+ MetaOK = SelectServerFromMetaServer(Play, errstr); | |
+ break; | |
+ case 'C': | |
+ SelectServerManually(); | |
+ break; | |
} | |
- if (!NetOK || !MetaOK || firstrun) { | |
- firstrun=FALSE; | |
- clear_line(16); | |
- clear_line(17); | |
- if (!MetaOK) { | |
-/* Display of an error while contacting the metaserver */ | |
- mvaddstr(16,1,_("Cannot get metaserver details")); | |
- text=g_strdup_printf(" (%s)",errstr->str); | |
- mvaddstr(17,1,text); g_free(text); | |
- } else if (!NetOK) { | |
-/* Display of an error message while trying to contact a dopewars server | |
- (the error message itself is displayed on the next screen line) */ | |
- mvaddstr(16,1,_("Could not start multiplayer dopewars")); | |
- text=g_strdup_printf(" (%s)",errstr->str); | |
- mvaddstr(17,1,text); g_free(text); | |
- } | |
- MetaOK=NetOK=TRUE; | |
- attrset(PromptAttr); | |
- mvaddstr(18,1, | |
- _("Will you... C>onnect to a named dopewars server")); | |
- mvaddstr(19,1, | |
- _(" L>ist the servers on the metaserver, and " | |
- "select one")); | |
- mvaddstr(20,1, | |
- _(" Q>uit (where you can start a server " | |
- "by typing \"dopewars -s\")")); | |
- mvaddstr(21,1,_(" or P>lay single-player ? ")); | |
- attrset(TextAttr); | |
- | |
-/* Translate these 4 keys in line with the above options, keeping the order | |
- the same (C>onnect, L>ist, Q>uit, P>lay single-player) */ | |
- c=GetKey(_("CLQP"),"CLQP",FALSE,FALSE,FALSE); | |
- switch(c) { | |
- case 'Q': g_string_free(errstr,TRUE); | |
- return FALSE; | |
- case 'P': g_string_free(errstr,TRUE); | |
- return TRUE; | |
- case 'L': MetaOK=SelectServerFromMetaServer(Play,errstr); | |
- break; | |
- case 'C': SelectServerManually(); | |
- break; | |
- } | |
- } else break; | |
- } | |
- g_string_free(errstr,TRUE); | |
- Client=Network=TRUE; | |
- return TRUE; | |
+ } else | |
+ break; | |
+ } | |
+ g_string_free(errstr, TRUE); | |
+ Client = Network = TRUE; | |
+ return TRUE; | |
} | |
#endif /* NETWORKING */ | |
-static gboolean jet(Player *Play,gboolean AllowReturn) { | |
-/* Displays the list of locations and prompts the user to select one. */ | |
-/* If "AllowReturn" is TRUE, then if the current location is selected */ | |
-/* simply drop back to the main game loop, otherwise send a request */ | |
-/* to the server to move to the new location. If FALSE, the user MUST */ | |
-/* choose a new location to move to. The active client player is */ | |
-/* passed in "Play" */ | |
-/* N.B. May set the global variable DisplayMode */ | |
-/* Returns: TRUE if the user chose to jet to a new location, */ | |
-/* FALSE if the action was cancelled instead. */ | |
- int i,c; | |
+/* | |
+ * Displays the list of locations and prompts the user to select one. | |
+ * If "AllowReturn" is TRUE, then if the current location is selected | |
+ * simply drop back to the main game loop, otherwise send a request | |
+ * to the server to move to the new location. If FALSE, the user MUST | |
+ * choose a new location to move to. The active client player is | |
+ * passed in "Play". | |
+ * N.B. May set the global variable DisplayMode. | |
+ * Returns: TRUE if the user chose to jet to a new location, | |
+ * FALSE if the action was cancelled instead. | |
+ */ | |
+static gboolean jet(Player *Play, gboolean AllowReturn) | |
+{ | |
+ int i, c; | |
char text[80]; | |
+ | |
attrset(TextAttr); | |
clear_bottom(); | |
- for (i=0;i<NumLocation;i++) { | |
- sprintf(text,"%d. %s",i+1,Location[i].Name); | |
- mvaddstr(17+i/3,(i%3)*20+12,text); | |
+ for (i = 0; i < NumLocation; i++) { | |
+ sprintf(text, "%d. %s", i + 1, Location[i].Name); | |
+ mvaddstr(17 + i / 3, (i % 3) * 20 + 12, text); | |
} | |
attrset(PromptAttr); | |
-/* Prompt when the player chooses to "jet" to a new location */ | |
- mvaddstr(22,22,_("Where to, dude ? ")); | |
+ /* Prompt when the player chooses to "jet" to a new location */ | |
+ mvaddstr(22, 22, _("Where to, dude ? ")); | |
attrset(TextAttr); | |
curs_set(1); | |
do { | |
- c=bgetch(); | |
- if (c>='1' && c<'1'+NumLocation) { | |
- addstr(Location[c-'1'].Name); | |
- if (Play->IsAt != c-'1') { | |
- sprintf(text,"%d",c-'1'); | |
- DisplayMode=DM_NONE; | |
- SendClientMessage(Play,C_NONE,C_REQUESTJET,NULL,text); | |
- } else c=0; | |
- } else c=0; | |
- } while (c==0 && !AllowReturn); | |
+ c = bgetch(); | |
+ if (c >= '1' && c < '1' + NumLocation) { | |
+ addstr(Location[c - '1'].Name); | |
+ if (Play->IsAt != c - '1') { | |
+ sprintf(text, "%d", c - '1'); | |
+ DisplayMode = DM_NONE; | |
+ SendClientMessage(Play, C_NONE, C_REQUESTJET, NULL, text); | |
+ } else | |
+ c = 0; | |
+ } else | |
+ c = 0; | |
+ } while (c == 0 && !AllowReturn); | |
curs_set(0); | |
- return (c!=0); | |
+ return (c != 0); | |
} | |
-static void DropDrugs(Player *Play) { | |
-/* Prompts the user "Play" to drop some of the currently carried drugs */ | |
- int i,c,num,NumDrugs; | |
+/* | |
+ * Prompts the user "Play" to drop some of the currently carried drugs. | |
+ */ | |
+static void DropDrugs(Player *Play) | |
+{ | |
+ int i, c, num, NumDrugs; | |
GString *text; | |
gchar *buf; | |
attrset(TextAttr); | |
clear_bottom(); | |
- text=g_string_new(""); | |
+ text = g_string_new(""); | |
dpg_string_sprintf(text, | |
-/* List of drugs that you can drop (%tde = "drugs" by default) */ | |
- _("You can\'t get any cash for the following carried %tde :"), | |
- Names.Drugs); | |
- mvaddstr(16,1,text->str); | |
- NumDrugs=0; | |
- for (i=0;i<NumDrug;i++) { | |
- if (Play->Drugs[i].Carried>0 && Play->Drugs[i].Price==0) { | |
- g_string_sprintf(text,"%c. %-10s %-8d",NumDrugs+'A',Drug[i].Name, | |
- Play->Drugs[i].Carried); | |
- mvaddstr(17+NumDrugs/3,(NumDrugs%3)*25+4,text->str); | |
+ /* List of drugs that you can drop (%tde = "drugs" by | |
+ * default) */ | |
+ _("You can\'t get any cash for the following " | |
+ "carried %tde :"), Names.Drugs); | |
+ mvaddstr(16, 1, text->str); | |
+ NumDrugs = 0; | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if (Play->Drugs[i].Carried > 0 && Play->Drugs[i].Price == 0) { | |
+ g_string_sprintf(text, "%c. %-10s %-8d", NumDrugs + 'A', | |
+ Drug[i].Name, Play->Drugs[i].Carried); | |
+ mvaddstr(17 + NumDrugs / 3, (NumDrugs % 3) * 25 + 4, text->str); | |
NumDrugs++; | |
} | |
} | |
attrset(PromptAttr); | |
- mvaddstr(22,20,_("What do you want to drop? ")); | |
+ mvaddstr(22, 20, _("What do you want to drop? ")); | |
curs_set(1); | |
attrset(TextAttr); | |
- c=bgetch(); | |
- c=toupper(c); | |
- for (i=0;c>='A' && c<'A'+NumDrugs && i<NumDrug;i++) { | |
- if (Play->Drugs[i].Carried>0 && Play->Drugs[i].Price==0) { | |
+ c = bgetch(); | |
+ c = toupper(c); | |
+ for (i = 0; c >= 'A' && c < 'A' + NumDrugs && i < NumDrug; i++) { | |
+ if (Play->Drugs[i].Carried > 0 && Play->Drugs[i].Price == 0) { | |
c--; | |
- if (c<'A') { | |
+ if (c < 'A') { | |
addstr(Drug[i].Name); | |
- buf=nice_input(_("How many do you drop? "),23,8,TRUE,NULL,'\0'); | |
- num=atoi(buf); g_free(buf); | |
- if (num>0) { | |
- g_string_sprintf(text,"drug^%d^%d",i,-num); | |
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text->str); | |
+ buf = | |
+ nice_input(_("How many do you drop? "), 23, 8, TRUE, NULL, | |
+ '\0'); | |
+ num = atoi(buf); | |
+ g_free(buf); | |
+ if (num > 0) { | |
+ g_string_sprintf(text, "drug^%d^%d", i, -num); | |
+ SendClientMessage(Play, C_NONE, C_BUYOBJECT, NULL, text->str); | |
} | |
} | |
} | |
} | |
- g_string_free(text,TRUE); | |
+ g_string_free(text, TRUE); | |
} | |
-static void DealDrugs(Player *Play,gboolean Buy) { | |
-/* Prompts the user (i.e. the owner of client "Play") to buy drugs if */ | |
-/* "Buy" is TRUE, or to sell drugs otherwise. A list of available drugs */ | |
-/* is displayed, and on receiving the selection, the user is prompted */ | |
-/* for the number of drugs desired. Finally a message is sent to the */ | |
-/* server to buy or sell the required quantity. */ | |
- int i,c,NumDrugsHere; | |
- gchar *text,*input; | |
- int DrugNum,CanCarry,CanAfford; | |
- | |
- NumDrugsHere=0; | |
- for (c=0;c<NumDrug;c++) if (Play->Drugs[c].Price>0) NumDrugsHere++; | |
+/* | |
+ * Prompts the user (i.e. the owner of client "Play") to buy drugs if | |
+ * "Buy" is TRUE, or to sell drugs otherwise. A list of available drugs | |
+ * is displayed, and on receiving the selection, the user is prompted | |
+ * for the number of drugs desired. Finally a message is sent to the | |
+ * server to buy or sell the required quantity. | |
+ */ | |
+static void DealDrugs(Player *Play, gboolean Buy) | |
+{ | |
+ int i, c, NumDrugsHere; | |
+ gchar *text, *input; | |
+ int DrugNum, CanCarry, CanAfford; | |
+ | |
+ NumDrugsHere = 0; | |
+ for (c = 0; c < NumDrug; c++) | |
+ if (Play->Drugs[c].Price > 0) | |
+ NumDrugsHere++; | |
clear_line(22); | |
attrset(PromptAttr); | |
if (Buy) { | |
-/* Buy and sell prompts for dealing drugs or guns */ | |
- mvaddstr(22,20,_("What do you wish to buy? ")); | |
+ /* Buy and sell prompts for dealing drugs or guns */ | |
+ mvaddstr(22, 20, _("What do you wish to buy? ")); | |
} else { | |
- mvaddstr(22,20,_("What do you wish to sell? ")); | |
+ mvaddstr(22, 20, _("What do you wish to sell? ")); | |
} | |
curs_set(1); | |
attrset(TextAttr); | |
- c=bgetch(); | |
- c=toupper(c); | |
- if (c>='A' && c<'A'+NumDrugsHere) { | |
- DrugNum=-1; | |
- c-='A'; | |
- for (i=0;i<=c;i++) DrugNum=GetNextDrugIndex(DrugNum,Play); | |
+ c = bgetch(); | |
+ c = toupper(c); | |
+ if (c >= 'A' && c < 'A' + NumDrugsHere) { | |
+ DrugNum = -1; | |
+ c -= 'A'; | |
+ for (i = 0; i <= c; i++) | |
+ DrugNum = GetNextDrugIndex(DrugNum, Play); | |
addstr(Drug[DrugNum].Name); | |
- CanCarry=Play->CoatSize; | |
- CanAfford=Play->Cash/Play->Drugs[DrugNum].Price; | |
+ CanCarry = Play->CoatSize; | |
+ CanAfford = Play->Cash / Play->Drugs[DrugNum].Price; | |
if (Buy) { | |
-/* Display of number of drugs you could buy and/or carry, when buying drugs */ | |
- text=g_strdup_printf(_("You can afford %d, and can carry %d. "), | |
- CanAfford,CanCarry); | |
- mvaddstr(23,2,text); | |
- input=nice_input(_("How many do you buy? "),23,2+strlen(text), | |
- TRUE,NULL,'\0'); | |
- c=atoi(input); g_free(input); g_free(text); | |
- if (c>=0) { | |
- text=g_strdup_printf("drug^%d^%d",DrugNum,c); | |
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text); | |
+ /* Display of number of drugs you could buy and/or carry, when | |
+ * buying drugs */ | |
+ text = g_strdup_printf(_("You can afford %d, and can carry %d. "), | |
+ CanAfford, CanCarry); | |
+ mvaddstr(23, 2, text); | |
+ input = nice_input(_("How many do you buy? "), 23, 2 + strlen(text), | |
+ TRUE, NULL, '\0'); | |
+ c = atoi(input); | |
+ g_free(input); | |
+ g_free(text); | |
+ if (c >= 0) { | |
+ text = g_strdup_printf("drug^%d^%d", DrugNum, c); | |
+ SendClientMessage(Play, C_NONE, C_BUYOBJECT, NULL, text); | |
g_free(text); | |
} | |
} else { | |
-/* Display of number of drugs you have, when selling drugs */ | |
- text=g_strdup_printf(_("You have %d. "),Play->Drugs[DrugNum].Carried); | |
- mvaddstr(23,2,text); | |
- input=nice_input(_("How many do you sell? "),23,2+strlen(text), | |
- TRUE,NULL,'\0'); | |
- c=atoi(input); g_free(input); g_free(text); | |
- if (c>=0) { | |
- text=g_strdup_printf("drug^%d^%d",DrugNum,-c); | |
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text); | |
+ /* Display of number of drugs you have, when selling drugs */ | |
+ text = | |
+ g_strdup_printf(_("You have %d. "), | |
+ Play->Drugs[DrugNum].Carried); | |
+ mvaddstr(23, 2, text); | |
+ input = nice_input(_("How many do you sell? "), 23, 2 + strlen(text), | |
+ TRUE, NULL, '\0'); | |
+ c = atoi(input); | |
+ g_free(input); | |
+ g_free(text); | |
+ if (c >= 0) { | |
+ text = g_strdup_printf("drug^%d^%d", DrugNum, -c); | |
+ SendClientMessage(Play, C_NONE, C_BUYOBJECT, NULL, text); | |
g_free(text); | |
} | |
} | |
t@@ -697,557 +809,657 @@ static void DealDrugs(Player *Play,gboolean Buy) { | |
curs_set(0); | |
} | |
-static void GiveErrand(Player *Play) { | |
-/* Prompts the user (player "Play") to give an errand to one of his/her */ | |
-/* bitches. The decision is relayed to the server for implementation. */ | |
- int c,y; | |
- GString *text; | |
- Player *To; | |
- | |
- text=g_string_new(""); | |
- attrset(TextAttr); | |
- clear_bottom(); | |
- y=17; | |
- | |
-/* Prompt for sending your bitches out to spy etc. (%tde = "bitches" | |
- by default) */ | |
- dpg_string_sprintf(text,_("Choose an errand to give one of your %tde..."), | |
- Names.Bitches); | |
- mvaddstr(y++,1,text->str); | |
- attrset(PromptAttr); | |
- if (Play->Bitches.Carried>0) { | |
- dpg_string_sprintf(text, | |
- _(" S>py on another dealer (cost: %P)"), | |
- Prices.Spy); | |
- mvaddstr(y++,2,text->str); | |
- dpg_string_sprintf(text, | |
- _(" T>ip off the cops to another dealer (cost: %P)"), | |
- Prices.Tipoff); | |
- mvaddstr(y++,2,text->str); | |
- mvaddstr(y++,2,_(" G>et stuffed")); | |
- } | |
- if (Play->Flags&SPYINGON) { | |
- mvaddstr(y++,2,_("or C>ontact your spies and receive reports")); | |
- } | |
- mvaddstr(y++,2,_("or N>o errand ? ")); | |
- curs_set(1); | |
- attrset(TextAttr); | |
- | |
-/* Translate these 5 keys to match the above options, keeping the original | |
- order the same (S>py, T>ip off, G>et stuffed, C>ontact spy, N>o errand) */ | |
- c=GetKey(_("STGCN"),"STGCN",TRUE,FALSE,FALSE); | |
- | |
- if (Play->Bitches.Carried>0 || c=='C') switch (c) { | |
- case 'S': | |
- To=ListPlayers(Play,TRUE,_("Whom do you want to spy on? ")); | |
- if (To) SendClientMessage(Play,C_NONE,C_SPYON,To,NULL); | |
- break; | |
- case 'T': | |
- To=ListPlayers(Play,TRUE, | |
- _("Whom do you want to tip the cops off to? ")); | |
- if (To) SendClientMessage(Play,C_NONE,C_TIPOFF,To,NULL); | |
- break; | |
- case 'G': | |
- attrset(PromptAttr); | |
-/* Prompt for confirmation of sacking a bitch */ | |
- addstr(_(" Are you sure? ")); | |
- | |
-/* The two keys that are valid for answering Yes/No - if you translate them, | |
- keep them in the same order - i.e. "Yes" before "No" */ | |
- c=GetKey(_("YN"),"YN",FALSE,TRUE,FALSE); | |
- | |
- if (c=='Y') SendClientMessage(Play,C_NONE,C_SACKBITCH,NULL,NULL); | |
- break; | |
- case 'C': | |
- if (Play->Flags & SPYINGON) { | |
- SendClientMessage(Play,C_NONE,C_CONTACTSPY,NULL,NULL); | |
- } | |
- break; | |
- } | |
+/* | |
+ * Prompts the user (player "Play") to give an errand to one of his/her | |
+ * bitches. The decision is relayed to the server for implementation. | |
+ */ | |
+static void GiveErrand(Player *Play) | |
+{ | |
+ int c, y; | |
+ GString *text; | |
+ Player *To; | |
+ | |
+ text = g_string_new(""); | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ y = 17; | |
+ | |
+ /* Prompt for sending your bitches out to spy etc. (%tde = "bitches" by | |
+ * default) */ | |
+ dpg_string_sprintf(text, | |
+ _("Choose an errand to give one of your %tde..."), | |
+ Names.Bitches); | |
+ mvaddstr(y++, 1, text->str); | |
+ attrset(PromptAttr); | |
+ if (Play->Bitches.Carried > 0) { | |
+ dpg_string_sprintf(text, | |
+ _(" S>py on another dealer " | |
+ "(cost: %P)"), Prices.Spy); | |
+ mvaddstr(y++, 2, text->str); | |
+ dpg_string_sprintf(text, | |
+ _(" T>ip off the cops to another dealer " | |
+ "(cost: %P)"), Prices.Tipoff); | |
+ mvaddstr(y++, 2, text->str); | |
+ mvaddstr(y++, 2, _(" G>et stuffed")); | |
+ } | |
+ if (Play->Flags & SPYINGON) { | |
+ mvaddstr(y++, 2, _("or C>ontact your spies and receive reports")); | |
+ } | |
+ mvaddstr(y++, 2, _("or N>o errand ? ")); | |
+ curs_set(1); | |
+ attrset(TextAttr); | |
+ | |
+ /* Translate these 5 keys to match the above options, keeping the | |
+ * original order the same (S>py, T>ip off, G>et stuffed, C>ontact spy, | |
+ * N>o errand) */ | |
+ c = GetKey(_("STGCN"), "STGCN", TRUE, FALSE, FALSE); | |
+ | |
+ if (Play->Bitches.Carried > 0 || c == 'C') | |
+ switch (c) { | |
+ case 'S': | |
+ To = ListPlayers(Play, TRUE, _("Whom do you want to spy on? ")); | |
+ if (To) | |
+ SendClientMessage(Play, C_NONE, C_SPYON, To, NULL); | |
+ break; | |
+ case 'T': | |
+ To = ListPlayers(Play, TRUE, | |
+ _("Whom do you want to tip the cops off to? ")); | |
+ if (To) | |
+ SendClientMessage(Play, C_NONE, C_TIPOFF, To, NULL); | |
+ break; | |
+ case 'G': | |
+ attrset(PromptAttr); | |
+ /* Prompt for confirmation of sacking a bitch */ | |
+ addstr(_(" Are you sure? ")); | |
+ | |
+ /* The two keys that are valid for answering Yes/No - if you | |
+ * translate them, keep them in the same order - i.e. "Yes" before | |
+ * "No" */ | |
+ c = GetKey(_("YN"), "YN", FALSE, TRUE, FALSE); | |
+ | |
+ if (c == 'Y') | |
+ SendClientMessage(Play, C_NONE, C_SACKBITCH, NULL, NULL); | |
+ break; | |
+ case 'C': | |
+ if (Play->Flags & SPYINGON) { | |
+ SendClientMessage(Play, C_NONE, C_CONTACTSPY, NULL, NULL); | |
+ } | |
+ break; | |
+ } | |
} | |
-static int want_to_quit(void) { | |
-/* Asks the user if he/she _really_ wants to quit dopewars */ | |
- attrset(TextAttr); | |
- clear_line(22); | |
- attrset(PromptAttr); | |
- mvaddstr(22,1,_("Are you sure you want to quit? ")); | |
- attrset(TextAttr); | |
- return (GetKey(_("YN"),"YN",FALSE,TRUE,FALSE)!='N'); | |
+/* | |
+ * Asks the user if he/she _really_ wants to quit dopewars. | |
+ */ | |
+static int want_to_quit(void) | |
+{ | |
+ attrset(TextAttr); | |
+ clear_line(22); | |
+ attrset(PromptAttr); | |
+ mvaddstr(22, 1, _("Are you sure you want to quit? ")); | |
+ attrset(TextAttr); | |
+ return (GetKey(_("YN"), "YN", FALSE, TRUE, FALSE) != 'N'); | |
} | |
-static void change_name(Player *Play,gboolean nullname) { | |
-/* Prompts the user to change his or her name, and notifies the server */ | |
- gchar *NewName; | |
+/* | |
+ * Prompts the user to change his or her name, and notifies the server. | |
+ */ | |
+static void change_name(Player *Play, gboolean nullname) | |
+{ | |
+ gchar *NewName; | |
-/* Prompt for player to change his/her name */ | |
- NewName=nice_input(_("New name: "),23,0,FALSE,NULL,'\0'); | |
+ /* Prompt for player to change his/her name */ | |
+ NewName = nice_input(_("New name: "), 23, 0, FALSE, NULL, '\0'); | |
- if (NewName[0]) { | |
- if (nullname) { | |
- SendNullClientMessage(Play,C_NONE,C_NAME,NULL,NewName); | |
- } else { | |
- SendClientMessage(Play,C_NONE,C_NAME,NULL,NewName); | |
- } | |
- SetPlayerName(Play,NewName); | |
- } | |
- g_free(NewName); | |
+ if (NewName[0]) { | |
+ if (nullname) { | |
+ SendNullClientMessage(Play, C_NONE, C_NAME, NULL, NewName); | |
+ } else { | |
+ SendClientMessage(Play, C_NONE, C_NAME, NULL, NewName); | |
+ } | |
+ SetPlayerName(Play, NewName); | |
+ } | |
+ g_free(NewName); | |
} | |
-void HandleClientMessage(char *Message,Player *Play) { | |
-/* Given a message "Message" coming in for player "Play", performs */ | |
-/* processing and reacts properly; if a message indicates the end of the */ | |
-/* game, the global variable QuitRequest is set. The global variable */ | |
-/* DisplayMode may also be changed by this routine as a result of network */ | |
-/* traffic. */ | |
- char *pt,*Data,*wrd; | |
- AICode AI; | |
- MsgCode Code; | |
- Player *From,*tmp; | |
- GSList *list; | |
- gchar *text; | |
- int i; | |
- gboolean Handled; | |
- | |
-/* Ignore To: field - all messages will be for Player "Play" */ | |
- if (ProcessMessage(Message,Play,&From,&AI,&Code,&Data,FirstClient)==-1) { | |
- return; | |
- } | |
- | |
- Handled=HandleGenericClientMessage(From,AI,Code,Play,Data,&DisplayMode); | |
- switch(Code) { | |
- case C_ENDLIST: | |
- if (FirstClient && g_slist_next(FirstClient)) { | |
- ListPlayers(Play,FALSE,NULL); | |
- } | |
- break; | |
- case C_STARTHISCORE: | |
- PrepareHighScoreScreen(); break; | |
- case C_HISCORE: | |
- PrintHighScore(Data); break; | |
- case C_ENDHISCORE: | |
- if (strcmp(Data,"end")==0) { | |
- QuitRequest=TRUE; | |
- } else { | |
- nice_wait(); | |
- clear_screen(); | |
- display_message(""); | |
- print_status(Play,TRUE); | |
- refresh(); | |
- } | |
- break; | |
- case C_PUSH: | |
- attrset(TextAttr); | |
- clear_line(22); | |
- mvaddstr(22,0,_("You have been pushed from the server. " | |
- "Reverting to single player mode.")); | |
- nice_wait(); | |
- SwitchToSinglePlayer(Play); | |
- print_status(Play,TRUE); | |
- break; | |
- case C_QUIT: | |
- attrset(TextAttr); | |
- clear_line(22); | |
- mvaddstr(22,0, | |
- _("The server has terminated. Reverting to single player mode.")); | |
- nice_wait(); | |
- SwitchToSinglePlayer(Play); | |
- print_status(Play,TRUE); | |
- break; | |
- case C_MSG: | |
- text=g_strdup_printf("%s: %s",GetPlayerName(From),Data); | |
- display_message(text); g_free(text); | |
- break; | |
- case C_MSGTO: | |
- text=g_strdup_printf("%s->%s: %s",GetPlayerName(From), | |
- GetPlayerName(Play),Data); | |
- display_message(text); g_free(text); | |
- break; | |
- case C_JOIN: | |
- text=g_strdup_printf(_("%s joins the game!"),Data); | |
- display_message(text); g_free(text); | |
- break; | |
- case C_LEAVE: | |
- if (From!=&Noone) { | |
- text=g_strdup_printf(_("%s has left the game."),Data); | |
- display_message(text); g_free(text); | |
- } | |
- break; | |
- case C_RENAME: | |
-/* Displayed when a player changes his/her name */ | |
- text=g_strdup_printf(_("%s will now be known as %s."), | |
- GetPlayerName(From),Data); | |
- SetPlayerName(From,Data); | |
- mvaddstr(22,0,text); g_free(text); nice_wait(); | |
- break; | |
- case C_PRINTMESSAGE: | |
- PrintMessage(Data); | |
- nice_wait(); | |
- break; | |
- case C_FIGHTPRINT: | |
- DisplayFightMessage(Play,Data); | |
- break; | |
- case C_SUBWAYFLASH: | |
- DisplayFightMessage(Play,NULL); | |
- for (list=FirstClient;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- tmp->Flags &= ~FIGHTING; | |
- } | |
- for (i=0;i<4;i++) { | |
- print_location(_("S U B W A Y")); | |
- refresh(); | |
- MicroSleep(100000); | |
- print_location(""); | |
- refresh(); | |
- MicroSleep(100000); | |
- } | |
- print_location(Location[(int)Play->IsAt].Name); | |
- break; | |
- case C_QUESTION: | |
- pt=Data; | |
- wrd=GetNextWord(&pt,""); | |
- PrintMessage(pt); | |
- addch(' '); | |
- i=GetKey(_(wrd),wrd,FALSE,TRUE,TRUE); | |
- wrd=g_strdup_printf("%c",i); | |
- SendClientMessage(Play,C_NONE,C_ANSWER, | |
- From==&Noone ? NULL : From,wrd); | |
- g_free(wrd); | |
- break; | |
- case C_LOANSHARK: | |
- LoanShark(Play); | |
- SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL); | |
- break; | |
- case C_BANK: | |
- Bank(Play); | |
- SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL); | |
- break; | |
- case C_GUNSHOP: | |
- GunShop(Play); | |
- SendClientMessage(Play,C_NONE,C_DONE,NULL,NULL); | |
- break; | |
- case C_UPDATE: | |
- if (From==&Noone) { | |
- ReceivePlayerData(Play,Data,Play); | |
- print_status(Play,TRUE); refresh(); | |
- } else { | |
- DisplaySpyReports(Data,From,Play); | |
- } | |
- break; | |
- case C_NEWNAME: | |
- clear_line(22); clear_line(23); | |
- attrset(TextAttr); | |
- mvaddstr(22,0,_("Unfortunately, somebody else is already " | |
- "using \"your\" name. Please change it.")); | |
- change_name(Play,TRUE); | |
- break; | |
- default: | |
- if (!Handled) { | |
- text=g_strdup_printf("%s^%c^%s^%s",GetPlayerName(From),Code, | |
- GetPlayerName(Play),Data); | |
- mvaddstr(22,0,text); g_free(text); nice_wait(); | |
- } | |
- break; | |
- } | |
+/* | |
+ * Given a message "Message" coming in for player "Play", performs | |
+ * processing and reacts properly; if a message indicates the end of the | |
+ * game, the global variable QuitRequest is set. The global variable | |
+ * DisplayMode may also be changed by this routine as a result of network | |
+ * traffic. | |
+ */ | |
+void HandleClientMessage(char *Message, Player *Play) | |
+{ | |
+ char *pt, *Data, *wrd; | |
+ AICode AI; | |
+ MsgCode Code; | |
+ Player *From, *tmp; | |
+ GSList *list; | |
+ gchar *text; | |
+ int i; | |
+ gboolean Handled; | |
+ | |
+ /* Ignore To: field - all messages will be for Player "Play" */ | |
+ if (ProcessMessage(Message, Play, &From, &AI, &Code, &Data, FirstClient) | |
+ == -1) { | |
+ return; | |
+ } | |
+ | |
+ Handled = | |
+ HandleGenericClientMessage(From, AI, Code, Play, Data, &DisplayMode); | |
+ switch (Code) { | |
+ case C_ENDLIST: | |
+ if (FirstClient && g_slist_next(FirstClient)) { | |
+ ListPlayers(Play, FALSE, NULL); | |
+ } | |
+ break; | |
+ case C_STARTHISCORE: | |
+ PrepareHighScoreScreen(); | |
+ break; | |
+ case C_HISCORE: | |
+ PrintHighScore(Data); | |
+ break; | |
+ case C_ENDHISCORE: | |
+ if (strcmp(Data, "end") == 0) { | |
+ QuitRequest = TRUE; | |
+ } else { | |
+ nice_wait(); | |
+ clear_screen(); | |
+ display_message(""); | |
+ print_status(Play, TRUE); | |
+ refresh(); | |
+ } | |
+ break; | |
+ case C_PUSH: | |
+ attrset(TextAttr); | |
+ clear_line(22); | |
+ mvaddstr(22, 0, _("You have been pushed from the server. " | |
+ "Reverting to single player mode.")); | |
+ nice_wait(); | |
+ SwitchToSinglePlayer(Play); | |
+ print_status(Play, TRUE); | |
+ break; | |
+ case C_QUIT: | |
+ attrset(TextAttr); | |
+ clear_line(22); | |
+ mvaddstr(22, 0, | |
+ _("The server has terminated. Reverting to " | |
+ "single player mode.")); | |
+ nice_wait(); | |
+ SwitchToSinglePlayer(Play); | |
+ print_status(Play, TRUE); | |
+ break; | |
+ case C_MSG: | |
+ text = g_strdup_printf("%s: %s", GetPlayerName(From), Data); | |
+ display_message(text); | |
+ g_free(text); | |
+ break; | |
+ case C_MSGTO: | |
+ text = g_strdup_printf("%s->%s: %s", GetPlayerName(From), | |
+ GetPlayerName(Play), Data); | |
+ display_message(text); | |
+ g_free(text); | |
+ break; | |
+ case C_JOIN: | |
+ text = g_strdup_printf(_("%s joins the game!"), Data); | |
+ display_message(text); | |
+ g_free(text); | |
+ break; | |
+ case C_LEAVE: | |
+ if (From != &Noone) { | |
+ text = g_strdup_printf(_("%s has left the game."), Data); | |
+ display_message(text); | |
+ g_free(text); | |
+ } | |
+ break; | |
+ case C_RENAME: | |
+ /* Displayed when a player changes his/her name */ | |
+ text = g_strdup_printf(_("%s will now be known as %s."), | |
+ GetPlayerName(From), Data); | |
+ SetPlayerName(From, Data); | |
+ mvaddstr(22, 0, text); | |
+ g_free(text); | |
+ nice_wait(); | |
+ break; | |
+ case C_PRINTMESSAGE: | |
+ PrintMessage(Data); | |
+ nice_wait(); | |
+ break; | |
+ case C_FIGHTPRINT: | |
+ DisplayFightMessage(Play, Data); | |
+ break; | |
+ case C_SUBWAYFLASH: | |
+ DisplayFightMessage(Play, NULL); | |
+ for (list = FirstClient; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ tmp->Flags &= ~FIGHTING; | |
+ } | |
+ for (i = 0; i < 4; i++) { | |
+ print_location(_("S U B W A Y")); | |
+ refresh(); | |
+ MicroSleep(100000); | |
+ print_location(""); | |
+ refresh(); | |
+ MicroSleep(100000); | |
+ } | |
+ print_location(Location[(int)Play->IsAt].Name); | |
+ break; | |
+ case C_QUESTION: | |
+ pt = Data; | |
+ wrd = GetNextWord(&pt, ""); | |
+ PrintMessage(pt); | |
+ addch(' '); | |
+ i = GetKey(_(wrd), wrd, FALSE, TRUE, TRUE); | |
+ wrd = g_strdup_printf("%c", i); | |
+ SendClientMessage(Play, C_NONE, C_ANSWER, | |
+ From == &Noone ? NULL : From, wrd); | |
+ g_free(wrd); | |
+ break; | |
+ case C_LOANSHARK: | |
+ LoanShark(Play); | |
+ SendClientMessage(Play, C_NONE, C_DONE, NULL, NULL); | |
+ break; | |
+ case C_BANK: | |
+ Bank(Play); | |
+ SendClientMessage(Play, C_NONE, C_DONE, NULL, NULL); | |
+ break; | |
+ case C_GUNSHOP: | |
+ GunShop(Play); | |
+ SendClientMessage(Play, C_NONE, C_DONE, NULL, NULL); | |
+ break; | |
+ case C_UPDATE: | |
+ if (From == &Noone) { | |
+ ReceivePlayerData(Play, Data, Play); | |
+ print_status(Play, TRUE); | |
+ refresh(); | |
+ } else { | |
+ DisplaySpyReports(Data, From, Play); | |
+ } | |
+ break; | |
+ case C_NEWNAME: | |
+ clear_line(22); | |
+ clear_line(23); | |
+ attrset(TextAttr); | |
+ mvaddstr(22, 0, _("Unfortunately, somebody else is already " | |
+ "using \"your\" name. Please change it.")); | |
+ change_name(Play, TRUE); | |
+ break; | |
+ default: | |
+ if (!Handled) { | |
+ text = g_strdup_printf("%s^%c^%s^%s", GetPlayerName(From), Code, | |
+ GetPlayerName(Play), Data); | |
+ mvaddstr(22, 0, text); | |
+ g_free(text); | |
+ nice_wait(); | |
+ } | |
+ break; | |
+ } | |
} | |
-void PrepareHighScoreScreen(void) { | |
-/* Responds to a "starthiscore" message by clearing the screen and */ | |
-/* displaying the title for the high scores screen */ | |
- char *text; | |
- attrset(TextAttr); | |
- clear_screen(); | |
- attrset(TitleAttr); | |
- text=_("H I G H S C O R E S"); | |
- mvaddstr(0,(Width-strlen(text))/2,text); | |
- attrset(TextAttr); | |
+/* | |
+ * Responds to a "starthiscore" message by clearing the screen and | |
+ * displaying the title for the high scores screen. | |
+ */ | |
+void PrepareHighScoreScreen(void) | |
+{ | |
+ char *text; | |
+ | |
+ attrset(TextAttr); | |
+ clear_screen(); | |
+ attrset(TitleAttr); | |
+ text = _("H I G H S C O R E S"); | |
+ mvaddstr(0, (Width - strlen(text)) / 2, text); | |
+ attrset(TextAttr); | |
} | |
-void PrintHighScore(char *Data) { | |
-/* Prints a high score coded in "Data"; first word is the index of the */ | |
-/* score (i.e. y screen coordinate), second word is the text, the first */ | |
-/* letter of which identifies whether it's to be printed bold or not. */ | |
- char *cp; | |
- int index; | |
- cp=Data; | |
- index=GetNextInt(&cp,0); | |
- if (!cp || strlen(cp)<2) return; | |
- move(index+2,0); | |
- attrset(TextAttr); | |
- if (cp[0]=='B') standout(); | |
- addstr(&cp[1]); | |
- if (cp[0]=='B') standend(); | |
+/* | |
+ * Prints a high score coded in "Data"; first word is the index of the | |
+ * score (i.e. y screen coordinate), second word is the text, the first | |
+ * letter of which identifies whether it's to be printed bold or not. | |
+ */ | |
+void PrintHighScore(char *Data) | |
+{ | |
+ char *cp; | |
+ int index; | |
+ | |
+ cp = Data; | |
+ index = GetNextInt(&cp, 0); | |
+ if (!cp || strlen(cp) < 2) | |
+ return; | |
+ move(index + 2, 0); | |
+ attrset(TextAttr); | |
+ if (cp[0] == 'B') | |
+ standout(); | |
+ addstr(&cp[1]); | |
+ if (cp[0] == 'B') | |
+ standend(); | |
} | |
-void PrintMessage(const gchar *text) { | |
-/* Prints a message "text" received via. a "printmessage" message in the */ | |
-/* bottom part of the screen. */ | |
- guint i,line; | |
+/* | |
+ * Prints a message "text" received via. a "printmessage" message in the | |
+ * bottom part of the screen. | |
+ */ | |
+void PrintMessage(const gchar *text) | |
+{ | |
+ guint i, line; | |
attrset(TextAttr); | |
clear_line(16); | |
- line=1; | |
- for (i=0;i<strlen(text) && (text[i]=='^' || text[i]=='\n');i++) line++; | |
+ line = 1; | |
+ for (i = 0; i < strlen(text) && (text[i] == '^' || text[i] == '\n'); i++) | |
+ line++; | |
clear_exceptfor(line); | |
- line=17; move(line,1); | |
- for (i=0;i<strlen(text);i++) { | |
- if (text[i]=='^' || text[i]=='\n') { | |
- line++; move(line,1); | |
- } else if (text[i]!='\r') addch((guchar)text[i]); | |
+ line = 17; | |
+ move(line, 1); | |
+ for (i = 0; i < strlen(text); i++) { | |
+ if (text[i] == '^' || text[i] == '\n') { | |
+ line++; | |
+ move(line, 1); | |
+ } else if (text[i] != '\r') | |
+ addch((guchar)text[i]); | |
} | |
} | |
-static void SellGun(Player *Play) { | |
+static void SellGun(Player *Play) | |
+{ | |
gchar *text; | |
gint gunind; | |
clear_line(22); | |
- if (TotalGunsCarried(Play)==0) { | |
-/* Error - player tried to sell guns that he/she doesn't have | |
- (%tde="guns" by default) */ | |
- text=dpg_strdup_printf(_("You don't have any %tde to sell!"), | |
- Names.Guns); | |
- mvaddstr(22,(Width-strlen(text))/2,text); g_free(text); | |
+ if (TotalGunsCarried(Play) == 0) { | |
+ /* Error - player tried to sell guns that he/she doesn't have | |
+ * (%tde="guns" by default) */ | |
+ text = dpg_strdup_printf(_("You don't have any %tde to sell!"), | |
+ Names.Guns); | |
+ mvaddstr(22, (Width - strlen(text)) / 2, text); | |
+ g_free(text); | |
nice_wait(); | |
clear_line(23); | |
} else { | |
attrset(PromptAttr); | |
- mvaddstr(22,20,_("What do you wish to sell? ")); | |
+ mvaddstr(22, 20, _("What do you wish to sell? ")); | |
curs_set(1); | |
attrset(TextAttr); | |
- gunind=bgetch(); gunind=toupper(gunind); | |
- if (gunind>='A' && gunind<'A'+NumGun) { | |
- gunind-='A'; | |
+ gunind = bgetch(); | |
+ gunind = toupper(gunind); | |
+ if (gunind >= 'A' && gunind < 'A' + NumGun) { | |
+ gunind -= 'A'; | |
addstr(Gun[gunind].Name); | |
if (Play->Guns[gunind].Carried == 0) { | |
clear_line(22); | |
-/* Error - player tried to sell some guns that he/she doesn't have */ | |
- mvaddstr(22,10,_("You don't have any to sell!")); | |
- nice_wait(); clear_line(23); | |
+ /* Error - player tried to sell some guns that he/she doesn't have */ | |
+ mvaddstr(22, 10, _("You don't have any to sell!")); | |
+ nice_wait(); | |
+ clear_line(23); | |
} else { | |
Play->Cash += Gun[gunind].Price; | |
Play->CoatSize += Gun[gunind].Space; | |
Play->Guns[gunind].Carried--; | |
- text=g_strdup_printf("gun^%d^-1",gunind); | |
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text); | |
+ text = g_strdup_printf("gun^%d^-1", gunind); | |
+ SendClientMessage(Play, C_NONE, C_BUYOBJECT, NULL, text); | |
g_free(text); | |
- print_status(Play,FALSE); | |
+ print_status(Play, FALSE); | |
} | |
} | |
} | |
} | |
-static void BuyGun(Player *Play) { | |
+static void BuyGun(Player *Play) | |
+{ | |
gchar *text; | |
gint gunind; | |
clear_line(22); | |
- if (TotalGunsCarried(Play)>=Play->Bitches.Carried+2) { | |
- text=dpg_strdup_printf( | |
-/* Error - player tried to buy more guns than his/her bitches can carry | |
- (1st %tde="bitches", 2nd %tde="guns" by default) */ | |
- _("You'll need more %tde to carry any more %tde!"), | |
- Names.Bitches,Names.Guns); | |
- mvaddstr(22,(Width-strlen(text))/2,text); g_free(text); | |
+ if (TotalGunsCarried(Play) >= Play->Bitches.Carried + 2) { | |
+ text = dpg_strdup_printf( | |
+ /* Error - player tried to buy more guns | |
+ * than his/her bitches can carry (1st | |
+ * %tde="bitches", 2nd %tde="guns" by | |
+ * default) */ | |
+ _("You'll need more %tde to carry " | |
+ "any more %tde!"), | |
+ Names.Bitches, Names.Guns); | |
+ mvaddstr(22, (Width - strlen(text)) / 2, text); | |
+ g_free(text); | |
nice_wait(); | |
clear_line(23); | |
} else { | |
attrset(PromptAttr); | |
- mvaddstr(22,20,_("What do you wish to buy? ")); | |
+ mvaddstr(22, 20, _("What do you wish to buy? ")); | |
curs_set(1); | |
attrset(TextAttr); | |
- gunind=bgetch(); gunind=toupper(gunind); | |
- if (gunind>='A' && gunind<'A'+NumGun) { | |
- gunind-='A'; | |
+ gunind = bgetch(); | |
+ gunind = toupper(gunind); | |
+ if (gunind >= 'A' && gunind < 'A' + NumGun) { | |
+ gunind -= 'A'; | |
addstr(Gun[gunind].Name); | |
if (Gun[gunind].Space > Play->CoatSize) { | |
clear_line(22); | |
-/* Error - player tried to buy a gun that he/she doesn't have space for | |
- (%tde="gun" by default) */ | |
- text=dpg_strdup_printf(_("You don't have enough space to " | |
- "carry that %tde!"),Names.Gun); | |
- mvaddstr(22,(Width-strlen(text))/2,text); g_free(text); | |
+ /* Error - player tried to buy a gun that he/she doesn't have | |
+ * space for (%tde="gun" by default) */ | |
+ text = dpg_strdup_printf(_("You don't have enough space to " | |
+ "carry that %tde!"), Names.Gun); | |
+ mvaddstr(22, (Width - strlen(text)) / 2, text); | |
+ g_free(text); | |
nice_wait(); | |
clear_line(23); | |
} else if (Gun[gunind].Price > Play->Cash) { | |
clear_line(22); | |
-/* Error - player tried to buy a gun that he/she can't afford | |
- (%tde="gun" by default) */ | |
- text=dpg_strdup_printf(_("You don't have enough cash to buy " | |
- "that %tde!"),Names.Gun); | |
- mvaddstr(22,(Width-strlen(text))/2,text); g_free(text); | |
+ /* Error - player tried to buy a gun that he/she can't afford | |
+ * (%tde="gun" by default) */ | |
+ text = dpg_strdup_printf(_("You don't have enough cash to buy " | |
+ "that %tde!"), Names.Gun); | |
+ mvaddstr(22, (Width - strlen(text)) / 2, text); | |
+ g_free(text); | |
nice_wait(); | |
clear_line(23); | |
} else { | |
Play->Cash -= Gun[gunind].Price; | |
Play->CoatSize -= Gun[gunind].Space; | |
Play->Guns[gunind].Carried++; | |
- text=g_strdup_printf("gun^%d^1",gunind); | |
- SendClientMessage(Play,C_NONE,C_BUYOBJECT,NULL,text); | |
+ text = g_strdup_printf("gun^%d^1", gunind); | |
+ SendClientMessage(Play, C_NONE, C_BUYOBJECT, NULL, text); | |
g_free(text); | |
- print_status(Play,FALSE); | |
+ print_status(Play, FALSE); | |
} | |
} | |
} | |
} | |
-void GunShop(Player *Play) { | |
-/* Allows player "Play" to buy and sell guns interactively. Passes the */ | |
-/* decisions on to the server for sanity checking and implementation. */ | |
- int i,action; | |
+/* | |
+ * Allows player "Play" to buy and sell guns interactively. Passes the | |
+ * decisions on to the server for sanity checking and implementation. | |
+ */ | |
+void GunShop(Player *Play) | |
+{ | |
+ int i, action; | |
gchar *text; | |
- print_status(Play,FALSE); | |
+ print_status(Play, FALSE); | |
attrset(TextAttr); | |
clear_bottom(); | |
- for (i=0;i<NumGun;i++) { | |
- text=dpg_strdup_printf("%c. %-22tde %12P",'A'+i,Gun[i].Name,Gun[i].Price); | |
- mvaddstr(17+i/2,(i%2)*40+1,text); g_free(text); | |
+ for (i = 0; i < NumGun; i++) { | |
+ text = | |
+ dpg_strdup_printf("%c. %-22tde %12P", 'A' + i, Gun[i].Name, | |
+ Gun[i].Price); | |
+ mvaddstr(17 + i / 2, (i % 2) * 40 + 1, text); | |
+ g_free(text); | |
} | |
do { | |
-/* Prompt for actions in the gun shop */ | |
- text=_("Will you B>uy, S>ell, or L>eave? "); | |
+ /* Prompt for actions in the gun shop */ | |
+ text = _("Will you B>uy, S>ell, or L>eave? "); | |
attrset(PromptAttr); | |
clear_line(22); | |
- mvaddstr(22,40-strlen(text)/2,text); | |
+ mvaddstr(22, 40 - strlen(text) / 2, text); | |
attrset(TextAttr); | |
-/* Translate these three keys in line with the above options, keeping the | |
- order (B>uy, S>ell, L>eave) the same - you can change the wording of | |
- the prompt, but if you change the order in this key list, the keys will | |
- do the wrong things! */ | |
- action=GetKey(_("BSL"),"BSL",FALSE,FALSE,FALSE); | |
- if (action=='S') SellGun(Play); | |
- else if (action=='B') BuyGun(Play); | |
- } while (action!='L'); | |
- print_status(Play,TRUE); | |
+ /* Translate these three keys in line with the above options, keeping | |
+ * the order (B>uy, S>ell, L>eave) the same - you can change the | |
+ * wording of the prompt, but if you change the order in this key | |
+ * list, the keys will do the wrong things! */ | |
+ action = GetKey(_("BSL"), "BSL", FALSE, FALSE, FALSE); | |
+ if (action == 'S') | |
+ SellGun(Play); | |
+ else if (action == 'B') | |
+ BuyGun(Play); | |
+ } while (action != 'L'); | |
+ print_status(Play, TRUE); | |
} | |
-void LoanShark(Player *Play) { | |
-/* Allows player "Play" to pay off loans interactively. */ | |
- gchar *text,*prstr; | |
+/* | |
+ * Allows player "Play" to pay off loans interactively. | |
+ */ | |
+void LoanShark(Player *Play) | |
+{ | |
+ gchar *text, *prstr; | |
price_t money; | |
+ | |
do { | |
clear_bottom(); | |
attrset(PromptAttr); | |
-/* Prompt for paying back loans from the loan shark */ | |
- text=nice_input(_("How much money do you pay back? "),19,1,TRUE,NULL,'\0'); | |
+ /* Prompt for paying back loans from the loan shark */ | |
+ text = | |
+ nice_input(_("How much money do you pay back? "), 19, 1, TRUE, | |
+ NULL, '\0'); | |
attrset(TextAttr); | |
- money=strtoprice(text); g_free(text); | |
- if (money<0) money=0; | |
- if (money>Play->Debt) money=Play->Debt; | |
- if (money>Play->Cash) { | |
-/* Error - player doesn't have enough money to pay back the loan */ | |
- mvaddstr(20,1,_("You don't have that much money!")); | |
+ money = strtoprice(text); | |
+ g_free(text); | |
+ if (money < 0) | |
+ money = 0; | |
+ if (money > Play->Debt) | |
+ money = Play->Debt; | |
+ if (money > Play->Cash) { | |
+ /* Error - player doesn't have enough money to pay back the loan */ | |
+ mvaddstr(20, 1, _("You don't have that much money!")); | |
nice_wait(); | |
} else { | |
- SendClientMessage(Play,C_NONE,C_PAYLOAN,NULL,(prstr=pricetostr(money))); | |
+ SendClientMessage(Play, C_NONE, C_PAYLOAN, NULL, | |
+ (prstr = pricetostr(money))); | |
g_free(prstr); | |
- money=0; | |
+ money = 0; | |
} | |
- } while (money!=0); | |
+ } while (money != 0); | |
} | |
-void Bank(Player *Play) { | |
-/* Allows player "Play" to pay in or withdraw money from the bank */ | |
-/* interactively. */ | |
- gchar *text,*prstr; | |
- price_t money=0; | |
+/* | |
+ * Allows player "Play" to pay in or withdraw money from the bank | |
+ * interactively. | |
+ */ | |
+void Bank(Player *Play) | |
+{ | |
+ gchar *text, *prstr; | |
+ price_t money = 0; | |
int action; | |
do { | |
clear_bottom(); | |
attrset(PromptAttr); | |
-/* Prompt for dealing with the bank in the curses client */ | |
- mvaddstr(18,1,_("Do you want to D>eposit money, W>ithdraw money, " | |
- "or L>eave ? ")); | |
+ /* Prompt for dealing with the bank in the curses client */ | |
+ mvaddstr(18, 1, _("Do you want to D>eposit money, W>ithdraw money, " | |
+ "or L>eave ? ")); | |
attrset(TextAttr); | |
-/* Make sure you keep the order the same if you translate these keys! | |
- (D>eposit, W>ithdraw, L>eave) */ | |
- action=GetKey(_("DWL"),"DWL",FALSE,FALSE,FALSE); | |
+ /* Make sure you keep the order the same if you translate these keys! | |
+ * (D>eposit, W>ithdraw, L>eave) */ | |
+ action = GetKey(_("DWL"), "DWL", FALSE, FALSE, FALSE); | |
- if (action=='D' || action=='W') { | |
-/* Prompt for putting money in or taking money out of the bank */ | |
- text=nice_input(_("How much money? "),19,1,TRUE,NULL,'\0'); | |
+ if (action == 'D' || action == 'W') { | |
+ /* Prompt for putting money in or taking money out of the bank */ | |
+ text = nice_input(_("How much money? "), 19, 1, TRUE, NULL, '\0'); | |
- money=strtoprice(text); g_free(text); | |
- if (money<0) money=0; | |
- if (action=='W') money=-money; | |
- if (money>Play->Cash) { | |
-/* Error - player has tried to put more money into the bank than he/she has */ | |
- mvaddstr(20,1,_("You don't have that much money!")); | |
+ money = strtoprice(text); | |
+ g_free(text); | |
+ if (money < 0) | |
+ money = 0; | |
+ if (action == 'W') | |
+ money = -money; | |
+ if (money > Play->Cash) { | |
+ /* Error - player has tried to put more money into the bank than | |
+ * he/she has */ | |
+ mvaddstr(20, 1, _("You don't have that much money!")); | |
nice_wait(); | |
} else if (-money > Play->Bank) { | |
-/* Error - player has tried to withdraw more money from the bank than there | |
- is in the account */ | |
- mvaddstr(20,1,_("There isn't that much money in the bank...")); | |
+ /* Error - player has tried to withdraw more money from the bank | |
+ * than there is in the account */ | |
+ mvaddstr(20, 1, _("There isn't that much money in the bank...")); | |
nice_wait(); | |
- } else if (money!=0) { | |
- SendClientMessage(Play,C_NONE,C_DEPOSIT,NULL,(prstr=pricetostr(money))… | |
+ } else if (money != 0) { | |
+ SendClientMessage(Play, C_NONE, C_DEPOSIT, NULL, | |
+ (prstr = pricetostr(money))); | |
g_free(prstr); | |
- money=0; | |
+ money = 0; | |
} | |
} | |
- } while (action!='L' && money!=0); | |
+ } while (action != 'L' && money != 0); | |
} | |
-int GetKey(char *allowed,char *orig_allowed,gboolean AllowOther, | |
- gboolean PrintAllowed,gboolean ExpandOut) { | |
-/* Waits for keyboard input; will only accept a key listed in the */ | |
-/* "allowed" string. This string may have been translated; thus */ | |
-/* the "orig_allowed" string contains the untranslated keys. */ | |
-/* Returns the untranslated key corresponding to the key pressed */ | |
-/* (e.g. if allowed[2] is pressed, orig_allowed[2] is returned) */ | |
-/* Case insensitive. If "AllowOther" is TRUE, keys other than the */ | |
-/* given selection are allowed, and cause a zero return value. */ | |
-/* If "PrintAllowed" is TRUE, the allowed keys are printed after */ | |
-/* the prompt. If "ExpandOut" is also TRUE, the full words for */ | |
-/* the commands, rather than just their first letters, are */ | |
-/* displayed. */ | |
+/* | |
+ * Waits for keyboard input; will only accept a key listed in the | |
+ * "allowed" string. This string may have been translated; thus | |
+ * the "orig_allowed" string contains the untranslated keys. | |
+ * Returns the untranslated key corresponding to the key pressed | |
+ * (e.g. if allowed[2] is pressed, orig_allowed[2] is returned) | |
+ * Case insensitive. If "AllowOther" is TRUE, keys other than the | |
+ * given selection are allowed, and cause a zero return value. | |
+ * If "PrintAllowed" is TRUE, the allowed keys are printed after | |
+ * the prompt. If "ExpandOut" is also TRUE, the full words for | |
+ * the commands, rather than just their first letters, are displayed. | |
+ */ | |
+int GetKey(char *allowed, char *orig_allowed, gboolean AllowOther, | |
+ gboolean PrintAllowed, gboolean ExpandOut) | |
+{ | |
int ch; | |
- guint AllowInd,WordInd,i; | |
+ guint AllowInd, WordInd, i; | |
-/* Expansions of the single-letter keypresses for the benefit of the user. | |
- i.e. "Yes" is printed for the key "Y" etc. You should indicate to the | |
- user which letter in the word corresponds to the keypress, by | |
- capitalising it or similar. */ | |
+ /* Expansions of the single-letter keypresses for the benefit of the | |
+ * user. i.e. "Yes" is printed for the key "Y" etc. You should indicate | |
+ * to the user which letter in the word corresponds to the keypress, by | |
+ * capitalising it or similar. */ | |
gchar *Words[] = { N_("Y:Yes"), N_("N:No"), N_("R:Run"), | |
- N_("F:Fight"), N_("A:Attack"), N_("E:Evade") }; | |
+ N_("F:Fight"), N_("A:Attack"), N_("E:Evade") | |
+ }; | |
guint numWords = sizeof(Words) / sizeof(Words[0]); | |
gchar *trWord; | |
curs_set(1); | |
- ch='\0'; | |
+ ch = '\0'; | |
- if (!allowed || strlen(allowed)==0) return 0; | |
+ if (!allowed || strlen(allowed) == 0) | |
+ return 0; | |
if (PrintAllowed) { | |
addch('[' | TextAttr); | |
- for (AllowInd=0;AllowInd<strlen(allowed);AllowInd++) { | |
- if (AllowInd>0) addch('/' | TextAttr); | |
- WordInd=0; | |
- while (WordInd<numWords && | |
- orig_allowed[AllowInd]!=Words[WordInd][0]) WordInd++; | |
- | |
- if (ExpandOut && WordInd<numWords) { | |
- trWord=_(Words[WordInd]); | |
- for (i=2;i<strlen(trWord);i++) addch((guchar)trWord[i] | TextAttr); | |
- } else addch((guchar)allowed[AllowInd] | TextAttr); | |
+ for (AllowInd = 0; AllowInd < strlen(allowed); AllowInd++) { | |
+ if (AllowInd > 0) | |
+ addch('/' | TextAttr); | |
+ WordInd = 0; | |
+ while (WordInd < numWords && | |
+ orig_allowed[AllowInd] != Words[WordInd][0]) | |
+ WordInd++; | |
+ | |
+ if (ExpandOut && WordInd < numWords) { | |
+ trWord = _(Words[WordInd]); | |
+ for (i = 2; i < strlen(trWord); i++) | |
+ addch((guchar)trWord[i] | TextAttr); | |
+ } else | |
+ addch((guchar)allowed[AllowInd] | TextAttr); | |
} | |
addch(']' | TextAttr); | |
addch(' ' | TextAttr); | |
} | |
do { | |
- ch=bgetch(); ch=toupper(ch); | |
- for (AllowInd=0;AllowInd<strlen(allowed);AllowInd++) { | |
- if (allowed[AllowInd]==ch) { | |
+ ch = bgetch(); | |
+ ch = toupper(ch); | |
+ for (AllowInd = 0; AllowInd < strlen(allowed); AllowInd++) { | |
+ if (allowed[AllowInd] == ch) { | |
addch((guint)ch | TextAttr); | |
- curs_set(0); return orig_allowed[AllowInd]; | |
+ curs_set(0); | |
+ return orig_allowed[AllowInd]; | |
} | |
} | |
} while (!AllowOther); | |
t@@ -1256,819 +1468,954 @@ int GetKey(char *allowed,char *orig_allowed,gboolean… | |
return 0; | |
} | |
-void clear_line(int line) { | |
-/* Clears one whole line on the curses screen */ | |
- int i; | |
- move(line,0); | |
- for (i=0;i<Width;i++) addch(' '); | |
+/* | |
+ * Clears one whole line on the curses screen. | |
+ */ | |
+void clear_line(int line) | |
+{ | |
+ int i; | |
+ | |
+ move(line, 0); | |
+ for (i = 0; i < Width; i++) | |
+ addch(' '); | |
} | |
-void clear_exceptfor(int skip) { | |
-/* Clears the bottom of the screen (i.e. from line 16 to line 23) */ | |
-/* except for the top "skip" lines */ | |
- int i; | |
- for (i=16+skip;i<=23;i++) clear_line(i); | |
+/* | |
+ * Clears the bottom of the screen (i.e. from line 16 to line 23) | |
+ * except for the top "skip" lines. | |
+ */ | |
+void clear_exceptfor(int skip) | |
+{ | |
+ int i; | |
+ | |
+ for (i = 16 + skip; i <= 23; i++) | |
+ clear_line(i); | |
} | |
-void clear_bottom(void) { | |
-/* Clears screen lines 16 to 23 */ | |
- int i; | |
- for (i=16;i<=23;i++) clear_line(i); | |
+/* | |
+ * Clears screen lines 16 to 23. | |
+ */ | |
+void clear_bottom(void) | |
+{ | |
+ int i; | |
+ | |
+ for (i = 16; i <= 23; i++) | |
+ clear_line(i); | |
} | |
-void clear_screen(void) { | |
-/* Clears the entire screen; 24 lines of 80 characters each */ | |
- int i; | |
- for (i=0;i<Depth;i++) clear_line(i); | |
+/* | |
+ * Clears the entire screen; 24 lines of 80 characters each. | |
+ */ | |
+void clear_screen(void) | |
+{ | |
+ int i; | |
+ | |
+ for (i = 0; i < Depth; i++) | |
+ clear_line(i); | |
} | |
-void nice_wait() { | |
-/* Displays a prompt on the bottom screen line and waits for the user */ | |
-/* to press a key */ | |
- gchar *text; | |
- attrset(PromptAttr); | |
- text=_("Press any key..."); | |
- mvaddstr(23,(Width-strlen(text))/2,text); | |
- bgetch(); | |
- attrset(TextAttr); | |
+/* | |
+ * Displays a prompt on the bottom screen line and waits for the user | |
+ * to press a key. | |
+ */ | |
+void nice_wait() | |
+{ | |
+ gchar *text; | |
+ | |
+ attrset(PromptAttr); | |
+ text = _("Press any key..."); | |
+ mvaddstr(23, (Width - strlen(text)) / 2, text); | |
+ bgetch(); | |
+ attrset(TextAttr); | |
} | |
-void DisplayFightMessage(Player *Play,char *text) { | |
-/* Handles the display of messages pertaining to player-player fights */ | |
-/* in the lower part of screen (fighting sub-screen). Adds the new line */ | |
-/* of text in "text" and scrolls up previous messages if necessary */ | |
-/* If "text" is NULL, initialises the area */ | |
-/* If "text" is a blank string, redisplays the message area */ | |
-/* Messages are displayed from lines 16 to 20; line 22 is used for */ | |
-/* the prompt for the user */ | |
+/* | |
+ * Handles the display of messages pertaining to player-player fights | |
+ * in the lower part of screen (fighting sub-screen). Adds the new line | |
+ * of text in "text" and scrolls up previous messages if necessary | |
+ * If "text" is NULL, initialises the area | |
+ * If "text" is a blank string, redisplays the message area | |
+ * Messages are displayed from lines 16 to 20; line 22 is used for | |
+ * the prompt for the user. | |
+ */ | |
+void DisplayFightMessage(Player *Play, char *text) | |
+{ | |
static char Messages[5][79]; | |
- static int x,y; | |
+ static int x, y; | |
gchar *textpt; | |
- gchar *AttackName,*DefendName,*BitchName; | |
- gint i,DefendHealth,DefendBitches,BitchesKilled,ArmPercent; | |
+ gchar *AttackName, *DefendName, *BitchName; | |
+ gint i, DefendHealth, DefendBitches, BitchesKilled, ArmPercent; | |
gboolean Loot; | |
- if (text==NULL) { | |
- x=0; y=15; | |
- for (i=0;i<5;i++) Messages[i][0]='\0'; | |
+ if (text == NULL) { | |
+ x = 0; | |
+ y = 15; | |
+ for (i = 0; i < 5; i++) | |
+ Messages[i][0] = '\0'; | |
} else if (!text[0]) { | |
attrset(TextAttr); | |
clear_bottom(); | |
- for (i=16;i<=20;i++) mvaddstr(i,1,Messages[i-16]); | |
+ for (i = 16; i <= 20; i++) | |
+ mvaddstr(i, 1, Messages[i - 16]); | |
} else { | |
- if (HaveAbility(Play,A_NEWFIGHT)) { | |
- ReceiveFightMessage(text,&AttackName,&DefendName,&DefendHealth, | |
- &DefendBitches,&BitchName,&BitchesKilled, | |
- &ArmPercent,&fp,&RunHere,&Loot,&CanFire,&textpt); | |
+ if (HaveAbility(Play, A_NEWFIGHT)) { | |
+ ReceiveFightMessage(text, &AttackName, &DefendName, &DefendHealth, | |
+ &DefendBitches, &BitchName, &BitchesKilled, | |
+ &ArmPercent, &fp, &RunHere, &Loot, &CanFire, | |
+ &textpt); | |
} else { | |
- textpt=text; | |
- if (Play->Flags&FIGHTING) fp=F_MSG; | |
- else fp=F_LASTLEAVE; | |
- CanFire = (Play->Flags&CANSHOOT); | |
- RunHere=FALSE; | |
+ textpt = text; | |
+ if (Play->Flags & FIGHTING) | |
+ fp = F_MSG; | |
+ else | |
+ fp = F_LASTLEAVE; | |
+ CanFire = (Play->Flags & CANSHOOT); | |
+ RunHere = FALSE; | |
} | |
- while(textpt[0]) { | |
- if (y<20) y++; | |
- else for (i=0;i<4;i++) strcpy(Messages[i],Messages[i+1]); | |
- | |
- strncpy(Messages[y-16],textpt,78); Messages[y-16][78]='\0'; | |
- textpt += MIN(strlen(textpt),78); | |
+ while (textpt[0]) { | |
+ if (y < 20) | |
+ y++; | |
+ else | |
+ for (i = 0; i < 4; i++) | |
+ strcpy(Messages[i], Messages[i + 1]); | |
+ | |
+ strncpy(Messages[y - 16], textpt, 78); | |
+ Messages[y - 16][78] = '\0'; | |
+ textpt += MIN(strlen(textpt), 78); | |
} | |
} | |
} | |
-void display_message(char *buf) { | |
-/* Displays a network message "buf" in the message area (lines */ | |
-/* 10 to 14) scrolling previous messages up */ | |
-/* If "buf" is NULL, clears the message area */ | |
-/* If "buf" is a blank string, redisplays the message area */ | |
- guint x,y; | |
+/* | |
+ * Displays a network message "buf" in the message area (lines | |
+ * 10 to 14) scrolling previous messages up. | |
+ * If "buf" is NULL, clears the message area | |
+ * If "buf" is a blank string, redisplays the message area | |
+ */ | |
+void display_message(char *buf) | |
+{ | |
+ guint x, y; | |
guint wid; | |
static gchar Messages[5][200]; | |
gchar *bufpt; | |
- if (Width<=4) return; | |
+ if (Width <= 4) | |
+ return; | |
- wid = MIN(Width-4,200); | |
+ wid = MIN(Width - 4, 200); | |
if (!buf) { | |
- for (y=0;y<5;y++) { | |
- memset(Messages[y],' ',200); | |
+ for (y = 0; y < 5; y++) { | |
+ memset(Messages[y], ' ', 200); | |
if (Network) { | |
- mvaddch(y+10,0,' ' | TextAttr); | |
+ mvaddch(y + 10, 0, ' ' | TextAttr); | |
addch(ACS_VLINE | StatsAttr); | |
- for (x=0;x<wid;x++) addch(' ' | StatsAttr); | |
+ for (x = 0; x < wid; x++) | |
+ addch(' ' | StatsAttr); | |
addch(ACS_VLINE | StatsAttr); | |
addch(' ' | TextAttr); | |
} | |
} | |
} else if (Network) { | |
- bufpt=buf; | |
- while (bufpt[0]!=0) { | |
- memmove(Messages[0],Messages[1],200*4); | |
- memset(Messages[4],' ',200); | |
- memcpy(Messages[4],bufpt,strlen(bufpt)>wid ? wid : strlen(bufpt)); | |
- bufpt += MIN(strlen(bufpt),wid); | |
- } | |
- for (y=0;y<5;y++) for (x=0;x<wid;x++) { | |
- mvaddch(y+10,x+2,(guchar)Messages[y][x] | StatsAttr); | |
+ bufpt = buf; | |
+ while (bufpt[0] != 0) { | |
+ memmove(Messages[0], Messages[1], 200 * 4); | |
+ memset(Messages[4], ' ', 200); | |
+ memcpy(Messages[4], bufpt, | |
+ strlen(bufpt) > wid ? wid : strlen(bufpt)); | |
+ bufpt += MIN(strlen(bufpt), wid); | |
} | |
+ for (y = 0; y < 5; y++) | |
+ for (x = 0; x < wid; x++) { | |
+ mvaddch(y + 10, x + 2, (guchar)Messages[y][x] | StatsAttr); | |
+ } | |
refresh(); | |
} | |
} | |
-void print_location(char *text) { | |
-/* Displays the string "text" at the top of the screen. Usually used for */ | |
-/* displaying the current location or the "Subway" flash. */ | |
- int i; | |
- if (!text) return; | |
- attrset(LocationAttr); | |
- move(0,Width/2-9); | |
- for (i=0;i<18;i++) addch(' '); | |
- mvaddstr(0,(Width-strlen(text))/2,text); | |
- attrset(TextAttr); | |
+/* | |
+ * Displays the string "text" at the top of the screen. Usually used for | |
+ * displaying the current location or the "Subway" flash. | |
+ */ | |
+void print_location(char *text) | |
+{ | |
+ int i; | |
+ | |
+ if (!text) | |
+ return; | |
+ attrset(LocationAttr); | |
+ move(0, Width / 2 - 9); | |
+ for (i = 0; i < 18; i++) | |
+ addch(' '); | |
+ mvaddstr(0, (Width - strlen(text)) / 2, text); | |
+ attrset(TextAttr); | |
} | |
-void print_status(Player *Play,gboolean DispDrug) { | |
-/* Displays the status of player "Play" - i.e. the current turn, the */ | |
-/* location, bitches, available space, cash, guns, health and bank */ | |
-/* details. If "DispDrugs" is TRUE, displays the carried drugs on the */ | |
-/* right hand side of the screen; if FALSE, displays the carried guns. */ | |
- int i,c; | |
- GString *text; | |
- | |
- text=g_string_new(NULL); | |
- attrset(TitleAttr); | |
- clear_line(0); | |
- g_string_sprintf(text,"%s%02d%s",Names.Month,Play->Turn,Names.Year); | |
- mvaddstr(0,3,text->str); | |
- | |
- attrset(StatsAttr); | |
- for (i=2;i<=14;i++) { | |
- mvaddch(i,1,ACS_VLINE); | |
- mvaddch(i,Width-2,ACS_VLINE); | |
- } | |
- mvaddch(1,1,ACS_ULCORNER); | |
- for (i=0;i<Width-4;i++) addch(ACS_HLINE); | |
- addch(ACS_URCORNER); | |
- | |
- mvaddch(1,Width/2,ACS_TTEE); | |
- for (i=2;i<=(Network ? 8 : 13);i++) { | |
- move(i,2); | |
- for (c=2;c<Width/2;c++) addch(' '); | |
- addch(ACS_VLINE); | |
- for (c=Width/2+1;c<Width-2;c++) addch(' '); | |
- } | |
- if (!Network) { | |
- mvaddch(14,1,ACS_LLCORNER); | |
- for (i=0;i<Width-4;i++) addch(ACS_HLINE); | |
- addch(ACS_LRCORNER); | |
- mvaddch(14,Width/2,ACS_BTEE); | |
- } else { | |
- mvaddch(9,1,ACS_LTEE); | |
- for (i=0;i<Width-4;i++) addch(ACS_HLINE); | |
- addch(ACS_RTEE); | |
- | |
-/* Title of the "Messages" window in the curses client */ | |
- mvaddstr(9,15,_("Messages")); | |
- | |
- mvaddch(9,Width/2,ACS_BTEE); | |
- mvaddch(15,1,ACS_LLCORNER); | |
- for (i=0;i<Width-4;i++) addch(ACS_HLINE); | |
- addch(ACS_LRCORNER); | |
- } | |
- | |
-/* Title of the "Stats" window in the curses client */ | |
- mvaddstr(1,Width/4-2,_("Stats")); | |
- | |
- attrset(StatsAttr); | |
- | |
-/* Display of the player's cash in the stats window (careful to keep the | |
- formatting if you change the length of the "Cash" word) */ | |
- dpg_string_sprintf(text,_("Cash %17P"),Play->Cash); | |
- mvaddstr(3,9,text->str); | |
- | |
-/* Display of the total number of guns carried (%Tde="Guns" by default) */ | |
- dpg_string_sprintf(text,_("%-19Tde%3d"),Names.Guns,TotalGunsCarried(Play)); | |
- mvaddstr(Network ? 4 : 5,9,text->str); | |
- | |
-/* Display of the player's health */ | |
- g_string_sprintf(text,_("Health %3d"),Play->Health); | |
- mvaddstr(Network ? 5 : 7,9,text->str); | |
- | |
-/* Display of the player's bank balance */ | |
- dpg_string_sprintf(text,_("Bank %17P"),Play->Bank); | |
- mvaddstr(Network ? 6 : 9,9,text->str); | |
- | |
- if (Play->Debt>0) attrset(DebtAttr); | |
-/* Display of the player's debt */ | |
- dpg_string_sprintf(text,_("Debt %17P"),Play->Debt); | |
- mvaddstr(Network ? 7 : 11,9,text->str); | |
- attrset(TitleAttr); | |
- | |
-/* Display of the player's trenchcoat size (antique mode only) */ | |
- if (WantAntique) g_string_sprintf(text,_("Space %6d"),Play->CoatSize); | |
- else { | |
-/* Display of the player's number of bitches, and available space | |
- (%Tde="Bitches" by default) */ | |
- dpg_string_sprintf(text,_("%Tde %3d Space %6d"),Names.Bitches, | |
- Play->Bitches.Carried,Play->CoatSize); | |
- } | |
- mvaddstr(0,Width-2-strlen(text->str),text->str); | |
- print_location(Location[(int)Play->IsAt].Name); | |
- attrset(StatsAttr); | |
- | |
- c=0; | |
- if (DispDrug) { | |
-/* Title of the "trenchcoat" window (antique mode only) */ | |
- if (WantAntique) mvaddstr(1,Width*3/4-5,_("Trenchcoat")); | |
- else { | |
-/* Title of the "drugs" window (the only important bit in this string is the | |
- "%Tde" which is "Drugs" by default; the %/.../ part is ignored, so you | |
- don't need to translate it; see doc/i18n.html) */ | |
- dpg_string_sprintf(text,_("%/Stats: Drugs/%Tde"),Names.Drugs); | |
- mvaddstr(1,Width*3/4-strlen(text->str)/2,text->str); | |
- } | |
- for (i=0;i<NumDrug;i++) { | |
- if (Play->Drugs[i].Carried>0) { | |
-/* Display of carried drugs with price (%tde="Opium", etc. by default) */ | |
- if (HaveAbility(Play,A_DRUGVALUE)) { | |
- dpg_string_sprintf(text,_("%-7tde %3d @ %P"),Drug[i].Name, | |
- Play->Drugs[i].Carried, | |
- Play->Drugs[i].TotalValue/Play->Drugs[i].Carried); | |
- mvaddstr(3+c,Width/2+3,text->str); | |
- } else { | |
-/* Display of carried drugs (%tde="Opium", etc. by default) */ | |
- dpg_string_sprintf(text,_("%-7tde %3d"),Drug[i].Name, | |
- Play->Drugs[i].Carried); | |
- mvaddstr(3+c/2,Width/2+3+(c%2)*17,text->str); | |
- } | |
- c++; | |
- } | |
+/* | |
+ * Displays the status of player "Play" - i.e. the current turn, the | |
+ * location, bitches, available space, cash, guns, health and bank | |
+ * details. If "DispDrugs" is TRUE, displays the carried drugs on the | |
+ * right hand side of the screen; if FALSE, displays the carried guns. | |
+ */ | |
+void print_status(Player *Play, gboolean DispDrug) | |
+{ | |
+ int i, c; | |
+ GString *text; | |
+ | |
+ text = g_string_new(NULL); | |
+ attrset(TitleAttr); | |
+ clear_line(0); | |
+ g_string_sprintf(text, "%s%02d%s", Names.Month, Play->Turn, Names.Year); | |
+ mvaddstr(0, 3, text->str); | |
+ | |
+ attrset(StatsAttr); | |
+ for (i = 2; i <= 14; i++) { | |
+ mvaddch(i, 1, ACS_VLINE); | |
+ mvaddch(i, Width - 2, ACS_VLINE); | |
+ } | |
+ mvaddch(1, 1, ACS_ULCORNER); | |
+ for (i = 0; i < Width - 4; i++) | |
+ addch(ACS_HLINE); | |
+ addch(ACS_URCORNER); | |
+ | |
+ mvaddch(1, Width / 2, ACS_TTEE); | |
+ for (i = 2; i <= (Network ? 8 : 13); i++) { | |
+ move(i, 2); | |
+ for (c = 2; c < Width / 2; c++) | |
+ addch(' '); | |
+ addch(ACS_VLINE); | |
+ for (c = Width / 2 + 1; c < Width - 2; c++) | |
+ addch(' '); | |
+ } | |
+ if (!Network) { | |
+ mvaddch(14, 1, ACS_LLCORNER); | |
+ for (i = 0; i < Width - 4; i++) | |
+ addch(ACS_HLINE); | |
+ addch(ACS_LRCORNER); | |
+ mvaddch(14, Width / 2, ACS_BTEE); | |
+ } else { | |
+ mvaddch(9, 1, ACS_LTEE); | |
+ for (i = 0; i < Width - 4; i++) | |
+ addch(ACS_HLINE); | |
+ addch(ACS_RTEE); | |
+ | |
+ /* Title of the "Messages" window in the curses client */ | |
+ mvaddstr(9, 15, _("Messages")); | |
+ | |
+ mvaddch(9, Width / 2, ACS_BTEE); | |
+ mvaddch(15, 1, ACS_LLCORNER); | |
+ for (i = 0; i < Width - 4; i++) | |
+ addch(ACS_HLINE); | |
+ addch(ACS_LRCORNER); | |
+ } | |
+ | |
+ /* Title of the "Stats" window in the curses client */ | |
+ mvaddstr(1, Width / 4 - 2, _("Stats")); | |
+ | |
+ attrset(StatsAttr); | |
+ | |
+ /* Display of the player's cash in the stats window (careful to keep the | |
+ * formatting if you change the length of the "Cash" word) */ | |
+ dpg_string_sprintf(text, _("Cash %17P"), Play->Cash); | |
+ mvaddstr(3, 9, text->str); | |
+ | |
+ /* Display of the total number of guns carried (%Tde="Guns" by default) */ | |
+ dpg_string_sprintf(text, _("%-19Tde%3d"), Names.Guns, | |
+ TotalGunsCarried(Play)); | |
+ mvaddstr(Network ? 4 : 5, 9, text->str); | |
+ | |
+ /* Display of the player's health */ | |
+ g_string_sprintf(text, _("Health %3d"), Play->Health); | |
+ mvaddstr(Network ? 5 : 7, 9, text->str); | |
+ | |
+ /* Display of the player's bank balance */ | |
+ dpg_string_sprintf(text, _("Bank %17P"), Play->Bank); | |
+ mvaddstr(Network ? 6 : 9, 9, text->str); | |
+ | |
+ if (Play->Debt > 0) | |
+ attrset(DebtAttr); | |
+ /* Display of the player's debt */ | |
+ dpg_string_sprintf(text, _("Debt %17P"), Play->Debt); | |
+ mvaddstr(Network ? 7 : 11, 9, text->str); | |
+ attrset(TitleAttr); | |
+ | |
+ /* Display of the player's trenchcoat size (antique mode only) */ | |
+ if (WantAntique) | |
+ g_string_sprintf(text, _("Space %6d"), Play->CoatSize); | |
+ else { | |
+ /* Display of the player's number of bitches, and available space | |
+ * (%Tde="Bitches" by default) */ | |
+ dpg_string_sprintf(text, _("%Tde %3d Space %6d"), Names.Bitches, | |
+ Play->Bitches.Carried, Play->CoatSize); | |
+ } | |
+ mvaddstr(0, Width - 2 - strlen(text->str), text->str); | |
+ print_location(Location[(int)Play->IsAt].Name); | |
+ attrset(StatsAttr); | |
+ | |
+ c = 0; | |
+ if (DispDrug) { | |
+ /* Title of the "trenchcoat" window (antique mode only) */ | |
+ if (WantAntique) | |
+ mvaddstr(1, Width * 3 / 4 - 5, _("Trenchcoat")); | |
+ else { | |
+ /* Title of the "drugs" window (the only important bit in this | |
+ * string is the "%Tde" which is "Drugs" by default; the %/.../ part | |
+ * is ignored, so you don't need to translate it; see doc/i18n.html) | |
+ */ | |
+ dpg_string_sprintf(text, _("%/Stats: Drugs/%Tde"), Names.Drugs); | |
+ mvaddstr(1, Width * 3 / 4 - strlen(text->str) / 2, text->str); | |
+ } | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if (Play->Drugs[i].Carried > 0) { | |
+ /* Display of carried drugs with price (%tde="Opium", etc. by | |
+ * default) */ | |
+ if (HaveAbility(Play, A_DRUGVALUE)) { | |
+ dpg_string_sprintf(text, _("%-7tde %3d @ %P"), Drug[i].Name, | |
+ Play->Drugs[i].Carried, | |
+ Play->Drugs[i].TotalValue / | |
+ Play->Drugs[i].Carried); | |
+ mvaddstr(3 + c, Width / 2 + 3, text->str); | |
+ } else { | |
+ /* Display of carried drugs (%tde="Opium", etc. by default) */ | |
+ dpg_string_sprintf(text, _("%-7tde %3d"), Drug[i].Name, | |
+ Play->Drugs[i].Carried); | |
+ mvaddstr(3 + c / 2, Width / 2 + 3 + (c % 2) * 17, text->str); | |
+ } | |
+ c++; | |
} | |
- } else { | |
-/* Title of the "guns" window (the only important bit in this string is the | |
- "%Tde" which is "Guns" by default) */ | |
- dpg_string_sprintf(text,_("%/Stats: Guns/%Tde"),Names.Guns); | |
- mvaddstr(1,Width*3/4-strlen(text->str)/2,text->str); | |
- for (i=0;i<NumGun;i++) { | |
- if (Play->Guns[i].Carried>0) { | |
-/* Display of carried guns (%tde="Baretta", etc. by default) */ | |
- dpg_string_sprintf(text,_("%-22tde %3d"),Gun[i].Name, | |
- Play->Guns[i].Carried); | |
- mvaddstr(3+c,Width/2+3,text->str); | |
- c++; | |
- } | |
+ } | |
+ } else { | |
+ /* Title of the "guns" window (the only important bit in this string | |
+ * is the "%Tde" which is "Guns" by default) */ | |
+ dpg_string_sprintf(text, _("%/Stats: Guns/%Tde"), Names.Guns); | |
+ mvaddstr(1, Width * 3 / 4 - strlen(text->str) / 2, text->str); | |
+ for (i = 0; i < NumGun; i++) { | |
+ if (Play->Guns[i].Carried > 0) { | |
+ /* Display of carried guns (%tde="Baretta", etc. by default) */ | |
+ dpg_string_sprintf(text, _("%-22tde %3d"), Gun[i].Name, | |
+ Play->Guns[i].Carried); | |
+ mvaddstr(3 + c, Width / 2 + 3, text->str); | |
+ c++; | |
} | |
- } | |
- attrset(TextAttr); | |
- if (!Network) clear_line(15); | |
- refresh(); | |
- g_string_free(text,TRUE); | |
+ } | |
+ } | |
+ attrset(TextAttr); | |
+ if (!Network) | |
+ clear_line(15); | |
+ refresh(); | |
+ g_string_free(text, TRUE); | |
} | |
-void DisplaySpyReports(char *Data,Player *From,Player *To) { | |
-/* Parses details about player "From" from string "Data" and then */ | |
-/* displays the lot, drugs and guns. */ | |
- gchar *text; | |
+/* | |
+ * Parses details about player "From" from string "Data" and then | |
+ * displays the lot, drugs and guns. | |
+ */ | |
+void DisplaySpyReports(char *Data, Player *From, Player *To) | |
+{ | |
+ gchar *text; | |
- ReceivePlayerData(To,Data,From); | |
+ ReceivePlayerData(To, Data, From); | |
- clear_bottom(); | |
- text=g_strdup_printf(_("Spy reports for %s"),GetPlayerName(From)); | |
- mvaddstr(17,1,text); g_free(text); | |
+ clear_bottom(); | |
+ text = g_strdup_printf(_("Spy reports for %s"), GetPlayerName(From)); | |
+ mvaddstr(17, 1, text); | |
+ g_free(text); | |
-/* Message displayed with a spy's list of drugs (%Tde="Drugs" by default) */ | |
- text=dpg_strdup_printf(_("%/Spy: Drugs/%Tde..."),Names.Drugs); | |
- mvaddstr(19,20,text); g_free(text); | |
- print_status(From,TRUE); nice_wait(); | |
- clear_line(19); | |
+ /* Message displayed with a spy's list of drugs (%Tde="Drugs" by | |
+ * default) */ | |
+ text = dpg_strdup_printf(_("%/Spy: Drugs/%Tde..."), Names.Drugs); | |
+ mvaddstr(19, 20, text); | |
+ g_free(text); | |
+ print_status(From, TRUE); | |
+ nice_wait(); | |
+ clear_line(19); | |
-/* Message displayed with a spy's list of guns (%Tde="Guns" by default) */ | |
- text=dpg_strdup_printf(_("%/Spy: Guns/%Tde..."),Names.Guns); | |
- mvaddstr(19,20,text); g_free(text); | |
- print_status(From,FALSE); nice_wait(); | |
+ /* Message displayed with a spy's list of guns (%Tde="Guns" by default) */ | |
+ text = dpg_strdup_printf(_("%/Spy: Guns/%Tde..."), Names.Guns); | |
+ mvaddstr(19, 20, text); | |
+ g_free(text); | |
+ print_status(From, FALSE); | |
+ nice_wait(); | |
- print_status(To,TRUE); refresh(); | |
+ print_status(To, TRUE); | |
+ refresh(); | |
} | |
-Player *ListPlayers(Player *Play,gboolean Select,char *Prompt) { | |
-/* Displays the "Prompt" if non-NULL, and then lists all clients */ | |
-/* currently playing dopewars, other than the current player "Play". */ | |
-/* If "Select" is TRUE, gives each player a letter and asks the user */ | |
-/* to select one, which is returned by the function. */ | |
- Player *tmp=NULL; | |
- GSList *list; | |
- int i,c; | |
- gchar *text; | |
- | |
- attrset(TextAttr); | |
- clear_bottom(); | |
- if (!FirstClient || (!g_slist_next(FirstClient) && | |
- FirstClient->data == Play)) { | |
- text=_("No other players are currently logged on!"); | |
- mvaddstr(18,(Width-strlen(text))/2,text); | |
- nice_wait(); | |
- return 0; | |
- } | |
- mvaddstr(16,1,_("Players currently logged on:-")); | |
- | |
- i=0; | |
- for (list=FirstClient;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- if (strcmp(GetPlayerName(tmp),GetPlayerName(Play))==0) continue; | |
- if (Select) text=g_strdup_printf("%c. %s",'A'+i,GetPlayerName(tmp)); | |
- else text=g_strdup(GetPlayerName(tmp)); | |
- mvaddstr(17+i/2,(i%2)*40+1,text); | |
- g_free(text); | |
- i++; | |
- } | |
+/* | |
+ * Displays the "Prompt" if non-NULL, and then lists all clients | |
+ * currently playing dopewars, other than the current player "Play". | |
+ * If "Select" is TRUE, gives each player a letter and asks the user | |
+ * to select one, which is returned by the function. | |
+ */ | |
+Player *ListPlayers(Player *Play, gboolean Select, char *Prompt) | |
+{ | |
+ Player *tmp = NULL; | |
+ GSList *list; | |
+ int i, c; | |
+ gchar *text; | |
- if (Prompt) { | |
- attrset(PromptAttr); mvaddstr(22,10,Prompt); attrset(TextAttr); | |
- } | |
- if (Select) { | |
- curs_set(1); | |
- attrset(TextAttr); | |
- c=0; | |
- while (c<'A' || c>='A'+i) { c=bgetch(); c=toupper(c); } | |
- if (Prompt) addch((guint)c); | |
- list=FirstClient; | |
- while (c>='A') { | |
- if (list!=FirstClient) list=g_slist_next(list); | |
- tmp=(Player *)list->data; | |
- while (strcmp(GetPlayerName(tmp),GetPlayerName(Play))==0) { | |
- list=g_slist_next(list); | |
- tmp=(Player *)list->data; | |
- } | |
- c--; | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ if (!FirstClient || (!g_slist_next(FirstClient) && | |
+ FirstClient->data == Play)) { | |
+ text = _("No other players are currently logged on!"); | |
+ mvaddstr(18, (Width - strlen(text)) / 2, text); | |
+ nice_wait(); | |
+ return 0; | |
+ } | |
+ mvaddstr(16, 1, _("Players currently logged on:-")); | |
+ | |
+ i = 0; | |
+ for (list = FirstClient; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ if (strcmp(GetPlayerName(tmp), GetPlayerName(Play)) == 0) | |
+ continue; | |
+ if (Select) | |
+ text = g_strdup_printf("%c. %s", 'A' + i, GetPlayerName(tmp)); | |
+ else | |
+ text = g_strdup(GetPlayerName(tmp)); | |
+ mvaddstr(17 + i / 2, (i % 2) * 40 + 1, text); | |
+ g_free(text); | |
+ i++; | |
+ } | |
+ | |
+ if (Prompt) { | |
+ attrset(PromptAttr); | |
+ mvaddstr(22, 10, Prompt); | |
+ attrset(TextAttr); | |
+ } | |
+ if (Select) { | |
+ curs_set(1); | |
+ attrset(TextAttr); | |
+ c = 0; | |
+ while (c < 'A' || c >= 'A' + i) { | |
+ c = bgetch(); | |
+ c = toupper(c); | |
+ } | |
+ if (Prompt) | |
+ addch((guint)c); | |
+ list = FirstClient; | |
+ while (c >= 'A') { | |
+ if (list != FirstClient) | |
+ list = g_slist_next(list); | |
+ tmp = (Player *)list->data; | |
+ while (strcmp(GetPlayerName(tmp), GetPlayerName(Play)) == 0) { | |
+ list = g_slist_next(list); | |
+ tmp = (Player *)list->data; | |
} | |
- return tmp; | |
- } else { | |
- nice_wait(); | |
- } | |
- return NULL; | |
+ c--; | |
+ } | |
+ return tmp; | |
+ } else { | |
+ nice_wait(); | |
+ } | |
+ return NULL; | |
} | |
-char *nice_input(char *prompt,int sy,int sx,gboolean digitsonly, | |
- char *displaystr,char passwdchar) { | |
-/* Displays the given "prompt" (if non-NULL) at coordinates sx,sy and */ | |
-/* allows the user to input a string, which is returned. This is a */ | |
-/* dynamically allocated string, and so must be freed by the calling */ | |
-/* routine. If "digitsonly" is TRUE, the user will be permitted only to */ | |
-/* input numbers, although the suffixes m and k are allowed (the */ | |
-/* strtoprice routine understands this notation for a 1000000 or 1000 */ | |
-/* multiplier) as well as a decimal point (. or ,) */ | |
-/* If "displaystr" is non-NULL, it is taken as a default response. */ | |
-/* If "passwdchar" is non-zero, it is displayed instead of the user's */ | |
-/* keypresses (e.g. for entering passwords) */ | |
- int i,c,x; | |
- gboolean DecimalPoint,Suffix; | |
+/* | |
+ * Displays the given "prompt" (if non-NULL) at coordinates sx,sy and | |
+ * allows the user to input a string, which is returned. This is a | |
+ * dynamically allocated string, and so must be freed by the calling | |
+ * routine. If "digitsonly" is TRUE, the user will be permitted only to | |
+ * input numbers, although the suffixes m and k are allowed (the | |
+ * strtoprice routine understands this notation for a 1000000 or 1000 | |
+ * multiplier) as well as a decimal point (. or ,) | |
+ * If "displaystr" is non-NULL, it is taken as a default response. | |
+ * If "passwdchar" is non-zero, it is displayed instead of the user's | |
+ * keypresses (e.g. for entering passwords) | |
+ */ | |
+char *nice_input(char *prompt, int sy, int sx, gboolean digitsonly, | |
+ char *displaystr, char passwdchar) | |
+{ | |
+ int i, c, x; | |
+ gboolean DecimalPoint, Suffix; | |
GString *text; | |
gchar *ReturnString; | |
- DecimalPoint=Suffix=FALSE; | |
- x=sx; | |
- move(sy,x); | |
+ DecimalPoint = Suffix = FALSE; | |
+ | |
+ x = sx; | |
+ move(sy, x); | |
if (prompt) { | |
attrset(PromptAttr); | |
addstr(prompt); | |
- x+=strlen(prompt); | |
+ x += strlen(prompt); | |
} | |
attrset(TextAttr); | |
if (displaystr) { | |
if (passwdchar) { | |
- for (i=strlen(displaystr);i;i--) addch((guint)passwdchar); | |
+ for (i = strlen(displaystr); i; i--) | |
+ addch((guint)passwdchar); | |
} else { | |
addstr(displaystr); | |
} | |
- i=strlen(displaystr); | |
- text=g_string_new(displaystr); | |
+ i = strlen(displaystr); | |
+ text = g_string_new(displaystr); | |
} else { | |
- i=0; | |
- text=g_string_new(""); | |
+ i = 0; | |
+ text = g_string_new(""); | |
} | |
curs_set(1); | |
do { | |
- move(sy+(x+i)/Width,(x+i)%Width); | |
- c=bgetch(); | |
- if ((c==8 || c==KEY_BACKSPACE || c==127) && i>0) { | |
- move(sy+(x+i-1)/Width,(x+i-1)%Width); | |
+ move(sy + (x + i) / Width, (x + i) % Width); | |
+ c = bgetch(); | |
+ if ((c == 8 || c == KEY_BACKSPACE || c == 127) && i > 0) { | |
+ move(sy + (x + i - 1) / Width, (x + i - 1) % Width); | |
addch(' '); | |
i--; | |
- if (DecimalPoint && text->str[i]=='.') DecimalPoint=FALSE; | |
- if (Suffix) Suffix=FALSE; | |
- g_string_truncate(text,i); | |
+ if (DecimalPoint && text->str[i] == '.') | |
+ DecimalPoint = FALSE; | |
+ if (Suffix) | |
+ Suffix = FALSE; | |
+ g_string_truncate(text, i); | |
} else if (!Suffix) { | |
- if ((digitsonly && c>='0' && c<='9') || | |
- (!digitsonly && c>=32 && c!='^' && c<127)) { | |
- g_string_append_c(text,c); | |
+ if ((digitsonly && c >= '0' && c <= '9') || | |
+ (!digitsonly && c >= 32 && c != '^' && c < 127)) { | |
+ g_string_append_c(text, c); | |
i++; | |
addch((guint)passwdchar ? passwdchar : c); | |
- } else if (digitsonly && (c=='.' || c==',') && !DecimalPoint) { | |
- g_string_append_c(text,'.'); | |
+ } else if (digitsonly && (c == '.' || c == ',') && !DecimalPoint) { | |
+ g_string_append_c(text, '.'); | |
i++; | |
addch((guint)passwdchar ? passwdchar : c); | |
- DecimalPoint=TRUE; | |
- } else if (digitsonly && (c=='M' || c=='m' || c=='k' || c=='K') | |
+ DecimalPoint = TRUE; | |
+ } else if (digitsonly | |
+ && (c == 'M' || c == 'm' || c == 'k' || c == 'K') | |
&& !Suffix) { | |
- g_string_append_c(text,c); | |
+ g_string_append_c(text, c); | |
i++; | |
addch((guint)passwdchar ? passwdchar : c); | |
- Suffix=TRUE; | |
+ Suffix = TRUE; | |
} | |
} | |
- } while (c!='\n' && c!=KEY_ENTER); | |
+ } while (c != '\n' && c != KEY_ENTER); | |
curs_set(0); | |
- move(sy,x); | |
- ReturnString=text->str; | |
- g_string_free(text,FALSE); /* Leave the buffer to return */ | |
+ move(sy, x); | |
+ ReturnString = text->str; | |
+ g_string_free(text, FALSE); /* Leave the buffer to return */ | |
return ReturnString; | |
} | |
-static void Curses_DoGame(Player *Play) { | |
-/* Loop which handles the user playing an interactive game (i.e. "Play" */ | |
-/* is a client connected to a server, either locally or remotely) */ | |
-/* dopewars is essentially server-driven, so this loop simply has to */ | |
-/* make the screen look pretty, respond to user keypresses, and react */ | |
-/* to messages from the server. */ | |
- gchar *buf,*OldName,*TalkMsg; | |
- GString *text; | |
- int i,c; | |
- char IsCarrying; | |
+/* | |
+ * Loop which handles the user playing an interactive game (i.e. "Play" | |
+ * is a client connected to a server, either locally or remotely) | |
+ * dopewars is essentially server-driven, so this loop simply has to | |
+ * make the screen look pretty, respond to user keypresses, and react | |
+ * to messages from the server. | |
+ */ | |
+static void Curses_DoGame(Player *Play) | |
+{ | |
+ gchar *buf, *OldName, *TalkMsg; | |
+ GString *text; | |
+ int i, c; | |
+ char IsCarrying; | |
+ | |
#if NETWORKING || HAVE_SELECT | |
- fd_set readfs; | |
+ fd_set readfs; | |
#endif | |
#ifdef NETWORKING | |
- fd_set writefs; | |
- gboolean DoneOK; | |
- gchar *pt; | |
- gboolean justconnected=FALSE; | |
+ fd_set writefs; | |
+ gboolean DoneOK; | |
+ gchar *pt; | |
+ gboolean justconnected = FALSE; | |
#endif | |
- int NumDrugsHere; | |
- int MaxSock; | |
- char HaveWorthless; | |
- Player *tmp; | |
- struct sigaction sact; | |
- | |
- DisplayMode=DM_NONE; | |
- QuitRequest=FALSE; | |
- | |
- ResizedFlag=0; | |
- sact.sa_handler=ResizeHandle; | |
- sact.sa_flags=0; | |
- sigemptyset(&sact.sa_mask); | |
- if (sigaction(SIGWINCH,&sact,NULL)==-1) { | |
- g_warning(_("Cannot install SIGWINCH interrupt handler!")); | |
- } | |
- OldName=g_strdup(GetPlayerName(Play)); | |
- attrset(TextAttr); clear_screen(); | |
- display_message(NULL); | |
- DisplayFightMessage(Play,NULL); | |
- print_status(Play,TRUE); | |
- | |
- attrset(TextAttr); | |
- clear_bottom(); | |
- buf=NULL; | |
- do { | |
- g_free(buf); | |
- buf=nice_input(_("Hey dude, what's your name? "),17,1,FALSE,OldName,'\0'… | |
- } while (buf[0]==0); | |
+ int NumDrugsHere; | |
+ int MaxSock; | |
+ char HaveWorthless; | |
+ Player *tmp; | |
+ struct sigaction sact; | |
+ | |
+ DisplayMode = DM_NONE; | |
+ QuitRequest = FALSE; | |
+ | |
+ ResizedFlag = 0; | |
+ sact.sa_handler = ResizeHandle; | |
+ sact.sa_flags = 0; | |
+ sigemptyset(&sact.sa_mask); | |
+ if (sigaction(SIGWINCH, &sact, NULL) == -1) { | |
+ g_warning(_("Cannot install SIGWINCH interrupt handler!")); | |
+ } | |
+ OldName = g_strdup(GetPlayerName(Play)); | |
+ attrset(TextAttr); | |
+ clear_screen(); | |
+ display_message(NULL); | |
+ DisplayFightMessage(Play, NULL); | |
+ print_status(Play, TRUE); | |
+ | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ buf = NULL; | |
+ do { | |
+ g_free(buf); | |
+ buf = | |
+ nice_input(_("Hey dude, what's your name? "), 17, 1, FALSE, | |
+ OldName, '\0'); | |
+ } while (buf[0] == 0); | |
#if NETWORKING | |
- if (WantNetwork) { | |
- if (!ConnectToServer(Play)) { end_curses(); exit(1); } | |
- justconnected=TRUE; | |
- } | |
+ if (WantNetwork) { | |
+ if (!ConnectToServer(Play)) { | |
+ end_curses(); | |
+ exit(1); | |
+ } | |
+ justconnected = TRUE; | |
+ } | |
#endif /* NETWORKING */ | |
- print_status(Play,TRUE); | |
- display_message(""); | |
- | |
- InitAbilities(Play); | |
- SendAbilities(Play); | |
- SetPlayerName(Play,buf); | |
- SendNullClientMessage(Play,C_NONE,C_NAME,NULL,buf); | |
- g_free(buf); g_free(OldName); | |
- | |
- text=g_string_new(""); | |
- | |
- while (1) { | |
- if (Play->Health==0) DisplayMode=DM_NONE; | |
- HaveWorthless=0; | |
- IsCarrying=0; | |
- for (i=0;i<NumDrug;i++) { | |
- if (Play->Drugs[i].Carried>0) { | |
- IsCarrying=1; | |
- if (Play->Drugs[i].Price==0) HaveWorthless=1; | |
- } | |
+ print_status(Play, TRUE); | |
+ display_message(""); | |
+ | |
+ InitAbilities(Play); | |
+ SendAbilities(Play); | |
+ SetPlayerName(Play, buf); | |
+ SendNullClientMessage(Play, C_NONE, C_NAME, NULL, buf); | |
+ g_free(buf); | |
+ g_free(OldName); | |
+ | |
+ text = g_string_new(""); | |
+ | |
+ while (1) { | |
+ if (Play->Health == 0) | |
+ DisplayMode = DM_NONE; | |
+ HaveWorthless = 0; | |
+ IsCarrying = 0; | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if (Play->Drugs[i].Carried > 0) { | |
+ IsCarrying = 1; | |
+ if (Play->Drugs[i].Price == 0) | |
+ HaveWorthless = 1; | |
} | |
- switch(DisplayMode) { | |
- case DM_STREET: | |
- attrset(TextAttr); | |
- NumDrugsHere=0; | |
- for (i=0;i<NumDrug;i++) if (Play->Drugs[i].Price>0) NumDrugsHere++; | |
- clear_bottom(); | |
-/* Display of drug prices (%tde="drugs" by default) */ | |
- dpg_string_sprintf(text,_("Hey dude, the prices of %tde here are:"… | |
- Names.Drugs); | |
- mvaddstr(16,1,text->str); | |
- for (c=0,i=GetNextDrugIndex(-1,Play); | |
- c<NumDrugsHere && i!=-1; | |
- c++,i=GetNextDrugIndex(i,Play)) { | |
-/* List of individual drug names for selection (%tde="Opium" etc. by default) … | |
- dpg_string_sprintf(text,_("%c. %-10tde %8P"),'A'+c,Drug[i].Name, | |
- Play->Drugs[i].Price); | |
- mvaddstr(17+c/3,(c%3)*25+4,text->str); | |
- } | |
- attrset(PromptAttr); | |
-/* Prompts for "normal" actions in curses client */ | |
- g_string_assign(text,_("Will you B>uy")); | |
- if (IsCarrying) g_string_append(text,_(", S>ell")); | |
- if (HaveWorthless && !WantAntique) g_string_append(text,_(", D>rop… | |
- if (Network) g_string_append(text,_(", T>alk, P>age, L>ist")); | |
- if (!WantAntique && (Play->Bitches.Carried>0 || | |
- Play->Flags&SPYINGON)) { | |
- g_string_append(text,_(", G>ive")); | |
- } | |
- if (Play->Flags & FIGHTING) { | |
- g_string_append(text,_(", F>ight")); | |
-/* } else if (Play->Flags&TRADING) { | |
- g_string_append(text,", T>rade");*/ | |
- } else { | |
- g_string_append(text,_(", J>et")); | |
- } | |
- g_string_append(text,_(", or Q>uit? ")); | |
- mvaddstr(22,40-strlen(text->str)/2,text->str); | |
- attrset(TextAttr); | |
- curs_set(1); | |
- break; | |
- case DM_FIGHT: | |
- DisplayFightMessage(Play,""); | |
- attrset(PromptAttr); | |
-/* Prompts for actions during fights in curses client */ | |
- g_string_assign(text,_("Do you ")); | |
- if (CanFire) { | |
- if (TotalGunsCarried(Play)>0) { | |
- g_string_append(text,_("F>ight, ")); | |
- } else { | |
- g_string_append(text,_("S>tand, ")); | |
- } | |
- } | |
- if (fp!=F_LASTLEAVE) g_string_append(text,_("R>un, ")); | |
- if (!RunHere || fp==F_LASTLEAVE) | |
-/* (%tde = "drugs" by default here) */ | |
- dpg_string_sprintfa(text,_("D>eal %tde, "),Names.Drugs); | |
- g_string_append(text,_("or Q>uit? ")); | |
- mvaddstr(22,40-strlen(text->str)/2,text->str); | |
- attrset(TextAttr); | |
- curs_set(1); | |
- break; | |
- case DM_DEAL: | |
- attrset(TextAttr); | |
- clear_bottom(); | |
- mvaddstr(16,1,"Your trade:-"); | |
- mvaddstr(19,1,"His trade:-"); | |
- g_string_assign(text,"Do you A>dd, R>emove, O>K, D>eal "); | |
- g_string_append(text,Names.Drugs); | |
- g_string_append(text,", or Q>uit? "); | |
- attrset(PromptAttr); | |
- mvaddstr(22,40-strlen(text->str)/2,text->str); | |
- attrset(TextAttr); | |
- curs_set(1); | |
- break; | |
- case DM_NONE: | |
- break; | |
+ } | |
+ switch (DisplayMode) { | |
+ case DM_STREET: | |
+ attrset(TextAttr); | |
+ NumDrugsHere = 0; | |
+ for (i = 0; i < NumDrug; i++) | |
+ if (Play->Drugs[i].Price > 0) | |
+ NumDrugsHere++; | |
+ clear_bottom(); | |
+ /* Display of drug prices (%tde="drugs" by default) */ | |
+ dpg_string_sprintf(text, _("Hey dude, the prices of %tde here are:"), | |
+ Names.Drugs); | |
+ mvaddstr(16, 1, text->str); | |
+ for (c = 0, i = GetNextDrugIndex(-1, Play); | |
+ c < NumDrugsHere && i != -1; | |
+ c++, i = GetNextDrugIndex(i, Play)) { | |
+ /* List of individual drug names for selection (%tde="Opium" etc. | |
+ * by default) */ | |
+ dpg_string_sprintf(text, _("%c. %-10tde %8P"), 'A' + c, | |
+ Drug[i].Name, Play->Drugs[i].Price); | |
+ mvaddstr(17 + c / 3, (c % 3) * 25 + 4, text->str); | |
} | |
- refresh(); | |
+ attrset(PromptAttr); | |
+ /* Prompts for "normal" actions in curses client */ | |
+ g_string_assign(text, _("Will you B>uy")); | |
+ if (IsCarrying) | |
+ g_string_append(text, _(", S>ell")); | |
+ if (HaveWorthless && !WantAntique) | |
+ g_string_append(text, _(", D>rop")); | |
+ if (Network) | |
+ g_string_append(text, _(", T>alk, P>age, L>ist")); | |
+ if (!WantAntique && (Play->Bitches.Carried > 0 || | |
+ Play->Flags & SPYINGON)) { | |
+ g_string_append(text, _(", G>ive")); | |
+ } | |
+ if (Play->Flags & FIGHTING) { | |
+ g_string_append(text, _(", F>ight")); | |
+ } else { | |
+ g_string_append(text, _(", J>et")); | |
+ } | |
+ g_string_append(text, _(", or Q>uit? ")); | |
+ mvaddstr(22, 40 - strlen(text->str) / 2, text->str); | |
+ attrset(TextAttr); | |
+ curs_set(1); | |
+ break; | |
+ case DM_FIGHT: | |
+ DisplayFightMessage(Play, ""); | |
+ attrset(PromptAttr); | |
+ /* Prompts for actions during fights in curses client */ | |
+ g_string_assign(text, _("Do you ")); | |
+ if (CanFire) { | |
+ if (TotalGunsCarried(Play) > 0) { | |
+ g_string_append(text, _("F>ight, ")); | |
+ } else { | |
+ g_string_append(text, _("S>tand, ")); | |
+ } | |
+ } | |
+ if (fp != F_LASTLEAVE) | |
+ g_string_append(text, _("R>un, ")); | |
+ if (!RunHere || fp == F_LASTLEAVE) | |
+ /* (%tde = "drugs" by default here) */ | |
+ dpg_string_sprintfa(text, _("D>eal %tde, "), Names.Drugs); | |
+ g_string_append(text, _("or Q>uit? ")); | |
+ mvaddstr(22, 40 - strlen(text->str) / 2, text->str); | |
+ attrset(TextAttr); | |
+ curs_set(1); | |
+ break; | |
+ case DM_DEAL: | |
+ attrset(TextAttr); | |
+ clear_bottom(); | |
+ mvaddstr(16, 1, "Your trade:-"); | |
+ mvaddstr(19, 1, "His trade:-"); | |
+ g_string_assign(text, "Do you A>dd, R>emove, O>K, D>eal "); | |
+ g_string_append(text, Names.Drugs); | |
+ g_string_append(text, ", or Q>uit? "); | |
+ attrset(PromptAttr); | |
+ mvaddstr(22, 40 - strlen(text->str) / 2, text->str); | |
+ attrset(TextAttr); | |
+ curs_set(1); | |
+ break; | |
+ case DM_NONE: | |
+ break; | |
+ } | |
+ refresh(); | |
- if (QuitRequest) return; | |
+ if (QuitRequest) | |
+ return; | |
#if NETWORKING | |
- FD_ZERO(&readfs); | |
- FD_ZERO(&writefs); | |
- FD_SET(0,&readfs); MaxSock=1; | |
- if (Client) { | |
- if (justconnected) { | |
-/* Deal with any messages that came in while we were connect()ing */ | |
- justconnected=FALSE; | |
- while ((pt=GetWaitingPlayerMessage(Play))!=NULL) { | |
- HandleClientMessage(pt,Play); | |
- g_free(pt); | |
- } | |
- if (QuitRequest) return; | |
- } | |
- SetSelectForNetworkBuffer(&Play->NetBuf,&readfs,&writefs, | |
- NULL,&MaxSock); | |
+ FD_ZERO(&readfs); | |
+ FD_ZERO(&writefs); | |
+ FD_SET(0, &readfs); | |
+ MaxSock = 1; | |
+ if (Client) { | |
+ if (justconnected) { | |
+ /* Deal with any messages that came in while we were connect()ing */ | |
+ justconnected = FALSE; | |
+ while ((pt = GetWaitingPlayerMessage(Play)) != NULL) { | |
+ HandleClientMessage(pt, Play); | |
+ g_free(pt); | |
+ } | |
+ if (QuitRequest) | |
+ return; | |
+ } | |
+ SetSelectForNetworkBuffer(&Play->NetBuf, &readfs, &writefs, | |
+ NULL, &MaxSock); | |
+ } | |
+ if (bselect(MaxSock, &readfs, &writefs, NULL, NULL) == -1) { | |
+ if (errno == EINTR) { | |
+ CheckForResize(Play); | |
+ continue; | |
} | |
- if (bselect(MaxSock,&readfs,&writefs,NULL,NULL)==-1) { | |
- if (errno==EINTR) { | |
- CheckForResize(Play); | |
- continue; | |
- } | |
- perror("bselect"); exit(1); | |
+ perror("bselect"); | |
+ exit(1); | |
+ } | |
+ if (Client) { | |
+ if (RespondToSelect(&Play->NetBuf, &readfs, &writefs, NULL, &DoneOK)) { | |
+ while ((pt = GetWaitingPlayerMessage(Play)) != NULL) { | |
+ HandleClientMessage(pt, Play); | |
+ g_free(pt); | |
+ } | |
+ if (QuitRequest) | |
+ return; | |
} | |
- if (Client) { | |
- if (RespondToSelect(&Play->NetBuf,&readfs,&writefs,NULL,&DoneOK)) { | |
- while ((pt=GetWaitingPlayerMessage(Play))!=NULL) { | |
- HandleClientMessage(pt,Play); | |
- g_free(pt); | |
- } | |
- if (QuitRequest) return; | |
- } | |
- if (!DoneOK) { | |
- attrset(TextAttr); | |
- clear_line(22); | |
- mvaddstr(22,0,_("Connection to server lost! " | |
- "Reverting to single player mode")); | |
- nice_wait(); | |
- SwitchToSinglePlayer(Play); | |
- print_status(Play,TRUE); | |
- } | |
+ if (!DoneOK) { | |
+ attrset(TextAttr); | |
+ clear_line(22); | |
+ mvaddstr(22, 0, _("Connection to server lost! " | |
+ "Reverting to single player mode")); | |
+ nice_wait(); | |
+ SwitchToSinglePlayer(Play); | |
+ print_status(Play, TRUE); | |
} | |
- if (FD_ISSET(0,&readfs)) { | |
+ } | |
+ if (FD_ISSET(0, &readfs)) { | |
#elif HAVE_SELECT | |
- FD_ZERO(&readfs); | |
- FD_SET(0,&readfs); MaxSock=1; | |
- if (bselect(MaxSock,&readfs,NULL,NULL,NULL)==-1) { | |
- if (errno==EINTR) { | |
- CheckForResize(Play); | |
- continue; | |
- } | |
- perror("bselect"); exit(1); | |
+ FD_ZERO(&readfs); | |
+ FD_SET(0, &readfs); | |
+ MaxSock = 1; | |
+ if (bselect(MaxSock, &readfs, NULL, NULL, NULL) == -1) { | |
+ if (errno == EINTR) { | |
+ CheckForResize(Play); | |
+ continue; | |
} | |
+ perror("bselect"); | |
+ exit(1); | |
+ } | |
#endif /* NETWORKING */ | |
- if (DisplayMode==DM_STREET) { | |
-/* N.B. You must keep the order of these keys the same as the original | |
- when you translate (B>uy, S>ell, D>rop, T>alk, P>age, L>ist, G>ive errand, | |
- F>ight, J>et, Q>uit) */ | |
- c=GetKey(_("BSDTPLGFJQ"),"BSDTPLGFJQ",TRUE,FALSE,FALSE); | |
- | |
- } else if (DisplayMode==DM_FIGHT) { | |
-/* N.B. You must keep the order of these keys the same as the original | |
- when you translate (D>eal drugs, R>un, F>ight, S>tand, Q>uit) */ | |
- c=GetKey(_("DRFSQ"),"DRFSQ",TRUE,FALSE,FALSE); | |
- | |
- } else c=0; | |
+ if (DisplayMode == DM_STREET) { | |
+ /* N.B. You must keep the order of these keys the same as the | |
+ * original when you translate (B>uy, S>ell, D>rop, T>alk, P>age, | |
+ * L>ist, G>ive errand, F>ight, J>et, Q>uit) */ | |
+ c = GetKey(_("BSDTPLGFJQ"), "BSDTPLGFJQ", TRUE, FALSE, FALSE); | |
+ | |
+ } else if (DisplayMode == DM_FIGHT) { | |
+ /* N.B. You must keep the order of these keys the same as the | |
+ * original when you translate (D>eal drugs, R>un, F>ight, S>tand, | |
+ * Q>uit) */ | |
+ c = GetKey(_("DRFSQ"), "DRFSQ", TRUE, FALSE, FALSE); | |
+ | |
+ } else | |
+ c = 0; | |
#if ! (NETWORKING || HAVE_SELECT) | |
- CheckForResize(Play); | |
+ CheckForResize(Play); | |
#endif | |
- if (DisplayMode==DM_STREET) { | |
- if (c=='J' && !(Play->Flags&FIGHTING)) { | |
- jet(Play,TRUE); | |
- } else if (c=='F' && Play->Flags&FIGHTING) { | |
- DisplayMode=DM_FIGHT; | |
- } else if (c=='T' && Play->Flags&TRADING) { | |
- DisplayMode=DM_DEAL; | |
- } else if (c=='B') { | |
- DealDrugs(Play,TRUE); | |
- } else if (c=='S' && IsCarrying) { | |
- DealDrugs(Play,FALSE); | |
- } else if (c=='D' && HaveWorthless && !WantAntique) { | |
- DropDrugs(Play); | |
- } else if (c=='G' && !WantAntique && Play->Bitches.Carried>0) { | |
- GiveErrand(Play); | |
- } else if (c=='Q') { | |
- if (want_to_quit()==1) { | |
- DisplayMode=DM_NONE; | |
- clear_bottom(); | |
- SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL); | |
- } | |
- } else if (c=='L' && Network) { | |
- attrset(PromptAttr); | |
- mvaddstr(23,20,_("List what? P>layers or S>cores? ")); | |
-/* P>layers, S>cores */ | |
- i=GetKey(_("PS"),"PS",TRUE,FALSE,FALSE); | |
- if (i=='P') { | |
- ListPlayers(Play,FALSE,NULL); | |
- } else if (i=='S') { | |
- DisplayMode=DM_NONE; | |
- SendClientMessage(Play,C_NONE,C_REQUESTSCORE,NULL,NULL); | |
- } | |
- } else if (c=='P' && Network) { | |
- tmp=ListPlayers(Play,TRUE, | |
- _("Whom do you want to page (talk privately to) ? ")); | |
- if (tmp) { | |
- attrset(TextAttr); clear_line(22); | |
-/* Prompt for sending player-player messages */ | |
- TalkMsg=nice_input(_("Talk: "),22,0,FALSE,NULL,'\0'); | |
- if (TalkMsg[0]) { | |
- SendClientMessage(Play,C_NONE,C_MSGTO,tmp,TalkMsg); | |
- buf=g_strdup_printf("%s->%s: %s",GetPlayerName(Play), | |
- GetPlayerName(tmp),TalkMsg); | |
- display_message(buf); | |
- g_free(buf); | |
- } | |
- g_free(TalkMsg); | |
- } | |
- } else if (c=='T' && Client) { | |
- attrset(TextAttr); clear_line(22); | |
- TalkMsg=nice_input(_("Talk: "),22,0,FALSE,NULL,'\0'); | |
- if (TalkMsg[0]) { | |
- SendClientMessage(Play,C_NONE,C_MSG,NULL,TalkMsg); | |
- buf=g_strdup_printf("%s: %s",GetPlayerName(Play),TalkMsg); | |
- display_message(buf); | |
- g_free(buf); | |
- } | |
- g_free(TalkMsg); | |
- } | |
- } else if (DisplayMode==DM_FIGHT) { | |
- switch(c) { | |
- case 'D': | |
- DisplayMode=DM_STREET; | |
- break; | |
- case 'R': | |
- if (RunHere) { | |
- SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,"R"); | |
- } else { | |
- jet(Play,TRUE); | |
- } | |
- break; | |
- case 'F': | |
- if (TotalGunsCarried(Play)>0 && CanFire) { | |
- buf=g_strdup_printf("%c",c); | |
- Play->Flags &= ~CANSHOOT; | |
- SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,buf); | |
- g_free(buf); | |
- } | |
- break; | |
- case 'S': | |
- if (TotalGunsCarried(Play)==0 && CanFire) { | |
- buf=g_strdup_printf("%c",c); | |
- Play->Flags &= ~CANSHOOT; | |
- SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,buf); | |
- g_free(buf); | |
- } | |
- break; | |
- case 'Q': | |
- if (want_to_quit()==1) { | |
- DisplayMode=DM_NONE; clear_bottom(); | |
- SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL); | |
- } | |
- break; | |
- } | |
- } else if (DisplayMode==DM_DEAL) { | |
- switch(c) { | |
- case 'D': | |
- DisplayMode=DM_STREET; | |
- break; | |
- case 'Q': | |
- if (want_to_quit()==1) { | |
- DisplayMode=DM_NONE; clear_bottom(); | |
- SendClientMessage(Play,C_NONE,C_WANTQUIT,NULL,NULL); | |
- } | |
- break; | |
- } | |
- } | |
-#if NETWORKING | |
+ if (DisplayMode == DM_STREET) { | |
+ if (c == 'J' && !(Play->Flags & FIGHTING)) { | |
+ jet(Play, TRUE); | |
+ } else if (c == 'F' && Play->Flags & FIGHTING) { | |
+ DisplayMode = DM_FIGHT; | |
+ } else if (c == 'T' && Play->Flags & TRADING) { | |
+ DisplayMode = DM_DEAL; | |
+ } else if (c == 'B') { | |
+ DealDrugs(Play, TRUE); | |
+ } else if (c == 'S' && IsCarrying) { | |
+ DealDrugs(Play, FALSE); | |
+ } else if (c == 'D' && HaveWorthless && !WantAntique) { | |
+ DropDrugs(Play); | |
+ } else if (c == 'G' && !WantAntique && Play->Bitches.Carried > 0) { | |
+ GiveErrand(Play); | |
+ } else if (c == 'Q') { | |
+ if (want_to_quit() == 1) { | |
+ DisplayMode = DM_NONE; | |
+ clear_bottom(); | |
+ SendClientMessage(Play, C_NONE, C_WANTQUIT, NULL, NULL); | |
+ } | |
+ } else if (c == 'L' && Network) { | |
+ attrset(PromptAttr); | |
+ mvaddstr(23, 20, _("List what? P>layers or S>cores? ")); | |
+ /* P>layers, S>cores */ | |
+ i = GetKey(_("PS"), "PS", TRUE, FALSE, FALSE); | |
+ if (i == 'P') { | |
+ ListPlayers(Play, FALSE, NULL); | |
+ } else if (i == 'S') { | |
+ DisplayMode = DM_NONE; | |
+ SendClientMessage(Play, C_NONE, C_REQUESTSCORE, NULL, NULL); | |
+ } | |
+ } else if (c == 'P' && Network) { | |
+ tmp = ListPlayers(Play, TRUE, | |
+ _("Whom do you want to page " | |
+ "(talk privately to) ? ")); | |
+ if (tmp) { | |
+ attrset(TextAttr); | |
+ clear_line(22); | |
+ /* Prompt for sending player-player messages */ | |
+ TalkMsg = nice_input(_("Talk: "), 22, 0, FALSE, NULL, '\0'); | |
+ if (TalkMsg[0]) { | |
+ SendClientMessage(Play, C_NONE, C_MSGTO, tmp, TalkMsg); | |
+ buf = g_strdup_printf("%s->%s: %s", GetPlayerName(Play), | |
+ GetPlayerName(tmp), TalkMsg); | |
+ display_message(buf); | |
+ g_free(buf); | |
+ } | |
+ g_free(TalkMsg); | |
+ } | |
+ } else if (c == 'T' && Client) { | |
+ attrset(TextAttr); | |
+ clear_line(22); | |
+ TalkMsg = nice_input(_("Talk: "), 22, 0, FALSE, NULL, '\0'); | |
+ if (TalkMsg[0]) { | |
+ SendClientMessage(Play, C_NONE, C_MSG, NULL, TalkMsg); | |
+ buf = g_strdup_printf("%s: %s", GetPlayerName(Play), TalkMsg); | |
+ display_message(buf); | |
+ g_free(buf); | |
+ } | |
+ g_free(TalkMsg); | |
} | |
+ } else if (DisplayMode == DM_FIGHT) { | |
+ switch (c) { | |
+ case 'D': | |
+ DisplayMode = DM_STREET; | |
+ break; | |
+ case 'R': | |
+ if (RunHere) { | |
+ SendClientMessage(Play, C_NONE, C_FIGHTACT, NULL, "R"); | |
+ } else { | |
+ jet(Play, TRUE); | |
+ } | |
+ break; | |
+ case 'F': | |
+ if (TotalGunsCarried(Play) > 0 && CanFire) { | |
+ buf = g_strdup_printf("%c", c); | |
+ Play->Flags &= ~CANSHOOT; | |
+ SendClientMessage(Play, C_NONE, C_FIGHTACT, NULL, buf); | |
+ g_free(buf); | |
+ } | |
+ break; | |
+ case 'S': | |
+ if (TotalGunsCarried(Play) == 0 && CanFire) { | |
+ buf = g_strdup_printf("%c", c); | |
+ Play->Flags &= ~CANSHOOT; | |
+ SendClientMessage(Play, C_NONE, C_FIGHTACT, NULL, buf); | |
+ g_free(buf); | |
+ } | |
+ break; | |
+ case 'Q': | |
+ if (want_to_quit() == 1) { | |
+ DisplayMode = DM_NONE; | |
+ clear_bottom(); | |
+ SendClientMessage(Play, C_NONE, C_WANTQUIT, NULL, NULL); | |
+ } | |
+ break; | |
+ } | |
+ } else if (DisplayMode == DM_DEAL) { | |
+ switch (c) { | |
+ case 'D': | |
+ DisplayMode = DM_STREET; | |
+ break; | |
+ case 'Q': | |
+ if (want_to_quit() == 1) { | |
+ DisplayMode = DM_NONE; | |
+ clear_bottom(); | |
+ SendClientMessage(Play, C_NONE, C_WANTQUIT, NULL, NULL); | |
+ } | |
+ break; | |
+ } | |
+ } | |
+#if NETWORKING | |
+ } | |
#endif | |
- curs_set(0); | |
- } | |
- g_string_free(text,TRUE); | |
+ curs_set(0); | |
+ } | |
+ g_string_free(text, TRUE); | |
} | |
-void CursesLoop(void) { | |
- char c; | |
- Player *Play; | |
+void CursesLoop(void) | |
+{ | |
+ char c; | |
+ Player *Play; | |
- if (!CheckHighScoreFileConfig()) return; | |
+ if (!CheckHighScoreFileConfig()) | |
+ return; | |
- start_curses(); | |
- Width=COLS; Depth=LINES; | |
+ start_curses(); | |
+ Width = COLS; | |
+ Depth = LINES; | |
-/* Set up message handlers */ | |
- ClientMessageHandlerPt = HandleClientMessage; | |
+ /* Set up message handlers */ | |
+ ClientMessageHandlerPt = HandleClientMessage; | |
-/* Make the GLib log messages display nicely */ | |
- g_log_set_handler(NULL,LogMask()|G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING, | |
- LogMessage,NULL); | |
+ /* Make the GLib log messages display nicely */ | |
+ g_log_set_handler(NULL, | |
+ LogMask() | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING, | |
+ LogMessage, NULL); | |
- display_intro(); | |
+ display_intro(); | |
- Play=g_new(Player,1); | |
- FirstClient=AddPlayer(0,Play,FirstClient); | |
- do { | |
- Curses_DoGame(Play); | |
- ShutdownNetwork(Play); | |
- CleanUpServer(); | |
- RestoreConfig(); | |
- attrset(TextAttr); | |
- mvaddstr(23,20,_("Play again? ")); | |
- c=GetKey(_("YN"),"YN",TRUE,TRUE,FALSE); | |
- } while (c=='Y'); | |
- FirstClient=RemovePlayer(Play,FirstClient); | |
- end_curses(); | |
+ Play = g_new(Player, 1); | |
+ FirstClient = AddPlayer(0, Play, FirstClient); | |
+ do { | |
+ Curses_DoGame(Play); | |
+ ShutdownNetwork(Play); | |
+ CleanUpServer(); | |
+ RestoreConfig(); | |
+ attrset(TextAttr); | |
+ mvaddstr(23, 20, _("Play again? ")); | |
+ c = GetKey(_("YN"), "YN", TRUE, TRUE, FALSE); | |
+ } while (c == 'Y'); | |
+ FirstClient = RemovePlayer(Play, FirstClient); | |
+ end_curses(); | |
} | |
#else | |
#include <glib.h> | |
-#include "nls.h" /* We need this for the definition of '_' */ | |
+#include "nls.h" /* We need this for the definition of '_' */ | |
-void CursesLoop(void) { | |
- g_print(_("No curses client available - rebuild the binary passing the\n" | |
- "--enable-curses-client option to configure, or use a windowed\n" | |
- "client (if available) instead!\n")); | |
+void CursesLoop(void) | |
+{ | |
+ g_print(_("No curses client available - rebuild the binary passing the\n" | |
+ "--enable-curses-client option to configure, or use a windowed\n" | |
+ "client (if available) instead!\n")); | |
} | |
#endif /* CURSES_CLIENT */ | |
diff --git a/src/curses_client.h b/src/curses_client.h | |
t@@ -1,23 +1,24 @@ | |
-/* curses_client.h dopewars client using the (n)curses console library */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * curses_client.h dopewars client using the (n)curses console library * | |
+ * 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 __CURSES_CLIENT_H__ | |
#define __CURSES_CLIENT_H__ | |
diff --git a/src/dopeos.c b/src/dopeos.c | |
t@@ -1,23 +1,24 @@ | |
-/* dopeos.c dopewars - operating-system-specific functions */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * dopeos.c dopewars - operating-system-specific functions * | |
+ * 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> | |
t@@ -26,260 +27,376 @@ | |
#include "dopeos.h" | |
#include "dopewars.h" | |
-#ifdef CYGWIN /* Code for native Win32 build under Cygwin */ | |
+#ifdef CYGWIN /* Code for native Win32 build under Cygwin */ | |
#include <conio.h> | |
#ifdef GUI_CLIENT | |
#include "gtkport.h" | |
#endif | |
-CHAR_INFO RealScreen[25][80],VirtualScreen[25][80]; | |
-HANDLE hOut,hIn; | |
- | |
-void refresh() { | |
- int y; | |
- COORD size,offset; | |
- SMALL_RECT screenpos; | |
- for (y=0;y<Depth;y++) { | |
- if (memcmp(&RealScreen[y][0],&VirtualScreen[y][0], | |
- sizeof(CHAR_INFO)*Width)!=0) { | |
- memcpy(&RealScreen[y][0],&VirtualScreen[y][0], | |
- Width*sizeof(CHAR_INFO)); | |
- size.X=Width; size.Y=1; | |
- offset.X=offset.Y=0; | |
- screenpos.Left=0; screenpos.Top=y; | |
- screenpos.Right=Width-1; screenpos.Bottom=y; | |
- WriteConsoleOutput(hOut,&VirtualScreen[y][0],size, | |
- offset,&screenpos); | |
- } | |
- } | |
+CHAR_INFO RealScreen[25][80], VirtualScreen[25][80]; | |
+HANDLE hOut, hIn; | |
+ | |
+void refresh() | |
+{ | |
+ int y; | |
+ COORD size, offset; | |
+ SMALL_RECT screenpos; | |
+ | |
+ for (y = 0; y < Depth; y++) { | |
+ if (memcmp(&RealScreen[y][0], &VirtualScreen[y][0], | |
+ sizeof(CHAR_INFO) * Width) != 0) { | |
+ memcpy(&RealScreen[y][0], &VirtualScreen[y][0], | |
+ Width * sizeof(CHAR_INFO)); | |
+ size.X = Width; | |
+ size.Y = 1; | |
+ offset.X = offset.Y = 0; | |
+ screenpos.Left = 0; | |
+ screenpos.Top = y; | |
+ screenpos.Right = Width - 1; | |
+ screenpos.Bottom = y; | |
+ WriteConsoleOutput(hOut, &VirtualScreen[y][0], size, | |
+ offset, &screenpos); | |
+ } | |
+ } | |
} | |
-HANDLE WINAPI GetConHandle(TCHAR *pszName) { | |
- SECURITY_ATTRIBUTES sa; | |
- sa.nLength = sizeof(sa); | |
- sa.lpSecurityDescriptor = NULL; | |
- sa.bInheritHandle = TRUE; | |
- return CreateFile(pszName,GENERIC_READ|GENERIC_WRITE, | |
- FILE_SHARE_READ|FILE_SHARE_WRITE, | |
- &sa,OPEN_EXISTING,(DWORD)0,(HANDLE)0); | |
+HANDLE WINAPI GetConHandle(TCHAR *pszName) | |
+{ | |
+ SECURITY_ATTRIBUTES sa; | |
+ | |
+ sa.nLength = sizeof(sa); | |
+ sa.lpSecurityDescriptor = NULL; | |
+ sa.bInheritHandle = TRUE; | |
+ return CreateFile(pszName, GENERIC_READ | GENERIC_WRITE, | |
+ FILE_SHARE_READ | FILE_SHARE_WRITE, | |
+ &sa, OPEN_EXISTING, (DWORD)0, (HANDLE)0); | |
} | |
-WORD CurAttr=0,TextAttr=2<<8,PromptAttr=1<<8,TitleAttr=4<<8; | |
-WORD LocationAttr=3<<8,StatsAttr=5<<8,DebtAttr=6<<8; | |
-int Width,Depth,CurX,CurY; | |
+WORD CurAttr = 0, TextAttr = 2 << 8; | |
+WORD PromptAttr = 1 << 8, TitleAttr = 4 << 8; | |
+WORD LocationAttr = 3 << 8, StatsAttr = 5 << 8, DebtAttr = 6 << 8; | |
+int Width, Depth, CurX, CurY; | |
char *optarg; | |
WORD Attr[10]; | |
HWND hwndMain; | |
-SCREEN *newterm(void *a,void *b,void *c) { | |
- COORD coord; | |
- int i; | |
- coord.X=80; coord.Y=25; | |
- Width=80; Depth=25; CurAttr=TextAttr; CurX=0; CurY=0; | |
- for (i=0;i<10;i++) | |
- Attr[i]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN; | |
- hOut=GetConHandle("CONOUT$"); | |
- hIn=GetConHandle("CONIN$"); | |
- SetConsoleMode(hIn,0); | |
-/* SetConsoleScreenBufferSize(hOut,coord);*/ | |
-/* clear_screen();*/ | |
- return NULL; | |
-} | |
- | |
-void start_color() {} | |
-void init_pair(int index,WORD fg,WORD bg) { | |
- if (index>=0 && index<10) { | |
- Attr[index]=0; | |
- switch(fg) { | |
- case COLOR_MAGENTA: Attr[index]|=(FOREGROUND_RED+FOREGROUND_BLUE); | |
- break; | |
- case COLOR_BLUE: Attr[index]|=FOREGROUND_BLUE; | |
- break; | |
- case COLOR_RED: Attr[index]|=FOREGROUND_RED; | |
- break; | |
- case COLOR_WHITE: Attr[index]|=(FOREGROUND_RED+FOREGROUND_BLUE+ | |
- FOREGROUND_GREEN); | |
- break; | |
- } | |
- switch(bg) { | |
- case COLOR_MAGENTA: Attr[index]|=(BACKGROUND_RED+BACKGROUND_BLUE); | |
- break; | |
- case COLOR_BLUE: Attr[index]|=BACKGROUND_BLUE; | |
- break; | |
- case COLOR_RED: Attr[index]|=BACKGROUND_RED; | |
- break; | |
- case COLOR_WHITE: Attr[index]|=(BACKGROUND_RED+BACKGROUND_BLUE+ | |
- BACKGROUND_GREEN); | |
- break; | |
- } | |
- } | |
-} | |
- | |
-void cbreak() {} | |
-void noecho() {} | |
-void nodelay(void *a,char b) {} | |
- | |
-void keypad(void *a,char b) {} | |
-void curs_set(BOOL visible) { | |
- CONSOLE_CURSOR_INFO ConCurInfo; | |
- move(CurY,CurX); | |
- ConCurInfo.dwSize=10; | |
- ConCurInfo.bVisible=visible; | |
- SetConsoleCursorInfo(hOut,&ConCurInfo); | |
-} | |
- | |
-void endwin() { | |
- CurAttr=0; | |
-/* clear_screen(); */ | |
- refresh(); | |
- curs_set(1); | |
-/* CloseHandle(hIn); | |
- CloseHandle(hOut);*/ | |
-} | |
- | |
-void move(int y,int x) { | |
- COORD coord; | |
- CurX=x; CurY=y; | |
- coord.X=x; coord.Y=y; | |
- SetConsoleCursorPosition(hOut,coord); | |
-} | |
- | |
-void attrset(WORD newAttr) { | |
- CurAttr=newAttr; | |
-} | |
- | |
-void addstr(char *str) { | |
- int i; | |
- for (i=0;i<strlen(str);i++) addch(str[i]); | |
- move(CurY,CurX); | |
-} | |
- | |
-void addch(int ch) { | |
- int attr; | |
- VirtualScreen[CurY][CurX].Char.AsciiChar=ch%256; | |
- attr=ch>>8; | |
- if (attr>0) VirtualScreen[CurY][CurX].Attributes=Attr[attr]; | |
- else VirtualScreen[CurY][CurX].Attributes=Attr[CurAttr>>8]; | |
- if (++CurX>=Width) { | |
- CurX=0; | |
- if (++CurY>=Depth) CurY=0; | |
- } | |
-} | |
- | |
-void mvaddstr(int y,int x,char *str) { | |
- move(y,x); addstr(str); | |
-} | |
- | |
-void mvaddch(int y,int x,int ch) { | |
- move(y,x); addch(ch); | |
-} | |
- | |
-int bgetch() { | |
-/* Waits for the user to press a key */ | |
- DWORD NumRead; | |
- char Buffer[10]; | |
- refresh(); | |
- ReadConsole(hIn,Buffer,1,&NumRead,NULL); | |
- return (int)(Buffer[0]); | |
-} | |
- | |
-char *index(const char *str,int ch) { | |
- int i; | |
- for (i=0;i<strlen(str);i++) { if (str[i]==ch) return str+i; } | |
- return NULL; | |
-} | |
- | |
-int apos=0; | |
-int getopt(int argc,char * const argv[],const char *str) { | |
- int i,c; | |
- char *pt; | |
- while (apos<argc && argv[apos]) { | |
- if (argv[apos][0]!='-') { apos++; return 0; } | |
- for (i=1;i<strlen(argv[apos]);i++) { | |
- c=argv[apos][i]; | |
- pt=index(str,c); | |
- if (pt) { | |
- argv[apos][i]='-'; | |
- if (*(pt+1)==':') { | |
- if (apos+1<argc && i==strlen(argv[apos])-1) { | |
- apos++; | |
- optarg=argv[apos]; | |
- apos++; | |
- } else return 0; | |
- } | |
- return c; | |
- } | |
- } | |
+SCREEN *newterm(void *a, void *b, void *c) | |
+{ | |
+ COORD coord; | |
+ int i; | |
+ | |
+ coord.X = 80; | |
+ coord.Y = 25; | |
+ Width = 80; | |
+ Depth = 25; | |
+ CurAttr = TextAttr; | |
+ CurX = 0; | |
+ CurY = 0; | |
+ for (i = 0; i < 10; i++) | |
+ Attr[i] = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN; | |
+ hOut = GetConHandle("CONOUT$"); | |
+ hIn = GetConHandle("CONIN$"); | |
+ SetConsoleMode(hIn, 0); | |
+ return NULL; | |
+} | |
+ | |
+void start_color() | |
+{ | |
+} | |
+ | |
+void init_pair(int index, WORD fg, WORD bg) | |
+{ | |
+ if (index >= 0 && index < 10) { | |
+ Attr[index] = 0; | |
+ switch (fg) { | |
+ case COLOR_MAGENTA: | |
+ Attr[index] |= (FOREGROUND_RED + FOREGROUND_BLUE); | |
+ break; | |
+ case COLOR_BLUE: | |
+ Attr[index] |= FOREGROUND_BLUE; | |
+ break; | |
+ case COLOR_RED: | |
+ Attr[index] |= FOREGROUND_RED; | |
+ break; | |
+ case COLOR_WHITE: | |
+ Attr[index] |= (FOREGROUND_RED + FOREGROUND_BLUE + FOREGROUND_GREEN); | |
+ break; | |
+ } | |
+ switch (bg) { | |
+ case COLOR_MAGENTA: | |
+ Attr[index] |= (BACKGROUND_RED + BACKGROUND_BLUE); | |
+ break; | |
+ case COLOR_BLUE: | |
+ Attr[index] |= BACKGROUND_BLUE; | |
+ break; | |
+ case COLOR_RED: | |
+ Attr[index] |= BACKGROUND_RED; | |
+ break; | |
+ case COLOR_WHITE: | |
+ Attr[index] |= (BACKGROUND_RED + BACKGROUND_BLUE + BACKGROUND_GREEN); | |
+ break; | |
+ } | |
+ } | |
+} | |
+ | |
+void cbreak() | |
+{ | |
+} | |
+ | |
+void noecho() | |
+{ | |
+} | |
+ | |
+void nodelay(void *a, char b) | |
+{ | |
+} | |
+ | |
+void keypad(void *a, char b) | |
+{ | |
+} | |
+ | |
+void curs_set(BOOL visible) | |
+{ | |
+ CONSOLE_CURSOR_INFO ConCurInfo; | |
+ | |
+ move(CurY, CurX); | |
+ ConCurInfo.dwSize = 10; | |
+ ConCurInfo.bVisible = visible; | |
+ SetConsoleCursorInfo(hOut, &ConCurInfo); | |
+} | |
+ | |
+void endwin() | |
+{ | |
+ CurAttr = 0; | |
+ refresh(); | |
+ curs_set(1); | |
+} | |
+ | |
+void move(int y, int x) | |
+{ | |
+ COORD coord; | |
+ | |
+ CurX = x; | |
+ CurY = y; | |
+ coord.X = x; | |
+ coord.Y = y; | |
+ SetConsoleCursorPosition(hOut, coord); | |
+} | |
+ | |
+void attrset(WORD newAttr) | |
+{ | |
+ CurAttr = newAttr; | |
+} | |
+ | |
+void addstr(char *str) | |
+{ | |
+ int i; | |
+ | |
+ for (i = 0; i < strlen(str); i++) | |
+ addch(str[i]); | |
+ move(CurY, CurX); | |
+} | |
+ | |
+void addch(int ch) | |
+{ | |
+ int attr; | |
+ | |
+ VirtualScreen[CurY][CurX].Char.AsciiChar = ch % 256; | |
+ attr = ch >> 8; | |
+ if (attr > 0) | |
+ VirtualScreen[CurY][CurX].Attributes = Attr[attr]; | |
+ else | |
+ VirtualScreen[CurY][CurX].Attributes = Attr[CurAttr >> 8]; | |
+ if (++CurX >= Width) { | |
+ CurX = 0; | |
+ if (++CurY >= Depth) | |
+ CurY = 0; | |
+ } | |
+} | |
+ | |
+void mvaddstr(int y, int x, char *str) | |
+{ | |
+ move(y, x); | |
+ addstr(str); | |
+} | |
+ | |
+void mvaddch(int y, int x, int ch) | |
+{ | |
+ move(y, x); | |
+ addch(ch); | |
+} | |
+ | |
+/* | |
+ * Waits for the user to press a key. | |
+ */ | |
+int bgetch() | |
+{ | |
+ DWORD NumRead; | |
+ char Buffer[10]; | |
+ | |
+ refresh(); | |
+ ReadConsole(hIn, Buffer, 1, &NumRead, NULL); | |
+ return (int)(Buffer[0]); | |
+} | |
+ | |
+char *index(const char *str, int ch) | |
+{ | |
+ int i; | |
+ | |
+ for (i = 0; i < strlen(str); i++) { | |
+ if (str[i] == ch) | |
+ return str + i; | |
+ } | |
+ return NULL; | |
+} | |
+ | |
+static int apos = 0; | |
+ | |
+int getopt(int argc, char *const argv[], const char *str) | |
+{ | |
+ int i, c; | |
+ char *pt; | |
+ | |
+ while (apos < argc && argv[apos]) { | |
+ if (argv[apos][0] != '-') { | |
apos++; | |
- } | |
- return EOF; | |
+ return 0; | |
+ } | |
+ for (i = 1; i < strlen(argv[apos]); i++) { | |
+ c = argv[apos][i]; | |
+ pt = index(str, c); | |
+ if (pt) { | |
+ argv[apos][i] = '-'; | |
+ if (*(pt + 1) == ':') { | |
+ if (apos + 1 < argc && i == strlen(argv[apos]) - 1) { | |
+ apos++; | |
+ optarg = argv[apos]; | |
+ apos++; | |
+ } else | |
+ return 0; | |
+ } | |
+ return c; | |
+ } | |
+ } | |
+ apos++; | |
+ } | |
+ return EOF; | |
+} | |
+ | |
+void sigemptyset(int *mask) | |
+{ | |
+} | |
+ | |
+void sigaddset(int *mask, int sig) | |
+{ | |
+} | |
+ | |
+int sigaction(int sig, struct sigaction *sact, char *pt) | |
+{ | |
+ return 0; | |
+} | |
+ | |
+void sigprocmask(int flag, int *mask, char *pt) | |
+{ | |
+} | |
+ | |
+void standout() | |
+{ | |
} | |
-void sigemptyset(int *mask) {} | |
-void sigaddset(int *mask,int sig) {} | |
-int sigaction(int sig,struct sigaction *sact,char *pt) { return 0; } | |
-void sigprocmask(int flag,int *mask,char *pt) {} | |
-void standout() {} | |
-void standend() {} | |
+void standend() | |
+{ | |
+} | |
-gboolean IsKeyPressed() { | |
+gboolean IsKeyPressed() | |
+{ | |
INPUT_RECORD ConsoleIn; | |
DWORD NumConsoleIn; | |
- while (PeekConsoleInput(hIn,&ConsoleIn,1,&NumConsoleIn) && NumConsoleIn==1) { | |
- if (ConsoleIn.EventType==KEY_EVENT && ConsoleIn.Event.KeyEvent.bKeyDown) { | |
+ | |
+ while (PeekConsoleInput(hIn, &ConsoleIn, 1, &NumConsoleIn) | |
+ && NumConsoleIn == 1) { | |
+ if (ConsoleIn.EventType == KEY_EVENT | |
+ && ConsoleIn.Event.KeyEvent.bKeyDown) { | |
return TRUE; | |
} else { | |
- ReadConsoleInput(hIn,&ConsoleIn,1,&NumConsoleIn); | |
+ ReadConsoleInput(hIn, &ConsoleIn, 1, &NumConsoleIn); | |
} | |
} | |
return FALSE; | |
} | |
-int bselect(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds, | |
- struct timeval *tm) { | |
- int retval; | |
- struct timeval tv,*tp; | |
- fd_set localread,localexcept; | |
- char CheckKbHit=0,KeyRead; | |
- if (nfds==0 && tm) { Sleep(tm->tv_sec*1000+tm->tv_usec/1000); return 0; } | |
- if (FD_ISSET(0,readfds)) { | |
- if (nfds==1) return 1; | |
- tp=&tv; | |
- CheckKbHit=1; | |
- FD_CLR(0,readfds); | |
- } else tp=tm; | |
- KeyRead=0; | |
- while (1) { | |
- tv.tv_sec=0; | |
- tv.tv_usec=250000; | |
- | |
- if (readfds) memcpy(&localread,readfds,sizeof(fd_set)); | |
- if (exceptfds) memcpy(&localexcept,exceptfds,sizeof(fd_set)); | |
- if (CheckKbHit && IsKeyPressed()) tv.tv_usec=0; | |
- retval=select(nfds,readfds,writefds,exceptfds,tp); | |
- if (retval==SOCKET_ERROR) return retval; | |
- if (CheckKbHit && IsKeyPressed()) { | |
- retval++; FD_SET(0,readfds); | |
- } | |
- if (retval>0 || !CheckKbHit) break; | |
- if (CheckKbHit && tm) { | |
- if (tm->tv_usec >= 250000) tm->tv_usec-=250000; | |
- else if (tm->tv_sec) { | |
- tm->tv_usec+=750000; | |
- tm->tv_sec--; | |
- } else break; | |
- } | |
- if (readfds) memcpy(readfds,&localread,sizeof(fd_set)); | |
- if (exceptfds) memcpy(exceptfds,&localexcept,sizeof(fd_set)); | |
- } | |
- return retval; | |
+int bselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, | |
+ struct timeval *tm) | |
+{ | |
+ int retval; | |
+ struct timeval tv, *tp; | |
+ fd_set localread, localexcept; | |
+ char CheckKbHit = 0, KeyRead; | |
+ | |
+ if (nfds == 0 && tm) { | |
+ Sleep(tm->tv_sec * 1000 + tm->tv_usec / 1000); | |
+ return 0; | |
+ } | |
+ if (FD_ISSET(0, readfds)) { | |
+ if (nfds == 1) | |
+ return 1; | |
+ tp = &tv; | |
+ CheckKbHit = 1; | |
+ FD_CLR(0, readfds); | |
+ } else | |
+ tp = tm; | |
+ KeyRead = 0; | |
+ while (1) { | |
+ tv.tv_sec = 0; | |
+ tv.tv_usec = 250000; | |
+ | |
+ if (readfds) | |
+ memcpy(&localread, readfds, sizeof(fd_set)); | |
+ if (exceptfds) | |
+ memcpy(&localexcept, exceptfds, sizeof(fd_set)); | |
+ if (CheckKbHit && IsKeyPressed()) | |
+ tv.tv_usec = 0; | |
+ retval = select(nfds, readfds, writefds, exceptfds, tp); | |
+ if (retval == SOCKET_ERROR) | |
+ return retval; | |
+ if (CheckKbHit && IsKeyPressed()) { | |
+ retval++; | |
+ FD_SET(0, readfds); | |
+ } | |
+ if (retval > 0 || !CheckKbHit) | |
+ break; | |
+ if (CheckKbHit && tm) { | |
+ if (tm->tv_usec >= 250000) | |
+ tm->tv_usec -= 250000; | |
+ else if (tm->tv_sec) { | |
+ tm->tv_usec += 750000; | |
+ tm->tv_sec--; | |
+ } else | |
+ break; | |
+ } | |
+ if (readfds) | |
+ memcpy(readfds, &localread, sizeof(fd_set)); | |
+ if (exceptfds) | |
+ memcpy(exceptfds, &localexcept, sizeof(fd_set)); | |
+ } | |
+ return retval; | |
} | |
/* We don't do locking under Win32 right now */ | |
-int ReadLock(FILE *fp) { return 0; } | |
-int WriteLock(FILE *fp) { return 0; } | |
-void ReleaseLock(FILE *fp) { } | |
+int ReadLock(FILE * fp) | |
+{ | |
+ return 0; | |
+} | |
+ | |
+int WriteLock(FILE * fp) | |
+{ | |
+ return 0; | |
+} | |
+ | |
+void ReleaseLock(FILE * fp) | |
+{ | |
+} | |
#else /* Code for Unix build */ | |
t@@ -295,50 +412,71 @@ void ReleaseLock(FILE *fp) { } | |
#include <fcntl.h> | |
#endif | |
-int Width,Depth; | |
+int Width, Depth; | |
#ifdef CURSES_CLIENT | |
-int bgetch() { | |
-/* Calls the curses getch() function; if the key pressed is Ctrl-L */ | |
-/* then automatically clears and redraws the screen, otherwise */ | |
-/* passes the key back to the calling routine */ | |
- int c; | |
- c=getch(); | |
- while (c=='\f') { | |
- wrefresh(curscr); | |
- c=getch(); | |
- } | |
- return c; | |
+/* | |
+ * Calls the curses getch() function; if the key pressed is Ctrl-L | |
+ * then automatically clears and redraws the screen, otherwise | |
+ * passes the key back to the calling routine. | |
+ */ | |
+int bgetch() | |
+{ | |
+ int c; | |
+ | |
+ c = getch(); | |
+ while (c == '\f') { | |
+ wrefresh(curscr); | |
+ c = getch(); | |
+ } | |
+ return c; | |
} | |
#endif | |
-static int DoLock(FILE *fp,int l_type) { | |
- struct flock lk; | |
+static int DoLock(FILE * fp, int l_type) | |
+{ | |
+ struct flock lk; | |
- lk.l_type = l_type; | |
- lk.l_whence = lk.l_start = lk.l_len = 0; | |
- lk.l_pid = 0; | |
+ lk.l_type = l_type; | |
+ lk.l_whence = lk.l_start = lk.l_len = 0; | |
+ lk.l_pid = 0; | |
- while(1) { | |
- if (fcntl(fileno(fp),F_SETLKW,&lk)==0) return 0; | |
- else if (errno!=EINTR) return 1; | |
- } | |
- return 1; | |
+ while (1) { | |
+ if (fcntl(fileno(fp), F_SETLKW, &lk) == 0) | |
+ return 0; | |
+ else if (errno != EINTR) | |
+ return 1; | |
+ } | |
+ return 1; | |
} | |
-int ReadLock(FILE *fp) { return DoLock(fp,F_RDLCK); } | |
-int WriteLock(FILE *fp) { return DoLock(fp,F_WRLCK); } | |
-void ReleaseLock(FILE *fp) { DoLock(fp,F_UNLCK); } | |
+int ReadLock(FILE * fp) | |
+{ | |
+ return DoLock(fp, F_RDLCK); | |
+} | |
+ | |
+int WriteLock(FILE * fp) | |
+{ | |
+ return DoLock(fp, F_WRLCK); | |
+} | |
+ | |
+void ReleaseLock(FILE * fp) | |
+{ | |
+ DoLock(fp, F_UNLCK); | |
+} | |
#endif /* CYGWIN */ | |
-void MicroSleep(int microsec) { | |
-/* On systems with select, sleep for "microsec" microseconds */ | |
+/* | |
+ * On systems with select, sleep for "microsec" microseconds. | |
+ */ | |
+void MicroSleep(int microsec) | |
+{ | |
#if HAVE_SELECT | |
- struct timeval tv; | |
- tv.tv_sec=0; | |
- tv.tv_usec=microsec; | |
- bselect(0,NULL,NULL,NULL,&tv); | |
+ struct timeval tv; | |
+ | |
+ tv.tv_sec = 0; | |
+ tv.tv_usec = microsec; | |
+ bselect(0, NULL, NULL, NULL, &tv); | |
#endif | |
} | |
- | |
diff --git a/src/dopeos.h b/src/dopeos.h | |
t@@ -1,23 +1,25 @@ | |
-/* dopeos.h dopewars - operating system-specific function */ | |
-/* definitions */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * dopeos.h dopewars - operating system-specific function * | |
+ * definitions * | |
+ * 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 __DOPEOS_H__ | |
#define __DOPEOS_H__ | |
t@@ -26,16 +28,17 @@ | |
#include <config.h> | |
#endif | |
-#ifdef CYGWIN /* Definitions for native Win32 build */ | |
+#ifdef CYGWIN /* Definitions for native Win32 build */ | |
#include <windows.h> | |
#include <string.h> | |
#include <stdio.h> | |
void refresh(); | |
-HANDLE WINAPI GetConHandle (TCHAR * pszName); | |
-extern WORD TextAttr,PromptAttr,TitleAttr,LocationAttr,StatsAttr,DebtAttr; | |
-extern int Width,Depth; | |
+HANDLE WINAPI GetConHandle(TCHAR *pszName); | |
+extern WORD TextAttr, PromptAttr, TitleAttr; | |
+extern WORD LocationAttr, StatsAttr, DebtAttr; | |
+extern int Width, Depth; | |
#define COLOR_MAGENTA 1 | |
#define COLOR_BLACK 2 | |
t@@ -43,70 +46,72 @@ extern int Width,Depth; | |
#define COLOR_BLUE 4 | |
#define COLOR_RED 5 | |
-#define SIGWINCH 0 | |
-#define SIGPIPE 0 | |
-#define SIG_BLOCK 0 | |
-#define SIG_UNBLOCK 0 | |
+#define SIGWINCH 0 | |
+#define SIGPIPE 0 | |
+#define SIG_BLOCK 0 | |
+#define SIG_UNBLOCK 0 | |
struct sigaction { | |
- void *sa_handler; | |
- int sa_flags; | |
- int sa_mask; | |
+ void *sa_handler; | |
+ int sa_flags; | |
+ int sa_mask; | |
}; | |
void sigemptyset(int *mask); | |
-void sigaddset(int *mask,int sig); | |
-int sigaction(int sig,struct sigaction *sact,char *pt); | |
-void sigprocmask(int flag,int *mask,char *pt); | |
+void sigaddset(int *mask, int sig); | |
+int sigaction(int sig, struct sigaction *sact, char *pt); | |
+void sigprocmask(int flag, int *mask, char *pt); | |
#define COLS Width | |
#define LINES Depth | |
-#define ACS_VLINE 179 | |
-#define ACS_ULCORNER 218 | |
-#define ACS_HLINE 196 | |
-#define ACS_URCORNER 191 | |
-#define ACS_TTEE 194 | |
-#define ACS_LLCORNER 192 | |
-#define ACS_LRCORNER 217 | |
-#define ACS_BTEE 193 | |
-#define ACS_LTEE 195 | |
-#define ACS_RTEE 180 | |
+#define ACS_VLINE 179 | |
+#define ACS_ULCORNER 218 | |
+#define ACS_HLINE 196 | |
+#define ACS_URCORNER 191 | |
+#define ACS_TTEE 194 | |
+#define ACS_LLCORNER 192 | |
+#define ACS_LRCORNER 217 | |
+#define ACS_BTEE 193 | |
+#define ACS_LTEE 195 | |
+#define ACS_RTEE 180 | |
typedef int SCREEN; | |
-#define stdscr 0 | |
-#define curscr 0 | |
+ | |
+#define stdscr 0 | |
+#define curscr 0 | |
#define KEY_ENTER 13 | |
#define KEY_BACKSPACE 8 | |
#define A_BOLD 0 | |
-SCREEN *newterm(void *,void *,void *); | |
+SCREEN *newterm(void *, void *, void *); | |
void start_color(); | |
-void init_pair(int index,WORD fg,WORD bg); | |
+void init_pair(int index, WORD fg, WORD bg); | |
void cbreak(); | |
void noecho(); | |
-void nodelay(void *,char); | |
-void keypad(void *,char); | |
+void nodelay(void *, char); | |
+void keypad(void *, char); | |
void curs_set(BOOL visible); | |
void endwin(); | |
-void move(int y,int x); | |
+void move(int y, int x); | |
void attrset(WORD newAttr); | |
void addstr(char *str); | |
void addch(int ch); | |
-void mvaddstr(int x,int y,char *str); | |
-void mvaddch(int x,int y,int ch); | |
+void mvaddstr(int x, int y, char *str); | |
+void mvaddch(int x, int y, int ch); | |
int bgetch(); | |
+ | |
#define erase() clear_screen() | |
-char *index(const char *str,int ch); | |
-int getopt(int argc,char * const argv[],const char *str); | |
+char *index(const char *str, int ch); | |
+int getopt(int argc, char *const argv[], const char *str); | |
extern char *optarg; | |
typedef int ssize_t; | |
void standout(); | |
void standend(); | |
void endwin(); | |
-int bselect(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfs, | |
- struct timeval *tm); | |
+int bselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfs, | |
+ struct timeval *tm); | |
#else /* Definitions for Unix build */ | |
t@@ -129,7 +134,7 @@ int bselect(int nfds,fd_set *readfds,fd_set *writefds,fd_s… | |
#include <curses_colr/curses.h> | |
#endif | |
-extern int Width,Depth; | |
+extern int Width, Depth; | |
#define PromptAttr (COLOR_PAIR(1)) | |
#define TextAttr (COLOR_PAIR(2)) | |
t@@ -151,9 +156,9 @@ int bgetch(void); | |
void MicroSleep(int microsec); | |
-int ReadLock(FILE *fp); | |
-int WriteLock(FILE *fp); | |
-void ReleaseLock(FILE *fp); | |
+int ReadLock(FILE * fp); | |
+int WriteLock(FILE * fp); | |
+void ReleaseLock(FILE * fp); | |
/* Now make definitions if they haven't been done properly */ | |
#ifndef WEXITSTATUS | |
diff --git a/src/dopewars.c b/src/dopewars.c | |
t@@ -1,22 +1,24 @@ | |
-/* dopewars.c dopewars - general purpose routines and initialisation */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * dopewars.c dopewars - general purpose routines and init * | |
+ * 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. * | |
+ ************************************************************************/ | |
#define _GNU_SOURCE | |
t@@ -55,1411 +57,1709 @@ | |
#include "gtkport.h" | |
#endif | |
-int ClientSock,ListenSock; | |
-gboolean Network,Client,Server,NotifyMetaServer,AIPlayer; | |
-/* dopewars acting as standalone TCP server: | |
- Network=Server=TRUE Client=FALSE | |
- dopewars acting as client, connecting to standalone server: | |
- Network=Client=TRUE Server=FALSE | |
- dopewars in single-player or antique mode: | |
- Network=Server=Client=FALSE | |
-*/ | |
-unsigned Port=7902; | |
-gboolean Sanitized,ConfigVerbose,DrugValue; | |
-gchar *HiScoreFile=NULL,*ServerName=NULL,*ConvertFile=NULL; | |
-gboolean WantHelp,WantVersion,WantAntique,WantColour,WantNetwork, | |
- WantConvert,WantAdmin; | |
+int ClientSock, ListenSock; | |
+gboolean Network, Client, Server, NotifyMetaServer, AIPlayer; | |
+ | |
+/* | |
+ * dopewars acting as standalone TCP server: | |
+ * Network=Server=TRUE Client=FALSE | |
+ * dopewars acting as client, connecting to standalone server: | |
+ * Network=Client=TRUE Server=FALSE | |
+ * dopewars in single-player or antique mode: | |
+ * Network=Server=Client=FALSE | |
+ */ | |
+unsigned Port = 7902; | |
+gboolean Sanitized, ConfigVerbose, DrugValue; | |
+gchar *HiScoreFile = NULL, *ServerName = NULL, *ConvertFile = NULL; | |
+gboolean WantHelp, WantVersion, WantAntique, WantColour, WantNetwork; | |
+gboolean WantConvert, WantAdmin; | |
#ifdef CYGWIN | |
-gboolean MinToSysTray=TRUE; | |
+gboolean MinToSysTray = TRUE; | |
#else | |
-gboolean Daemonize=TRUE; | |
+gboolean Daemonize = TRUE; | |
#endif | |
gchar *WebBrowser = NULL; | |
-gint ConfigErrors=0; | |
+gint ConfigErrors = 0; | |
ClientType WantedClient; | |
-int NumLocation=0,NumGun=0,NumCop=0,NumDrug=0,NumSubway=0, | |
- NumPlaying=0,NumStoppedTo=0; | |
+int NumLocation = 0, NumGun = 0, NumCop = 0, NumDrug = 0, NumSubway = 0; | |
+int NumPlaying = 0, NumStoppedTo = 0; | |
Player Noone; | |
-int LoanSharkLoc=DEFLOANSHARK,BankLoc=DEFBANK,GunShopLoc=DEFGUNSHOP, | |
- RoughPubLoc=DEFROUGHPUB; | |
-int DrugSortMethod=DS_ATOZ; | |
-int FightTimeout=5,IdleTimeout=14400,ConnectTimeout=300; | |
-int MaxClients=20,AITurnPause=5; | |
-price_t StartCash=2000,StartDebt=5500; | |
-GSList *ServerList=NULL; | |
+int LoanSharkLoc = DEFLOANSHARK, BankLoc = DEFBANK, GunShopLoc = | |
+ DEFGUNSHOP; | |
+int RoughPubLoc = DEFROUGHPUB; | |
+int DrugSortMethod = DS_ATOZ; | |
+int FightTimeout = 5, IdleTimeout = 14400, ConnectTimeout = 300; | |
+int MaxClients = 20, AITurnPause = 5; | |
+price_t StartCash = 2000, StartDebt = 5500; | |
+GSList *ServerList = NULL; | |
GScannerConfig ScannerConfig = { | |
- " \t\n", /* Ignore these characters */ | |
- G_CSET_a_2_z "_" G_CSET_A_2_Z, /* Valid characters for starting | |
- an identifier */ | |
- G_CSET_a_2_z "._-0123456789" G_CSET_A_2_Z, /* Valid characters for | |
- continuing an identifier */ | |
- "#\n", /* Single line comments start with # and end with \n */ | |
- FALSE, /* Are symbols case sensitive? */ | |
- TRUE, /* Ignore C-style comments? */ | |
- TRUE, /* Ignore single-line comments? */ | |
- TRUE, /* Treat C-style comments as single tokens - do not break into | |
- words? */ | |
- TRUE, /* Read identifiers as tokens? */ | |
- TRUE, /* Read single-character identifiers as 1-character strings? */ | |
- TRUE, /* Allow the parsing of NULL as the G_TOKEN_IDENTIFIER_NULL ? */ | |
- FALSE, /* Allow symbols (defined by g_scanner_scope_add_symbol) ? */ | |
- TRUE, /* Allow binary numbers in 0b1110 format ? */ | |
- TRUE, /* Allow octal numbers in C-style e.g. 034 ? */ | |
- FALSE, /* Allow floats? */ | |
- TRUE, /* Allow hex numbers in C-style e.g. 0xFF ? */ | |
- TRUE, /* Allow hex numbers in $FF format ? */ | |
- TRUE, /* Allow '' strings (no escaping) ? */ | |
- TRUE, /* Allow "" strings (\ escapes parsed) ? */ | |
- TRUE, /* Convert octal, binary and hex to int? */ | |
- FALSE, /* Convert ints to floats? */ | |
- FALSE, /* Treat all identifiers as strings? */ | |
- TRUE, /* Leave single characters (e.g. {,=) unchanged, instead of | |
- returning G_TOKEN_CHAR ? */ | |
- FALSE, /* Replace read symbols with the token given by their value, instead | |
- of G_TOKEN_SYMBOL ? */ | |
- FALSE /* scope_0_fallback... */ | |
+ " \t\n", /* Ignore these characters */ | |
+ | |
+ /* Valid characters for starting an identifier */ | |
+ G_CSET_a_2_z "_" G_CSET_A_2_Z, | |
+ | |
+ /* Valid characters for continuing an identifier */ | |
+ G_CSET_a_2_z "._-0123456789" G_CSET_A_2_Z, | |
+ | |
+ "#\n", /* Single line comments start with # and | |
+ * end with \n */ | |
+ FALSE, /* Are symbols case sensitive? */ | |
+ TRUE, /* Ignore C-style comments? */ | |
+ TRUE, /* Ignore single-line comments? */ | |
+ TRUE, /* Treat C-style comments as single tokens | |
+ * - do not break into words? */ | |
+ TRUE, /* Read identifiers as tokens? */ | |
+ TRUE, /* Read single-character identifiers as | |
+ * 1-character strings? */ | |
+ TRUE, /* Allow the parsing of NULL as the | |
+ * G_TOKEN_IDENTIFIER_NULL ? */ | |
+ FALSE, /* Allow symbols (defined by | |
+ * g_scanner_scope_add_symbol) ? */ | |
+ TRUE, /* Allow binary numbers in 0b1110 format ? */ | |
+ TRUE, /* Allow octal numbers in C-style e.g. 034 ? */ | |
+ FALSE, /* Allow floats? */ | |
+ TRUE, /* Allow hex numbers in C-style e.g. 0xFF ? */ | |
+ TRUE, /* Allow hex numbers in $FF format ? */ | |
+ TRUE, /* Allow '' strings (no escaping) ? */ | |
+ TRUE, /* Allow "" strings (\ escapes parsed) ? */ | |
+ TRUE, /* Convert octal, binary and hex to int? */ | |
+ FALSE, /* Convert ints to floats? */ | |
+ FALSE, /* Treat all identifiers as strings? */ | |
+ TRUE, /* Leave single characters (e.g. {,=) | |
+ * unchanged, instead of returning | |
+ * G_TOKEN_CHAR ? */ | |
+ FALSE, /* Replace read symbols with the token | |
+ * given by their value, instead of | |
+ * G_TOKEN_SYMBOL ? */ | |
+ FALSE /* scope_0_fallback... */ | |
}; | |
-struct LOCATION StaticLocation,*Location=NULL; | |
-struct DRUG StaticDrug,*Drug=NULL; | |
-struct GUN StaticGun,*Gun=NULL; | |
-struct COP StaticCop,*Cop=NULL; | |
-struct NAMES Names = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, | |
- NULL,NULL,NULL,NULL }; | |
+struct LOCATION StaticLocation, *Location = NULL; | |
+struct DRUG StaticDrug, *Drug = NULL; | |
+struct GUN StaticGun, *Gun = NULL; | |
+struct COP StaticCop, *Cop = NULL; | |
+struct NAMES Names = { | |
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL | |
+}; | |
/* N.B. The slightly over-enthusiastic comments here are for the benefit | |
- of translators ;) */ | |
+ * of translators ;) */ | |
struct NAMES DefaultNames = { | |
-/* Name of a single bitch - if you need to use different words for "bitch" | |
- depending on where in the sentence it occurs (e.g. subject or object) | |
- then read doc/i18n.html about the %tde (etc.) notation. N.B. This | |
- notation can be used for most of the translatable strings in dopewars. */ | |
- N_("bitch"), | |
-/* Word used for two or more bitches */ | |
- N_("bitches"), | |
-/* Word used for a single gun */ | |
- N_("gun"), | |
-/* Word used for two or more guns */ | |
- N_("guns"), | |
-/* Word used for a single drug */ | |
- N_("drug"), | |
-/* Word used for two or more drugs */ | |
- N_("drugs"), | |
-/* Text that is printed before the turn number. In US mm-dd-yyyy date | |
- notation, with MaxTurns at 31 or less, this works out as the month - | |
- i.e. December in this case */ | |
- N_("12-"), | |
-/* Text that is printed _after_ the turn number (the year, in US notation) */ | |
- N_("-1984"), | |
-/* Names of the loan shark, the bank, the gun shop, and the pub, respectively … | |
- N_("the Loan Shark"),N_("the Bank"), | |
- N_("Dan\'s House of Guns"),N_("the pub") | |
+ /* Name of a single bitch - if you need to use different words for | |
+ * "bitch" depending on where in the sentence it occurs (e.g. subject or | |
+ * object) then read doc/i18n.html about the %tde (etc.) notation. N.B. | |
+ * This notation can be used for most of the translatable strings in | |
+ * dopewars. */ | |
+ N_("bitch"), | |
+ /* Word used for two or more bitches */ | |
+ N_("bitches"), | |
+ /* Word used for a single gun */ | |
+ N_("gun"), | |
+ /* Word used for two or more guns */ | |
+ N_("guns"), | |
+ /* Word used for a single drug */ | |
+ N_("drug"), | |
+ /* Word used for two or more drugs */ | |
+ N_("drugs"), | |
+ /* Text that is printed before the turn number. In US mm-dd-yyyy date | |
+ * notation, with MaxTurns at 31 or less, this works out as the month - | |
+ * i.e. December in this case */ | |
+ N_("12-"), | |
+ /* Text that is printed _after_ the turn number (the year, in US | |
+ * notation) */ | |
+ N_("-1984"), | |
+ /* Names of the loan shark, the bank, the gun shop, and the pub, | |
+ * respectively */ | |
+ N_("the Loan Shark"), N_("the Bank"), | |
+ N_("Dan\'s House of Guns"), N_("the pub") | |
}; | |
struct CURRENCY Currency; | |
struct PRICES Prices = { | |
- 20000,10000 | |
+ 20000, 10000 | |
}; | |
struct BITCH Bitch = { | |
- 50000,150000 | |
+ 50000, 150000 | |
}; | |
#ifdef NETWORKING | |
-struct METASERVER MetaServer = { FALSE,NULL,0,NULL,0,NULL,NULL,NULL, | |
- NULL,FALSE,NULL,NULL,NULL,NULL }; | |
+struct METASERVER MetaServer = { | |
+ FALSE, NULL, 0, NULL, 0, NULL, NULL, NULL, | |
+ NULL, FALSE, NULL, NULL, NULL, NULL | |
+}; | |
struct METASERVER DefaultMetaServer = { | |
- TRUE,"dopewars.sourceforge.net",80,"",8080,"/metaserver.php", | |
- "","","dopewars server", FALSE, "", "", "", "" | |
+ TRUE, "dopewars.sourceforge.net", 80, "", 8080, "/metaserver.php", | |
+ "", "", "dopewars server", FALSE, "", "", "", "" | |
}; | |
-SocksServer Socks = { NULL,0,0,FALSE,NULL,NULL,NULL }; | |
+SocksServer Socks = { NULL, 0, 0, FALSE, NULL, NULL, NULL }; | |
gboolean UseSocks; | |
#endif | |
-int NumTurns=31; | |
+int NumTurns = 31; | |
-int PlayerArmour=100,BitchArmour=50; | |
+int PlayerArmour = 100, BitchArmour = 50; | |
struct LOG Log; | |
struct GLOBALS Globals[] = { | |
-/* The following strings are the helptexts for all the options that can be | |
- set in a dopewars configuration file, or in the server. See | |
- doc/configfile.html for more detailed explanations. */ | |
- { &Port,NULL,NULL,NULL,NULL,"Port",N_("Network port to connect to"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&HiScoreFile,NULL,"HiScoreFile", | |
- N_("Name of the high score file"),NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&ServerName,NULL,"Server", | |
- N_("Name of the server to connect to"),NULL,NULL,0,"",NULL,NULL }, | |
+ /* The following strings are the helptexts for all the options that can | |
+ * be set in a dopewars configuration file, or in the server. See | |
+ * doc/configfile.html for more detailed explanations. */ | |
+ {&Port, NULL, NULL, NULL, NULL, "Port", N_("Network port to connect to"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &HiScoreFile, NULL, "HiScoreFile", | |
+ N_("Name of the high score file"), NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &ServerName, NULL, "Server", | |
+ N_("Name of the server to connect to"), NULL, NULL, 0, "", NULL, NULL}, | |
#ifdef NETWORKING | |
- { NULL,&UseSocks,NULL,NULL,NULL,"Socks.Active", | |
- N_("TRUE if a SOCKS server should be used for networking"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
+ {NULL, &UseSocks, NULL, NULL, NULL, "Socks.Active", | |
+ N_("TRUE if a SOCKS server should be used for networking"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
#ifndef CYGWIN | |
- { NULL,&Socks.numuid,NULL,NULL,NULL,"Socks.NumUID", | |
- N_("TRUE if numeric user IDs should be used for SOCKS4"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
+ {NULL, &Socks.numuid, NULL, NULL, NULL, "Socks.NumUID", | |
+ N_("TRUE if numeric user IDs should be used for SOCKS4"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
#endif | |
- { NULL,NULL,NULL,&Socks.user,NULL,"Socks.User", | |
- N_("If not blank, the username to use for SOCKS4"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Socks.name,NULL,"Socks.Name", | |
- N_("The hostname of a SOCKS server to use"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &Socks.port,NULL,NULL,NULL,NULL,"Socks.Port", | |
- N_("The port number of a SOCKS server to use"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &Socks.version,NULL,NULL,NULL,NULL,"Socks.Version", | |
- N_("The version of the SOCKS protocol to use (4 or 5)"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Socks.authuser,NULL,"Socks.Auth.User", | |
- N_("Username for SOCKS5 authentication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Socks.authpassword,NULL,"Socks.Auth.Password", | |
- N_("Password for SOCKS5 authentication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,&MetaServer.Active,NULL,NULL,NULL,"MetaServer.Active", | |
- N_("TRUE if server should report to a metaserver"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&MetaServer.Name,NULL,"MetaServer.Name", | |
- N_("Metaserver name to report/get server details to/from"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &MetaServer.Port,NULL,NULL,NULL,NULL,"MetaServer.Port", | |
- N_("Port for metaserver communication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&MetaServer.ProxyName,NULL,"MetaServer.ProxyName", | |
- N_("Name of a proxy for metaserver communication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &MetaServer.ProxyPort,NULL,NULL,NULL,NULL,"MetaServer.ProxyPort", | |
- N_("Port for communicating with the proxy server"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&MetaServer.Path,NULL,"MetaServer.Path", | |
- N_("Path of the script on the metaserver"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&MetaServer.LocalName,NULL,"MetaServer.LocalName", | |
- N_("Preferred hostname of your server machine"),NULL,NULL,0,"",NULL,NULL … | |
- { NULL,NULL,NULL,&MetaServer.Password,NULL,"MetaServer.Password", | |
- N_("Authentication for LocalName with the metaserver"),NULL,NULL,0,"",NUL… | |
- NULL }, | |
- { NULL,NULL,NULL,&MetaServer.Comment,NULL,"MetaServer.Comment", | |
- N_("Server description, reported to the metaserver"),NULL,NULL,0,"",NULL, | |
- NULL }, | |
- { NULL,&MetaServer.UseSocks,NULL,NULL,NULL,"MetaServer.UseSocks", | |
- N_("If TRUE, use SOCKS for metaserver communication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&MetaServer.authuser,NULL,"MetaServer.Auth.User", | |
- N_("Username for HTTP Basic authentication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&MetaServer.authpassword,NULL,"MetaServer.Auth.Password", | |
- N_("Password for HTTP Basic authentication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&MetaServer.proxyuser,NULL,"MetaServer.Proxy.User", | |
- N_("Username for HTTP Basic proxy authentication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&MetaServer.proxypassword,NULL, | |
- "MetaServer.Proxy.Password", | |
- N_("Password for HTTP Basic proxy authentication"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
+ {NULL, NULL, NULL, &Socks.user, NULL, "Socks.User", | |
+ N_("If not blank, the username to use for SOCKS4"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Socks.name, NULL, "Socks.Name", | |
+ N_("The hostname of a SOCKS server to use"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&Socks.port, NULL, NULL, NULL, NULL, "Socks.Port", | |
+ N_("The port number of a SOCKS server to use"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&Socks.version, NULL, NULL, NULL, NULL, "Socks.Version", | |
+ N_("The version of the SOCKS protocol to use (4 or 5)"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Socks.authuser, NULL, "Socks.Auth.User", | |
+ N_("Username for SOCKS5 authentication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Socks.authpassword, NULL, "Socks.Auth.Password", | |
+ N_("Password for SOCKS5 authentication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, &MetaServer.Active, NULL, NULL, NULL, "MetaServer.Active", | |
+ N_("TRUE if server should report to a metaserver"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.Name, NULL, "MetaServer.Name", | |
+ N_("Metaserver name to report/get server details to/from"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&MetaServer.Port, NULL, NULL, NULL, NULL, "MetaServer.Port", | |
+ N_("Port for metaserver communication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.ProxyName, NULL, "MetaServer.ProxyName", | |
+ N_("Name of a proxy for metaserver communication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&MetaServer.ProxyPort, NULL, NULL, NULL, NULL, "MetaServer.ProxyPort", | |
+ N_("Port for communicating with the proxy server"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.Path, NULL, "MetaServer.Path", | |
+ N_("Path of the script on the metaserver"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.LocalName, NULL, "MetaServer.LocalName", | |
+ N_("Preferred hostname of your server machine"), NULL, NULL, 0, "", | |
+ NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.Password, NULL, "MetaServer.Password", | |
+ N_("Authentication for LocalName with the metaserver"), NULL, NULL, 0, | |
+ "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.Comment, NULL, "MetaServer.Comment", | |
+ N_("Server description, reported to the metaserver"), NULL, NULL, 0, "", | |
+ NULL, NULL}, | |
+ {NULL, &MetaServer.UseSocks, NULL, NULL, NULL, "MetaServer.UseSocks", | |
+ N_("If TRUE, use SOCKS for metaserver communication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.authuser, NULL, "MetaServer.Auth.User", | |
+ N_("Username for HTTP Basic authentication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.authpassword, NULL, | |
+ "MetaServer.Auth.Password", | |
+ N_("Password for HTTP Basic authentication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.proxyuser, NULL, "MetaServer.Proxy.User", | |
+ N_("Username for HTTP Basic proxy authentication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &MetaServer.proxypassword, NULL, | |
+ "MetaServer.Proxy.Password", | |
+ N_("Password for HTTP Basic proxy authentication"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
#endif /* NETWORKING */ | |
#ifdef CYGWIN | |
- { NULL,&MinToSysTray,NULL,NULL,NULL,"MinToSysTray", | |
- N_("If TRUE, the server minimizes to the System Tray"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
+ {NULL, &MinToSysTray, NULL, NULL, NULL, "MinToSysTray", | |
+ N_("If TRUE, the server minimizes to the System Tray"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
#else | |
- { NULL,&Daemonize,NULL,NULL,NULL,"Daemonize", | |
- N_("If TRUE, the server runs in the background"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&WebBrowser,NULL,"WebBrowser", | |
- N_("The command used to start your web browser"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
+ {NULL, &Daemonize, NULL, NULL, NULL, "Daemonize", | |
+ N_("If TRUE, the server runs in the background"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &WebBrowser, NULL, "WebBrowser", | |
+ N_("The command used to start your web browser"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
#endif | |
- { &NumTurns,NULL,NULL,NULL,NULL,"NumTurns", | |
- N_("No. of game turns (if 0, game never ends)"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Currency.Symbol,NULL,"Currency.Symbol", | |
- N_("The currency symbol (e.g. $)"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,&Currency.Prefix,NULL,NULL,NULL,"Currency.Prefix", | |
- N_("If TRUE, the currency symbol precedes prices"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Log.File,NULL,"Log.File", | |
- N_("File to write log messages to"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &Log.Level,NULL,NULL,NULL,NULL,"Log.Level", | |
- N_("Controls the number of log messages produced"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Log.Timestamp,NULL,"Log.Timestamp", | |
- N_("strftime() format string for log timestamps"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,&Sanitized,NULL,NULL,NULL,"Sanitized", | |
- N_("Random events are sanitized"),NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,&DrugValue,NULL,NULL,NULL,"DrugValue", | |
- N_("TRUE if the value of bought drugs should be saved"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,&ConfigVerbose,NULL,NULL,NULL,"ConfigVerbose", | |
- N_("Be verbose in processing config file"),NULL,NULL,0,"",NULL,NULL }, | |
- { &NumLocation,NULL,NULL,NULL,NULL,"NumLocation", | |
- N_("Number of locations in the game"), | |
- (void **)(&Location),NULL,sizeof(struct LOCATION),"",NULL, | |
- ResizeLocations }, | |
- { &NumCop,NULL,NULL,NULL,NULL,"NumCop", | |
- N_("Number of types of cop in the game"), | |
- (void **)(&Cop),NULL,sizeof(struct COP),"",NULL,ResizeCops }, | |
- { &NumGun,NULL,NULL,NULL,NULL,"NumGun",N_("Number of guns in the game"), | |
- (void **)(&Gun),NULL,sizeof(struct GUN),"",NULL,ResizeGuns }, | |
- { &NumDrug,NULL,NULL,NULL,NULL,"NumDrug",N_("Number of drugs in the game"), | |
- (void **)(&Drug),NULL,sizeof(struct DRUG),"",NULL,ResizeDrugs }, | |
- { &LoanSharkLoc,NULL,NULL,NULL,NULL,"LoanShark", | |
- N_("Location of the Loan Shark"),NULL,NULL,0,"",NULL,NULL }, | |
- { &BankLoc,NULL,NULL,NULL,NULL,"Bank",N_("Location of the bank"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &GunShopLoc,NULL,NULL,NULL,NULL,"GunShop",N_("Location of the gun shop"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &RoughPubLoc,NULL,NULL,NULL,NULL,"RoughPub",N_("Location of the pub"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.LoanSharkName,NULL,"LoanSharkName", | |
- N_("Name of the loan shark"),NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.BankName,NULL,"BankName", | |
- N_("Name of the bank"),NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.GunShopName,NULL,"GunShopName", | |
- N_("Name of the gun shop"),NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.RoughPubName,NULL,"RoughPubName", | |
- N_("Name of the pub"),NULL,NULL,0,"",NULL,NULL }, | |
- { &DrugSortMethod,NULL,NULL,NULL,NULL,"DrugSortMethod", | |
- N_("Sort key for listing available drugs"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &FightTimeout,NULL,NULL,NULL,NULL,"FightTimeout", | |
- N_("No. of seconds in which to return fire"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &IdleTimeout,NULL,NULL,NULL,NULL,"IdleTimeout", | |
- N_("Players are disconnected after this many seconds"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &ConnectTimeout,NULL,NULL,NULL,NULL,"ConnectTimeout", | |
- N_("Time in seconds for connections to be made or broken"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &MaxClients,NULL,NULL,NULL,NULL,"MaxClients", | |
- N_("Maximum number of TCP/IP connections"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &AITurnPause,NULL,NULL,NULL,NULL,"AITurnPause", | |
- N_("Seconds between turns of AI players"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,&StartCash,NULL,NULL,"StartCash", | |
- N_("Amount of cash that each player starts with"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,&StartDebt,NULL,NULL,"StartDebt", | |
- N_("Amount of debt that each player starts with"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&StaticLocation.Name,NULL,"Name", | |
- N_("Name of each location"),(void **)(&Location),&StaticLocation, | |
- sizeof(struct LOCATION),"Location",&NumLocation,NULL }, | |
- { &(StaticLocation.PolicePresence),NULL,NULL,NULL,NULL,"PolicePresence", | |
- N_("Police presence at each location (%)"), | |
- (void **)(&Location),&StaticLocation, | |
- sizeof(struct LOCATION),"Location",&NumLocation,NULL }, | |
- { &(StaticLocation.MinDrug),NULL,NULL,NULL,NULL,"MinDrug", | |
- N_("Minimum number of drugs at each location"), | |
- (void **)(&Location),&StaticLocation, | |
- sizeof(struct LOCATION),"Location",&NumLocation,NULL }, | |
- { &(StaticLocation.MaxDrug),NULL,NULL,NULL,NULL,"MaxDrug", | |
- N_("Maximum number of drugs at each location"), | |
- (void **)(&Location),&StaticLocation, | |
- sizeof(struct LOCATION),"Location",&NumLocation,NULL }, | |
- { &PlayerArmour,NULL,NULL,NULL,NULL,"PlayerArmour", | |
- N_("% resistance to gunshots of each player"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &BitchArmour,NULL,NULL,NULL,NULL,"BitchArmour", | |
- N_("% resistance to gunshots of each bitch"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&StaticCop.Name,NULL,"Name", | |
- N_("Name of each cop"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { NULL,NULL,NULL,&StaticCop.DeputyName,NULL,"DeputyName", | |
- N_("Name of each cop's deputy"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { NULL,NULL,NULL,&StaticCop.DeputiesName,NULL,"DeputiesName", | |
- N_("Name of each cop's deputies"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.Armour,NULL,NULL,NULL,NULL,"Armour", | |
- N_("% resistance to gunshots of each cop"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.DeputyArmour,NULL,NULL,NULL,NULL,"DeputyArmour", | |
- N_("% resistance to gunshots of each deputy"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.AttackPenalty,NULL,NULL,NULL,NULL,"AttackPenalty", | |
- N_("Attack penalty relative to a player"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.DefendPenalty,NULL,NULL,NULL,NULL,"DefendPenalty", | |
- N_("Defend penalty relative to a player"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.MinDeputies,NULL,NULL,NULL,NULL,"MinDeputies", | |
- N_("Minimum number of accompanying deputies"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.MaxDeputies,NULL,NULL,NULL,NULL,"MaxDeputies", | |
- N_("Maximum number of accompanying deputies"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.GunIndex,NULL,NULL,NULL,NULL,"GunIndex", | |
- N_("Zero-based index of the gun that cops are armed with"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.CopGun,NULL,NULL,NULL,NULL,"CopGun", | |
- N_("Number of guns that each cop carries"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { &StaticCop.DeputyGun,NULL,NULL,NULL,NULL,"DeputyGun", | |
- N_("Number of guns that each deputy carries"), | |
- (void **)(&Cop),&StaticCop,sizeof(struct COP),"Cop",&NumCop,NULL }, | |
- { NULL,NULL,NULL,&StaticDrug.Name,NULL,"Name", | |
- N_("Name of each drug"), | |
- (void **)(&Drug),&StaticDrug, | |
- sizeof(struct DRUG),"Drug",&NumDrug,NULL }, | |
- { NULL,NULL,&(StaticDrug.MinPrice),NULL,NULL,"MinPrice", | |
- N_("Minimum normal price of each drug"), | |
- (void **)(&Drug),&StaticDrug, | |
- sizeof(struct DRUG),"Drug",&NumDrug,NULL }, | |
- { NULL,NULL,&(StaticDrug.MaxPrice),NULL,NULL,"MaxPrice", | |
- N_("Maximum normal price of each drug"), | |
- (void **)(&Drug),&StaticDrug, | |
- sizeof(struct DRUG),"Drug",&NumDrug,NULL }, | |
- { NULL,&(StaticDrug.Cheap),NULL,NULL,NULL,"Cheap", | |
- N_("TRUE if this drug can be specially cheap"), | |
- (void **)(&Drug),&StaticDrug, | |
- sizeof(struct DRUG),"Drug",&NumDrug,NULL }, | |
- { NULL,&(StaticDrug.Expensive),NULL,NULL,NULL,"Expensive", | |
- N_("TRUE if this drug can be specially expensive"), | |
- (void **)(&Drug),&StaticDrug, | |
- sizeof(struct DRUG),"Drug",&NumDrug,NULL }, | |
- { NULL,NULL,NULL,&StaticDrug.CheapStr,NULL,"CheapStr", | |
- N_("Message displayed when this drug is specially cheap"), | |
- (void **)(&Drug),&StaticDrug, | |
- sizeof(struct DRUG),"Drug",&NumDrug,NULL }, | |
- { NULL,NULL,NULL,&Drugs.ExpensiveStr1,NULL,"Drugs.ExpensiveStr1", | |
- N_("Format string used for expensive drugs 50% of time"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Drugs.ExpensiveStr2,NULL,"Drugs.ExpensiveStr2", | |
- N_("Format string used for expensive drugs 50% of time"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &(Drugs.CheapDivide),NULL,NULL,NULL,NULL,"Drugs.CheapDivide", | |
- N_("Divider for drug price when it's specially cheap"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { &(Drugs.ExpensiveMultiply),NULL,NULL,NULL,NULL,"Drugs.ExpensiveMultiply", | |
- N_("Multiplier for specially expensive drug prices"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&StaticGun.Name,NULL,"Name", | |
- N_("Name of each gun"), | |
- (void **)(&Gun),&StaticGun, | |
- sizeof(struct GUN),"Gun",&NumGun,NULL }, | |
- { NULL,NULL,&(StaticGun.Price),NULL,NULL,"Price", | |
- N_("Price of each gun"), | |
- (void **)(&Gun),&StaticGun, | |
- sizeof(struct GUN),"Gun",&NumGun,NULL }, | |
- { &(StaticGun.Space),NULL,NULL,NULL,NULL,"Space", | |
- N_("Space taken by each gun"), | |
- (void **)(&Gun),&StaticGun, | |
- sizeof(struct GUN),"Gun",&NumGun,NULL }, | |
- { &(StaticGun.Damage),NULL,NULL,NULL,NULL,"Damage", | |
- N_("Damage done by each gun"), | |
- (void **)(&Gun),&StaticGun, | |
- sizeof(struct GUN),"Gun",&NumGun,NULL }, | |
- { NULL,NULL,NULL,&Names.Bitch,NULL,"Names.Bitch", | |
- N_("Word used to denote a single \"bitch\""),NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.Bitches,NULL,"Names.Bitches", | |
- N_("Word used to denote two or more \"bitches\""), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.Gun,NULL,"Names.Gun", | |
- N_("Word used to denote a single gun or equivalent"),NULL,NULL,0,"",NULL, | |
- NULL }, | |
- { NULL,NULL,NULL,&Names.Guns,NULL,"Names.Guns", | |
- N_("Word used to denote two or more guns"),NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.Drug,NULL,"Names.Drug", | |
- N_("Word used to denote a single drug or equivalent"),NULL,NULL,0,"",NULL, | |
- NULL }, | |
- { NULL,NULL,NULL,&Names.Drugs,NULL,"Names.Drugs", | |
- N_("Word used to denote two or more drugs"),NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.Month,NULL,"Names.Month", | |
- N_("Text prefixed to the turn number (i.e. the month)"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,&Names.Year,NULL,"Names.Year", | |
- N_("Text appended to the turn number (i.e. the year)"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,&Prices.Spy,NULL,NULL,"Prices.Spy", | |
- N_("Cost for a bitch to spy on the enemy"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,&Prices.Tipoff,NULL,NULL,"Prices.Tipoff", | |
- N_("Cost for a bitch to tipoff the cops to an enemy"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,&Bitch.MinPrice,NULL,NULL,"Bitch.MinPrice", | |
- N_("Minimum price to hire a bitch"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,&Bitch.MaxPrice,NULL,NULL,"Bitch.MaxPrice", | |
- N_("Maximum price to hire a bitch"), | |
- NULL,NULL,0,"",NULL,NULL }, | |
- { NULL,NULL,NULL,NULL,&SubwaySaying,"SubwaySaying", | |
- N_("List of things which you overhear on the subway"), | |
- NULL,NULL,0,"",&NumSubway,ResizeSubway }, | |
- { &NumSubway,NULL,NULL,NULL,NULL,"NumSubwaySaying", | |
- N_("Number of subway sayings"), | |
- NULL,NULL,0,"",NULL,ResizeSubway }, | |
- { NULL,NULL,NULL,NULL,&Playing,"Playing", | |
- N_("List of songs which you can hear playing"), | |
- NULL,NULL,0,"",&NumPlaying,ResizePlaying }, | |
- { &NumPlaying,NULL,NULL,NULL,NULL,"NumPlaying", | |
- N_("Number of playing songs"), | |
- NULL,NULL,0,"",NULL,ResizePlaying }, | |
- { NULL,NULL,NULL,NULL,&StoppedTo,"StoppedTo", | |
- N_("List of things which you can stop to do"), | |
- NULL,NULL,0,"",&NumStoppedTo,ResizeStoppedTo }, | |
- { &NumStoppedTo,NULL,NULL,NULL,NULL,"NumStoppedTo", | |
- N_("Number of things which you can stop to do"), | |
- NULL,NULL,0,"",NULL,ResizeStoppedTo } | |
+ {&NumTurns, NULL, NULL, NULL, NULL, "NumTurns", | |
+ N_("No. of game turns (if 0, game never ends)"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Currency.Symbol, NULL, "Currency.Symbol", | |
+ N_("The currency symbol (e.g. $)"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, &Currency.Prefix, NULL, NULL, NULL, "Currency.Prefix", | |
+ N_("If TRUE, the currency symbol precedes prices"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Log.File, NULL, "Log.File", | |
+ N_("File to write log messages to"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&Log.Level, NULL, NULL, NULL, NULL, "Log.Level", | |
+ N_("Controls the number of log messages produced"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Log.Timestamp, NULL, "Log.Timestamp", | |
+ N_("strftime() format string for log timestamps"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, &Sanitized, NULL, NULL, NULL, "Sanitized", | |
+ N_("Random events are sanitized"), NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, &DrugValue, NULL, NULL, NULL, "DrugValue", | |
+ N_("TRUE if the value of bought drugs should be saved"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, &ConfigVerbose, NULL, NULL, NULL, "ConfigVerbose", | |
+ N_("Be verbose in processing config file"), NULL, NULL, 0, "", NULL, | |
+ NULL}, | |
+ {&NumLocation, NULL, NULL, NULL, NULL, "NumLocation", | |
+ N_("Number of locations in the game"), | |
+ (void **)(&Location), NULL, sizeof(struct LOCATION), "", NULL, | |
+ ResizeLocations}, | |
+ {&NumCop, NULL, NULL, NULL, NULL, "NumCop", | |
+ N_("Number of types of cop in the game"), | |
+ (void **)(&Cop), NULL, sizeof(struct COP), "", NULL, ResizeCops}, | |
+ {&NumGun, NULL, NULL, NULL, NULL, "NumGun", | |
+ N_("Number of guns in the game"), | |
+ (void **)(&Gun), NULL, sizeof(struct GUN), "", NULL, ResizeGuns}, | |
+ {&NumDrug, NULL, NULL, NULL, NULL, "NumDrug", | |
+ N_("Number of drugs in the game"), | |
+ (void **)(&Drug), NULL, sizeof(struct DRUG), "", NULL, ResizeDrugs}, | |
+ {&LoanSharkLoc, NULL, NULL, NULL, NULL, "LoanShark", | |
+ N_("Location of the Loan Shark"), NULL, NULL, 0, "", NULL, NULL}, | |
+ {&BankLoc, NULL, NULL, NULL, NULL, "Bank", N_("Location of the bank"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&GunShopLoc, NULL, NULL, NULL, NULL, "GunShop", | |
+ N_("Location of the gun shop"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&RoughPubLoc, NULL, NULL, NULL, NULL, "RoughPub", | |
+ N_("Location of the pub"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Names.LoanSharkName, NULL, "LoanSharkName", | |
+ N_("Name of the loan shark"), NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Names.BankName, NULL, "BankName", | |
+ N_("Name of the bank"), NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Names.GunShopName, NULL, "GunShopName", | |
+ N_("Name of the gun shop"), NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Names.RoughPubName, NULL, "RoughPubName", | |
+ N_("Name of the pub"), NULL, NULL, 0, "", NULL, NULL}, | |
+ {&DrugSortMethod, NULL, NULL, NULL, NULL, "DrugSortMethod", | |
+ N_("Sort key for listing available drugs"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&FightTimeout, NULL, NULL, NULL, NULL, "FightTimeout", | |
+ N_("No. of seconds in which to return fire"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&IdleTimeout, NULL, NULL, NULL, NULL, "IdleTimeout", | |
+ N_("Players are disconnected after this many seconds"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&ConnectTimeout, NULL, NULL, NULL, NULL, "ConnectTimeout", | |
+ N_("Time in seconds for connections to be made or broken"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&MaxClients, NULL, NULL, NULL, NULL, "MaxClients", | |
+ N_("Maximum number of TCP/IP connections"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&AITurnPause, NULL, NULL, NULL, NULL, "AITurnPause", | |
+ N_("Seconds between turns of AI players"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, &StartCash, NULL, NULL, "StartCash", | |
+ N_("Amount of cash that each player starts with"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, &StartDebt, NULL, NULL, "StartDebt", | |
+ N_("Amount of debt that each player starts with"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &StaticLocation.Name, NULL, "Name", | |
+ N_("Name of each location"), (void **)(&Location), &StaticLocation, | |
+ sizeof(struct LOCATION), "Location", &NumLocation, NULL}, | |
+ {&(StaticLocation.PolicePresence), NULL, NULL, NULL, NULL, | |
+ "PolicePresence", | |
+ N_("Police presence at each location (%)"), | |
+ (void **)(&Location), &StaticLocation, | |
+ sizeof(struct LOCATION), "Location", &NumLocation, NULL}, | |
+ {&(StaticLocation.MinDrug), NULL, NULL, NULL, NULL, "MinDrug", | |
+ N_("Minimum number of drugs at each location"), | |
+ (void **)(&Location), &StaticLocation, | |
+ sizeof(struct LOCATION), "Location", &NumLocation, NULL}, | |
+ {&(StaticLocation.MaxDrug), NULL, NULL, NULL, NULL, "MaxDrug", | |
+ N_("Maximum number of drugs at each location"), | |
+ (void **)(&Location), &StaticLocation, | |
+ sizeof(struct LOCATION), "Location", &NumLocation, NULL}, | |
+ {&PlayerArmour, NULL, NULL, NULL, NULL, "PlayerArmour", | |
+ N_("% resistance to gunshots of each player"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&BitchArmour, NULL, NULL, NULL, NULL, "BitchArmour", | |
+ N_("% resistance to gunshots of each bitch"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &StaticCop.Name, NULL, "Name", | |
+ N_("Name of each cop"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {NULL, NULL, NULL, &StaticCop.DeputyName, NULL, "DeputyName", | |
+ N_("Name of each cop's deputy"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {NULL, NULL, NULL, &StaticCop.DeputiesName, NULL, "DeputiesName", | |
+ N_("Name of each cop's deputies"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.Armour, NULL, NULL, NULL, NULL, "Armour", | |
+ N_("% resistance to gunshots of each cop"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.DeputyArmour, NULL, NULL, NULL, NULL, "DeputyArmour", | |
+ N_("% resistance to gunshots of each deputy"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.AttackPenalty, NULL, NULL, NULL, NULL, "AttackPenalty", | |
+ N_("Attack penalty relative to a player"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.DefendPenalty, NULL, NULL, NULL, NULL, "DefendPenalty", | |
+ N_("Defend penalty relative to a player"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.MinDeputies, NULL, NULL, NULL, NULL, "MinDeputies", | |
+ N_("Minimum number of accompanying deputies"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.MaxDeputies, NULL, NULL, NULL, NULL, "MaxDeputies", | |
+ N_("Maximum number of accompanying deputies"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.GunIndex, NULL, NULL, NULL, NULL, "GunIndex", | |
+ N_("Zero-based index of the gun that cops are armed with"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.CopGun, NULL, NULL, NULL, NULL, "CopGun", | |
+ N_("Number of guns that each cop carries"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {&StaticCop.DeputyGun, NULL, NULL, NULL, NULL, "DeputyGun", | |
+ N_("Number of guns that each deputy carries"), | |
+ (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop, NULL}, | |
+ {NULL, NULL, NULL, &StaticDrug.Name, NULL, "Name", | |
+ N_("Name of each drug"), | |
+ (void **)(&Drug), &StaticDrug, | |
+ sizeof(struct DRUG), "Drug", &NumDrug, NULL}, | |
+ {NULL, NULL, &(StaticDrug.MinPrice), NULL, NULL, "MinPrice", | |
+ N_("Minimum normal price of each drug"), | |
+ (void **)(&Drug), &StaticDrug, | |
+ sizeof(struct DRUG), "Drug", &NumDrug, NULL}, | |
+ {NULL, NULL, &(StaticDrug.MaxPrice), NULL, NULL, "MaxPrice", | |
+ N_("Maximum normal price of each drug"), | |
+ (void **)(&Drug), &StaticDrug, | |
+ sizeof(struct DRUG), "Drug", &NumDrug, NULL}, | |
+ {NULL, &(StaticDrug.Cheap), NULL, NULL, NULL, "Cheap", | |
+ N_("TRUE if this drug can be specially cheap"), | |
+ (void **)(&Drug), &StaticDrug, | |
+ sizeof(struct DRUG), "Drug", &NumDrug, NULL}, | |
+ {NULL, &(StaticDrug.Expensive), NULL, NULL, NULL, "Expensive", | |
+ N_("TRUE if this drug can be specially expensive"), | |
+ (void **)(&Drug), &StaticDrug, | |
+ sizeof(struct DRUG), "Drug", &NumDrug, NULL}, | |
+ {NULL, NULL, NULL, &StaticDrug.CheapStr, NULL, "CheapStr", | |
+ N_("Message displayed when this drug is specially cheap"), | |
+ (void **)(&Drug), &StaticDrug, | |
+ sizeof(struct DRUG), "Drug", &NumDrug, NULL}, | |
+ {NULL, NULL, NULL, &Drugs.ExpensiveStr1, NULL, "Drugs.ExpensiveStr1", | |
+ N_("Format string used for expensive drugs 50% of time"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Drugs.ExpensiveStr2, NULL, "Drugs.ExpensiveStr2", | |
+ N_("Format string used for expensive drugs 50% of time"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&(Drugs.CheapDivide), NULL, NULL, NULL, NULL, "Drugs.CheapDivide", | |
+ N_("Divider for drug price when it's specially cheap"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {&(Drugs.ExpensiveMultiply), NULL, NULL, NULL, NULL, | |
+ "Drugs.ExpensiveMultiply", | |
+ N_("Multiplier for specially expensive drug prices"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &StaticGun.Name, NULL, "Name", | |
+ N_("Name of each gun"), | |
+ (void **)(&Gun), &StaticGun, | |
+ sizeof(struct GUN), "Gun", &NumGun, NULL}, | |
+ {NULL, NULL, &(StaticGun.Price), NULL, NULL, "Price", | |
+ N_("Price of each gun"), | |
+ (void **)(&Gun), &StaticGun, | |
+ sizeof(struct GUN), "Gun", &NumGun, NULL}, | |
+ {&(StaticGun.Space), NULL, NULL, NULL, NULL, "Space", | |
+ N_("Space taken by each gun"), | |
+ (void **)(&Gun), &StaticGun, | |
+ sizeof(struct GUN), "Gun", &NumGun, NULL}, | |
+ {&(StaticGun.Damage), NULL, NULL, NULL, NULL, "Damage", | |
+ N_("Damage done by each gun"), | |
+ (void **)(&Gun), &StaticGun, | |
+ sizeof(struct GUN), "Gun", &NumGun, NULL}, | |
+ {NULL, NULL, NULL, &Names.Bitch, NULL, "Names.Bitch", | |
+ N_("Word used to denote a single \"bitch\""), NULL, NULL, 0, "", NULL, | |
+ NULL}, | |
+ {NULL, NULL, NULL, &Names.Bitches, NULL, "Names.Bitches", | |
+ N_("Word used to denote two or more \"bitches\""), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Names.Gun, NULL, "Names.Gun", | |
+ N_("Word used to denote a single gun or equivalent"), NULL, NULL, 0, "", | |
+ NULL, NULL}, | |
+ {NULL, NULL, NULL, &Names.Guns, NULL, "Names.Guns", | |
+ N_("Word used to denote two or more guns"), NULL, NULL, 0, "", NULL, | |
+ NULL}, | |
+ {NULL, NULL, NULL, &Names.Drug, NULL, "Names.Drug", | |
+ N_("Word used to denote a single drug or equivalent"), NULL, NULL, 0, | |
+ "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Names.Drugs, NULL, "Names.Drugs", | |
+ N_("Word used to denote two or more drugs"), NULL, NULL, 0, "", NULL, | |
+ NULL}, | |
+ {NULL, NULL, NULL, &Names.Month, NULL, "Names.Month", | |
+ N_("Text prefixed to the turn number (i.e. the month)"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, &Names.Year, NULL, "Names.Year", | |
+ N_("Text appended to the turn number (i.e. the year)"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, &Prices.Spy, NULL, NULL, "Prices.Spy", | |
+ N_("Cost for a bitch to spy on the enemy"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, &Prices.Tipoff, NULL, NULL, "Prices.Tipoff", | |
+ N_("Cost for a bitch to tipoff the cops to an enemy"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, &Bitch.MinPrice, NULL, NULL, "Bitch.MinPrice", | |
+ N_("Minimum price to hire a bitch"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, &Bitch.MaxPrice, NULL, NULL, "Bitch.MaxPrice", | |
+ N_("Maximum price to hire a bitch"), | |
+ NULL, NULL, 0, "", NULL, NULL}, | |
+ {NULL, NULL, NULL, NULL, &SubwaySaying, "SubwaySaying", | |
+ N_("List of things which you overhear on the subway"), | |
+ NULL, NULL, 0, "", &NumSubway, ResizeSubway}, | |
+ {&NumSubway, NULL, NULL, NULL, NULL, "NumSubwaySaying", | |
+ N_("Number of subway sayings"), | |
+ NULL, NULL, 0, "", NULL, ResizeSubway}, | |
+ {NULL, NULL, NULL, NULL, &Playing, "Playing", | |
+ N_("List of songs which you can hear playing"), | |
+ NULL, NULL, 0, "", &NumPlaying, ResizePlaying}, | |
+ {&NumPlaying, NULL, NULL, NULL, NULL, "NumPlaying", | |
+ N_("Number of playing songs"), | |
+ NULL, NULL, 0, "", NULL, ResizePlaying}, | |
+ {NULL, NULL, NULL, NULL, &StoppedTo, "StoppedTo", | |
+ N_("List of things which you can stop to do"), | |
+ NULL, NULL, 0, "", &NumStoppedTo, ResizeStoppedTo}, | |
+ {&NumStoppedTo, NULL, NULL, NULL, NULL, "NumStoppedTo", | |
+ N_("Number of things which you can stop to do"), | |
+ NULL, NULL, 0, "", NULL, ResizeStoppedTo} | |
}; | |
-const int NUMGLOB = sizeof(Globals)/sizeof(Globals[0]); | |
+const int NUMGLOB = sizeof(Globals) / sizeof(Globals[0]); | |
-char **Playing=NULL; | |
+char **Playing = NULL; | |
char *DefaultPlaying[] = { | |
-/* Default list of songs that you can hear playing (N.B. this can be | |
- overridden in the configuration file with the "Playing" variable) - | |
- look for "You hear someone playing %s" to see how these are used. */ | |
- N_("`Are you Experienced` by Jimi Hendrix"), | |
- N_("`Cheeba Cheeba` by Tone Loc"), | |
- N_("`Comin` in to Los Angeles` by Arlo Guthrie"), | |
- N_("`Commercial` by Spanky and Our Gang"), | |
- N_("`Late in the Evening` by Paul Simon"), | |
- N_("`Light Up` by Styx"), | |
- N_("`Mexico` by Jefferson Airplane"), | |
- N_("`One toke over the line` by Brewer & Shipley"), | |
- N_("`The Smokeout` by Shel Silverstein"), | |
- N_("`White Rabbit` by Jefferson Airplane"), | |
- N_("`Itchycoo Park` by Small Faces"), | |
- N_("`White Punks on Dope` by the Tubes"), | |
- N_("`Legend of a Mind` by the Moody Blues"), | |
- N_("`Eight Miles High` by the Byrds"), | |
- N_("`Acapulco Gold` by Riders of the Purple Sage"), | |
- N_("`Kicks` by Paul Revere & the Raiders"), | |
- N_("the Nixon tapes"), | |
- N_("`Legalize It` by Mojo Nixon & Skid Roper") | |
+ /* Default list of songs that you can hear playing (N.B. this can be | |
+ * overridden in the configuration file with the "Playing" variable) - | |
+ * look for "You hear someone playing %s" to see how these are used. */ | |
+ N_("`Are you Experienced` by Jimi Hendrix"), | |
+ N_("`Cheeba Cheeba` by Tone Loc"), | |
+ N_("`Comin` in to Los Angeles` by Arlo Guthrie"), | |
+ N_("`Commercial` by Spanky and Our Gang"), | |
+ N_("`Late in the Evening` by Paul Simon"), | |
+ N_("`Light Up` by Styx"), | |
+ N_("`Mexico` by Jefferson Airplane"), | |
+ N_("`One toke over the line` by Brewer & Shipley"), | |
+ N_("`The Smokeout` by Shel Silverstein"), | |
+ N_("`White Rabbit` by Jefferson Airplane"), | |
+ N_("`Itchycoo Park` by Small Faces"), | |
+ N_("`White Punks on Dope` by the Tubes"), | |
+ N_("`Legend of a Mind` by the Moody Blues"), | |
+ N_("`Eight Miles High` by the Byrds"), | |
+ N_("`Acapulco Gold` by Riders of the Purple Sage"), | |
+ N_("`Kicks` by Paul Revere & the Raiders"), | |
+ N_("the Nixon tapes"), | |
+ N_("`Legalize It` by Mojo Nixon & Skid Roper") | |
}; | |
-char **StoppedTo=NULL; | |
+char **StoppedTo = NULL; | |
char *DefaultStoppedTo[] = { | |
-/* Default list of things which you can "stop to do" (random events that | |
- cost you a little money). These can be overridden with the "StoppedTo" | |
- variable in the configuration file. See the later string | |
- "You stopped to %s." to see how these strings are used. */ | |
- N_("have a beer"), | |
- N_("smoke a joint"), | |
- N_("smoke a cigar"), | |
- N_("smoke a Djarum"), | |
- N_("smoke a cigarette") | |
+ /* Default list of things which you can "stop to do" (random events that | |
+ * cost you a little money). These can be overridden with the "StoppedTo" | |
+ * variable in the configuration file. See the later string "You stopped | |
+ * to %s." to see how these strings are used. */ | |
+ N_("have a beer"), | |
+ N_("smoke a joint"), | |
+ N_("smoke a cigar"), | |
+ N_("smoke a Djarum"), | |
+ N_("smoke a cigarette") | |
}; | |
struct COP DefaultCop[] = { | |
-/* Name of the first police officer to attack you */ | |
- { N_("Officer Hardass"), | |
-/* Name of a single deputy of the first police officer */ | |
- N_("deputy"), | |
-/* Word used for more than one deputy of the first police officer */ | |
- N_("deputies"),4,3,30,30,2,8,0,1,1 }, | |
-/* Ditto, for the other police officers */ | |
- { N_("Officer Bob"),N_("deputy"),N_("deputies"),15,4,30,20,4,10,0,2,1 }, | |
- { N_("Agent Smith"),N_("cop"),N_("cops"),50,6,20,20,6,18,1,3,2 } | |
+ /* Name of the first police officer to attack you */ | |
+ {N_("Officer Hardass"), | |
+ /* Name of a single deputy of the first police officer */ | |
+ N_("deputy"), | |
+ /* Word used for more than one deputy of the first police officer */ | |
+ N_("deputies"), 4, 3, 30, 30, 2, 8, 0, 1, 1}, | |
+ /* Ditto, for the other police officers */ | |
+ {N_("Officer Bob"), N_("deputy"), N_("deputies"), 15, 4, 30, 20, 4, 10, | |
+ 0, 2, 1}, | |
+ {N_("Agent Smith"), N_("cop"), N_("cops"), 50, 6, 20, 20, 6, 18, 1, 3, 2} | |
}; | |
struct GUN DefaultGun[] = { | |
-/* The names of the default guns */ | |
- { N_("Baretta"),3000,4,5 }, | |
- { N_(".38 Special"),3500,4,9 }, | |
- { N_("Ruger"),2900,4,4 }, | |
- { N_("Saturday Night Special"),3100,4,7 } | |
+ /* The names of the default guns */ | |
+ {N_("Baretta"), 3000, 4, 5}, | |
+ {N_(".38 Special"), 3500, 4, 9}, | |
+ {N_("Ruger"), 2900, 4, 4}, | |
+ {N_("Saturday Night Special"), 3100, 4, 7} | |
}; | |
struct DRUG DefaultDrug[] = { | |
-/* The names of the default drugs, and the messages displayed when they are | |
- specially cheap or expensive */ | |
- { N_("Acid"),1000,4400,TRUE,FALSE, | |
- N_("The market is flooded with cheap home-made acid!") }, | |
- { N_("Cocaine"),15000,29000,FALSE,TRUE,"" }, | |
- { N_("Hashish"),480,1280,TRUE,FALSE, | |
- N_("The Marrakesh Express has arrived!") }, | |
- { N_("Heroin"),5500,13000,FALSE,TRUE,"" }, | |
- { N_("Ludes"),11,60,TRUE,FALSE, | |
- N_("Rival drug dealers raided a pharmacy and are selling cheap ludes!") }, | |
- { N_("MDA"),1500,4400,FALSE,FALSE,"" }, | |
- { N_("Opium"),540,1250,FALSE,TRUE,"" }, | |
- { N_("PCP"),1000,2500,FALSE,FALSE,"" }, | |
- { N_("Peyote"),220,700,FALSE,FALSE,"" }, | |
- { N_("Shrooms"),630,1300,FALSE,FALSE,"" }, | |
- { N_("Speed"),90,250,FALSE,TRUE,"" }, | |
- { N_("Weed"),315,890,TRUE,FALSE, | |
- N_("Columbian freighter dusted the Coast Guard! " | |
- "Weed prices have bottomed out!") } | |
+ /* The names of the default drugs, and the messages displayed when they | |
+ * are specially cheap or expensive */ | |
+ {N_("Acid"), 1000, 4400, TRUE, FALSE, | |
+ N_("The market is flooded with cheap home-made acid!")}, | |
+ {N_("Cocaine"), 15000, 29000, FALSE, TRUE, ""}, | |
+ {N_("Hashish"), 480, 1280, TRUE, FALSE, | |
+ N_("The Marrakesh Express has arrived!")}, | |
+ {N_("Heroin"), 5500, 13000, FALSE, TRUE, ""}, | |
+ {N_("Ludes"), 11, 60, TRUE, FALSE, | |
+ N_("Rival drug dealers raided a pharmacy and are selling cheap ludes!")}, | |
+ {N_("MDA"), 1500, 4400, FALSE, FALSE, ""}, | |
+ {N_("Opium"), 540, 1250, FALSE, TRUE, ""}, | |
+ {N_("PCP"), 1000, 2500, FALSE, FALSE, ""}, | |
+ {N_("Peyote"), 220, 700, FALSE, FALSE, ""}, | |
+ {N_("Shrooms"), 630, 1300, FALSE, FALSE, ""}, | |
+ {N_("Speed"), 90, 250, FALSE, TRUE, ""}, | |
+ {N_("Weed"), 315, 890, TRUE, FALSE, | |
+ N_("Columbian freighter dusted the Coast Guard! " | |
+ "Weed prices have bottomed out!")} | |
}; | |
+ | |
#define NUMDRUG (sizeof(DefaultDrug)/sizeof(DefaultDrug[0])) | |
struct LOCATION DefaultLocation[] = { | |
-/* The names of the default locations */ | |
- { N_("Bronx"),10,NUMDRUG/2+1,NUMDRUG }, | |
- { N_("Ghetto"),5,NUMDRUG/2+2,NUMDRUG }, | |
- { N_("Central Park"),15,NUMDRUG/2,NUMDRUG }, | |
- { N_("Manhattan"),90,NUMDRUG/2-2,NUMDRUG-2 }, | |
- { N_("Coney Island"),20,NUMDRUG/2,NUMDRUG }, | |
- { N_("Brooklyn"),70,NUMDRUG/2-2,NUMDRUG-1 }, | |
- { N_("Queens"),50,NUMDRUG/2,NUMDRUG }, | |
- { N_("Staten Island"),20,NUMDRUG/2,NUMDRUG } | |
+ /* The names of the default locations */ | |
+ {N_("Bronx"), 10, NUMDRUG / 2 + 1, NUMDRUG}, | |
+ {N_("Ghetto"), 5, NUMDRUG / 2 + 2, NUMDRUG}, | |
+ {N_("Central Park"), 15, NUMDRUG / 2, NUMDRUG}, | |
+ {N_("Manhattan"), 90, NUMDRUG / 2 - 2, NUMDRUG - 2}, | |
+ {N_("Coney Island"), 20, NUMDRUG / 2, NUMDRUG}, | |
+ {N_("Brooklyn"), 70, NUMDRUG / 2 - 2, NUMDRUG - 1}, | |
+ {N_("Queens"), 50, NUMDRUG / 2, NUMDRUG}, | |
+ {N_("Staten Island"), 20, NUMDRUG / 2, NUMDRUG} | |
}; | |
-struct DRUGS Drugs = { NULL,NULL,0,0 }; | |
+struct DRUGS Drugs = { NULL, NULL, 0, 0 }; | |
struct DRUGS DefaultDrugs = { | |
-/* Messages displayed for drug busts, etc. */ | |
- N_("Cops made a big %tde bust! Prices are outrageous!"), | |
- N_("Addicts are buying %tde at ridiculous prices!"), | |
- 4,4 }; | |
+ /* Messages displayed for drug busts, etc. */ | |
+ N_("Cops made a big %tde bust! Prices are outrageous!"), | |
+ N_("Addicts are buying %tde at ridiculous prices!"), | |
+ 4, 4 | |
+}; | |
-char **SubwaySaying=NULL; | |
+char **SubwaySaying = NULL; | |
char *DefaultSubwaySaying[] = { | |
-/* Default list of things which the "lady on the subway" can tell you (N.B. | |
- can be overridden with the "SubwaySaying" config. file variable). Look | |
- for "the lady next to you" to see how these strings are used. */ | |
- N_("Wouldn\'t it be funny if everyone suddenly quacked at once?"), | |
- N_("The Pope was once Jewish, you know"), | |
- N_("I\'ll bet you have some really interesting dreams"), | |
- N_("So I think I\'m going to Amsterdam this year"), | |
- N_("Son, you need a yellow haircut"), | |
- N_("I think it\'s wonderful what they\'re doing with incense these days"), | |
- N_("I wasn\'t always a woman, you know"), | |
- N_("Does your mother know you\'re a dope dealer?"), | |
- N_("Are you high on something?"), | |
- N_("Oh, you must be from California"), | |
- N_("I used to be a hippie, myself"), | |
- N_("There\'s nothing like having lots of money"), | |
- N_("You look like an aardvark!"), | |
- N_("I don\'t believe in Ronald Reagan"), | |
- N_("Courage! Bush is a noodle!"), | |
- N_("Haven\'t I seen you on TV?"), | |
- N_("I think hemorrhoid commercials are really neat!"), | |
- N_("We\'re winning the war for drugs!"), | |
- N_("A day without dope is like night"), | |
- N_("We only use 20% of our brains, so why not burn out the other 80%"), | |
- N_("I\'m soliciting contributions for Zombies for Christ"), | |
- N_("I\'d like to sell you an edible poodle"), | |
- N_("Winners don\'t do drugs... unless they do"), | |
- N_("Kill a cop for Christ!"), | |
- N_("I am the walrus!"), | |
- N_("Jesus loves you more than you will know"), | |
- N_("I feel an unaccountable urge to dye my hair blue"), | |
- N_("Wasn\'t Jane Fonda wonderful in Barbarella"), | |
- N_("Just say No... well, maybe... ok, what the hell!"), | |
- N_("Would you like a jelly baby?"), | |
- N_("Drugs can be your friend!") | |
+ /* Default list of things which the "lady on the subway" can tell you | |
+ * (N.B. can be overridden with the "SubwaySaying" config. file | |
+ * variable). Look for "the lady next to you" to see how these strings | |
+ * are used. */ | |
+ N_("Wouldn\'t it be funny if everyone suddenly quacked at once?"), | |
+ N_("The Pope was once Jewish, you know"), | |
+ N_("I\'ll bet you have some really interesting dreams"), | |
+ N_("So I think I\'m going to Amsterdam this year"), | |
+ N_("Son, you need a yellow haircut"), | |
+ N_("I think it\'s wonderful what they\'re doing with incense these days"), | |
+ N_("I wasn\'t always a woman, you know"), | |
+ N_("Does your mother know you\'re a dope dealer?"), | |
+ N_("Are you high on something?"), | |
+ N_("Oh, you must be from California"), | |
+ N_("I used to be a hippie, myself"), | |
+ N_("There\'s nothing like having lots of money"), | |
+ N_("You look like an aardvark!"), | |
+ N_("I don\'t believe in Ronald Reagan"), | |
+ N_("Courage! Bush is a noodle!"), | |
+ N_("Haven\'t I seen you on TV?"), | |
+ N_("I think hemorrhoid commercials are really neat!"), | |
+ N_("We\'re winning the war for drugs!"), | |
+ N_("A day without dope is like night"), | |
+ N_("We only use 20% of our brains, so why not burn out the other 80%"), | |
+ N_("I\'m soliciting contributions for Zombies for Christ"), | |
+ N_("I\'d like to sell you an edible poodle"), | |
+ N_("Winners don\'t do drugs... unless they do"), | |
+ N_("Kill a cop for Christ!"), | |
+ N_("I am the walrus!"), | |
+ N_("Jesus loves you more than you will know"), | |
+ N_("I feel an unaccountable urge to dye my hair blue"), | |
+ N_("Wasn\'t Jane Fonda wonderful in Barbarella"), | |
+ N_("Just say No... well, maybe... ok, what the hell!"), | |
+ N_("Would you like a jelly baby?"), | |
+ N_("Drugs can be your friend!") | |
}; | |
-int brandom(int bot,int top) { | |
-/* Returns a random integer not less than bot and less than top */ | |
- return (int)((float)(top-bot)*rand()/(RAND_MAX+1.0))+bot; | |
-} | |
- | |
-price_t prandom(price_t bot,price_t top) { | |
-/* Returns a random price not less than bot and less than top */ | |
- return (price_t)((float)(top-bot)*rand()/(RAND_MAX+1.0))+bot; | |
-} | |
- | |
-int CountPlayers(GSList *First) { | |
-/* Returns the total numbers of players in the list starting at "First"; */ | |
-/* players still in the process of connecting or leaving, and those that */ | |
-/* are actually cops (server-created internal AI players) are ignored. */ | |
- GSList *list; | |
- Player *Play; | |
- int count=0; | |
- for (list=First;list;list=g_slist_next(list)) { | |
- Play=(Player *)list->data; | |
- if (strlen(GetPlayerName(Play))>0 && !IsCop(Play)) count++; | |
- } | |
- return count; | |
-} | |
- | |
-GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First) { | |
-/* Adds the new Player structure "NewPlayer" to the linked list */ | |
-/* pointed to by "First", and initialises all fields. Returns the new */ | |
-/* start of the list. If this function is called by the server, then */ | |
-/* it should pass the file descriptor of the socket used to */ | |
-/* communicate with the client player. */ | |
- Player *tmp; | |
- GSList *list; | |
- list=First; | |
- NewPlayer->ID=0; | |
-/* Generate a unique player ID, if we're the server (clients get their IDs | |
- from the server, so don't need to generate IDs) */ | |
- if (Server) while (list) { | |
- tmp=(Player *)list->data; | |
- if (tmp->ID==NewPlayer->ID) { | |
- NewPlayer->ID++; | |
- list=First; | |
+/* | |
+ * Returns a random integer not less than bot and less than top. | |
+ */ | |
+int brandom(int bot, int top) | |
+{ | |
+ return (int)((float)(top - bot) * rand() / (RAND_MAX + 1.0)) + bot; | |
+} | |
+ | |
+/* | |
+ * Returns a random price not less than bot and less than top. | |
+ */ | |
+price_t prandom(price_t bot, price_t top) | |
+{ | |
+ return (price_t)((float)(top - bot) * rand() / (RAND_MAX + 1.0)) + bot; | |
+} | |
+ | |
+/* | |
+ * Returns the total numbers of players in the list starting at "First"; | |
+ * players still in the process of connecting or leaving, and those that | |
+ * are actually cops (server-created internal AI players) are ignored. | |
+ */ | |
+int CountPlayers(GSList *First) | |
+{ | |
+ GSList *list; | |
+ Player *Play; | |
+ int count = 0; | |
+ | |
+ for (list = First; list; list = g_slist_next(list)) { | |
+ Play = (Player *)list->data; | |
+ if (strlen(GetPlayerName(Play)) > 0 && !IsCop(Play)) | |
+ count++; | |
+ } | |
+ return count; | |
+} | |
+ | |
+/* | |
+ * Adds the new Player structure "NewPlayer" to the linked list | |
+ * pointed to by "First", and initialises all fields. Returns the new | |
+ * start of the list. If this function is called by the server, then | |
+ * it should pass the file descriptor of the socket used to | |
+ * communicate with the client player. | |
+ */ | |
+GSList *AddPlayer(int fd, Player *NewPlayer, GSList *First) | |
+{ | |
+ Player *tmp; | |
+ GSList *list; | |
+ | |
+ list = First; | |
+ NewPlayer->ID = 0; | |
+ /* Generate a unique player ID, if we're the server (clients get their | |
+ * IDs from the server, so don't need to generate IDs) */ | |
+ if (Server) | |
+ while (list) { | |
+ tmp = (Player *)list->data; | |
+ if (tmp->ID == NewPlayer->ID) { | |
+ NewPlayer->ID++; | |
+ list = First; | |
} else { | |
- list=g_slist_next(list); | |
+ list = g_slist_next(list); | |
} | |
- } | |
- NewPlayer->Name=NULL; | |
- SetPlayerName(NewPlayer,NULL); | |
- NewPlayer->IsAt=0; | |
- NewPlayer->EventNum=E_NONE; | |
- NewPlayer->FightTimeout=NewPlayer->ConnectTimeout=NewPlayer->IdleTimeout=0; | |
- NewPlayer->Guns=(Inventory *)g_malloc0(NumGun*sizeof(Inventory)); | |
- NewPlayer->Drugs=(Inventory *)g_malloc0(NumDrug*sizeof(Inventory)); | |
- InitList(&(NewPlayer->SpyList)); | |
- InitList(&(NewPlayer->TipList)); | |
- NewPlayer->Turn=1; | |
- NewPlayer->Cash=StartCash; | |
- NewPlayer->Debt=StartDebt; | |
- NewPlayer->Bank=0; | |
- NewPlayer->Bitches.Carried=8; | |
- NewPlayer->CopIndex=0; | |
- NewPlayer->Health=100; | |
- NewPlayer->CoatSize=100; | |
- NewPlayer->Flags=0; | |
+ } | |
+ NewPlayer->Name = NULL; | |
+ SetPlayerName(NewPlayer, NULL); | |
+ NewPlayer->IsAt = 0; | |
+ NewPlayer->EventNum = E_NONE; | |
+ NewPlayer->FightTimeout = NewPlayer->ConnectTimeout = | |
+ NewPlayer->IdleTimeout = 0; | |
+ NewPlayer->Guns = (Inventory *)g_malloc0(NumGun * sizeof(Inventory)); | |
+ NewPlayer->Drugs = (Inventory *)g_malloc0(NumDrug * sizeof(Inventory)); | |
+ InitList(&(NewPlayer->SpyList)); | |
+ InitList(&(NewPlayer->TipList)); | |
+ NewPlayer->Turn = 1; | |
+ NewPlayer->Cash = StartCash; | |
+ NewPlayer->Debt = StartDebt; | |
+ NewPlayer->Bank = 0; | |
+ NewPlayer->Bitches.Carried = 8; | |
+ NewPlayer->CopIndex = 0; | |
+ NewPlayer->Health = 100; | |
+ NewPlayer->CoatSize = 100; | |
+ NewPlayer->Flags = 0; | |
#if NETWORKING | |
- InitNetworkBuffer(&NewPlayer->NetBuf,'\n','\r',UseSocks ? &Socks : NULL); | |
- if (Server) BindNetworkBufferToSocket(&NewPlayer->NetBuf,fd); | |
+ InitNetworkBuffer(&NewPlayer->NetBuf, '\n', '\r', | |
+ UseSocks ? &Socks : NULL); | |
+ if (Server) | |
+ BindNetworkBufferToSocket(&NewPlayer->NetBuf, fd); | |
#endif | |
- InitAbilities(NewPlayer); | |
- NewPlayer->FightArray=NULL; | |
- NewPlayer->Attacking=NULL; | |
- return g_slist_append(First,(gpointer)NewPlayer); | |
-} | |
- | |
-gboolean IsConnectedPlayer(Player *play) { | |
-/* Returns TRUE only if the given player has properly connected (i.e. has | |
- a valid name) */ | |
+ InitAbilities(NewPlayer); | |
+ NewPlayer->FightArray = NULL; | |
+ NewPlayer->Attacking = NULL; | |
+ return g_slist_append(First, (gpointer)NewPlayer); | |
+} | |
+ | |
+/* | |
+ * Returns TRUE only if the given player has properly connected (i.e. has | |
+ * a valid name). | |
+ */ | |
+gboolean IsConnectedPlayer(Player *play) | |
+{ | |
return (play && play->Name && play->Name[0]); | |
} | |
-void UpdatePlayer(Player *Play) { | |
-/* Redimensions the Gun and Drug lists for "Play" */ | |
- Play->Guns=(Inventory *)g_realloc(Play->Guns,NumGun*sizeof(Inventory)); | |
- Play->Drugs=(Inventory *)g_realloc(Play->Drugs,NumDrug*sizeof(Inventory)); | |
-} | |
- | |
-GSList *RemovePlayer(Player *Play,GSList *First) { | |
-/* Removes the Player structure pointed to by "Play" from the linked */ | |
-/* list starting at "First". The client socket is freed if called */ | |
-/* from the server. The new start of the list is returned. */ | |
- g_assert(Play); | |
- g_assert(First); | |
- | |
- First=g_slist_remove(First,(gpointer)Play); | |
+/* | |
+ * Redimensions the Gun and Drug lists for "Play". | |
+ */ | |
+void UpdatePlayer(Player *Play) | |
+{ | |
+ Play->Guns = | |
+ (Inventory *)g_realloc(Play->Guns, NumGun * sizeof(Inventory)); | |
+ Play->Drugs = | |
+ (Inventory *)g_realloc(Play->Drugs, NumDrug * sizeof(Inventory)); | |
+} | |
+ | |
+/* | |
+ * Removes the Player structure pointed to by "Play" from the linked | |
+ * list starting at "First". The client socket is freed if called | |
+ * from the server. The new start of the list is returned. | |
+ */ | |
+GSList *RemovePlayer(Player *Play, GSList *First) | |
+{ | |
+ g_assert(Play); | |
+ g_assert(First); | |
+ | |
+ First = g_slist_remove(First, (gpointer)Play); | |
#if NETWORKING | |
- if (!IsCop(Play)) ShutdownNetworkBuffer(&Play->NetBuf); | |
+ if (!IsCop(Play)) | |
+ ShutdownNetworkBuffer(&Play->NetBuf); | |
#endif | |
- ClearList(&(Play->SpyList)); | |
- ClearList(&(Play->TipList)); | |
- g_free(Play->Name); | |
- g_free(Play); | |
- return First; | |
-} | |
- | |
-void CopyPlayer(Player *Dest,Player *Src) { | |
-/* Copies player "Src" to player "Dest" */ | |
- if (!Dest || !Src) return; | |
- Dest->Turn=Src->Turn; | |
- Dest->Cash=Src->Cash; | |
- Dest->Debt=Src->Debt; | |
- Dest->Bank=Src->Bank; | |
- Dest->Health=Src->Health; | |
- ClearInventory(Dest->Guns,Dest->Drugs); | |
- AddInventory(Dest->Guns,Src->Guns,NumGun); | |
- AddInventory(Dest->Drugs,Src->Drugs,NumDrug); | |
- Dest->CoatSize=Src->CoatSize; | |
- Dest->IsAt=Src->IsAt; | |
- g_free(Dest->Name); | |
- Dest->Name=g_strdup(Src->Name); | |
- Dest->Bitches.Carried=Src->Bitches.Carried; | |
- Dest->Flags=Src->Flags; | |
-} | |
- | |
-gboolean IsCop(Player *Play) { | |
- return (Play->CopIndex>0); | |
-} | |
- | |
-char *GetPlayerName(Player *Play) { | |
- if (Play->Name) return Play->Name; | |
- else return ""; | |
-} | |
- | |
-void SetPlayerName(Player *Play,char *Name) { | |
- if (Play->Name) g_free(Play->Name); | |
- if (!Name) Play->Name=g_strdup(""); | |
- else Play->Name = g_strdup(Name); | |
-} | |
- | |
-Player *GetPlayerByID(guint ID,GSList *First) { | |
-/* Searches the linked list starting at "First" for a Player structure */ | |
-/* with the given ID. Returns a pointer to this structure, or NULL if */ | |
-/* no match can be found. */ | |
- GSList *list; | |
- Player *Play; | |
- for (list=First;list;list=g_slist_next(list)) { | |
- Play=(Player *)list->data; | |
- if (Play->ID==ID) return Play; | |
- } | |
- return NULL; | |
-} | |
- | |
-Player *GetPlayerByName(char *Name,GSList *First) { | |
-/* Searches the linked list starting at "First" for a Player structure */ | |
-/* with the name "Name". Returns a pointer to this structure, or NULL */ | |
-/* if no match can be found. */ | |
- GSList *list; | |
- Player *Play; | |
- if (Name==NULL || Name[0]==0) return &Noone; | |
- for (list=First;list;list=g_slist_next(list)) { | |
- Play=(Player *)list->data; | |
- if (!IsCop(Play) && strcmp(GetPlayerName(Play),Name)==0) return Play; | |
- } | |
- return NULL; | |
-} | |
- | |
-price_t strtoprice(char *buf) { | |
-/* Forms a price based on the string representation in "buf" */ | |
- guint i,buflen,FracNum; | |
- gchar digit,suffix; | |
- gboolean minus,InFrac; | |
- price_t val=0; | |
- | |
- minus=FALSE; | |
- if (!buf || !buf[0]) return 0; | |
- | |
- buflen=strlen(buf); | |
- suffix=buf[buflen-1]; | |
- suffix=toupper(suffix); | |
- if (suffix=='M') FracNum=6; | |
- else if (suffix=='K') FracNum=3; | |
- else FracNum=0; | |
- | |
- for (i=0,InFrac=FALSE;i<buflen && (!InFrac || FracNum>0);i++) { | |
- digit=buf[i]; | |
- if (digit=='.' || digit==',') { | |
- InFrac=TRUE; | |
- } else if (digit>='0' && digit<='9') { | |
- if (InFrac) FracNum--; | |
- val*=10; | |
- val+=(digit-'0'); | |
- } else if (digit=='-') minus=TRUE; | |
+ ClearList(&(Play->SpyList)); | |
+ ClearList(&(Play->TipList)); | |
+ g_free(Play->Name); | |
+ g_free(Play); | |
+ return First; | |
+} | |
+ | |
+/* | |
+ * Copies player "Src" to player "Dest". | |
+ */ | |
+void CopyPlayer(Player *Dest, Player *Src) | |
+{ | |
+ if (!Dest || !Src) | |
+ return; | |
+ Dest->Turn = Src->Turn; | |
+ Dest->Cash = Src->Cash; | |
+ Dest->Debt = Src->Debt; | |
+ Dest->Bank = Src->Bank; | |
+ Dest->Health = Src->Health; | |
+ ClearInventory(Dest->Guns, Dest->Drugs); | |
+ AddInventory(Dest->Guns, Src->Guns, NumGun); | |
+ AddInventory(Dest->Drugs, Src->Drugs, NumDrug); | |
+ Dest->CoatSize = Src->CoatSize; | |
+ Dest->IsAt = Src->IsAt; | |
+ g_free(Dest->Name); | |
+ Dest->Name = g_strdup(Src->Name); | |
+ Dest->Bitches.Carried = Src->Bitches.Carried; | |
+ Dest->Flags = Src->Flags; | |
+} | |
+ | |
+gboolean IsCop(Player *Play) | |
+{ | |
+ return (Play->CopIndex > 0); | |
+} | |
+ | |
+char *GetPlayerName(Player *Play) | |
+{ | |
+ if (Play->Name) | |
+ return Play->Name; | |
+ else | |
+ return ""; | |
+} | |
+ | |
+void SetPlayerName(Player *Play, char *Name) | |
+{ | |
+ if (Play->Name) | |
+ g_free(Play->Name); | |
+ if (!Name) | |
+ Play->Name = g_strdup(""); | |
+ else | |
+ Play->Name = g_strdup(Name); | |
+} | |
+ | |
+/* | |
+ * Searches the linked list starting at "First" for a Player structure | |
+ * with the given ID. Returns a pointer to this structure, or NULL if | |
+ * no match can be found. | |
+ */ | |
+Player *GetPlayerByID(guint ID, GSList *First) | |
+{ | |
+ GSList *list; | |
+ Player *Play; | |
+ | |
+ for (list = First; list; list = g_slist_next(list)) { | |
+ Play = (Player *)list->data; | |
+ if (Play->ID == ID) | |
+ return Play; | |
+ } | |
+ return NULL; | |
+} | |
+ | |
+/* | |
+ * Searches the linked list starting at "First" for a Player structure | |
+ * with the name "Name". Returns a pointer to this structure, or NULL | |
+ * if no match can be found. | |
+ */ | |
+Player *GetPlayerByName(char *Name, GSList *First) | |
+{ | |
+ GSList *list; | |
+ Player *Play; | |
+ | |
+ if (Name == NULL || Name[0] == 0) | |
+ return &Noone; | |
+ for (list = First; list; list = g_slist_next(list)) { | |
+ Play = (Player *)list->data; | |
+ if (!IsCop(Play) && strcmp(GetPlayerName(Play), Name) == 0) | |
+ return Play; | |
+ } | |
+ return NULL; | |
+} | |
+ | |
+/* | |
+ * Forms a price based on the string representation in "buf". | |
+ */ | |
+price_t strtoprice(char *buf) | |
+{ | |
+ guint i, buflen, FracNum; | |
+ gchar digit, suffix; | |
+ gboolean minus, InFrac; | |
+ price_t val = 0; | |
+ | |
+ minus = FALSE; | |
+ if (!buf || !buf[0]) | |
+ return 0; | |
+ | |
+ buflen = strlen(buf); | |
+ suffix = buf[buflen - 1]; | |
+ suffix = toupper(suffix); | |
+ if (suffix == 'M') | |
+ FracNum = 6; | |
+ else if (suffix == 'K') | |
+ FracNum = 3; | |
+ else | |
+ FracNum = 0; | |
+ | |
+ for (i = 0, InFrac = FALSE; i < buflen && (!InFrac || FracNum > 0); i++) { | |
+ digit = buf[i]; | |
+ if (digit == '.' || digit == ',') { | |
+ InFrac = TRUE; | |
+ } else if (digit >= '0' && digit <= '9') { | |
+ if (InFrac) | |
+ FracNum--; | |
+ val *= 10; | |
+ val += (digit - '0'); | |
+ } else if (digit == '-') | |
+ minus = TRUE; | |
} | |
- for (i=0;i<FracNum;i++) val*=10; | |
- if (minus) val=-val; | |
+ for (i = 0; i < FracNum; i++) | |
+ val *= 10; | |
+ if (minus) | |
+ val = -val; | |
return val; | |
} | |
-gchar *pricetostr(price_t price) { | |
-/* Prints "price" directly into a dynamically-allocated string buffer */ | |
-/* and returns a pointer to this buffer. It is the responsbility of */ | |
-/* the user to g_free this buffer when it is finished with. */ | |
- GString *PriceStr; | |
- gchar *NewBuffer; | |
- price_t absprice; | |
- | |
- if (price<0) absprice=-price; else absprice=price; | |
- PriceStr=g_string_new(NULL); | |
- while (absprice!=0) { | |
- g_string_prepend_c(PriceStr,'0'+(absprice%10)); | |
- absprice /= 10; | |
- if (absprice==0) { | |
- if (price<0) g_string_prepend_c(PriceStr,'-'); | |
- } | |
- } | |
- NewBuffer=PriceStr->str; | |
- /* Free the string structure, but not the actual char array */ | |
- g_string_free(PriceStr,FALSE); | |
- return NewBuffer; | |
-} | |
- | |
-gchar *FormatPrice(price_t price) { | |
-/* Takes the number in "price" and prints it into a dynamically-allocated */ | |
-/* string, adding commas to split up thousands, and adding a currency */ | |
-/* symbol to the start. Returns a pointer to the string, which must be */ | |
-/* g_free'd by the user when it is finished with. */ | |
- GString *PriceStr; | |
- gchar *NewBuffer; | |
- char thou[10]; | |
- gboolean First=TRUE; | |
- price_t absprice; | |
- PriceStr=g_string_new(NULL); | |
- if (price<0) absprice=-price; else absprice=price; | |
- while (First || absprice>0) { | |
- if (absprice>=1000) sprintf(thou,"%03d",(int)(absprice%1000l)); | |
- else sprintf(thou,"%d",(int)(price%1000l)); | |
- price/=1000l; | |
- absprice/=1000l; | |
- if (!First) g_string_prepend_c(PriceStr,','); | |
- g_string_prepend(PriceStr,thou); | |
- First=FALSE; | |
- } | |
- if (Currency.Prefix) g_string_prepend(PriceStr,Currency.Symbol); | |
- else g_string_append(PriceStr,Currency.Symbol); | |
- | |
- NewBuffer=PriceStr->str; | |
- /* Free the string structure only, not the char data */ | |
- g_string_free(PriceStr,FALSE); | |
- return NewBuffer; | |
-} | |
- | |
-int TotalGunsCarried(Player *Play) { | |
-/* Returns the total number of guns being carried by "Play" */ | |
- int i,c; | |
- c=0; | |
- for (i=0;i<NumGun;i++) c+=Play->Guns[i].Carried; | |
- return c; | |
-} | |
- | |
-gchar *InitialCaps(gchar *string) { | |
-/* Capitalises the first character of "string" and writes the resultant */ | |
-/* string into a dynamically-allocated copy; the user must g_free this */ | |
-/* string (a pointer to which is returned) when it is no longer needed. */ | |
- gchar *buf; | |
- if (!string) return NULL; | |
- buf=g_strdup(string); | |
- if (strlen(buf)>=1) buf[0]=toupper(buf[0]); | |
- return buf; | |
-} | |
- | |
-char StartsWithVowel(char *string) { | |
-/* Returns TRUE if "string" starts with a vowel */ | |
- int c; | |
- if (!string || strlen(string)<1) return FALSE; | |
- c=toupper(string[0]); | |
- return (c=='A' || c=='E' || c=='I' || c=='O' || c=='U'); | |
-} | |
- | |
-int read_string(FILE *fp,char **buf) { | |
-/* Reads a NULL-terminated string into the buffer "buf" from file "fp". */ | |
-/* buf is sized to hold the string; this is a dynamic string and must be */ | |
-/* freed by the calling routine. Returns 0 on success, EOF on failure. */ | |
+/* | |
+ * Prints "price" directly into a dynamically-allocated string buffer | |
+ * and returns a pointer to this buffer. It is the responsbility of | |
+ * the user to g_free this buffer when it is finished with. | |
+ */ | |
+gchar *pricetostr(price_t price) | |
+{ | |
+ GString *PriceStr; | |
+ gchar *NewBuffer; | |
+ price_t absprice; | |
+ | |
+ if (price < 0) | |
+ absprice = -price; | |
+ else | |
+ absprice = price; | |
+ PriceStr = g_string_new(NULL); | |
+ while (absprice != 0) { | |
+ g_string_prepend_c(PriceStr, '0' + (absprice % 10)); | |
+ absprice /= 10; | |
+ if (absprice == 0) { | |
+ if (price < 0) | |
+ g_string_prepend_c(PriceStr, '-'); | |
+ } | |
+ } | |
+ NewBuffer = PriceStr->str; | |
+ /* Free the string structure, but not the actual char array */ | |
+ g_string_free(PriceStr, FALSE); | |
+ return NewBuffer; | |
+} | |
+ | |
+/* | |
+ * Takes the number in "price" and prints it into a dynamically-allocated | |
+ * string, adding commas to split up thousands, and adding a currency | |
+ * symbol to the start. Returns a pointer to the string, which must be | |
+ * g_free'd by the user when it is finished with. | |
+ */ | |
+gchar *FormatPrice(price_t price) | |
+{ | |
+ GString *PriceStr; | |
+ gchar *NewBuffer; | |
+ char thou[10]; | |
+ gboolean First = TRUE; | |
+ price_t absprice; | |
+ | |
+ PriceStr = g_string_new(NULL); | |
+ if (price < 0) | |
+ absprice = -price; | |
+ else | |
+ absprice = price; | |
+ while (First || absprice > 0) { | |
+ if (absprice >= 1000) | |
+ sprintf(thou, "%03d", (int)(absprice % 1000l)); | |
+ else | |
+ sprintf(thou, "%d", (int)(price % 1000l)); | |
+ price /= 1000l; | |
+ absprice /= 1000l; | |
+ if (!First) | |
+ g_string_prepend_c(PriceStr, ','); | |
+ g_string_prepend(PriceStr, thou); | |
+ First = FALSE; | |
+ } | |
+ if (Currency.Prefix) | |
+ g_string_prepend(PriceStr, Currency.Symbol); | |
+ else | |
+ g_string_append(PriceStr, Currency.Symbol); | |
+ | |
+ NewBuffer = PriceStr->str; | |
+ /* Free the string structure only, not the char data */ | |
+ g_string_free(PriceStr, FALSE); | |
+ return NewBuffer; | |
+} | |
+ | |
+/* | |
+ * Returns the total number of guns being carried by "Play". | |
+ */ | |
+int TotalGunsCarried(Player *Play) | |
+{ | |
+ int i, c; | |
+ | |
+ c = 0; | |
+ for (i = 0; i < NumGun; i++) | |
+ c += Play->Guns[i].Carried; | |
+ return c; | |
+} | |
+ | |
+/* | |
+ * Capitalises the first character of "string" and writes the resultant | |
+ * string into a dynamically-allocated copy; the user must g_free this | |
+ * string (a pointer to which is returned) when it is no longer needed. | |
+ */ | |
+gchar *InitialCaps(gchar *string) | |
+{ | |
+ gchar *buf; | |
+ | |
+ if (!string) | |
+ return NULL; | |
+ buf = g_strdup(string); | |
+ if (strlen(buf) >= 1) | |
+ buf[0] = toupper(buf[0]); | |
+ return buf; | |
+} | |
+ | |
+/* | |
+ * Returns TRUE if "string" starts with a vowel. | |
+ */ | |
+char StartsWithVowel(char *string) | |
+{ | |
+ int c; | |
+ | |
+ if (!string || strlen(string) < 1) | |
+ return FALSE; | |
+ c = toupper(string[0]); | |
+ return (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U'); | |
+} | |
+ | |
+/* | |
+ * Reads a NULL-terminated string into the buffer "buf" from file "fp". | |
+ * buf is sized to hold the string; this is a dynamic string and must be | |
+ * freed by the calling routine. Returns 0 on success, EOF on failure. | |
+ */ | |
+int read_string(FILE *fp, char **buf) | |
+{ | |
int c; | |
GString *text; | |
- text=g_string_new(""); | |
+ text = g_string_new(""); | |
do { | |
- c=fgetc(fp); | |
- if (c!=EOF && c!=0) g_string_append_c(text,(char)c); | |
- } while (c!=EOF && c!=0); | |
+ c = fgetc(fp); | |
+ if (c != EOF && c != 0) | |
+ g_string_append_c(text, (char)c); | |
+ } while (c != EOF && c != 0); | |
- *buf=text->str; | |
+ *buf = text->str; | |
/* Free the GString, but not the actual data text->str */ | |
- g_string_free(text,FALSE); | |
- if (c==EOF) return EOF; else return 0; | |
-} | |
- | |
-void ClearInventory(Inventory *Guns,Inventory *Drugs) { | |
-/* This function simply clears the given inventories "Guns" */ | |
-/* and "Drugs" if they are non-NULL */ | |
- int i; | |
- if (Guns) for (i=0;i<NumGun;i++) { | |
- Guns[i].Carried=0; Guns[i].TotalValue=0; | |
- } | |
- if (Drugs) for (i=0;i<NumDrug;i++) { | |
- Drugs[i].Carried=0; Drugs[i].TotalValue=0; | |
- } | |
-} | |
- | |
-char IsInventoryClear(Inventory *Guns,Inventory *Drugs) { | |
-/* Returns TRUE only if "Guns" and "Drugs" contain no objects */ | |
- int i; | |
- if (Guns) for (i=0;i<NumGun;i++) if (Guns[i].Carried > 0) return FALSE; | |
- if (Drugs) for (i=0;i<NumDrug;i++) if (Drugs[i].Carried > 0) return FALSE; | |
- return TRUE; | |
-} | |
- | |
-void AddInventory(Inventory *Cumul,Inventory *Add,int Length) { | |
-/* Adds inventory "Add" into the contents of inventory "Cumul" */ | |
-/* Each inventory is of length "Length" */ | |
-/* N.B. TotalValue is not modified, as it is assumed that the */ | |
-/* new items are free (if this is not the case it must be */ | |
-/* handled elsewhere). */ | |
- int i; | |
- for (i=0;i<Length;i++) Cumul[i].Carried+=Add[i].Carried; | |
-} | |
- | |
-void ChangeSpaceForInventory(Inventory *Guns,Inventory *Drugs, | |
- Player *Play) { | |
-/* Given the lists of "Guns" and "Drugs" (which the given player "Play" */ | |
-/* must have sufficient room to carry) updates the player's space to */ | |
-/* reflect carrying them. */ | |
- int i; | |
- if (Guns) for (i=0;i<NumGun;i++) { | |
- Play->CoatSize-=Guns[i].Carried*Gun[i].Space; | |
- } | |
- if (Drugs) for (i=0;i<NumDrug;i++) { | |
- Play->CoatSize-=Drugs[i].Carried; | |
- } | |
-} | |
- | |
-void TruncateInventoryFor(Inventory *Guns,Inventory *Drugs, | |
- Player *Play) { | |
-/* Discards items from "Guns" and/or "Drugs" (if non-NULL) if necessary */ | |
-/* such that player "Play" is able to carry them all. The cheapest */ | |
-/* objects are discarded. */ | |
- int i,Total,CheapIndex; | |
- int CheapestGun; | |
- Total=0; | |
- if (Guns) for (i=0;i<NumGun;i++) Total+=Guns[i].Carried; | |
- Total+=TotalGunsCarried(Play); | |
- while (Guns && Total > Play->Bitches.Carried+2) { | |
- CheapIndex=-1; | |
- for (i=0;i<NumGun;i++) if (Guns[i].Carried && (CheapIndex==-1 || | |
- Gun[i].Price <= Gun[CheapIndex].Price)) { | |
- CheapIndex=i; | |
- } | |
- i=Total-Play->Bitches.Carried-2; | |
- if (Guns[CheapIndex].Carried > i) { | |
- Guns[CheapIndex].Carried-=i; Total-=i; | |
- } else { | |
- Total-=Guns[CheapIndex].Carried; Guns[CheapIndex].Carried=0; | |
- } | |
- } | |
- | |
- Total=Play->CoatSize; | |
- if (Guns) for (i=0;i<NumGun;i++) Total-=Guns[i].Carried*Gun[i].Space; | |
- if (Drugs) for (i=0;i<NumDrug;i++) Total-=Drugs[i].Carried; | |
- while (Total < 0) { | |
- CheapestGun=-1; | |
- CheapIndex=-1; | |
- if (Guns) for (i=0;i<NumGun;i++) if (Guns[i].Carried && (CheapIndex==-1 … | |
- Gun[i].Price <= Gun[CheapIndex].Price)) { | |
- CheapIndex=i; CheapestGun=Gun[i].Price/Gun[i].Space; | |
- } | |
- if (Drugs) for (i=0;i<NumDrug;i++) if (Drugs[i].Carried && | |
- (CheapIndex==-1 || | |
- (CheapestGun==-1 && Drug[i].MinPrice<=Drug[CheapIndex].MinPrice) || | |
- (CheapestGun>=0 && Drug[i].MinPrice<=CheapestGun))) { | |
- CheapIndex=i; CheapestGun=-1; | |
- } | |
- if (Guns && CheapestGun>=0) { | |
- Guns[CheapIndex].Carried--; | |
- Total+=Gun[CheapIndex].Space; | |
- } else { | |
- if (Drugs && Drugs[CheapIndex].Carried >= -Total) { | |
- Drugs[CheapIndex].TotalValue = | |
- Drugs[CheapIndex].TotalValue* | |
- (Drugs[CheapIndex].Carried+Total)/ | |
- Drugs[CheapIndex].Carried; | |
- Drugs[CheapIndex].Carried += Total; Total=0; | |
- } else { | |
- Total+=Drugs[CheapIndex].Carried; Drugs[CheapIndex].Carried=0; | |
- Drugs[CheapIndex].TotalValue=0; | |
- } | |
- } | |
- } | |
-} | |
- | |
-int IsCarryingRandom(Player *Play,int amount) { | |
-/* Returns an index into the drugs array of a random drug that "Play" is */ | |
-/* carrying at least "amount" of. If no suitable drug is found after 5 */ | |
-/* attempts, returns -1. */ | |
- int i,ind; | |
- for (i=0;i<5;i++) { | |
- ind=brandom(0,NumDrug); | |
- if (Play->Drugs[ind].Carried >= amount) { | |
- return ind; | |
- } | |
- } | |
- return -1; | |
-} | |
- | |
-int GetNextDrugIndex(int OldIndex,Player *Play) { | |
-/* Returns an index into the "Drugs" array maintained by player "Play" */ | |
-/* of the next available drug after "OldIndex", following the current */ | |
-/* sort method (defined globally as "DrugSortMethod") */ | |
- int i,MaxIndex; | |
- MaxIndex=-1; | |
- for (i=0;i<NumDrug;i++) { | |
- if (Play->Drugs[i].Price!=0 && i!=OldIndex && i!=MaxIndex && | |
- (MaxIndex==-1 || | |
- (DrugSortMethod==DS_ATOZ && | |
- g_strcasecmp(Drug[MaxIndex].Name,Drug[i].Name)>0) || | |
- (DrugSortMethod==DS_ZTOA && | |
- g_strcasecmp(Drug[MaxIndex].Name,Drug[i].Name)<0) || | |
- (DrugSortMethod==DS_CHEAPFIRST && | |
- Play->Drugs[MaxIndex].Price > Play->Drugs[i].Price) || | |
- (DrugSortMethod==DS_CHEAPLAST && | |
- Play->Drugs[MaxIndex].Price < Play->Drugs[i].Price)) && | |
- (OldIndex==-1 || | |
- (DrugSortMethod==DS_ATOZ && | |
- g_strcasecmp(Drug[OldIndex].Name,Drug[i].Name)<=0) || | |
- (DrugSortMethod==DS_ZTOA && | |
- g_strcasecmp(Drug[OldIndex].Name,Drug[i].Name)>=0) || | |
- (DrugSortMethod==DS_CHEAPFIRST && | |
- Play->Drugs[OldIndex].Price <= Play->Drugs[i].Price) || | |
- (DrugSortMethod==DS_CHEAPLAST && | |
- Play->Drugs[OldIndex].Price >= Play->Drugs[i].Price))) { | |
- MaxIndex=i; | |
- } | |
- } | |
- return MaxIndex; | |
-} | |
+ g_string_free(text, FALSE); | |
+ if (c == EOF) | |
+ return EOF; | |
+ else | |
+ return 0; | |
+} | |
+ | |
+/* | |
+ * This function simply clears the given inventories "Guns" | |
+ * and "Drugs" if they are non-NULL. | |
+ */ | |
+void ClearInventory(Inventory *Guns, Inventory *Drugs) | |
+{ | |
+ int i; | |
-void InitList(DopeList *List) { | |
-/* A DopeList is akin to a Vector class; it is a list of DopeEntry */ | |
-/* structures, which can be dynamically extended or compressed. This */ | |
-/* function initialises the newly-created list pointed to by "List" */ | |
-/* (A DopeEntry contains a Player pointer and a counter, and is used */ | |
-/* by the server to keep track of tipoffs and spies.) */ | |
- List->Data=NULL; | |
- List->Number=0; | |
+ if (Guns) | |
+ for (i = 0; i < NumGun; i++) { | |
+ Guns[i].Carried = 0; | |
+ Guns[i].TotalValue = 0; | |
+ } | |
+ if (Drugs) | |
+ for (i = 0; i < NumDrug; i++) { | |
+ Drugs[i].Carried = 0; | |
+ Drugs[i].TotalValue = 0; | |
+ } | |
} | |
-void ClearList(DopeList *List) { | |
-/* Clears the list pointed to by "List" */ | |
- free(List->Data); | |
- InitList(List); | |
+/* | |
+ * Returns TRUE only if "Guns" and "Drugs" contain no objects. | |
+ */ | |
+char IsInventoryClear(Inventory *Guns, Inventory *Drugs) | |
+{ | |
+ int i; | |
+ | |
+ if (Guns) | |
+ for (i = 0; i < NumGun; i++) | |
+ if (Guns[i].Carried > 0) | |
+ return FALSE; | |
+ if (Drugs) | |
+ for (i = 0; i < NumDrug; i++) | |
+ if (Drugs[i].Carried > 0) | |
+ return FALSE; | |
+ return TRUE; | |
+} | |
+ | |
+/* | |
+ * Adds inventory "Add" into the contents of inventory "Cumul" | |
+ * Each inventory is of length "Length". | |
+ * N.B. TotalValue is not modified, as it is assumed that the | |
+ * new items are free (if this is not the case it must be | |
+ * handled elsewhere). | |
+ */ | |
+void AddInventory(Inventory *Cumul, Inventory *Add, int Length) | |
+{ | |
+ int i; | |
+ | |
+ for (i = 0; i < Length; i++) | |
+ Cumul[i].Carried += Add[i].Carried; | |
} | |
-void AddListEntry(DopeList *List,DopeEntry *NewEntry) { | |
-/* Adds a new DopeEntry (pointed to by "NewEntry") to the list "List". */ | |
-/* A copy of NewEntry is placed into the list, so the original */ | |
-/* structure pointed to by NewEntry can be reused. */ | |
- if (!NewEntry || !List) return; | |
- List->Number++; | |
- List->Data = (DopeEntry *)g_realloc(List->Data,List->Number* | |
- sizeof(DopeEntry)); | |
- g_memmove(&(List->Data[List->Number-1]),NewEntry,sizeof(DopeEntry)); | |
+/* | |
+ * Given the lists of "Guns" and "Drugs" (which the given player "Play" | |
+ * must have sufficient room to carry) updates the player's space to | |
+ * reflect carrying them. | |
+ */ | |
+void ChangeSpaceForInventory(Inventory *Guns, Inventory *Drugs, | |
+ Player *Play) | |
+{ | |
+ int i; | |
+ | |
+ if (Guns) | |
+ for (i = 0; i < NumGun; i++) { | |
+ Play->CoatSize -= Guns[i].Carried * Gun[i].Space; | |
+ } | |
+ if (Drugs) | |
+ for (i = 0; i < NumDrug; i++) { | |
+ Play->CoatSize -= Drugs[i].Carried; | |
+ } | |
} | |
-void RemoveListEntry(DopeList *List,int Index) { | |
-/* Removes the DopeEntry at index "Index" from list "List" */ | |
- if (!List || Index<0 || Index>=List->Number) return; | |
+/* | |
+ * Discards items from "Guns" and/or "Drugs" (if non-NULL) if necessary | |
+ * such that player "Play" is able to carry them all. The cheapest | |
+ * objects are discarded. | |
+ */ | |
+void TruncateInventoryFor(Inventory *Guns, Inventory *Drugs, Player *Play) | |
+{ | |
+ int i, Total, CheapIndex; | |
+ int CheapestGun; | |
+ | |
+ Total = 0; | |
+ if (Guns) | |
+ for (i = 0; i < NumGun; i++) | |
+ Total += Guns[i].Carried; | |
+ Total += TotalGunsCarried(Play); | |
+ while (Guns && Total > Play->Bitches.Carried + 2) { | |
+ CheapIndex = -1; | |
+ for (i = 0; i < NumGun; i++) | |
+ if (Guns[i].Carried && (CheapIndex == -1 | |
+ || Gun[i].Price <= Gun[CheapIndex].Price)) { | |
+ CheapIndex = i; | |
+ } | |
+ i = Total - Play->Bitches.Carried - 2; | |
+ if (Guns[CheapIndex].Carried > i) { | |
+ Guns[CheapIndex].Carried -= i; | |
+ Total -= i; | |
+ } else { | |
+ Total -= Guns[CheapIndex].Carried; | |
+ Guns[CheapIndex].Carried = 0; | |
+ } | |
+ } | |
- g_memmove(&(List->Data[Index]),&(List->Data[Index+1]), | |
- (List->Number-1-Index)*sizeof(DopeEntry)); | |
- List->Number--; | |
- List->Data = (DopeEntry *)g_realloc(List->Data,List->Number* | |
- sizeof(DopeEntry)); | |
- if (List->Number==0) List->Data=NULL; | |
+ Total = Play->CoatSize; | |
+ if (Guns) | |
+ for (i = 0; i < NumGun; i++) | |
+ Total -= Guns[i].Carried * Gun[i].Space; | |
+ if (Drugs) | |
+ for (i = 0; i < NumDrug; i++) | |
+ Total -= Drugs[i].Carried; | |
+ while (Total < 0) { | |
+ CheapestGun = -1; | |
+ CheapIndex = -1; | |
+ if (Guns) | |
+ for (i = 0; i < NumGun; i++) | |
+ if (Guns[i].Carried && (CheapIndex == -1 | |
+ || Gun[i].Price <= Gun[CheapIndex].Price)) { | |
+ CheapIndex = i; | |
+ CheapestGun = Gun[i].Price / Gun[i].Space; | |
+ } | |
+ if (Drugs) | |
+ for (i = 0; i < NumDrug; i++) | |
+ if (Drugs[i].Carried && | |
+ (CheapIndex == -1 || | |
+ (CheapestGun == -1 | |
+ && Drug[i].MinPrice <= Drug[CheapIndex].MinPrice) | |
+ || (CheapestGun >= 0 && Drug[i].MinPrice <= CheapestGun))) { | |
+ CheapIndex = i; | |
+ CheapestGun = -1; | |
+ } | |
+ if (Guns && CheapestGun >= 0) { | |
+ Guns[CheapIndex].Carried--; | |
+ Total += Gun[CheapIndex].Space; | |
+ } else { | |
+ if (Drugs && Drugs[CheapIndex].Carried >= -Total) { | |
+ Drugs[CheapIndex].TotalValue = | |
+ Drugs[CheapIndex].TotalValue * | |
+ (Drugs[CheapIndex].Carried + Total) / | |
+ Drugs[CheapIndex].Carried; | |
+ Drugs[CheapIndex].Carried += Total; | |
+ Total = 0; | |
+ } else { | |
+ Total += Drugs[CheapIndex].Carried; | |
+ Drugs[CheapIndex].Carried = 0; | |
+ Drugs[CheapIndex].TotalValue = 0; | |
+ } | |
+ } | |
+ } | |
} | |
-int GetListEntry(DopeList *List,Player *Play) { | |
-/* Returns the index of the DopeEntry matching "Play" in list "List" */ | |
-/* or -1 if this is not found. */ | |
- int i; | |
- for (i=List->Number-1;i>=0;i--) { | |
- if (List->Data[i].Play==Play) return i; | |
- } | |
- return -1; | |
+/* | |
+ * Returns an index into the drugs array of a random drug that "Play" is | |
+ * carrying at least "amount" of. If no suitable drug is found after 5 | |
+ * attempts, returns -1. | |
+ */ | |
+int IsCarryingRandom(Player *Play, int amount) | |
+{ | |
+ int i, ind; | |
+ | |
+ for (i = 0; i < 5; i++) { | |
+ ind = brandom(0, NumDrug); | |
+ if (Play->Drugs[ind].Carried >= amount) { | |
+ return ind; | |
+ } | |
+ } | |
+ return -1; | |
+} | |
+ | |
+/* | |
+ * Returns an index into the "Drugs" array maintained by player "Play" | |
+ * of the next available drug after "OldIndex", following the current | |
+ * sort method (defined globally as "DrugSortMethod"). | |
+ */ | |
+int GetNextDrugIndex(int OldIndex, Player *Play) | |
+{ | |
+ int i, MaxIndex; | |
+ | |
+ MaxIndex = -1; | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if (Play->Drugs[i].Price != 0 && i != OldIndex && i != MaxIndex && | |
+ (MaxIndex == -1 | |
+ || (DrugSortMethod == DS_ATOZ | |
+ && g_strcasecmp(Drug[MaxIndex].Name, Drug[i].Name) > 0) | |
+ || (DrugSortMethod == DS_ZTOA | |
+ && g_strcasecmp(Drug[MaxIndex].Name, Drug[i].Name) < 0) | |
+ || (DrugSortMethod == DS_CHEAPFIRST | |
+ && Play->Drugs[MaxIndex].Price > Play->Drugs[i].Price) | |
+ || (DrugSortMethod == DS_CHEAPLAST | |
+ && Play->Drugs[MaxIndex].Price < Play->Drugs[i].Price)) && | |
+ (OldIndex == -1 | |
+ || (DrugSortMethod == DS_ATOZ | |
+ && g_strcasecmp(Drug[OldIndex].Name, Drug[i].Name) <= 0) | |
+ || (DrugSortMethod == DS_ZTOA | |
+ && g_strcasecmp(Drug[OldIndex].Name, Drug[i].Name) >= 0) | |
+ || (DrugSortMethod == DS_CHEAPFIRST | |
+ && Play->Drugs[OldIndex].Price <= Play->Drugs[i].Price) | |
+ || (DrugSortMethod == DS_CHEAPLAST | |
+ && Play->Drugs[OldIndex].Price >= Play->Drugs[i].Price))) { | |
+ MaxIndex = i; | |
+ } | |
+ } | |
+ return MaxIndex; | |
+} | |
+ | |
+/* | |
+ * A DopeList is akin to a Vector class; it is a list of DopeEntry | |
+ * structures, which can be dynamically extended or compressed. This | |
+ * function initialises the newly-created list pointed to by "List" | |
+ * (A DopeEntry contains a Player pointer and a counter, and is used | |
+ * by the server to keep track of tipoffs and spies.) | |
+ */ | |
+void InitList(DopeList *List) | |
+{ | |
+ List->Data = NULL; | |
+ List->Number = 0; | |
+} | |
+ | |
+/* | |
+ * Clears the list pointed to by "List". | |
+ */ | |
+void ClearList(DopeList *List) | |
+{ | |
+ free(List->Data); | |
+ InitList(List); | |
+} | |
+ | |
+/* | |
+ * Adds a new DopeEntry (pointed to by "NewEntry") to the list "List". | |
+ * A copy of NewEntry is placed into the list, so the original | |
+ * structure pointed to by NewEntry can be reused. | |
+ */ | |
+void AddListEntry(DopeList *List, DopeEntry *NewEntry) | |
+{ | |
+ if (!NewEntry || !List) | |
+ return; | |
+ List->Number++; | |
+ List->Data = (DopeEntry *)g_realloc(List->Data, List->Number * | |
+ sizeof(DopeEntry)); | |
+ g_memmove(&(List->Data[List->Number - 1]), NewEntry, sizeof(DopeEntry)); | |
+} | |
+ | |
+/* | |
+ * Removes the DopeEntry at index "Index" from list "List". | |
+ */ | |
+void RemoveListEntry(DopeList *List, int Index) | |
+{ | |
+ if (!List || Index < 0 || Index >= List->Number) | |
+ return; | |
+ | |
+ g_memmove(&(List->Data[Index]), &(List->Data[Index + 1]), | |
+ (List->Number - 1 - Index) * sizeof(DopeEntry)); | |
+ List->Number--; | |
+ List->Data = (DopeEntry *)g_realloc(List->Data, List->Number * | |
+ sizeof(DopeEntry)); | |
+ if (List->Number == 0) | |
+ List->Data = NULL; | |
+} | |
+ | |
+/* | |
+ * Returns the index of the DopeEntry matching "Play" in list "List" | |
+ * or -1 if this is not found. | |
+ */ | |
+int GetListEntry(DopeList *List, Player *Play) | |
+{ | |
+ int i; | |
+ | |
+ for (i = List->Number - 1; i >= 0; i--) { | |
+ if (List->Data[i].Play == Play) | |
+ return i; | |
+ } | |
+ return -1; | |
} | |
-void RemoveListPlayer(DopeList *List,Player *Play) { | |
-/* Removes (if it exists) the DopeEntry in list "List" matching "Play" */ | |
- RemoveListEntry(List,GetListEntry(List,Play)); | |
+/* | |
+ * Removes (if it exists) the DopeEntry in list "List" matching "Play". | |
+ */ | |
+void RemoveListPlayer(DopeList *List, Player *Play) | |
+{ | |
+ RemoveListEntry(List, GetListEntry(List, Play)); | |
} | |
-void RemoveAllEntries(DopeList *List,Player *Play) { | |
-/* Similar to RemoveListPlayer, except that if the list contains "Play" */ | |
-/* more than once, all the matching entries are removed, not just the first */ | |
+/* | |
+ * Similar to RemoveListPlayer, except that if the list contains "Play" more | |
+ * than once, all the matching entries are removed, not just the first. | |
+ */ | |
+void RemoveAllEntries(DopeList *List, Player *Play) | |
+{ | |
int i; | |
+ | |
do { | |
- i=GetListEntry(List,Play); | |
- if (i>=0) RemoveListEntry(List,i); | |
- } while (i>=0); | |
-} | |
- | |
-void dopelog(int loglevel,const gchar *format,...) { | |
-/* General logging function. All messages should be given a loglevel, */ | |
-/* from 0 to 5 (0=vital, 2=normal, 5=maximum debugging output). This */ | |
-/* is essentially just a wrapper around the GLib g_log function. */ | |
- va_list args; | |
- if (!Network) return; /* Don't print server log messages when | |
- running standalone */ | |
- va_start (args,format); | |
- g_logv(G_LOG_DOMAIN,1<<(loglevel+G_LOG_LEVEL_USER_SHIFT),format,args); | |
- va_end (args); | |
-} | |
- | |
-GLogLevelFlags LogMask() { | |
-/* Returns the bitmask necessary to catch all custom log messages */ | |
- return ((1<<(MAXLOG))-1) << G_LOG_LEVEL_USER_SHIFT; | |
-} | |
- | |
-void ResizeLocations(int NewNum) { | |
- int i; | |
- if (NewNum<NumLocation) for (i=NewNum;i<NumLocation;i++) { | |
+ i = GetListEntry(List, Play); | |
+ if (i >= 0) | |
+ RemoveListEntry(List, i); | |
+ } while (i >= 0); | |
+} | |
+ | |
+/* | |
+ * General logging function. All messages should be given a loglevel, | |
+ * from 0 to 5 (0=vital, 2=normal, 5=maximum debugging output). This | |
+ * is essentially just a wrapper around the GLib g_log function. | |
+ */ | |
+void dopelog(int loglevel, const gchar *format, ...) | |
+{ | |
+ va_list args; | |
+ | |
+ if (!Network) | |
+ return; /* Don't print server log messages when | |
+ * running standalone */ | |
+ va_start(args, format); | |
+ g_logv(G_LOG_DOMAIN, 1 << (loglevel + G_LOG_LEVEL_USER_SHIFT), format, | |
+ args); | |
+ va_end(args); | |
+} | |
+ | |
+/* | |
+ * Returns the bitmask necessary to catch all custom log messages. | |
+ */ | |
+GLogLevelFlags LogMask() | |
+{ | |
+ return ((1 << (MAXLOG)) - 1) << G_LOG_LEVEL_USER_SHIFT; | |
+} | |
+ | |
+void ResizeLocations(int NewNum) | |
+{ | |
+ int i; | |
+ | |
+ if (NewNum < NumLocation) | |
+ for (i = NewNum; i < NumLocation; i++) { | |
g_free(Location[i].Name); | |
- } | |
- Location=g_realloc(Location,sizeof(struct LOCATION)*NewNum); | |
- if (NewNum>NumLocation) { | |
- memset(&Location[NumLocation],0, | |
- (NewNum-NumLocation)*sizeof(struct LOCATION)); | |
- for (i=NumLocation;i<NewNum;i++) { | |
- Location[i].Name=g_strdup(""); | |
- } | |
- } | |
- NumLocation=NewNum; | |
+ } | |
+ Location = g_realloc(Location, sizeof(struct LOCATION) * NewNum); | |
+ if (NewNum > NumLocation) { | |
+ memset(&Location[NumLocation], 0, | |
+ (NewNum - NumLocation) * sizeof(struct LOCATION)); | |
+ for (i = NumLocation; i < NewNum; i++) { | |
+ Location[i].Name = g_strdup(""); | |
+ } | |
+ } | |
+ NumLocation = NewNum; | |
} | |
-void ResizeCops(int NewNum) { | |
- int i; | |
- if (NewNum<NumCop) for (i=NewNum;i<NumCop;i++) { | |
+void ResizeCops(int NewNum) | |
+{ | |
+ int i; | |
+ | |
+ if (NewNum < NumCop) | |
+ for (i = NewNum; i < NumCop; i++) { | |
g_free(Cop[i].Name); | |
g_free(Cop[i].DeputyName); | |
g_free(Cop[i].DeputiesName); | |
- } | |
- Cop=g_realloc(Cop,sizeof(struct COP)*NewNum); | |
- if (NewNum>NumCop) { | |
- memset(&Cop[NumCop],0,(NewNum-NumCop)*sizeof(struct COP)); | |
- for (i=NumCop;i<NewNum;i++) { | |
- Cop[i].Name=g_strdup(""); | |
- Cop[i].DeputyName=g_strdup(""); | |
- Cop[i].DeputiesName=g_strdup(""); | |
- } | |
- } | |
- NumCop=NewNum; | |
+ } | |
+ Cop = g_realloc(Cop, sizeof(struct COP) * NewNum); | |
+ if (NewNum > NumCop) { | |
+ memset(&Cop[NumCop], 0, (NewNum - NumCop) * sizeof(struct COP)); | |
+ for (i = NumCop; i < NewNum; i++) { | |
+ Cop[i].Name = g_strdup(""); | |
+ Cop[i].DeputyName = g_strdup(""); | |
+ Cop[i].DeputiesName = g_strdup(""); | |
+ } | |
+ } | |
+ NumCop = NewNum; | |
} | |
-void ResizeGuns(int NewNum) { | |
- int i; | |
- if (NewNum<NumGun) for (i=NewNum;i<NumGun;i++) { | |
+void ResizeGuns(int NewNum) | |
+{ | |
+ int i; | |
+ | |
+ if (NewNum < NumGun) | |
+ for (i = NewNum; i < NumGun; i++) { | |
g_free(Gun[i].Name); | |
- } | |
- Gun=g_realloc(Gun,sizeof(struct GUN)*NewNum); | |
- if (NewNum>NumGun) { | |
- memset(&Gun[NumGun],0,(NewNum-NumGun)*sizeof(struct GUN)); | |
- for (i=NumGun;i<NewNum;i++) { | |
- Gun[i].Name=g_strdup(""); | |
- } | |
- } | |
- NumGun=NewNum; | |
-} | |
- | |
-void ResizeDrugs(int NewNum) { | |
- int i; | |
- if (NewNum<NumDrug) for (i=NewNum;i<NumDrug;i++) { | |
- g_free(Drug[i].Name); g_free(Drug[i].CheapStr); | |
- } | |
- Drug=g_realloc(Drug,sizeof(struct DRUG)*NewNum); | |
- if (NewNum>NumDrug) { | |
- memset(&Drug[NumDrug],0, | |
- (NewNum-NumDrug)*sizeof(struct DRUG)); | |
- for (i=NumDrug;i<NewNum;i++) { | |
- Drug[i].Name=g_strdup(""); Drug[i].CheapStr=g_strdup(""); | |
- } | |
- } | |
- NumDrug=NewNum; | |
+ } | |
+ Gun = g_realloc(Gun, sizeof(struct GUN) * NewNum); | |
+ if (NewNum > NumGun) { | |
+ memset(&Gun[NumGun], 0, (NewNum - NumGun) * sizeof(struct GUN)); | |
+ for (i = NumGun; i < NewNum; i++) { | |
+ Gun[i].Name = g_strdup(""); | |
+ } | |
+ } | |
+ NumGun = NewNum; | |
} | |
-void ResizeSubway(int NewNum) { | |
- int i; | |
- if (NewNum<NumSubway) for (i=NewNum;i<NumSubway;i++) { | |
- g_free(SubwaySaying[i]); | |
- } | |
- SubwaySaying=g_realloc(SubwaySaying,sizeof(char *)*NewNum); | |
- if (NewNum>NumSubway) for (i=NumSubway;i<NewNum;i++) { | |
- SubwaySaying[i]=g_strdup(""); | |
- } | |
- NumSubway=NewNum; | |
-} | |
+void ResizeDrugs(int NewNum) | |
+{ | |
+ int i; | |
-void ResizePlaying(int NewNum) { | |
- int i; | |
- if (NewNum<NumPlaying) for (i=NewNum;i<NumPlaying;i++) { | |
- g_free(Playing[i]); | |
- } | |
- Playing=g_realloc(Playing,sizeof(char *)*NewNum); | |
- if (NewNum>NumPlaying) for (i=NumPlaying;i<NewNum;i++) { | |
- Playing[i]=g_strdup(""); | |
- } | |
- NumPlaying=NewNum; | |
+ if (NewNum < NumDrug) | |
+ for (i = NewNum; i < NumDrug; i++) { | |
+ g_free(Drug[i].Name); | |
+ g_free(Drug[i].CheapStr); | |
+ } | |
+ Drug = g_realloc(Drug, sizeof(struct DRUG) * NewNum); | |
+ if (NewNum > NumDrug) { | |
+ memset(&Drug[NumDrug], 0, (NewNum - NumDrug) * sizeof(struct DRUG)); | |
+ for (i = NumDrug; i < NewNum; i++) { | |
+ Drug[i].Name = g_strdup(""); | |
+ Drug[i].CheapStr = g_strdup(""); | |
+ } | |
+ } | |
+ NumDrug = NewNum; | |
} | |
-void ResizeStoppedTo(int NewNum) { | |
- int i; | |
- if (NewNum<NumStoppedTo) for (i=NewNum;i<NumStoppedTo;i++) { | |
- g_free(StoppedTo[i]); | |
- } | |
- StoppedTo=g_realloc(StoppedTo,sizeof(char *)*NewNum); | |
- if (NewNum>NumStoppedTo) for (i=NumStoppedTo;i<NewNum;i++) { | |
- StoppedTo[i]=g_strdup(""); | |
- } | |
- NumStoppedTo=NewNum; | |
-} | |
- | |
-void AssignName(gchar **dest,gchar *src) { | |
-/* Sets the dynamically-sized string pointed to by *dest to a copy of */ | |
-/* "src" - src can safely be freed or reused afterwards. Any existing */ | |
-/* string in "dest" is freed. The function returns immediately if src */ | |
-/* and *dest are already the same. */ | |
- if (*dest == src) return; | |
- g_free(*dest); | |
- *dest=g_strdup(src); | |
-} | |
- | |
-void CopyNames(struct NAMES *dest,struct NAMES *src) { | |
- AssignName(&dest->Bitch,_(src->Bitch)); | |
- AssignName(&dest->Bitches,_(src->Bitches)); | |
- AssignName(&dest->Gun,_(src->Gun)); | |
- AssignName(&dest->Guns,_(src->Guns)); | |
- AssignName(&dest->Drug,_(src->Drug)); | |
- AssignName(&dest->Drugs,_(src->Drugs)); | |
- AssignName(&dest->Month,_(src->Month)); | |
- AssignName(&dest->Year,_(src->Year)); | |
- AssignName(&dest->LoanSharkName,_(src->LoanSharkName)); | |
- AssignName(&dest->BankName,_(src->BankName)); | |
- AssignName(&dest->GunShopName,_(src->GunShopName)); | |
- AssignName(&dest->RoughPubName,_(src->RoughPubName)); | |
-} | |
+void ResizeSubway(int NewNum) | |
+{ | |
+ int i; | |
-#ifdef NETWORKING | |
-void CopyMetaServer(struct METASERVER *dest,struct METASERVER *src) { | |
- dest->Active=src->Active; | |
- dest->Port=src->Port; | |
- dest->ProxyPort=src->ProxyPort; | |
- dest->UseSocks=src->UseSocks; | |
- AssignName(&dest->Name,src->Name); | |
- AssignName(&dest->ProxyName,src->ProxyName); | |
- AssignName(&dest->Path,src->Path); | |
- AssignName(&dest->LocalName,src->LocalName); | |
- AssignName(&dest->Password,src->Password); | |
- AssignName(&dest->Comment,src->Comment); | |
- AssignName(&dest->authuser,src->authuser); | |
- AssignName(&dest->authpassword,src->authpassword); | |
- AssignName(&dest->proxyuser,src->proxyuser); | |
- AssignName(&dest->proxypassword,src->proxypassword); | |
+ if (NewNum < NumSubway) | |
+ for (i = NewNum; i < NumSubway; i++) { | |
+ g_free(SubwaySaying[i]); | |
+ } | |
+ SubwaySaying = g_realloc(SubwaySaying, sizeof(char *) * NewNum); | |
+ if (NewNum > NumSubway) | |
+ for (i = NumSubway; i < NewNum; i++) { | |
+ SubwaySaying[i] = g_strdup(""); | |
+ } | |
+ NumSubway = NewNum; | |
} | |
-#endif | |
-void CopyLocation(struct LOCATION *dest,struct LOCATION *src) { | |
- AssignName(&dest->Name,_(src->Name)); | |
- dest->PolicePresence=src->PolicePresence; | |
- dest->MinDrug=src->MinDrug; dest->MaxDrug=src->MaxDrug; | |
-} | |
+void ResizePlaying(int NewNum) | |
+{ | |
+ int i; | |
-void CopyCop(struct COP *dest,struct COP *src) { | |
- AssignName(&dest->Name,_(src->Name)); | |
- AssignName(&dest->DeputyName,_(src->DeputyName)); | |
- AssignName(&dest->DeputiesName,_(src->DeputiesName)); | |
- dest->Armour=src->Armour; | |
- dest->DeputyArmour=src->DeputyArmour; | |
- dest->AttackPenalty=src->AttackPenalty; | |
- dest->DefendPenalty=src->DefendPenalty; | |
- dest->MinDeputies=src->MinDeputies; | |
- dest->MaxDeputies=src->MaxDeputies; | |
- dest->GunIndex=src->GunIndex; | |
- dest->CopGun=src->CopGun; | |
- dest->DeputyGun=src->DeputyGun; | |
+ if (NewNum < NumPlaying) | |
+ for (i = NewNum; i < NumPlaying; i++) { | |
+ g_free(Playing[i]); | |
+ } | |
+ Playing = g_realloc(Playing, sizeof(char *) * NewNum); | |
+ if (NewNum > NumPlaying) | |
+ for (i = NumPlaying; i < NewNum; i++) { | |
+ Playing[i] = g_strdup(""); | |
+ } | |
+ NumPlaying = NewNum; | |
} | |
-void CopyGun(struct GUN *dest,struct GUN *src) { | |
- AssignName(&dest->Name,_(src->Name)); | |
- dest->Price=src->Price; | |
- dest->Space=src->Space; | |
- dest->Damage=src->Damage; | |
+void ResizeStoppedTo(int NewNum) | |
+{ | |
+ int i; | |
+ | |
+ if (NewNum < NumStoppedTo) | |
+ for (i = NewNum; i < NumStoppedTo; i++) { | |
+ g_free(StoppedTo[i]); | |
+ } | |
+ StoppedTo = g_realloc(StoppedTo, sizeof(char *) * NewNum); | |
+ if (NewNum > NumStoppedTo) | |
+ for (i = NumStoppedTo; i < NewNum; i++) { | |
+ StoppedTo[i] = g_strdup(""); | |
+ } | |
+ NumStoppedTo = NewNum; | |
+} | |
+ | |
+/* | |
+ * Sets the dynamically-sized string pointed to by *dest to a copy of | |
+ * "src" - src can safely be freed or reused afterwards. Any existing | |
+ * string in "dest" is freed. The function returns immediately if src | |
+ * and *dest are already the same. | |
+ */ | |
+void AssignName(gchar **dest, gchar *src) | |
+{ | |
+ if (*dest == src) | |
+ return; | |
+ g_free(*dest); | |
+ *dest = g_strdup(src); | |
+} | |
+ | |
+void CopyNames(struct NAMES *dest, struct NAMES *src) | |
+{ | |
+ AssignName(&dest->Bitch, _(src->Bitch)); | |
+ AssignName(&dest->Bitches, _(src->Bitches)); | |
+ AssignName(&dest->Gun, _(src->Gun)); | |
+ AssignName(&dest->Guns, _(src->Guns)); | |
+ AssignName(&dest->Drug, _(src->Drug)); | |
+ AssignName(&dest->Drugs, _(src->Drugs)); | |
+ AssignName(&dest->Month, _(src->Month)); | |
+ AssignName(&dest->Year, _(src->Year)); | |
+ AssignName(&dest->LoanSharkName, _(src->LoanSharkName)); | |
+ AssignName(&dest->BankName, _(src->BankName)); | |
+ AssignName(&dest->GunShopName, _(src->GunShopName)); | |
+ AssignName(&dest->RoughPubName, _(src->RoughPubName)); | |
} | |
-void CopyDrug(struct DRUG *dest,struct DRUG *src) { | |
- AssignName(&dest->Name,_(src->Name)); | |
- dest->MinPrice=src->MinPrice; | |
- dest->MaxPrice=src->MaxPrice; | |
- dest->Cheap=src->Cheap; | |
- dest->Expensive=src->Expensive; | |
- AssignName(&dest->CheapStr,_(src->CheapStr)); | |
+#ifdef NETWORKING | |
+void CopyMetaServer(struct METASERVER *dest, struct METASERVER *src) | |
+{ | |
+ dest->Active = src->Active; | |
+ dest->Port = src->Port; | |
+ dest->ProxyPort = src->ProxyPort; | |
+ dest->UseSocks = src->UseSocks; | |
+ AssignName(&dest->Name, src->Name); | |
+ AssignName(&dest->ProxyName, src->ProxyName); | |
+ AssignName(&dest->Path, src->Path); | |
+ AssignName(&dest->LocalName, src->LocalName); | |
+ AssignName(&dest->Password, src->Password); | |
+ AssignName(&dest->Comment, src->Comment); | |
+ AssignName(&dest->authuser, src->authuser); | |
+ AssignName(&dest->authpassword, src->authpassword); | |
+ AssignName(&dest->proxyuser, src->proxyuser); | |
+ AssignName(&dest->proxypassword, src->proxypassword); | |
} | |
+#endif | |
-void CopyDrugs(struct DRUGS *dest,struct DRUGS *src) { | |
- AssignName(&dest->ExpensiveStr1,_(src->ExpensiveStr1)); | |
- AssignName(&dest->ExpensiveStr2,_(src->ExpensiveStr2)); | |
- dest->CheapDivide=src->CheapDivide; | |
- dest->ExpensiveMultiply=src->ExpensiveMultiply; | |
+void CopyLocation(struct LOCATION *dest, struct LOCATION *src) | |
+{ | |
+ AssignName(&dest->Name, _(src->Name)); | |
+ dest->PolicePresence = src->PolicePresence; | |
+ dest->MinDrug = src->MinDrug; | |
+ dest->MaxDrug = src->MaxDrug; | |
+} | |
+ | |
+void CopyCop(struct COP *dest, struct COP *src) | |
+{ | |
+ AssignName(&dest->Name, _(src->Name)); | |
+ AssignName(&dest->DeputyName, _(src->DeputyName)); | |
+ AssignName(&dest->DeputiesName, _(src->DeputiesName)); | |
+ dest->Armour = src->Armour; | |
+ dest->DeputyArmour = src->DeputyArmour; | |
+ dest->AttackPenalty = src->AttackPenalty; | |
+ dest->DefendPenalty = src->DefendPenalty; | |
+ dest->MinDeputies = src->MinDeputies; | |
+ dest->MaxDeputies = src->MaxDeputies; | |
+ dest->GunIndex = src->GunIndex; | |
+ dest->CopGun = src->CopGun; | |
+ dest->DeputyGun = src->DeputyGun; | |
+} | |
+ | |
+void CopyGun(struct GUN *dest, struct GUN *src) | |
+{ | |
+ AssignName(&dest->Name, _(src->Name)); | |
+ dest->Price = src->Price; | |
+ dest->Space = src->Space; | |
+ dest->Damage = src->Damage; | |
+} | |
+ | |
+void CopyDrug(struct DRUG *dest, struct DRUG *src) | |
+{ | |
+ AssignName(&dest->Name, _(src->Name)); | |
+ dest->MinPrice = src->MinPrice; | |
+ dest->MaxPrice = src->MaxPrice; | |
+ dest->Cheap = src->Cheap; | |
+ dest->Expensive = src->Expensive; | |
+ AssignName(&dest->CheapStr, _(src->CheapStr)); | |
+} | |
+ | |
+void CopyDrugs(struct DRUGS *dest, struct DRUGS *src) | |
+{ | |
+ AssignName(&dest->ExpensiveStr1, _(src->ExpensiveStr1)); | |
+ AssignName(&dest->ExpensiveStr2, _(src->ExpensiveStr2)); | |
+ dest->CheapDivide = src->CheapDivide; | |
+ dest->ExpensiveMultiply = src->ExpensiveMultiply; | |
} | |
static struct PRICES BackupPrices; | |
static struct NAMES BackupNames; | |
-static struct DRUG *BackupDrug=NULL; | |
-static struct GUN *BackupGun=NULL; | |
-static struct LOCATION *BackupLocation=NULL; | |
-static struct CURRENCY BackupCurrency = { NULL,TRUE }; | |
-static gint NumBackupDrug=0,NumBackupGun=0,NumBackupLocation=0; | |
- | |
-void BackupConfig(void) { | |
+static struct DRUG *BackupDrug = NULL; | |
+static struct GUN *BackupGun = NULL; | |
+static struct LOCATION *BackupLocation = NULL; | |
+static struct CURRENCY BackupCurrency = { NULL, TRUE }; | |
+static gint NumBackupDrug = 0, NumBackupGun = 0, NumBackupLocation = 0; | |
+ | |
+void BackupConfig(void) | |
+{ | |
gint i; | |
+ | |
BackupPrices.Spy = Prices.Spy; | |
BackupPrices.Tipoff = Prices.Tipoff; | |
- AssignName(&BackupCurrency.Symbol,Currency.Symbol); | |
+ AssignName(&BackupCurrency.Symbol, Currency.Symbol); | |
BackupCurrency.Prefix = Currency.Prefix; | |
- CopyNames(&BackupNames,&Names); | |
+ CopyNames(&BackupNames, &Names); | |
-/* Free existing backups of guns, drugs, and locations */ | |
- for (i=0;i<NumBackupGun;i++) g_free(BackupGun[i].Name); | |
+ /* Free existing backups of guns, drugs, and locations */ | |
+ for (i = 0; i < NumBackupGun; i++) | |
+ g_free(BackupGun[i].Name); | |
g_free(BackupGun); | |
- for (i=0;i<NumBackupDrug;i++) { | |
+ for (i = 0; i < NumBackupDrug; i++) { | |
g_free(BackupDrug[i].Name); | |
g_free(BackupDrug[i].CheapStr); | |
} | |
g_free(BackupDrug); | |
- for (i=0;i<NumBackupLocation;i++) g_free(BackupLocation[i].Name); | |
+ for (i = 0; i < NumBackupLocation; i++) | |
+ g_free(BackupLocation[i].Name); | |
g_free(BackupLocation); | |
NumBackupGun = NumGun; | |
- BackupGun = g_new0(struct GUN,NumGun); | |
- for (i=0;i<NumGun;i++) CopyGun(&BackupGun[i],&Gun[i]); | |
+ BackupGun = g_new0(struct GUN, NumGun); | |
+ | |
+ for (i = 0; i < NumGun; i++) | |
+ CopyGun(&BackupGun[i], &Gun[i]); | |
NumBackupDrug = NumDrug; | |
- BackupDrug = g_new0(struct DRUG,NumDrug); | |
- for (i=0;i<NumDrug;i++) CopyDrug(&BackupDrug[i],&Drug[i]); | |
+ BackupDrug = g_new0(struct DRUG, NumDrug); | |
+ | |
+ for (i = 0; i < NumDrug; i++) | |
+ CopyDrug(&BackupDrug[i], &Drug[i]); | |
NumBackupLocation = NumLocation; | |
- BackupLocation = g_new0(struct LOCATION,NumLocation); | |
- for (i=0;i<NumLocation;i++) CopyLocation(&BackupLocation[i],&Location[i]); | |
+ BackupLocation = g_new0(struct LOCATION, NumLocation); | |
+ | |
+ for (i = 0; i < NumLocation; i++) | |
+ CopyLocation(&BackupLocation[i], &Location[i]); | |
} | |
-void RestoreConfig(void) { | |
+void RestoreConfig(void) | |
+{ | |
gint i; | |
Prices.Spy = BackupPrices.Spy; | |
Prices.Tipoff = BackupPrices.Tipoff; | |
- CopyNames(&Names,&BackupNames); | |
- AssignName(&Currency.Symbol,BackupCurrency.Symbol); | |
+ CopyNames(&Names, &BackupNames); | |
+ AssignName(&Currency.Symbol, BackupCurrency.Symbol); | |
Currency.Prefix = BackupCurrency.Prefix; | |
ResizeGuns(NumBackupGun); | |
- for (i=0;i<NumGun;i++) CopyGun(&Gun[i],&BackupGun[i]); | |
+ for (i = 0; i < NumGun; i++) | |
+ CopyGun(&Gun[i], &BackupGun[i]); | |
ResizeDrugs(NumBackupDrug); | |
- for (i=0;i<NumDrug;i++) CopyDrug(&Drug[i],&BackupDrug[i]); | |
+ for (i = 0; i < NumDrug; i++) | |
+ CopyDrug(&Drug[i], &BackupDrug[i]); | |
ResizeLocations(NumBackupLocation); | |
- for (i=0;i<NumLocation;i++) CopyLocation(&Location[i],&BackupLocation[i]); | |
+ for (i = 0; i < NumLocation; i++) | |
+ CopyLocation(&Location[i], &BackupLocation[i]); | |
} | |
-void ScannerErrorHandler(GScanner *scanner,gchar *msg,gint error) { | |
- g_print("%s\n",msg); | |
+void ScannerErrorHandler(GScanner *scanner, gchar *msg, gint error) | |
+{ | |
+ g_print("%s\n", msg); | |
} | |
-void ReadConfigFile(char *FileName) { | |
-/* Read a configuration file given by "FileName"; GScanner under Win32 */ | |
-/* doesn't work properly with files, so we use a nasty workaround */ | |
+/* | |
+ * Read a configuration file given by "FileName"; GScanner under Win32 | |
+ * doesn't work properly with files, so we use a nasty workaround. | |
+ */ | |
+void ReadConfigFile(char *FileName) | |
+{ | |
FILE *fp; | |
+ | |
#ifdef CYGWIN | |
char *buf; | |
#endif | |
GScanner *scanner; | |
- fp=fopen(FileName,"r"); | |
+ | |
+ fp = fopen(FileName, "r"); | |
if (fp) { | |
- scanner=g_scanner_new(&ScannerConfig); | |
- scanner->input_name=FileName; | |
- scanner->msg_handler=ScannerErrorHandler; | |
+ scanner = g_scanner_new(&ScannerConfig); | |
+ scanner->input_name = FileName; | |
+ scanner->msg_handler = ScannerErrorHandler; | |
#ifdef CYGWIN | |
- read_string(fp,&buf); if (!buf) { fclose(fp); return; } | |
- g_scanner_input_text(scanner,buf,strlen(buf)); | |
+ read_string(fp, &buf); | |
+ if (!buf) { | |
+ fclose(fp); | |
+ return; | |
+ } | |
+ g_scanner_input_text(scanner, buf, strlen(buf)); | |
#else | |
- g_scanner_input_file(scanner,fileno(fp)); | |
+ g_scanner_input_file(scanner, fileno(fp)); | |
#endif | |
- while (!g_scanner_eof(scanner)) if (!ParseNextConfig(scanner,FALSE)) { | |
- ConfigErrors++; | |
- g_scanner_error(scanner, | |
- _("Unable to process configuration file %s, line %d"), | |
- FileName,g_scanner_cur_line(scanner)); | |
- } | |
+ while (!g_scanner_eof(scanner)) | |
+ if (!ParseNextConfig(scanner, FALSE)) { | |
+ ConfigErrors++; | |
+ g_scanner_error(scanner, | |
+ _("Unable to process configuration file %s, line %d"), | |
+ FileName, g_scanner_cur_line(scanner)); | |
+ } | |
g_scanner_destroy(scanner); | |
fclose(fp); | |
#ifdef CYGWIN | |
t@@ -1468,443 +1768,489 @@ void ReadConfigFile(char *FileName) { | |
} | |
} | |
-gboolean ParseNextConfig(GScanner *scanner,gboolean print) { | |
- GTokenType token; | |
- gchar *ID1,*ID2; | |
- gulong ind=0; | |
- int GlobalIndex; | |
- gboolean IndexGiven=FALSE; | |
- | |
- ID1=ID2=NULL; | |
- token=g_scanner_get_next_token(scanner); | |
- if (token==G_TOKEN_EOF) return TRUE; | |
- if (token!=G_TOKEN_IDENTIFIER) { | |
- g_scanner_unexp_token(scanner,G_TOKEN_IDENTIFIER,NULL,NULL, | |
- NULL,NULL,FALSE); | |
+gboolean ParseNextConfig(GScanner *scanner, gboolean print) | |
+{ | |
+ GTokenType token; | |
+ gchar *ID1, *ID2; | |
+ gulong ind = 0; | |
+ int GlobalIndex; | |
+ gboolean IndexGiven = FALSE; | |
+ | |
+ ID1 = ID2 = NULL; | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token == G_TOKEN_EOF) | |
+ return TRUE; | |
+ if (token != G_TOKEN_IDENTIFIER) { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_IDENTIFIER, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
+ return FALSE; | |
+ } | |
+ ID1 = g_strdup(scanner->value.v_identifier); | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token == G_TOKEN_LEFT_BRACE) { | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token != G_TOKEN_INT) { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_INT, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
return FALSE; | |
- } | |
- ID1=g_strdup(scanner->value.v_identifier); | |
- token=g_scanner_get_next_token(scanner); | |
- if (token==G_TOKEN_LEFT_BRACE) { | |
- token=g_scanner_get_next_token(scanner); | |
- if (token!=G_TOKEN_INT) { | |
- g_scanner_unexp_token(scanner,G_TOKEN_INT,NULL,NULL, | |
- NULL,NULL,FALSE); | |
- return FALSE; | |
- } | |
- ind=scanner->value.v_int; | |
- IndexGiven=TRUE; | |
- token=g_scanner_get_next_token(scanner); | |
- if (token!=G_TOKEN_RIGHT_BRACE) { | |
- g_scanner_unexp_token(scanner,G_TOKEN_RIGHT_BRACE,NULL,NULL, | |
- NULL,NULL,FALSE); | |
- return FALSE; | |
- } | |
- token=g_scanner_get_next_token(scanner); | |
- if (token=='.') { | |
- token=g_scanner_get_next_token(scanner); | |
- if (token!=G_TOKEN_IDENTIFIER) { | |
- g_scanner_unexp_token(scanner,G_TOKEN_IDENTIFIER,NULL,NULL, | |
- NULL,NULL,FALSE); | |
- return FALSE; | |
- } | |
- ID2=g_strdup(scanner->value.v_identifier); | |
- token=g_scanner_get_next_token(scanner); | |
- } | |
- } | |
- GlobalIndex=GetGlobalIndex(ID1,ID2); | |
- g_free(ID1); g_free(ID2); | |
- if (GlobalIndex==-1) return FALSE; | |
- if (token==G_TOKEN_EOF) { | |
- PrintConfigValue(GlobalIndex,(int)ind,IndexGiven,scanner); | |
- return TRUE; | |
- } else if (token==G_TOKEN_EQUAL_SIGN) { | |
- if (CountPlayers(FirstServer)>0) { | |
- g_warning( | |
-_("Configuration can only be changed interactively when no\n" | |
-"players are logged on. Wait for all players to log off, or remove\n" | |
-"them with the push or kill commands, and try again.")); | |
- } else { | |
- if (SetConfigValue(GlobalIndex,(int)ind,IndexGiven,scanner) && print)… | |
- PrintConfigValue(GlobalIndex,(int)ind,IndexGiven,scanner); | |
- } | |
- } | |
- return TRUE; | |
- } else { | |
+ } | |
+ ind = scanner->value.v_int; | |
+ IndexGiven = TRUE; | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token != G_TOKEN_RIGHT_BRACE) { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_RIGHT_BRACE, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
return FALSE; | |
- } | |
- return FALSE; | |
-} | |
- | |
-int GetGlobalIndex(gchar *ID1,gchar *ID2) { | |
- int i; | |
- const int NumGlob=sizeof(Globals)/sizeof(Globals[0]); | |
- if (!ID1) return -1; | |
- for (i=0;i<NumGlob;i++) { | |
- if (g_strcasecmp(ID1,Globals[i].Name)==0 && !Globals[i].NameStruct[0]) { | |
-/* Just a bog-standard ID1=value */ | |
- return i; | |
+ } | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token == '.') { | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token != G_TOKEN_IDENTIFIER) { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_IDENTIFIER, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
+ return FALSE; | |
} | |
- if (g_strcasecmp(ID1,Globals[i].NameStruct)==0 && ID2 && | |
- g_strcasecmp(ID2,Globals[i].Name)==0 && | |
- Globals[i].StructStaticPt && Globals[i].StructListPt) { | |
-/* ID1[index].ID2=value */ | |
- return i; | |
+ ID2 = g_strdup(scanner->value.v_identifier); | |
+ token = g_scanner_get_next_token(scanner); | |
+ } | |
+ } | |
+ GlobalIndex = GetGlobalIndex(ID1, ID2); | |
+ g_free(ID1); | |
+ g_free(ID2); | |
+ if (GlobalIndex == -1) | |
+ return FALSE; | |
+ if (token == G_TOKEN_EOF) { | |
+ PrintConfigValue(GlobalIndex, (int)ind, IndexGiven, scanner); | |
+ return TRUE; | |
+ } else if (token == G_TOKEN_EQUAL_SIGN) { | |
+ if (CountPlayers(FirstServer) > 0) { | |
+ g_warning(_("Configuration can only be changed interactively " | |
+ "when no\nplayers are logged on. Wait for all " | |
+ "players to log off, or remove\nthem with the " | |
+ "push or kill commands, and try again.")); | |
+ } else { | |
+ if (SetConfigValue(GlobalIndex, (int)ind, IndexGiven, scanner) | |
+ && print) { | |
+ PrintConfigValue(GlobalIndex, (int)ind, IndexGiven, scanner); | |
} | |
- } | |
- return -1; | |
-} | |
- | |
-void *GetGlobalPointer(int GlobalIndex,int StructIndex) { | |
- void *ValPt=NULL; | |
- | |
- if (Globals[GlobalIndex].IntVal) { | |
- ValPt=(void *)Globals[GlobalIndex].IntVal; | |
- } else if (Globals[GlobalIndex].PriceVal) { | |
- ValPt=(void *)Globals[GlobalIndex].PriceVal; | |
- } else if (Globals[GlobalIndex].BoolVal) { | |
- ValPt=(void *)Globals[GlobalIndex].BoolVal; | |
- } else if (Globals[GlobalIndex].StringVal) { | |
- ValPt=(void *)Globals[GlobalIndex].StringVal; | |
- } | |
- if (!ValPt) return NULL; | |
- | |
- if (Globals[GlobalIndex].StructStaticPt && | |
- Globals[GlobalIndex].StructListPt) { | |
- return (char *)ValPt-(char *)Globals[GlobalIndex].StructStaticPt + | |
- (char *)*(Globals[GlobalIndex].StructListPt) + | |
- (StructIndex-1)*Globals[GlobalIndex].LenStruct; | |
- } else { | |
- return ValPt; | |
- } | |
-} | |
- | |
-gboolean CheckMaxIndex(GScanner *scanner,int GlobalIndex,int StructIndex, | |
- gboolean IndexGiven) { | |
- if (!Globals[GlobalIndex].MaxIndex || | |
- (Globals[GlobalIndex].StringList && !IndexGiven) || | |
- (IndexGiven && StructIndex>=1 && | |
+ } | |
+ return TRUE; | |
+ } else { | |
+ return FALSE; | |
+ } | |
+ return FALSE; | |
+} | |
+ | |
+int GetGlobalIndex(gchar *ID1, gchar *ID2) | |
+{ | |
+ int i; | |
+ const int NumGlob = sizeof(Globals) / sizeof(Globals[0]); | |
+ | |
+ if (!ID1) | |
+ return -1; | |
+ for (i = 0; i < NumGlob; i++) { | |
+ if (g_strcasecmp(ID1, Globals[i].Name) == 0 | |
+ && !Globals[i].NameStruct[0]) { | |
+ /* Just a bog-standard ID1=value */ | |
+ return i; | |
+ } | |
+ if (g_strcasecmp(ID1, Globals[i].NameStruct) == 0 && ID2 | |
+ && g_strcasecmp(ID2, Globals[i].Name) == 0 | |
+ && Globals[i].StructStaticPt && Globals[i].StructListPt) { | |
+ /* ID1[index].ID2=value */ | |
+ return i; | |
+ } | |
+ } | |
+ return -1; | |
+} | |
+ | |
+void *GetGlobalPointer(int GlobalIndex, int StructIndex) | |
+{ | |
+ void *ValPt = NULL; | |
+ | |
+ if (Globals[GlobalIndex].IntVal) { | |
+ ValPt = (void *)Globals[GlobalIndex].IntVal; | |
+ } else if (Globals[GlobalIndex].PriceVal) { | |
+ ValPt = (void *)Globals[GlobalIndex].PriceVal; | |
+ } else if (Globals[GlobalIndex].BoolVal) { | |
+ ValPt = (void *)Globals[GlobalIndex].BoolVal; | |
+ } else if (Globals[GlobalIndex].StringVal) { | |
+ ValPt = (void *)Globals[GlobalIndex].StringVal; | |
+ } | |
+ if (!ValPt) | |
+ return NULL; | |
+ | |
+ if (Globals[GlobalIndex].StructStaticPt && | |
+ Globals[GlobalIndex].StructListPt) { | |
+ return (char *)ValPt - (char *)Globals[GlobalIndex].StructStaticPt + | |
+ (char *)*(Globals[GlobalIndex].StructListPt) + | |
+ (StructIndex - 1) * Globals[GlobalIndex].LenStruct; | |
+ } else { | |
+ return ValPt; | |
+ } | |
+} | |
+ | |
+gboolean CheckMaxIndex(GScanner *scanner, int GlobalIndex, int StructIndex, | |
+ gboolean IndexGiven) | |
+{ | |
+ if (!Globals[GlobalIndex].MaxIndex || | |
+ (Globals[GlobalIndex].StringList && !IndexGiven) || | |
+ (IndexGiven && StructIndex >= 1 && | |
StructIndex <= *(Globals[GlobalIndex].MaxIndex))) { | |
- return TRUE; | |
- } | |
-/* Error message displayed when you try to set, for example, Drug[10].Name | |
- when NumDrug<10 (%s="Drug" and %d=10 in this example) */ | |
- g_scanner_error(scanner,_("Index into %s array should be between 1 and %d"), | |
- (Globals[GlobalIndex].NameStruct && | |
- Globals[GlobalIndex].NameStruct[0]) ? | |
- Globals[GlobalIndex].NameStruct : | |
- Globals[GlobalIndex].Name, | |
- *(Globals[GlobalIndex].MaxIndex)); | |
- return FALSE; | |
-} | |
- | |
-void PrintConfigValue(int GlobalIndex,int StructIndex,gboolean IndexGiven, | |
- GScanner *scanner) { | |
- gchar *GlobalName; | |
- int i; | |
- if (!CheckMaxIndex(scanner,GlobalIndex,StructIndex,IndexGiven)) return; | |
- if (Globals[GlobalIndex].NameStruct[0]) { | |
- GlobalName=g_strdup_printf("%s[%d].%s",Globals[GlobalIndex].NameStruct, | |
- StructIndex,Globals[GlobalIndex].Name); | |
- } else GlobalName=Globals[GlobalIndex].Name; | |
- if (Globals[GlobalIndex].IntVal) { | |
-/* Display of a numeric config. file variable - e.g. "NumDrug is 6" */ | |
- g_print(_("%s is %d\n"),GlobalName, | |
- *((int *)GetGlobalPointer(GlobalIndex,StructIndex))); | |
- } else if (Globals[GlobalIndex].BoolVal) { | |
-/* Display of a boolean config. file variable - e.g. "DrugValue is TRUE" */ | |
- g_print(_("%s is %s\n"),GlobalName, | |
- *((gboolean *)GetGlobalPointer(GlobalIndex,StructIndex)) ? | |
- _("TRUE") : _("FALSE")); | |
- } else if (Globals[GlobalIndex].PriceVal) { | |
-/* Display of a price config. file variable - e.g. "Bitch.MinPrice is $200" */ | |
- dpg_print(_("%s is %P\n"),GlobalName, | |
- *((price_t *)GetGlobalPointer(GlobalIndex,StructIndex))); | |
- } else if (Globals[GlobalIndex].StringVal) { | |
-/* Display of a string config. file variable - e.g. | |
- "LoanSharkName is \"the loan shark\"" */ | |
- g_print(_("%s is \"%s\"\n"),GlobalName, | |
- *((gchar **)GetGlobalPointer(GlobalIndex,StructIndex))); | |
- } else if (Globals[GlobalIndex].StringList) { | |
- if (IndexGiven) { | |
-/* Display of an indexed string list config. file variable - e.g. | |
- "StoppedTo[1] is have a beer" */ | |
- g_print(_("%s[%d] is %s\n"),GlobalName,StructIndex, | |
- (*(Globals[GlobalIndex].StringList))[StructIndex-1]); | |
- } else { | |
-/* Display of the first part of an entire string list config. file variable - | |
- e.g. "StoppedTo is { " (followed by "have a beer", "smoke a joint" etc.) */ | |
- g_print(_("%s is { "),GlobalName); | |
- if (Globals[GlobalIndex].MaxIndex) { | |
- for (i=0;i<*(Globals[GlobalIndex].MaxIndex);i++) { | |
- if (i>0) g_print(", "); | |
- g_print("\"%s\"",(*(Globals[GlobalIndex].StringList))[i]); | |
- } | |
- } | |
- g_print(" }\n"); | |
- } | |
- } | |
- if (Globals[GlobalIndex].NameStruct[0]) g_free(GlobalName); | |
-} | |
- | |
-gboolean SetConfigValue(int GlobalIndex,int StructIndex,gboolean IndexGiven, | |
- GScanner *scanner) { | |
- gchar *GlobalName,*tmpstr; | |
- GTokenType token; | |
- int IntVal,NewNum; | |
- Player *tmp; | |
- GSList *list,*StartList; | |
- gboolean parsed; | |
- | |
- if (!CheckMaxIndex(scanner,GlobalIndex,StructIndex,IndexGiven)) return FALS… | |
- if (Globals[GlobalIndex].NameStruct[0]) { | |
- GlobalName=g_strdup_printf("%s[%d].%s",Globals[GlobalIndex].NameStruct, | |
- StructIndex,Globals[GlobalIndex].Name); | |
- } else GlobalName=Globals[GlobalIndex].Name; | |
- if (Globals[GlobalIndex].IntVal) { | |
- token=g_scanner_get_next_token(scanner); | |
- if (token==G_TOKEN_INT) { | |
- IntVal=(int)scanner->value.v_int; | |
- if (Globals[GlobalIndex].ResizeFunc) { | |
- (*(Globals[GlobalIndex].ResizeFunc))(IntVal); | |
-/* Displayed, for example, when you set NumDrug=10 to allow Drug[10].Name | |
- etc. to be set */ | |
- g_print(_("Resized structure list to %d elements\n"),IntVal); | |
- for (list=FirstClient;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- UpdatePlayer(tmp); | |
- } | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- UpdatePlayer(tmp); | |
- } | |
- } | |
- *((int *)GetGlobalPointer(GlobalIndex,StructIndex))=IntVal; | |
- } else { | |
- g_scanner_unexp_token(scanner,G_TOKEN_INT,NULL,NULL, | |
- NULL,NULL,FALSE); return FALSE; | |
+ return TRUE; | |
+ } | |
+ /* Error message displayed when you try to set, for example, | |
+ * Drug[10].Name when NumDrug<10 (%s="Drug" and %d=10 in this example) */ | |
+ g_scanner_error(scanner, | |
+ _("Index into %s array should be between 1 and %d"), | |
+ (Globals[GlobalIndex].NameStruct | |
+ && Globals[GlobalIndex]. | |
+ NameStruct[0]) ? Globals[GlobalIndex]. | |
+ NameStruct : Globals[GlobalIndex].Name, | |
+ *(Globals[GlobalIndex].MaxIndex)); | |
+ return FALSE; | |
+} | |
+ | |
+void PrintConfigValue(int GlobalIndex, int StructIndex, | |
+ gboolean IndexGiven, GScanner *scanner) | |
+{ | |
+ gchar *GlobalName; | |
+ int i; | |
+ | |
+ if (!CheckMaxIndex(scanner, GlobalIndex, StructIndex, IndexGiven)) | |
+ return; | |
+ if (Globals[GlobalIndex].NameStruct[0]) { | |
+ GlobalName = | |
+ g_strdup_printf("%s[%d].%s", Globals[GlobalIndex].NameStruct, | |
+ StructIndex, Globals[GlobalIndex].Name); | |
+ } else | |
+ GlobalName = Globals[GlobalIndex].Name; | |
+ if (Globals[GlobalIndex].IntVal) { | |
+ /* Display of a numeric config. file variable - e.g. "NumDrug is 6" */ | |
+ g_print(_("%s is %d\n"), GlobalName, | |
+ *((int *)GetGlobalPointer(GlobalIndex, StructIndex))); | |
+ } else if (Globals[GlobalIndex].BoolVal) { | |
+ /* Display of a boolean config. file variable - e.g. "DrugValue is | |
+ * TRUE" */ | |
+ g_print(_("%s is %s\n"), GlobalName, | |
+ *((gboolean *)GetGlobalPointer(GlobalIndex, StructIndex)) ? | |
+ _("TRUE") : _("FALSE")); | |
+ } else if (Globals[GlobalIndex].PriceVal) { | |
+ /* Display of a price config. file variable - e.g. "Bitch.MinPrice is | |
+ * $200" */ | |
+ dpg_print(_("%s is %P\n"), GlobalName, | |
+ *((price_t *)GetGlobalPointer(GlobalIndex, StructIndex))); | |
+ } else if (Globals[GlobalIndex].StringVal) { | |
+ /* Display of a string config. file variable - e.g. "LoanSharkName is | |
+ * \"the loan shark\"" */ | |
+ g_print(_("%s is \"%s\"\n"), GlobalName, | |
+ *((gchar **)GetGlobalPointer(GlobalIndex, StructIndex))); | |
+ } else if (Globals[GlobalIndex].StringList) { | |
+ if (IndexGiven) { | |
+ /* Display of an indexed string list config. file variable - e.g. | |
+ * "StoppedTo[1] is have a beer" */ | |
+ g_print(_("%s[%d] is %s\n"), GlobalName, StructIndex, | |
+ (*(Globals[GlobalIndex].StringList))[StructIndex - 1]); | |
+ } else { | |
+ /* Display of the first part of an entire string list config. file | |
+ * variable - e.g. "StoppedTo is { " (followed by "have a beer", | |
+ * "smoke a joint" etc.) */ | |
+ g_print(_("%s is { "), GlobalName); | |
+ if (Globals[GlobalIndex].MaxIndex) { | |
+ for (i = 0; i < *(Globals[GlobalIndex].MaxIndex); i++) { | |
+ if (i > 0) | |
+ g_print(", "); | |
+ g_print("\"%s\"", (*(Globals[GlobalIndex].StringList))[i]); | |
+ } | |
} | |
- } else if (Globals[GlobalIndex].BoolVal) { | |
- scanner->config->cset_identifier_first= | |
- G_CSET_a_2_z "01" G_CSET_A_2_Z; | |
- scanner->config->cset_identifier_nth= | |
- G_CSET_a_2_z G_CSET_A_2_Z; | |
- token=g_scanner_get_next_token(scanner); | |
- scanner->config->cset_identifier_first=G_CSET_a_2_z "_" G_CSET_A_2_Z; | |
- scanner->config->cset_identifier_nth= | |
- G_CSET_a_2_z "._0123456789" G_CSET_A_2_Z; | |
- parsed=FALSE; | |
- if (token==G_TOKEN_IDENTIFIER) { | |
- if (g_strcasecmp(scanner->value.v_identifier,_("TRUE"))==0 || | |
- g_strcasecmp(scanner->value.v_identifier,_("YES"))==0 || | |
- g_strcasecmp(scanner->value.v_identifier,_("ON"))==0 || | |
- strcmp(scanner->value.v_identifier,"1")==0) { | |
- parsed=TRUE; | |
- *((gboolean *)GetGlobalPointer(GlobalIndex,StructIndex))=TRUE; | |
- } else if (g_strcasecmp(scanner->value.v_identifier,_("FALSE"))==0 || | |
- g_strcasecmp(scanner->value.v_identifier,_("NO"))==0 || | |
- g_strcasecmp(scanner->value.v_identifier,_("OFF"))==0 || | |
- strcmp(scanner->value.v_identifier,"0")==0) { | |
- parsed=TRUE; | |
- *((gboolean *)GetGlobalPointer(GlobalIndex,StructIndex))=FALSE; | |
- } | |
+ g_print(" }\n"); | |
+ } | |
+ } | |
+ if (Globals[GlobalIndex].NameStruct[0]) | |
+ g_free(GlobalName); | |
+} | |
+ | |
+gboolean SetConfigValue(int GlobalIndex, int StructIndex, | |
+ gboolean IndexGiven, GScanner *scanner) | |
+{ | |
+ gchar *GlobalName, *tmpstr; | |
+ GTokenType token; | |
+ int IntVal, NewNum; | |
+ Player *tmp; | |
+ GSList *list, *StartList; | |
+ gboolean parsed; | |
+ | |
+ if (!CheckMaxIndex(scanner, GlobalIndex, StructIndex, IndexGiven)) | |
+ return FALSE; | |
+ if (Globals[GlobalIndex].NameStruct[0]) { | |
+ GlobalName = | |
+ g_strdup_printf("%s[%d].%s", Globals[GlobalIndex].NameStruct, | |
+ StructIndex, Globals[GlobalIndex].Name); | |
+ } else | |
+ GlobalName = Globals[GlobalIndex].Name; | |
+ if (Globals[GlobalIndex].IntVal) { | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token == G_TOKEN_INT) { | |
+ IntVal = (int)scanner->value.v_int; | |
+ if (Globals[GlobalIndex].ResizeFunc) { | |
+ (*(Globals[GlobalIndex].ResizeFunc)) (IntVal); | |
+ /* Displayed, for example, when you set NumDrug=10 to allow | |
+ * Drug[10].Name etc. to be set */ | |
+ g_print(_("Resized structure list to %d elements\n"), IntVal); | |
+ for (list = FirstClient; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ UpdatePlayer(tmp); | |
+ } | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ UpdatePlayer(tmp); | |
+ } | |
} | |
- if (!parsed) { | |
- g_scanner_unexp_token(scanner,G_TOKEN_NONE,NULL,NULL,NULL, | |
- _("expected a boolean value (one of 0, OFF, NO, FALSE, " | |
- "1, ON, YES, TRUE)"),FALSE); | |
- return FALSE; | |
+ *((int *)GetGlobalPointer(GlobalIndex, StructIndex)) = IntVal; | |
+ } else { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_INT, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
+ return FALSE; | |
+ } | |
+ } else if (Globals[GlobalIndex].BoolVal) { | |
+ scanner->config->cset_identifier_first = | |
+ G_CSET_a_2_z "01" G_CSET_A_2_Z; | |
+ scanner->config->cset_identifier_nth = G_CSET_a_2_z G_CSET_A_2_Z; | |
+ token = g_scanner_get_next_token(scanner); | |
+ scanner->config->cset_identifier_first = G_CSET_a_2_z "_" G_CSET_A_2_Z; | |
+ scanner->config->cset_identifier_nth = | |
+ G_CSET_a_2_z "._0123456789" G_CSET_A_2_Z; | |
+ parsed = FALSE; | |
+ if (token == G_TOKEN_IDENTIFIER) { | |
+ if (g_strcasecmp(scanner->value.v_identifier, _("TRUE")) == 0 || | |
+ g_strcasecmp(scanner->value.v_identifier, _("YES")) == 0 || | |
+ g_strcasecmp(scanner->value.v_identifier, _("ON")) == 0 || | |
+ strcmp(scanner->value.v_identifier, "1") == 0) { | |
+ parsed = TRUE; | |
+ *((gboolean *)GetGlobalPointer(GlobalIndex, StructIndex)) = TRUE; | |
+ } else if (g_strcasecmp(scanner->value.v_identifier, _("FALSE")) == 0 | |
+ || g_strcasecmp(scanner->value.v_identifier, _("NO")) == 0 | |
+ || g_strcasecmp(scanner->value.v_identifier, | |
+ _("OFF")) == 0 | |
+ || strcmp(scanner->value.v_identifier, "0") == 0) { | |
+ parsed = TRUE; | |
+ *((gboolean *)GetGlobalPointer(GlobalIndex, StructIndex)) = FALSE; | |
} | |
- } else if (Globals[GlobalIndex].PriceVal) { | |
- token=g_scanner_get_next_token(scanner); | |
- if (token==G_TOKEN_INT) { | |
- *((price_t *)GetGlobalPointer(GlobalIndex,StructIndex))= | |
- (price_t)scanner->value.v_int; | |
+ } | |
+ if (!parsed) { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_NONE, NULL, NULL, NULL, | |
+ _("expected a boolean value (one of 0, OFF, " | |
+ "NO, FALSE, 1, ON, YES, TRUE)"), FALSE); | |
+ return FALSE; | |
+ } | |
+ } else if (Globals[GlobalIndex].PriceVal) { | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token == G_TOKEN_INT) { | |
+ *((price_t *)GetGlobalPointer(GlobalIndex, StructIndex)) = | |
+ (price_t)scanner->value.v_int; | |
+ } else { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_INT, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
+ return FALSE; | |
+ } | |
+ } else if (Globals[GlobalIndex].StringVal) { | |
+ scanner->config->identifier_2_string = TRUE; | |
+ scanner->config->cset_identifier_first = | |
+ G_CSET_a_2_z " ._0123456789" G_CSET_A_2_Z G_CSET_LATINS | |
+ G_CSET_LATINC; | |
+ scanner->config->cset_identifier_nth = | |
+ G_CSET_a_2_z " ._0123456789" G_CSET_A_2_Z G_CSET_LATINS | |
+ G_CSET_LATINC; | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token == G_TOKEN_STRING) { | |
+ AssignName((gchar **)GetGlobalPointer(GlobalIndex, StructIndex), | |
+ scanner->value.v_string); | |
+ } else if (token == G_TOKEN_IDENTIFIER) { | |
+ AssignName((gchar **)GetGlobalPointer(GlobalIndex, StructIndex), | |
+ scanner->value.v_identifier); | |
+ } else { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_STRING, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
+ } | |
+ scanner->config->identifier_2_string = FALSE; | |
+ scanner->config->cset_identifier_first = G_CSET_a_2_z "_" G_CSET_A_2_Z; | |
+ scanner->config->cset_identifier_nth = | |
+ G_CSET_a_2_z "._0123456789" G_CSET_A_2_Z; | |
+ } else if (Globals[GlobalIndex].StringList) { | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (IndexGiven) { | |
+ if (token == G_TOKEN_STRING) { | |
+ AssignName(&(*(Globals[GlobalIndex].StringList))[StructIndex - 1], | |
+ scanner->value.v_string); | |
} else { | |
- g_scanner_unexp_token(scanner,G_TOKEN_INT,NULL,NULL, | |
- NULL,NULL,FALSE); return FALSE; | |
+ g_scanner_unexp_token(scanner, G_TOKEN_STRING, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
+ return FALSE; | |
} | |
- } else if (Globals[GlobalIndex].StringVal) { | |
- scanner->config->identifier_2_string=TRUE; | |
- scanner->config->cset_identifier_first= | |
- G_CSET_a_2_z " ._0123456789" G_CSET_A_2_Z G_CSET_LATINS G_CSET_LATIN… | |
- scanner->config->cset_identifier_nth= | |
- G_CSET_a_2_z " ._0123456789" G_CSET_A_2_Z G_CSET_LATINS G_CSET_LATIN… | |
- token=g_scanner_get_next_token(scanner); | |
- if (token==G_TOKEN_STRING) { | |
- AssignName((gchar **)GetGlobalPointer(GlobalIndex,StructIndex), | |
- scanner->value.v_string); | |
- } else if (token==G_TOKEN_IDENTIFIER) { | |
- AssignName((gchar **)GetGlobalPointer(GlobalIndex,StructIndex), | |
- scanner->value.v_identifier); | |
- } else { | |
- g_scanner_unexp_token(scanner,G_TOKEN_STRING,NULL,NULL, | |
- NULL,NULL,FALSE); | |
+ } else { | |
+ StartList = NULL; | |
+ if (token != G_TOKEN_LEFT_CURLY) { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_LEFT_CURLY, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
+ return FALSE; | |
} | |
- scanner->config->identifier_2_string=FALSE; | |
- scanner->config->cset_identifier_first=G_CSET_a_2_z "_" G_CSET_A_2_Z; | |
- scanner->config->cset_identifier_nth= | |
- G_CSET_a_2_z "._0123456789" G_CSET_A_2_Z; | |
- } else if (Globals[GlobalIndex].StringList) { | |
- token=g_scanner_get_next_token(scanner); | |
- if (IndexGiven) { | |
- if (token==G_TOKEN_STRING) { | |
- AssignName(&(*(Globals[GlobalIndex].StringList))[StructIndex-1], | |
- scanner->value.v_string); | |
- } else { | |
- g_scanner_unexp_token(scanner,G_TOKEN_STRING,NULL,NULL, | |
- NULL,NULL,FALSE); return FALSE; | |
- } | |
- } else { | |
- StartList=NULL; | |
- if (token!=G_TOKEN_LEFT_CURLY) { | |
- g_scanner_unexp_token(scanner,G_TOKEN_LEFT_CURLY,NULL,NULL, | |
- NULL,NULL,FALSE); return FALSE; | |
- } | |
- NewNum=0; | |
- do { | |
- token=g_scanner_get_next_token(scanner); | |
- if (token==G_TOKEN_STRING) { | |
- tmpstr=g_strdup(scanner->value.v_string); | |
- NewNum++; StartList=g_slist_append(StartList,tmpstr); | |
- } else if (token!=G_TOKEN_RIGHT_CURLY && | |
- token!=G_TOKEN_COMMA) { | |
- g_scanner_unexp_token(scanner,G_TOKEN_STRING,NULL,NULL, | |
- NULL,NULL,FALSE); return FALSE; | |
- } | |
- } while (token!=G_TOKEN_RIGHT_CURLY); | |
- (*Globals[GlobalIndex].ResizeFunc)(NewNum); | |
- NewNum=0; | |
- for (list=StartList;list;NewNum++,list=g_slist_next(list)) { | |
- AssignName(&(*(Globals[GlobalIndex].StringList))[NewNum], | |
- (char *)list->data); | |
- g_free(list->data); | |
- } | |
- g_slist_free(StartList); | |
+ NewNum = 0; | |
+ do { | |
+ token = g_scanner_get_next_token(scanner); | |
+ if (token == G_TOKEN_STRING) { | |
+ tmpstr = g_strdup(scanner->value.v_string); | |
+ NewNum++; | |
+ StartList = g_slist_append(StartList, tmpstr); | |
+ } else if (token != G_TOKEN_RIGHT_CURLY && token != G_TOKEN_COMMA) { | |
+ g_scanner_unexp_token(scanner, G_TOKEN_STRING, NULL, NULL, | |
+ NULL, NULL, FALSE); | |
+ return FALSE; | |
+ } | |
+ } while (token != G_TOKEN_RIGHT_CURLY); | |
+ (*Globals[GlobalIndex].ResizeFunc) (NewNum); | |
+ NewNum = 0; | |
+ for (list = StartList; list; NewNum++, list = g_slist_next(list)) { | |
+ AssignName(&(*(Globals[GlobalIndex].StringList))[NewNum], | |
+ (char *)list->data); | |
+ g_free(list->data); | |
} | |
- } | |
- if (Globals[GlobalIndex].NameStruct[0]) g_free(GlobalName); | |
- return TRUE; | |
-} | |
- | |
-void SetupParameters(void) { | |
-/* Sets up data - such as the location of the high score file - to */ | |
-/* hard-coded internal values, and then processes the global and */ | |
-/* user-specific configuration files */ | |
- char *ConfigFile,*pt; | |
- int i; | |
- | |
-/* Initialise variables */ | |
- srand((unsigned)time(NULL)); | |
- PidFile=NULL; | |
- ConvertFile=NULL; | |
- Location=NULL; | |
- Gun=NULL; | |
- Drug=NULL; | |
- SubwaySaying=Playing=StoppedTo=NULL; | |
- DrugValue=TRUE; | |
- Sanitized=ConfigVerbose=FALSE; | |
- NumLocation=NumGun=NumDrug=0; | |
- FirstClient=FirstServer=NULL; | |
- Noone.Name=g_strdup("Noone"); | |
- WantColour=WantNetwork=TRUE; | |
- WantHelp=WantConvert=WantVersion=WantAntique=WantAdmin=FALSE; | |
- WantedClient=CLIENT_AUTO; | |
- Server=AIPlayer=Client=Network=FALSE; | |
- | |
- Log.Level=2; | |
- Log.Timestamp=g_strdup("[%H:%M:%S] "); | |
- Log.File=g_strdup(""); | |
- | |
- Currency.Symbol = g_strdup("$"); | |
- Currency.Prefix = TRUE; | |
- | |
-/* Set hard-coded default values */ | |
- g_free(HiScoreFile); g_free(ServerName); | |
- HiScoreFile=g_strdup_printf("%s/dopewars.sco",DATADIR); | |
- ServerName=g_strdup("localhost"); | |
- g_free(WebBrowser); | |
- WebBrowser = g_strdup("/usr/bin/mozilla"); | |
- | |
- CopyNames(&Names,&DefaultNames); | |
- CopyDrugs(&Drugs,&DefaultDrugs); | |
+ g_slist_free(StartList); | |
+ } | |
+ } | |
+ if (Globals[GlobalIndex].NameStruct[0]) | |
+ g_free(GlobalName); | |
+ return TRUE; | |
+} | |
+ | |
+/* | |
+ * Sets up data - such as the location of the high score file - to | |
+ * hard-coded internal values, and then processes the global and | |
+ * user-specific configuration files. | |
+ */ | |
+void SetupParameters(void) | |
+{ | |
+ char *ConfigFile, *pt; | |
+ int i; | |
+ | |
+ /* Initialise variables */ | |
+ srand((unsigned)time(NULL)); | |
+ PidFile = NULL; | |
+ ConvertFile = NULL; | |
+ Location = NULL; | |
+ Gun = NULL; | |
+ Drug = NULL; | |
+ SubwaySaying = Playing = StoppedTo = NULL; | |
+ DrugValue = TRUE; | |
+ Sanitized = ConfigVerbose = FALSE; | |
+ NumLocation = NumGun = NumDrug = 0; | |
+ FirstClient = FirstServer = NULL; | |
+ Noone.Name = g_strdup("Noone"); | |
+ WantColour = WantNetwork = TRUE; | |
+ WantHelp = WantConvert = WantVersion = WantAntique = WantAdmin = FALSE; | |
+ WantedClient = CLIENT_AUTO; | |
+ Server = AIPlayer = Client = Network = FALSE; | |
+ | |
+ Log.Level = 2; | |
+ Log.Timestamp = g_strdup("[%H:%M:%S] "); | |
+ Log.File = g_strdup(""); | |
+ | |
+ Currency.Symbol = g_strdup("$"); | |
+ Currency.Prefix = TRUE; | |
+ | |
+ /* Set hard-coded default values */ | |
+ g_free(HiScoreFile); | |
+ g_free(ServerName); | |
+ HiScoreFile = g_strdup_printf("%s/dopewars.sco", DATADIR); | |
+ ServerName = g_strdup("localhost"); | |
+ g_free(WebBrowser); | |
+ WebBrowser = g_strdup("/usr/bin/mozilla"); | |
+ | |
+ CopyNames(&Names, &DefaultNames); | |
+ CopyDrugs(&Drugs, &DefaultDrugs); | |
#ifdef NETWORKING | |
- CopyMetaServer(&MetaServer,&DefaultMetaServer); | |
- AssignName(&Socks.name,"socks"); | |
- Socks.port = 1080; | |
- Socks.version = 4; | |
- Socks.user = g_strdup(""); | |
- Socks.numuid = FALSE; | |
- Socks.authuser = g_strdup(""); | |
- Socks.authpassword = g_strdup(""); | |
- UseSocks = FALSE; | |
+ CopyMetaServer(&MetaServer, &DefaultMetaServer); | |
+ AssignName(&Socks.name, "socks"); | |
+ Socks.port = 1080; | |
+ Socks.version = 4; | |
+ Socks.user = g_strdup(""); | |
+ Socks.numuid = FALSE; | |
+ Socks.authuser = g_strdup(""); | |
+ Socks.authpassword = g_strdup(""); | |
+ UseSocks = FALSE; | |
#endif | |
- ResizeLocations(sizeof(DefaultLocation)/sizeof(DefaultLocation[0])); | |
- for (i=0;i<NumLocation;i++) CopyLocation(&Location[i],&DefaultLocation[i]); | |
- ResizeCops(sizeof(DefaultCop)/sizeof(DefaultCop[0])); | |
- for (i=0;i<NumCop;i++) CopyCop(&Cop[i],&DefaultCop[i]); | |
- ResizeGuns(sizeof(DefaultGun)/sizeof(DefaultGun[0])); | |
- for (i=0;i<NumGun;i++) CopyGun(&Gun[i],&DefaultGun[i]); | |
- ResizeDrugs(sizeof(DefaultDrug)/sizeof(DefaultDrug[0])); | |
- for (i=0;i<NumDrug;i++) CopyDrug(&Drug[i],&DefaultDrug[i]); | |
- ResizeSubway(sizeof(DefaultSubwaySaying)/sizeof(DefaultSubwaySaying[0])); | |
- for (i=0;i<NumSubway;i++) { | |
- AssignName(&SubwaySaying[i],_(DefaultSubwaySaying[i])); | |
- } | |
- ResizePlaying(sizeof(DefaultPlaying)/sizeof(DefaultPlaying[0])); | |
- for (i=0;i<NumPlaying;i++) { | |
- AssignName(&Playing[i],_(DefaultPlaying[i])); | |
- } | |
- ResizeStoppedTo(sizeof(DefaultStoppedTo)/sizeof(DefaultStoppedTo[0])); | |
- for (i=0;i<NumStoppedTo;i++) { | |
- AssignName(&StoppedTo[i],_(DefaultStoppedTo[i])); | |
- } | |
+ ResizeLocations(sizeof(DefaultLocation) / sizeof(DefaultLocation[0])); | |
+ for (i = 0; i < NumLocation; i++) | |
+ CopyLocation(&Location[i], &DefaultLocation[i]); | |
+ ResizeCops(sizeof(DefaultCop) / sizeof(DefaultCop[0])); | |
+ for (i = 0; i < NumCop; i++) | |
+ CopyCop(&Cop[i], &DefaultCop[i]); | |
+ ResizeGuns(sizeof(DefaultGun) / sizeof(DefaultGun[0])); | |
+ for (i = 0; i < NumGun; i++) | |
+ CopyGun(&Gun[i], &DefaultGun[i]); | |
+ ResizeDrugs(sizeof(DefaultDrug) / sizeof(DefaultDrug[0])); | |
+ for (i = 0; i < NumDrug; i++) | |
+ CopyDrug(&Drug[i], &DefaultDrug[i]); | |
+ ResizeSubway(sizeof(DefaultSubwaySaying) / | |
+ sizeof(DefaultSubwaySaying[0])); | |
+ for (i = 0; i < NumSubway; i++) { | |
+ AssignName(&SubwaySaying[i], _(DefaultSubwaySaying[i])); | |
+ } | |
+ ResizePlaying(sizeof(DefaultPlaying) / sizeof(DefaultPlaying[0])); | |
+ for (i = 0; i < NumPlaying; i++) { | |
+ AssignName(&Playing[i], _(DefaultPlaying[i])); | |
+ } | |
+ ResizeStoppedTo(sizeof(DefaultStoppedTo) / sizeof(DefaultStoppedTo[0])); | |
+ for (i = 0; i < NumStoppedTo; i++) { | |
+ AssignName(&StoppedTo[i], _(DefaultStoppedTo[i])); | |
+ } | |
#ifdef CYGWIN | |
-/* Read the global configuration from the directory the binary is | |
- installed in */ | |
- pt=GetBinaryDir(); | |
+ /* Read the global configuration from the directory the binary is | |
+ * installed in */ | |
+ pt = GetBinaryDir(); | |
if (pt) { | |
- ConfigFile=g_strdup_printf("%s/dopewars-config.txt",pt); | |
+ ConfigFile = g_strdup_printf("%s/dopewars-config.txt", pt); | |
ReadConfigFile(ConfigFile); | |
- g_free(ConfigFile); g_free(pt); | |
+ g_free(ConfigFile); | |
+ g_free(pt); | |
} | |
-/* Now read the local configuration from the current directory */ | |
+ /* Now read the local configuration from the current directory */ | |
ReadConfigFile("dopewars-config.txt"); | |
#else /* CYGWIN */ | |
-/* Now read in the global configuration file */ | |
+ /* Now read in the global configuration file */ | |
ReadConfigFile("/etc/dopewars"); | |
-/* Next, try to read in the .dopewars file in the user's home directory */ | |
- pt=getenv("HOME"); | |
+ /* Next, try to read in the .dopewars file in the user's home directory */ | |
+ pt = getenv("HOME"); | |
if (pt) { | |
- ConfigFile=g_strdup_printf("%s/.dopewars",pt); | |
+ ConfigFile = g_strdup_printf("%s/.dopewars", pt); | |
ReadConfigFile(ConfigFile); | |
g_free(ConfigFile); | |
} | |
- | |
#endif /* CYGWIN */ | |
-/* Save this configuration, so we can restore those elements that get | |
- overwritten when we connect to a dopewars server */ | |
+ /* Save this configuration, so we can restore those elements that get | |
+ * overwritten when we connect to a dopewars server */ | |
BackupConfig(); | |
} | |
-void HandleHelpTexts() { | |
- g_print(_("dopewars version %s\n"),VERSION); | |
- if (!WantHelp) return; | |
+void HandleHelpTexts() | |
+{ | |
+ g_print(_("dopewars version %s\n"), VERSION); | |
+ if (!WantHelp) | |
+ return; | |
- g_print( | |
+ g_print( | |
#ifdef HAVE_GETOPT_LONG | |
-/* Usage information, printed when the user runs "dopewars -h" (version | |
- with support for GNU long options) */ | |
-_("Usage: dopewars [OPTION]...\n\ | |
+ /* Usage information, printed when the user runs "dopewars -h" | |
+ * (version with support for GNU long options) */ | |
+ _("Usage: dopewars [OPTION]...\n\ | |
Drug dealing game based on \"Drug Wars\" by John E. Dell\n\ | |
-b, --no-color, \"black and white\" - i.e. do not use pretty colours… | |
--no-colour (by default colours are used where available)\n\ | |
t@@ -1935,11 +2281,11 @@ Drug dealing game based on \"Drug Wars\" by John E. De… | |
-h, --help display this help information\n\ | |
-v, --version output version information and exit\n\n\ | |
dopewars is Copyright (C) Ben Webb 1998-2002, and released under the GNU GPL\n\ | |
-Report bugs to the author at [email protected]\n"),DATADIR); | |
+Report bugs to the author at [email protected]\n"), DATADIR); | |
#else | |
-/* Usage information, printed when the user runs "dopewars -h" (short | |
- options only version) */ | |
-_("Usage: dopewars [OPTION]...\n\ | |
+ /* Usage information, printed when the user runs "dopewars -h" | |
+ * (short options only version) */ | |
+ _("Usage: dopewars [OPTION]...\n\ | |
Drug dealing game based on \"Drug Wars\" by John E. Dell\n\ | |
-b \"black and white\" - i.e. do not use pretty colours\n\ | |
(by default colours are used where the terminal supports them)\n\ | |
t@@ -1968,76 +2314,120 @@ Drug dealing game based on \"Drug Wars\" by John E. D… | |
-h display this help information\n\ | |
-v output version information and exit\n\n\ | |
dopewars is Copyright (C) Ben Webb 1998-2002, and released under the GNU GPL\n\ | |
-Report bugs to the author at [email protected]\n"),DATADIR); | |
+Report bugs to the author at [email protected]\n"), DATADIR); | |
#endif | |
} | |
-void HandleCmdLine(int argc,char *argv[]) { | |
- int c; | |
- static const gchar *options = "anbchvf:o:sSp:g:r:wtC:l:NA"; | |
+void HandleCmdLine(int argc, char *argv[]) | |
+{ | |
+ int c; | |
+ static const gchar *options = "anbchvf:o:sSp:g:r:wtC:l:NA"; | |
+ | |
#ifdef HAVE_GETOPT_LONG | |
- static const struct option long_options[] = { | |
- { "no-color", no_argument, NULL, 'b' }, | |
- { "no-colour", no_argument, NULL, 'b' }, | |
- { "single-player", no_argument, NULL, 'n' }, | |
- { "antique", no_argument, NULL, 'a' }, | |
- { "scorefile", required_argument, NULL, 'f' }, | |
- { "hostname", required_argument, NULL, 'o' }, | |
- { "public-server", no_argument, NULL, 's' }, | |
- { "private-server", no_argument, NULL, 'S' }, | |
- { "port", required_argument, NULL, 'p' }, | |
- { "configfile", required_argument, NULL, 'g' }, | |
- { "pidfile", required_argument, NULL, 'r' }, | |
- { "ai-player", no_argument, NULL, 'c' }, | |
- { "windowed-client", no_argument, NULL, 'w' }, | |
- { "text-client", no_argument, NULL, 't' }, | |
- { "convert", required_argument, NULL, 'C' }, | |
- { "logfile", required_argument, NULL, 'l' }, | |
- { "admin", no_argument, NULL, 'A' }, | |
- { "help", no_argument, NULL, 'h' }, | |
- { "version", no_argument, NULL, 'v' }, | |
- { 0, 0, 0, 0 } | |
- }; | |
+ static const struct option long_options[] = { | |
+ {"no-color", no_argument, NULL, 'b'}, | |
+ {"no-colour", no_argument, NULL, 'b'}, | |
+ {"single-player", no_argument, NULL, 'n'}, | |
+ {"antique", no_argument, NULL, 'a'}, | |
+ {"scorefile", required_argument, NULL, 'f'}, | |
+ {"hostname", required_argument, NULL, 'o'}, | |
+ {"public-server", no_argument, NULL, 's'}, | |
+ {"private-server", no_argument, NULL, 'S'}, | |
+ {"port", required_argument, NULL, 'p'}, | |
+ {"configfile", required_argument, NULL, 'g'}, | |
+ {"pidfile", required_argument, NULL, 'r'}, | |
+ {"ai-player", no_argument, NULL, 'c'}, | |
+ {"windowed-client", no_argument, NULL, 'w'}, | |
+ {"text-client", no_argument, NULL, 't'}, | |
+ {"convert", required_argument, NULL, 'C'}, | |
+ {"logfile", required_argument, NULL, 'l'}, | |
+ {"admin", no_argument, NULL, 'A'}, | |
+ {"help", no_argument, NULL, 'h'}, | |
+ {"version", no_argument, NULL, 'v'}, | |
+ {0, 0, 0, 0} | |
+ }; | |
#endif | |
- do { | |
+ do { | |
#ifdef HAVE_GETOPT_LONG | |
- c=getopt_long(argc,argv,options,long_options,NULL); | |
+ c = getopt_long(argc, argv, options, long_options, NULL); | |
#else | |
- c=getopt(argc,argv,options); | |
+ c = getopt(argc, argv, options); | |
#endif | |
- switch(c) { | |
- case 'n': WantNetwork=FALSE; break; | |
- case 'b': WantColour=FALSE; break; | |
- case 'c': AIPlayer=TRUE; break; | |
- case 'a': WantAntique=TRUE; WantNetwork=FALSE; break; | |
- case 'v': WantVersion=TRUE; break; | |
- case 'h': | |
- case 0 : | |
- case '?': WantHelp=TRUE; break; | |
- case 'f': AssignName(&HiScoreFile,optarg); break; | |
- case 'o': AssignName(&ServerName,optarg); break; | |
- case 's': Server=TRUE; NotifyMetaServer=TRUE; break; | |
- case 'S': Server=TRUE; NotifyMetaServer=FALSE; break; | |
- case 'p': Port=atoi(optarg); break; | |
- case 'g': ReadConfigFile(optarg); break; | |
- case 'r': AssignName(&PidFile,optarg); break; | |
- case 'l': AssignName(&Log.File,optarg); break; | |
- case 'w': WantedClient=CLIENT_WINDOW; break; | |
- case 't': WantedClient=CLIENT_CURSES; break; | |
- case 'C': AssignName(&ConvertFile,optarg); WantConvert=TRUE; break; | |
- case 'A': WantAdmin=TRUE; break; | |
- } | |
- } while (c!=-1); | |
+ switch (c) { | |
+ case 'n': | |
+ WantNetwork = FALSE; | |
+ break; | |
+ case 'b': | |
+ WantColour = FALSE; | |
+ break; | |
+ case 'c': | |
+ AIPlayer = TRUE; | |
+ break; | |
+ case 'a': | |
+ WantAntique = TRUE; | |
+ WantNetwork = FALSE; | |
+ break; | |
+ case 'v': | |
+ WantVersion = TRUE; | |
+ break; | |
+ case 'h': | |
+ case 0: | |
+ case '?': | |
+ WantHelp = TRUE; | |
+ break; | |
+ case 'f': | |
+ AssignName(&HiScoreFile, optarg); | |
+ break; | |
+ case 'o': | |
+ AssignName(&ServerName, optarg); | |
+ break; | |
+ case 's': | |
+ Server = TRUE; | |
+ NotifyMetaServer = TRUE; | |
+ break; | |
+ case 'S': | |
+ Server = TRUE; | |
+ NotifyMetaServer = FALSE; | |
+ break; | |
+ case 'p': | |
+ Port = atoi(optarg); | |
+ break; | |
+ case 'g': | |
+ ReadConfigFile(optarg); | |
+ break; | |
+ case 'r': | |
+ AssignName(&PidFile, optarg); | |
+ break; | |
+ case 'l': | |
+ AssignName(&Log.File, optarg); | |
+ break; | |
+ case 'w': | |
+ WantedClient = CLIENT_WINDOW; | |
+ break; | |
+ case 't': | |
+ WantedClient = CLIENT_CURSES; | |
+ break; | |
+ case 'C': | |
+ AssignName(&ConvertFile, optarg); | |
+ WantConvert = TRUE; | |
+ break; | |
+ case 'A': | |
+ WantAdmin = TRUE; | |
+ break; | |
+ } | |
+ } while (c != -1); | |
} | |
-void GeneralStartup(int argc,char *argv[]) { | |
-/* Does general startup stuff (config. files, command line, and high | |
- score init.) */ | |
- | |
- ConfigErrors=0; | |
+/* | |
+ * Does general startup stuff (config. files, command line, and high | |
+ * score init.) | |
+ */ | |
+void GeneralStartup(int argc, char *argv[]) | |
+{ | |
+ ConfigErrors = 0; | |
SetupParameters(); | |
- HandleCmdLine(argc,argv); | |
+ HandleCmdLine(argc, argv); | |
if (!WantVersion && !WantHelp && !AIPlayer && !WantConvert && !WantAdmin) { | |
OpenHighScoreFile(); | |
t@@ -2046,119 +2436,141 @@ void GeneralStartup(int argc,char *argv[]) { | |
} | |
} | |
-GString *GetLogString(GLogLevelFlags log_level,const gchar *message) { | |
-/* Returns the text to be displayed in a log message, if any. */ | |
- GString *text; | |
- gchar TimeBuf[80]; | |
- gint i; | |
- time_t tim; | |
- struct tm *timep; | |
- | |
- text=g_string_new(""); | |
- if (Log.Timestamp) { | |
- tim=time(NULL); | |
- timep=localtime(&tim); | |
- strftime(TimeBuf,80,Log.Timestamp,timep); | |
- TimeBuf[79]='\0'; | |
- g_string_append(text,TimeBuf); | |
- } | |
- | |
- for (i=0;i<MAXLOG;i++) if (log_level&(1<<(G_LOG_LEVEL_USER_SHIFT+i))) { | |
- if (i>Log.Level) { g_string_free(text,TRUE); return NULL; } | |
- g_string_sprintfa(text,"%d: ",i); | |
- } | |
- g_string_append(text,message); | |
- return text; | |
-} | |
- | |
-void OpenLog(void) { | |
+/* | |
+ * Returns the text to be displayed in a log message, if any. | |
+ */ | |
+GString *GetLogString(GLogLevelFlags log_level, const gchar *message) | |
+{ | |
+ GString *text; | |
+ gchar TimeBuf[80]; | |
+ gint i; | |
+ time_t tim; | |
+ struct tm *timep; | |
+ | |
+ text = g_string_new(""); | |
+ if (Log.Timestamp) { | |
+ tim = time(NULL); | |
+ timep = localtime(&tim); | |
+ strftime(TimeBuf, 80, Log.Timestamp, timep); | |
+ TimeBuf[79] = '\0'; | |
+ g_string_append(text, TimeBuf); | |
+ } | |
+ | |
+ for (i = 0; i < MAXLOG; i++) | |
+ if (log_level & (1 << (G_LOG_LEVEL_USER_SHIFT + i))) { | |
+ if (i > Log.Level) { | |
+ g_string_free(text, TRUE); | |
+ return NULL; | |
+ } | |
+ g_string_sprintfa(text, "%d: ", i); | |
+ } | |
+ g_string_append(text, message); | |
+ return text; | |
+} | |
+ | |
+void OpenLog(void) | |
+{ | |
CloseLog(); | |
- if (Log.File[0]=='\0') return; | |
- Log.fp = fopen(Log.File,"a"); | |
+ if (Log.File[0] == '\0') | |
+ return; | |
+ Log.fp = fopen(Log.File, "a"); | |
if (Log.fp) { | |
-#ifdef SETVBUF_REVERSED /* 2nd and 3rd arguments are reversed on some systems … | |
- setvbuf(Log.fp,_IOLBF,(char *)NULL,0); | |
+#ifdef SETVBUF_REVERSED /* 2nd and 3rd arguments are reversed on | |
+ * some systems */ | |
+ setvbuf(Log.fp, _IOLBF, (char *)NULL, 0); | |
#else | |
- setvbuf(Log.fp,(char *)NULL,_IOLBF,0); | |
+ setvbuf(Log.fp, (char *)NULL, _IOLBF, 0); | |
#endif | |
} | |
} | |
-void CloseLog(void) { | |
- if (Log.fp) fclose(Log.fp); | |
+void CloseLog(void) | |
+{ | |
+ if (Log.fp) | |
+ fclose(Log.fp); | |
Log.fp = NULL; | |
} | |
#ifndef CYGWIN | |
#if NETWORKING && !GUI_SERVER | |
-static void ServerLogMessage(const gchar *log_domain,GLogLevelFlags log_level, | |
- const gchar *message,gpointer user_data) { | |
- GString *text; | |
- text=GetLogString(log_level,message); | |
- if (text) { | |
- fprintf(Log.fp ? Log.fp : stdout,"%s\n",text->str); | |
- g_string_free(text,TRUE); | |
- } | |
+static void ServerLogMessage(const gchar *log_domain, | |
+ GLogLevelFlags log_level, | |
+ const gchar *message, gpointer user_data) | |
+{ | |
+ GString *text; | |
+ | |
+ text = GetLogString(log_level, message); | |
+ if (text) { | |
+ fprintf(Log.fp ? Log.fp : stdout, "%s\n", text->str); | |
+ g_string_free(text, TRUE); | |
+ } | |
} | |
#endif | |
-/* Standard program entry - Win32 uses WinMain() instead, in winmain.c */ | |
-int main(int argc,char *argv[]) { | |
+/* | |
+ * Standard program entry - Win32 uses WinMain() instead, in winmain.c | |
+ */ | |
+int main(int argc, char *argv[]) | |
+{ | |
#ifdef ENABLE_NLS | |
- setlocale(LC_ALL,""); | |
- bindtextdomain(PACKAGE,LOCALEDIR); | |
- textdomain(PACKAGE); | |
+ setlocale(LC_ALL, ""); | |
+ bindtextdomain(PACKAGE, LOCALEDIR); | |
+ textdomain(PACKAGE); | |
#endif | |
- GeneralStartup(argc,argv); | |
- OpenLog(); | |
- if (WantVersion || WantHelp) { | |
- HandleHelpTexts(); | |
- } else if (WantAdmin) { | |
- AdminServer(); | |
- } else if (WantConvert) { | |
- ConvertHighScoreFile(); | |
- } else { | |
+ GeneralStartup(argc, argv); | |
+ OpenLog(); | |
+ if (WantVersion || WantHelp) { | |
+ HandleHelpTexts(); | |
+ } else if (WantAdmin) { | |
+ AdminServer(); | |
+ } else if (WantConvert) { | |
+ ConvertHighScoreFile(); | |
+ } else { | |
#ifdef NETWORKING | |
- StartNetworking(); | |
+ StartNetworking(); | |
#endif | |
- if (Server) { | |
+ if (Server) { | |
#ifdef NETWORKING | |
#ifdef GUI_SERVER | |
- gtk_set_locale(); | |
- gtk_init(&argc,&argv); | |
- GuiServerLoop(FALSE); | |
+ gtk_set_locale(); | |
+ gtk_init(&argc, &argv); | |
+ GuiServerLoop(FALSE); | |
#else | |
- g_log_set_handler(NULL,LogMask(),ServerLogMessage,NULL); | |
- ServerLoop(); | |
+ g_log_set_handler(NULL, LogMask(), ServerLogMessage, NULL); | |
+ ServerLoop(); | |
#endif /* GUI_SERVER */ | |
#else | |
- g_print(_("This binary has been compiled without networking " | |
- "support, and thus cannot run\nin server mode. " | |
- "Recompile passing --enable-networking to the " | |
- "configure script.\n")); | |
+ g_print(_("This binary has been compiled without networking " | |
+ "support, and thus cannot run\nin server mode. " | |
+ "Recompile passing --enable-networking to the " | |
+ "configure script.\n")); | |
#endif /* NETWORKING */ | |
- } else if (AIPlayer) { | |
- AIPlayerLoop(); | |
- } else switch(WantedClient) { | |
- case CLIENT_AUTO: | |
- if (!GtkLoop(&argc,&argv,TRUE)) CursesLoop(); | |
- break; | |
- case CLIENT_WINDOW: | |
- GtkLoop(&argc,&argv,FALSE); break; | |
- case CLIENT_CURSES: | |
- CursesLoop(); break; | |
- } | |
+ } else if (AIPlayer) { | |
+ AIPlayerLoop(); | |
+ } else | |
+ switch (WantedClient) { | |
+ case CLIENT_AUTO: | |
+ if (!GtkLoop(&argc, &argv, TRUE)) | |
+ CursesLoop(); | |
+ break; | |
+ case CLIENT_WINDOW: | |
+ GtkLoop(&argc, &argv, FALSE); | |
+ break; | |
+ case CLIENT_CURSES: | |
+ CursesLoop(); | |
+ break; | |
+ } | |
#ifdef NETWORKING | |
- StopNetworking(); | |
+ StopNetworking(); | |
#endif | |
- } | |
- CloseLog(); | |
- CloseHighScoreFile(); | |
- g_free(PidFile); | |
- g_free(Log.File); | |
- g_free(ConvertFile); | |
- return 0; | |
+ } | |
+ CloseLog(); | |
+ CloseHighScoreFile(); | |
+ g_free(PidFile); | |
+ g_free(Log.File); | |
+ g_free(ConvertFile); | |
+ return 0; | |
} | |
#endif /* CYGWIN */ | |
diff --git a/src/dopewars.h b/src/dopewars.h | |
t@@ -1,23 +1,24 @@ | |
-/* dopewars.h Common structures and stuff for dopewars */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * dopewars.h Common structures and stuff for dopewars * | |
+ * 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 __DOPEWARS_H__ | |
#define __DOPEWARS_H__ | |
t@@ -28,8 +29,8 @@ | |
#include <stdio.h> | |
-/* Be careful not to include both sys/time.h and time.h on those systems */ | |
-/* which don't like it */ | |
+/* Be careful not to include both sys/time.h and time.h on those systems | |
+ * which don't like it */ | |
#if TIME_WITH_SYS_TIME | |
#include <sys/time.h> | |
#include <time.h> | |
t@@ -54,39 +55,43 @@ typedef long long price_t; | |
#endif | |
/* "Abilities" are protocol extensions, which are negotiated between the | |
- client and server at connect-time. */ | |
+ * client and server at connect-time. */ | |
typedef enum { | |
- A_PLAYERID = 0, /* Use numeric IDs rather than player names | |
- in network messages */ | |
- A_DRUGVALUE, /* Server keeps track of purchase price of drugs */ | |
- A_NEWFIGHT, /* Use new unified fighting code */ | |
- A_TSTRING, /* We understand the %Txx (tstring) notation */ | |
- | |
- A_NUM /* N.B. Must be last */ | |
+ A_PLAYERID = 0, /* Use numeric IDs rather than player | |
+ * names in network messages */ | |
+ A_DRUGVALUE, /* Server keeps track of purchase price | |
+ * of drugs */ | |
+ A_NEWFIGHT, /* Use new unified fighting code */ | |
+ A_TSTRING, /* We understand the %Txx (tstring) | |
+ * notation */ | |
+ A_NUM /* N.B. Must be last */ | |
} AbilType; | |
typedef struct ABILITIES { | |
- gboolean Local[A_NUM]; /* Abilities that we have */ | |
- gboolean Remote[A_NUM]; /* Those that the other end of the connection has … | |
- gboolean Shared[A_NUM]; /* Abilites shared by us and the remote host */ | |
+ gboolean Local[A_NUM]; /* Abilities that we have */ | |
+ gboolean Remote[A_NUM]; /* Those that the other end of the | |
+ * connection has */ | |
+ gboolean Shared[A_NUM]; /* Abilites shared by us and the | |
+ * remote host */ | |
} Abilities; | |
struct NAMES { | |
- gchar *Bitch,*Bitches,*Gun,*Guns,*Drug,*Drugs,*Month,*Year, | |
- *LoanSharkName,*BankName,*GunShopName,*RoughPubName; | |
+ gchar *Bitch, *Bitches, *Gun, *Guns, *Drug, *Drugs; | |
+ gchar *Month, *Year, *LoanSharkName, *BankName; | |
+ gchar *GunShopName, *RoughPubName; | |
}; | |
#ifdef NETWORKING | |
struct METASERVER { | |
- gboolean Active; | |
- gchar *Name; | |
- unsigned Port; | |
- gchar *ProxyName; | |
- unsigned ProxyPort; | |
- gchar *Path,*LocalName,*Password,*Comment; | |
- gboolean UseSocks; | |
- gchar *authuser,*authpassword,*proxyuser,*proxypassword; | |
+ gboolean Active; | |
+ gchar *Name; | |
+ unsigned Port; | |
+ gchar *ProxyName; | |
+ unsigned ProxyPort; | |
+ gchar *Path, *LocalName, *Password, *Comment; | |
+ gboolean UseSocks; | |
+ gchar *authuser, *authpassword, *proxyuser, *proxypassword; | |
}; | |
#endif | |
t@@ -96,49 +101,49 @@ struct CURRENCY { | |
}; | |
struct PRICES { | |
- price_t Spy,Tipoff; | |
+ price_t Spy, Tipoff; | |
}; | |
struct BITCH { | |
- price_t MinPrice,MaxPrice; | |
+ price_t MinPrice, MaxPrice; | |
}; | |
typedef enum { | |
- CLIENT_AUTO, CLIENT_WINDOW, CLIENT_CURSES | |
+ CLIENT_AUTO, CLIENT_WINDOW, CLIENT_CURSES | |
} ClientType; | |
typedef enum { | |
- DM_NONE, DM_STREET, DM_FIGHT, DM_DEAL | |
+ DM_NONE, DM_STREET, DM_FIGHT, DM_DEAL | |
} DispMode; | |
typedef enum { | |
- E_NONE = 0, | |
- E_SUBWAY, E_OFFOBJECT, E_WEED, E_SAYING, E_LOANSHARK, | |
- E_BANK, E_GUNSHOP, E_ROUGHPUB, E_HIREBITCH, E_ARRIVE, | |
- E_MAX, | |
+ E_NONE = 0, | |
+ E_SUBWAY, E_OFFOBJECT, E_WEED, E_SAYING, E_LOANSHARK, | |
+ E_BANK, E_GUNSHOP, E_ROUGHPUB, E_HIREBITCH, E_ARRIVE, | |
+ E_MAX, | |
- E_FINISH = 100, | |
+ E_FINISH = 100, | |
- E_OUTOFSYNC = 120, | |
- E_FIGHT, E_FIGHTASK, E_DOCTOR, | |
- E_MAXOOS | |
+ E_OUTOFSYNC = 120, | |
+ E_FIGHT, E_FIGHTASK, E_DOCTOR, | |
+ E_MAXOOS | |
} EventCode; | |
typedef enum { | |
- FIRSTTURN = 1 << 0, | |
- DEADHARDASS = 1 << 1, | |
- TIPPEDOFF = 1 << 2, | |
- SPIEDON = 1 << 3, | |
- SPYINGON = 1 << 4, | |
- FIGHTING = 1 << 5, | |
- CANSHOOT = 1 << 6, | |
- TRADING = 1 << 7 | |
+ FIRSTTURN = 1 << 0, | |
+ DEADHARDASS = 1 << 1, | |
+ TIPPEDOFF = 1 << 2, | |
+ SPIEDON = 1 << 3, | |
+ SPYINGON = 1 << 4, | |
+ FIGHTING = 1 << 5, | |
+ CANSHOOT = 1 << 6, | |
+ TRADING = 1 << 7 | |
} PlayerFlags; | |
typedef enum { | |
- ACID = 0, | |
- COCAINE, HASHISH, HEROIN, LUDES, MDA, OPIUM, PCP, | |
- PEYOTE, SHROOMS, SPEED, WEED | |
+ ACID = 0, | |
+ COCAINE, HASHISH, HEROIN, LUDES, MDA, OPIUM, PCP, | |
+ PEYOTE, SHROOMS, SPEED, WEED | |
} DrugIndex; | |
struct LOG { | |
t@@ -147,16 +152,16 @@ struct LOG { | |
gchar *Timestamp; | |
FILE *fp; | |
}; | |
- | |
-extern int ClientSock,ListenSock; | |
-extern gboolean Network,Client,Server,NotifyMetaServer,AIPlayer; | |
+extern int ClientSock, ListenSock; | |
+extern gboolean Network, Client, Server, NotifyMetaServer, AIPlayer; | |
extern unsigned Port; | |
-extern gboolean Sanitized,ConfigVerbose,DrugValue; | |
-extern int NumLocation,NumGun,NumCop,NumDrug,NumSubway,NumPlaying,NumStoppedTo; | |
-extern gchar *HiScoreFile,*ServerName,*ConvertFile; | |
-extern gboolean WantHelp,WantVersion,WantAntique,WantColour, | |
- WantNetwork,WantConvert,WantAdmin; | |
+extern gboolean Sanitized, ConfigVerbose, DrugValue; | |
+extern int NumLocation, NumGun, NumCop, NumDrug, NumSubway, NumPlaying, | |
+ NumStoppedTo; | |
+extern gchar *HiScoreFile, *ServerName, *ConvertFile; | |
+extern gboolean WantHelp, WantVersion, WantAntique, WantColour, | |
+ WantNetwork, WantConvert, WantAdmin; | |
#ifdef CYGWIN | |
extern gboolean MinToSysTray; | |
#else | |
t@@ -164,13 +169,13 @@ extern gboolean Daemonize; | |
#endif | |
extern gchar *WebBrowser; | |
extern ClientType WantedClient; | |
-extern int LoanSharkLoc,BankLoc,GunShopLoc,RoughPubLoc; | |
-extern int DrugSortMethod,FightTimeout,IdleTimeout,ConnectTimeout; | |
-extern int MaxClients,AITurnPause; | |
+extern int LoanSharkLoc, BankLoc, GunShopLoc, RoughPubLoc; | |
+extern int DrugSortMethod, FightTimeout, IdleTimeout, ConnectTimeout; | |
+extern int MaxClients, AITurnPause; | |
extern struct CURRENCY Currency; | |
extern struct PRICES Prices; | |
extern struct BITCH Bitch; | |
-extern price_t StartCash,StartDebt; | |
+extern price_t StartCash, StartDebt; | |
extern struct NAMES Names; | |
#ifdef NETWORKING | |
t@@ -180,7 +185,7 @@ extern gboolean UseSocks; | |
#endif | |
extern int NumTurns; | |
-extern int PlayerArmour,BitchArmour; | |
+extern int PlayerArmour, BitchArmour; | |
#define MAXLOG 6 | |
t@@ -190,64 +195,64 @@ extern int PlayerArmour,BitchArmour; | |
#define DS_CHEAPLAST 4 | |
#define DS_MAX 5 | |
-#define NUMHISCORE 18 | |
+#define NUMHISCORE 18 | |
-#define DEFLOANSHARK 1 | |
-#define DEFBANK 1 | |
-#define DEFGUNSHOP 2 | |
-#define DEFROUGHPUB 2 | |
+#define DEFLOANSHARK 1 | |
+#define DEFBANK 1 | |
+#define DEFGUNSHOP 2 | |
+#define DEFROUGHPUB 2 | |
-#define METAVERSION 2 | |
+#define METAVERSION 2 | |
struct COP { | |
- gchar *Name,*DeputyName,*DeputiesName; | |
- gint Armour,DeputyArmour; | |
- gint AttackPenalty,DefendPenalty; | |
- gint MinDeputies,MaxDeputies; | |
- gint GunIndex; | |
- gint CopGun,DeputyGun; | |
+ gchar *Name, *DeputyName, *DeputiesName; | |
+ gint Armour, DeputyArmour; | |
+ gint AttackPenalty, DefendPenalty; | |
+ gint MinDeputies, MaxDeputies; | |
+ gint GunIndex; | |
+ gint CopGun, DeputyGun; | |
}; | |
extern struct COP *Cop; | |
struct GUN { | |
- gchar *Name; | |
- price_t Price; | |
- int Space; | |
- int Damage; | |
+ gchar *Name; | |
+ price_t Price; | |
+ int Space; | |
+ int Damage; | |
}; | |
extern struct GUN *Gun; | |
struct HISCORE { | |
- gchar *Time; | |
- price_t Money; | |
- gboolean Dead; | |
- gchar *Name; | |
+ gchar *Time; | |
+ price_t Money; | |
+ gboolean Dead; | |
+ gchar *Name; | |
}; | |
struct LOCATION { | |
- gchar *Name; | |
- int PolicePresence; | |
- int MinDrug,MaxDrug; | |
+ gchar *Name; | |
+ int PolicePresence; | |
+ int MinDrug, MaxDrug; | |
}; | |
extern struct LOCATION *Location; | |
struct DRUG { | |
- gchar *Name; | |
- price_t MinPrice,MaxPrice; | |
- gboolean Cheap,Expensive; | |
- gchar *CheapStr; | |
+ gchar *Name; | |
+ price_t MinPrice, MaxPrice; | |
+ gboolean Cheap, Expensive; | |
+ gchar *CheapStr; | |
}; | |
extern struct DRUG *Drug; | |
struct DRUGS { | |
- gchar *ExpensiveStr1,*ExpensiveStr2; | |
- int CheapDivide,ExpensiveMultiply; | |
+ gchar *ExpensiveStr1, *ExpensiveStr2; | |
+ int CheapDivide, ExpensiveMultiply; | |
}; | |
extern struct DRUGS Drugs; | |
struct INVENTORY { | |
- price_t Price,TotalValue; | |
- int Carried; | |
+ price_t Price, TotalValue; | |
+ int Carried; | |
}; | |
typedef struct INVENTORY Inventory; | |
t@@ -255,43 +260,47 @@ struct PLAYER_T; | |
typedef struct PLAYER_T Player; | |
struct TDopeEntry { | |
- Player *Play; | |
- int Turns; | |
+ Player *Play; | |
+ int Turns; | |
}; | |
typedef struct TDopeEntry DopeEntry; | |
struct TDopeList { | |
- DopeEntry *Data; | |
- int Number; | |
+ DopeEntry *Data; | |
+ int Number; | |
}; | |
typedef struct TDopeList DopeList; | |
struct PLAYER_T { | |
- guint ID; | |
- int Turn; | |
- price_t Cash,Debt,Bank; | |
- int Health; | |
- int CoatSize; | |
- char IsAt; | |
- PlayerFlags Flags; | |
- gchar *Name; | |
- Inventory *Guns,*Drugs,Bitches; | |
- EventCode EventNum,ResyncNum; | |
- time_t FightTimeout,IdleTimeout,ConnectTimeout; | |
- price_t DocPrice; | |
- DopeList SpyList,TipList; | |
- Player *OnBehalfOf; | |
+ guint ID; | |
+ int Turn; | |
+ price_t Cash, Debt, Bank; | |
+ int Health; | |
+ int CoatSize; | |
+ char IsAt; | |
+ PlayerFlags Flags; | |
+ gchar *Name; | |
+ Inventory *Guns, *Drugs, Bitches; | |
+ EventCode EventNum, ResyncNum; | |
+ time_t FightTimeout, IdleTimeout, ConnectTimeout; | |
+ price_t DocPrice; | |
+ DopeList SpyList, TipList; | |
+ Player *OnBehalfOf; | |
#ifdef NETWORKING | |
- NetworkBuffer NetBuf; | |
+ NetworkBuffer NetBuf; | |
#endif | |
- Abilities Abil; | |
- GPtrArray *FightArray; /* If non-NULL, a list of players in a fight */ | |
- Player *Attacking; /* The player that this player is attacking */ | |
- gint CopIndex; /* if >0, then this player is a cop, described | |
- by Cop[CopIndex-1] | |
- if ==0, this is a normal player that has killed no cops | |
- if <0, then this is a normal player, who has killed | |
- cops up to Cop[-1-CopIndex] */ | |
+ Abilities Abil; | |
+ GPtrArray *FightArray; /* If non-NULL, a list of players | |
+ * in a fight */ | |
+ Player *Attacking; /* The player that this player | |
+ * is attacking */ | |
+ gint CopIndex; /* if >0, then this player is a cop, | |
+ * described by Cop[CopIndex-1]; | |
+ * if ==0, this is a normal player that | |
+ * has killed no cops; | |
+ * if <0, then this is a normal player, | |
+ * who has killed cops up to | |
+ * Cop[-1-CopIndex] */ | |
}; | |
#define SN_PROMPT "(Prompt)" | |
t@@ -299,25 +308,25 @@ struct PLAYER_T { | |
#define SN_SINGLE "(Single)" | |
typedef struct tag_serverdata { | |
- char *Name; | |
- unsigned Port; | |
- int MaxPlayers,CurPlayers; | |
- char *Comment,*Version,*Update,*UpSince; | |
+ char *Name; | |
+ unsigned Port; | |
+ int MaxPlayers, CurPlayers; | |
+ char *Comment, *Version, *Update, *UpSince; | |
} ServerData; | |
struct GLOBALS { | |
- int *IntVal; | |
- gboolean *BoolVal; | |
- price_t *PriceVal; | |
- gchar **StringVal; | |
- gchar ***StringList; | |
- char *Name,*Help; | |
- | |
- void **StructListPt,*StructStaticPt; | |
- int LenStruct; | |
- char *NameStruct; | |
- int *MaxIndex; | |
- void (*ResizeFunc)(int NewNum); | |
+ int *IntVal; | |
+ gboolean *BoolVal; | |
+ price_t *PriceVal; | |
+ gchar **StringVal; | |
+ gchar ***StringList; | |
+ char *Name, *Help; | |
+ | |
+ void **StructListPt, *StructStaticPt; | |
+ int LenStruct; | |
+ char *NameStruct; | |
+ int *MaxIndex; | |
+ void (*ResizeFunc) (int NewNum); | |
}; | |
extern const int NUMGLOB; | |
t@@ -332,36 +341,35 @@ extern GScannerConfig ScannerConfig; | |
extern struct LOG Log; | |
extern gint ConfigErrors; | |
-GSList *RemovePlayer(Player *Play,GSList *First); | |
-Player *GetPlayerByID(guint ID,GSList *First); | |
-Player *GetPlayerByName(gchar *Name,GSList *First); | |
+GSList *RemovePlayer(Player *Play, GSList *First); | |
+Player *GetPlayerByID(guint ID, GSList *First); | |
+Player *GetPlayerByName(gchar *Name, GSList *First); | |
int CountPlayers(GSList *First); | |
-GSList *AddPlayer(int fd,Player *NewPlayer,GSList *First); | |
+GSList *AddPlayer(int fd, Player *NewPlayer, GSList *First); | |
void UpdatePlayer(Player *Play); | |
-void CopyPlayer(Player *Dest,Player *Src); | |
-void ClearInventory(Inventory *Guns,Inventory *Drugs); | |
-int IsCarryingRandom(Player *Play,int amount); | |
-void ChangeSpaceForInventory(Inventory *Guns,Inventory *Drugs, | |
+void CopyPlayer(Player *Dest, Player *Src); | |
+void ClearInventory(Inventory *Guns, Inventory *Drugs); | |
+int IsCarryingRandom(Player *Play, int amount); | |
+void ChangeSpaceForInventory(Inventory *Guns, Inventory *Drugs, | |
Player *Play); | |
void InitList(DopeList *List); | |
-void AddListEntry(DopeList *List,DopeEntry *NewEntry); | |
-void RemoveListEntry(DopeList *List,int Entry); | |
-int GetListEntry(DopeList *List,Player *Play); | |
-void RemoveListPlayer(DopeList *List,Player *Play); | |
-void RemoveAllEntries(DopeList *List,Player *Play); | |
+void AddListEntry(DopeList *List, DopeEntry *NewEntry); | |
+void RemoveListEntry(DopeList *List, int Entry); | |
+int GetListEntry(DopeList *List, Player *Play); | |
+void RemoveListPlayer(DopeList *List, Player *Play); | |
+void RemoveAllEntries(DopeList *List, Player *Play); | |
void ClearList(DopeList *List); | |
int TotalGunsCarried(Player *Play); | |
-int read_string(FILE *fp,char **buf); | |
-int brandom(int bot,int top); | |
-price_t prandom(price_t bot,price_t top); | |
-void AddInventory(Inventory *Cumul,Inventory *Add,int Length); | |
-void TruncateInventoryFor(Inventory *Guns,Inventory *Drugs, | |
- Player *Play); | |
-void PrintInventory(Inventory *Guns,Inventory *Drugs); | |
+int read_string(FILE *fp, char **buf); | |
+int brandom(int bot, int top); | |
+price_t prandom(price_t bot, price_t top); | |
+void AddInventory(Inventory *Cumul, Inventory *Add, int Length); | |
+void TruncateInventoryFor(Inventory *Guns, Inventory *Drugs, Player *Play); | |
+void PrintInventory(Inventory *Guns, Inventory *Drugs); | |
price_t strtoprice(char *buf); | |
gchar *pricetostr(price_t price); | |
gchar *FormatPrice(price_t price); | |
-char IsInventoryClear(Inventory *Guns,Inventory *Drugs); | |
+char IsInventoryClear(Inventory *Guns, Inventory *Drugs); | |
void ResizeLocations(int NewNum); | |
void ResizeCops(int NewNum); | |
void ResizeGuns(int NewNum); | |
t@@ -369,39 +377,40 @@ void ResizeDrugs(int NewNum); | |
void ResizeSubway(int NewNum); | |
void ResizePlaying(int NewNum); | |
void ResizeStoppedTo(int NewNum); | |
-void AssignName(gchar **dest,gchar *src); | |
-void CopyNames(struct NAMES *dest,struct NAMES *src); | |
+void AssignName(gchar **dest, gchar *src); | |
+void CopyNames(struct NAMES *dest, struct NAMES *src); | |
+ | |
#ifdef NETWORKING | |
-void CopyMetaServer(struct METASERVER *dest,struct METASERVER *src); | |
+void CopyMetaServer(struct METASERVER *dest, struct METASERVER *src); | |
#endif | |
-void CopyLocation(struct LOCATION *dest,struct LOCATION *src); | |
-void CopyCop(struct COP *dest,struct COP *src); | |
-void CopyGun(struct GUN *dest,struct GUN *src); | |
-void CopyDrug(struct DRUG *dest,struct DRUG *src); | |
-void CopyDrugs(struct DRUGS *dest,struct DRUGS *src); | |
-int GetNextDrugIndex(int OldIndex,Player *Play); | |
+void CopyLocation(struct LOCATION *dest, struct LOCATION *src); | |
+void CopyCop(struct COP *dest, struct COP *src); | |
+void CopyGun(struct GUN *dest, struct GUN *src); | |
+void CopyDrug(struct DRUG *dest, struct DRUG *src); | |
+void CopyDrugs(struct DRUGS *dest, struct DRUGS *src); | |
+int GetNextDrugIndex(int OldIndex, Player *Play); | |
gchar *InitialCaps(gchar *string); | |
char StartsWithVowel(char *string); | |
char *GetPlayerName(Player *Play); | |
-void SetPlayerName(Player *Play,char *Name); | |
-void HandleCmdLine(int argc,char *argv[]); | |
+void SetPlayerName(Player *Play, char *Name); | |
+void HandleCmdLine(int argc, char *argv[]); | |
void SetupParameters(void); | |
void HandleHelpTexts(void); | |
-void GeneralStartup(int argc,char *argv[]); | |
+void GeneralStartup(int argc, char *argv[]); | |
void ReadConfigFile(char *FileName); | |
-gboolean ParseNextConfig(GScanner *scanner,gboolean print); | |
-int GetGlobalIndex(gchar *ID1,gchar *ID2); | |
-void *GetGlobalPointer(int GlobalIndex,int StructIndex); | |
-void PrintConfigValue(int GlobalIndex,int StructIndex,gboolean IndexGiven, | |
- GScanner *scanner); | |
-gboolean SetConfigValue(int GlobalIndex,int StructIndex,gboolean IndexGiven, | |
- GScanner *scanner); | |
+gboolean ParseNextConfig(GScanner *scanner, gboolean print); | |
+int GetGlobalIndex(gchar *ID1, gchar *ID2); | |
+void *GetGlobalPointer(int GlobalIndex, int StructIndex); | |
+void PrintConfigValue(int GlobalIndex, int StructIndex, | |
+ gboolean IndexGiven, GScanner *scanner); | |
+gboolean SetConfigValue(int GlobalIndex, int StructIndex, | |
+ gboolean IndexGiven, GScanner *scanner); | |
gboolean IsCop(Player *Play); | |
-void dopelog(int loglevel,const gchar *format,...); | |
+void dopelog(int loglevel, const gchar *format, ...); | |
GLogLevelFlags LogMask(void); | |
-GString *GetLogString(GLogLevelFlags log_level,const gchar *message); | |
+GString *GetLogString(GLogLevelFlags log_level, const gchar *message); | |
void RestoreConfig(void); | |
-void ScannerErrorHandler(GScanner *scanner,gchar *msg,gint error); | |
+void ScannerErrorHandler(GScanner *scanner, gchar *msg, gint error); | |
void OpenLog(void); | |
void CloseLog(void); | |
gboolean IsConnectedPlayer(Player *play); | |
diff --git a/src/error.c b/src/error.c | |
t@@ -1,42 +1,46 @@ | |
-/* error.c Error-handling routines for dopewars */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * error.c Error-handling routines for dopewars * | |
+ * 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 <glib.h> /* For GString functions */ | |
-#include <string.h> /* For strerror */ | |
+#include <glib.h> /* For GString functions */ | |
+#include <string.h> /* For strerror */ | |
#ifdef CYGWIN | |
-#include <windows.h> /* For FormatMessage() etc. */ | |
-#include <winsock.h> /* For WSAxxx constants */ | |
+#include <windows.h> /* For FormatMessage() etc. */ | |
+#include <winsock.h> /* For WSAxxx constants */ | |
#else | |
-#include <netdb.h> /* For h_errno error codes */ | |
+#include <netdb.h> /* For h_errno error codes */ | |
#endif | |
#include "error.h" | |
#include "nls.h" | |
-void FreeError(LastError *error) { | |
- if (!error) return; | |
+void FreeError(LastError *error) | |
+{ | |
+ if (!error) | |
+ return; | |
if (error->type && error->type->FreeErrorData) { | |
(*error->type->FreeErrorData)(error); | |
} else { | |
t@@ -45,129 +49,151 @@ void FreeError(LastError *error) { | |
g_free(error); | |
} | |
-LastError *NewError(ErrorType *type,gint code,gpointer data) { | |
+LastError *NewError(ErrorType *type, gint code, gpointer data) | |
+{ | |
LastError *error; | |
- error = g_new0(LastError,1); | |
- error->type=type; | |
- error->code=code; | |
- error->data=data; | |
+ error = g_new0(LastError, 1); | |
+ | |
+ error->type = type; | |
+ error->code = code; | |
+ error->data = data; | |
return error; | |
} | |
-void SetError(LastError **error,ErrorType *type,gint code,gpointer data) { | |
- if (!error) return; | |
- if (*error) FreeError(*error); | |
- *error = NewError(type,code,data); | |
+void SetError(LastError **error, ErrorType *type, gint code, gpointer data) | |
+{ | |
+ if (!error) | |
+ return; | |
+ if (*error) | |
+ FreeError(*error); | |
+ *error = NewError(type, code, data); | |
} | |
-void LookupErrorCode(GString *str,gint code,ErrTable *table, | |
- gchar *fallbackstr) { | |
- for (;table && table->string;table++) { | |
- if (code==table->code) { | |
- g_string_append(str,_(table->string)); | |
+void LookupErrorCode(GString *str, gint code, ErrTable *table, | |
+ gchar *fallbackstr) | |
+{ | |
+ for (; table && table->string; table++) { | |
+ if (code == table->code) { | |
+ g_string_append(str, _(table->string)); | |
return; | |
} | |
} | |
- g_string_sprintfa(str,fallbackstr,code); | |
+ g_string_sprintfa(str, fallbackstr, code); | |
} | |
/* "Custom" error handling */ | |
static ErrTable CustomErrStr[] = { | |
- { E_FULLBUF,N_("Connection dropped due to full buffer") }, | |
- { 0,NULL } | |
+ {E_FULLBUF, N_("Connection dropped due to full buffer")}, | |
+ {0, NULL} | |
}; | |
-void CustomAppendError(GString *str,LastError *error) { | |
- LookupErrorCode(str,error->code,CustomErrStr,_("Internal error code %d")); | |
+void CustomAppendError(GString *str, LastError *error) | |
+{ | |
+ LookupErrorCode(str, error->code, CustomErrStr, | |
+ _("Internal error code %d")); | |
} | |
-static ErrorType ETCustom = { CustomAppendError,NULL }; | |
+static ErrorType ETCustom = { CustomAppendError, NULL }; | |
ErrorType *ET_CUSTOM = &ETCustom; | |
-/* "errno" error handling */ | |
-void ErrnoAppendError(GString *str,LastError *error) { | |
- g_string_append(str,strerror(error->code)); | |
+/* | |
+ * "errno" error handling | |
+ */ | |
+void ErrnoAppendError(GString *str, LastError *error) | |
+{ | |
+ g_string_append(str, strerror(error->code)); | |
} | |
-static ErrorType ETErrno = { ErrnoAppendError,NULL }; | |
+static ErrorType ETErrno = { ErrnoAppendError, NULL }; | |
ErrorType *ET_ERRNO = &ETErrno; | |
#ifdef CYGWIN | |
/* Winsock error handling */ | |
static ErrTable WSAErrStr[] = { | |
-/* These are the explanations of the various Windows Sockets error codes */ | |
- { WSANOTINITIALISED,N_("WinSock has not been properly initialised") }, | |
- { WSASYSNOTREADY,N_("Network subsystem is not ready") }, | |
- { WSAVERNOTSUPPORTED,N_("WinSock version not supported") }, | |
- { WSAENETDOWN,N_("The network subsystem has failed") }, | |
- { WSAEADDRINUSE,N_("Address already in use") }, | |
- { WSAENETDOWN,N_("Cannot reach the network") }, | |
- { WSAETIMEDOUT,N_("The connection timed out") }, | |
- { WSAEMFILE,N_("Out of file descriptors") }, | |
- { WSAENOBUFS,N_("Out of buffer space") }, | |
- { WSAEOPNOTSUPP,N_("Operation not supported") }, | |
- { WSAECONNABORTED,N_("Connection aborted due to failure") }, | |
- { WSAECONNRESET,N_("Connection reset by remote host") }, | |
- { WSAECONNREFUSED,N_("Connection refused") }, | |
- { WSAEAFNOSUPPORT,N_("Address family not supported") }, | |
- { WSAEPROTONOSUPPORT,N_("Protocol not supported") }, | |
- { WSAESOCKTNOSUPPORT,N_("Socket type not supported") }, | |
- { WSAHOST_NOT_FOUND,N_("Host not found") }, | |
- { WSATRY_AGAIN,N_("Temporary name server error - try again later") }, | |
- { WSANO_RECOVERY,N_("Failed to contact nameserver") }, | |
- { WSANO_DATA,N_("Valid name, but no DNS data record present") }, | |
- { 0,NULL } | |
+ /* These are the explanations of the various | |
+ * Windows Sockets error codes */ | |
+ {WSANOTINITIALISED, N_("WinSock has not been properly initialised")}, | |
+ {WSASYSNOTREADY, N_("Network subsystem is not ready")}, | |
+ {WSAVERNOTSUPPORTED, N_("WinSock version not supported")}, | |
+ {WSAENETDOWN, N_("The network subsystem has failed")}, | |
+ {WSAEADDRINUSE, N_("Address already in use")}, | |
+ {WSAENETDOWN, N_("Cannot reach the network")}, | |
+ {WSAETIMEDOUT, N_("The connection timed out")}, | |
+ {WSAEMFILE, N_("Out of file descriptors")}, | |
+ {WSAENOBUFS, N_("Out of buffer space")}, | |
+ {WSAEOPNOTSUPP, N_("Operation not supported")}, | |
+ {WSAECONNABORTED, N_("Connection aborted due to failure")}, | |
+ {WSAECONNRESET, N_("Connection reset by remote host")}, | |
+ {WSAECONNREFUSED, N_("Connection refused")}, | |
+ {WSAEAFNOSUPPORT, N_("Address family not supported")}, | |
+ {WSAEPROTONOSUPPORT, N_("Protocol not supported")}, | |
+ {WSAESOCKTNOSUPPORT, N_("Socket type not supported")}, | |
+ {WSAHOST_NOT_FOUND, N_("Host not found")}, | |
+ {WSATRY_AGAIN, N_("Temporary name server error - try again later")}, | |
+ {WSANO_RECOVERY, N_("Failed to contact nameserver")}, | |
+ {WSANO_DATA, N_("Valid name, but no DNS data record present")}, | |
+ {0, NULL} | |
}; | |
-void WinsockAppendError(GString *str,LastError *error) { | |
- LookupErrorCode(str,error->code,WSAErrStr,_("Network error code %d")); | |
+void WinsockAppendError(GString *str, LastError *error) | |
+{ | |
+ LookupErrorCode(str, error->code, WSAErrStr, _("Network error code %d")); | |
} | |
-static ErrorType ETWinsock = { WinsockAppendError,NULL }; | |
+static ErrorType ETWinsock = { WinsockAppendError, NULL }; | |
ErrorType *ET_WINSOCK = &ETWinsock; | |
-/* Standard Win32 "GetLastError" handling */ | |
-void Win32AppendError(GString *str,LastError *error) { | |
+/* | |
+ * Standard Win32 "GetLastError" handling | |
+ */ | |
+void Win32AppendError(GString *str, LastError *error) | |
+{ | |
LPTSTR lpMsgBuf; | |
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, | |
- NULL,error->code,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), | |
- (LPTSTR)&lpMsgBuf,0,NULL); | |
- g_string_append(str,lpMsgBuf); | |
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | | |
+ FORMAT_MESSAGE_FROM_SYSTEM, NULL, error->code, | |
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | |
+ (LPTSTR) & lpMsgBuf, 0, NULL); | |
+ g_string_append(str, lpMsgBuf); | |
LocalFree(lpMsgBuf); | |
} | |
-static ErrorType ETWin32 = { Win32AppendError,NULL }; | |
+static ErrorType ETWin32 = { Win32AppendError, NULL }; | |
ErrorType *ET_WIN32 = &ETWin32; | |
#else | |
/* h_errno error handling */ | |
static ErrTable DNSErrStr[] = { | |
-/* These are the explanations of the various name server error codes */ | |
- { HOST_NOT_FOUND,N_("Host not found") }, | |
- { TRY_AGAIN,N_("Temporary name server error - try again later") }, | |
- { 0,NULL } | |
+ /* These are the explanations of the various name server error codes */ | |
+ {HOST_NOT_FOUND, N_("Host not found")}, | |
+ {TRY_AGAIN, N_("Temporary name server error - try again later")}, | |
+ {0, NULL} | |
}; | |
-void HErrnoAppendError(GString *str,LastError *error) { | |
- LookupErrorCode(str,error->code,DNSErrStr,_("Name server error code %d")); | |
+void HErrnoAppendError(GString *str, LastError *error) | |
+{ | |
+ LookupErrorCode(str, error->code, DNSErrStr, | |
+ _("Name server error code %d")); | |
} | |
-static ErrorType ETHErrno = { HErrnoAppendError,NULL }; | |
+static ErrorType ETHErrno = { HErrnoAppendError, NULL }; | |
ErrorType *ET_HERRNO = ÐErrno; | |
#endif /* CYGWIN */ | |
-void g_string_assign_error(GString *str,LastError *error) { | |
- g_string_truncate(str,0); | |
- g_string_append_error(str,error); | |
+void g_string_assign_error(GString *str, LastError *error) | |
+{ | |
+ g_string_truncate(str, 0); | |
+ g_string_append_error(str, error); | |
} | |
-void g_string_append_error(GString *str,LastError *error) { | |
- if (!error || !error->type) return; | |
- (*error->type->AppendErrorString)(str,error); | |
+void g_string_append_error(GString *str, LastError *error) | |
+{ | |
+ if (!error || !error->type) | |
+ return; | |
+ (*error->type->AppendErrorString) (str, error); | |
} | |
diff --git a/src/error.h b/src/error.h | |
t@@ -1,23 +1,24 @@ | |
-/* error.h Header file for dopewars error-handling routines */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * error.h Header file for dopewars error-handling routines * | |
+ * 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 __ERROR_H__ | |
#define __ERROR_H__ | |
t@@ -30,8 +31,8 @@ | |
struct _LastError; | |
typedef struct _ErrorType { | |
- void (*AppendErrorString)(GString *str,struct _LastError *error); | |
- void (*FreeErrorData)(struct _LastError *error); | |
+ void (*AppendErrorString) (GString *str, struct _LastError *error); | |
+ void (*FreeErrorData) (struct _LastError *error); | |
} ErrorType; | |
typedef struct _LastError { | |
t@@ -40,15 +41,16 @@ typedef struct _LastError { | |
gpointer data; | |
} LastError; | |
-extern ErrorType *ET_CUSTOM,*ET_ERRNO; | |
+extern ErrorType *ET_CUSTOM, *ET_ERRNO; | |
+ | |
#ifdef CYGWIN | |
-extern ErrorType *ET_WIN32,*ET_WINSOCK; | |
+extern ErrorType *ET_WIN32, *ET_WINSOCK; | |
#else | |
extern ErrorType *ET_HERRNO; | |
#endif | |
typedef enum { | |
- E_FULLBUF | |
+ E_FULLBUF | |
} CustomErrorCode; | |
typedef struct _ErrTable { | |
t@@ -57,11 +59,12 @@ typedef struct _ErrTable { | |
} ErrTable; | |
void FreeError(LastError *error); | |
-LastError *NewError(ErrorType *type,gint code,gpointer data); | |
-void SetError(LastError **error,ErrorType *type,gint code,gpointer data); | |
-void LookupErrorCode(GString *str,gint code,ErrTable *table, | |
+LastError *NewError(ErrorType *type, gint code, gpointer data); | |
+void SetError(LastError **error, ErrorType *type, gint code, | |
+ gpointer data); | |
+void LookupErrorCode(GString *str, gint code, ErrTable *table, | |
gchar *fallbackstr); | |
-void g_string_assign_error(GString *str,LastError *error); | |
-void g_string_append_error(GString *str,LastError *error); | |
+void g_string_assign_error(GString *str, LastError *error); | |
+void g_string_append_error(GString *str, LastError *error); | |
#endif /* __ERROR_H__ */ | |
diff --git a/src/gtk_client.c b/src/gtk_client.c | |
t@@ -1,22 +1,24 @@ | |
-/* gtk_client.c dopewars client using the GTK+ toolkit */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * gtk_client.c dopewars client using the GTK+ toolkit * | |
+ * 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> | |
t@@ -46,53 +48,53 @@ | |
#define ET_TIPOFF 1 | |
/* Which notebook page to display in the New Game dialog */ | |
-static gint NewGameType=0; | |
+static gint NewGameType = 0; | |
struct InventoryWidgets { | |
- GtkWidget *HereList,*CarriedList; | |
- GtkWidget *HereFrame,*CarriedFrame; | |
- GtkWidget *BuyButton,*SellButton,*DropButton; | |
- GtkWidget *vbbox; | |
+ GtkWidget *HereList, *CarriedList; | |
+ GtkWidget *HereFrame, *CarriedFrame; | |
+ GtkWidget *BuyButton, *SellButton, *DropButton; | |
+ GtkWidget *vbbox; | |
}; | |
struct StatusWidgets { | |
- GtkWidget *Location,*Date,*SpaceName,*SpaceValue,*CashName,*CashValue, | |
- *DebtName,*DebtValue,*BankName,*BankValue, | |
- *GunsName,*GunsValue,*BitchesName,*BitchesValue, | |
- *HealthName,*HealthValue; | |
+ GtkWidget *Location, *Date, *SpaceName, *SpaceValue, *CashName; | |
+ GtkWidget *CashValue, *DebtName, *DebtValue, *BankName, *BankValue; | |
+ GtkWidget *GunsName, *GunsValue, *BitchesName, *BitchesValue; | |
+ GtkWidget *HealthName, *HealthValue; | |
}; | |
struct ClientDataStruct { | |
- GtkWidget *window,*messages; | |
- Player *Play; | |
- GtkItemFactory *Menu; | |
- struct StatusWidgets Status; | |
- struct InventoryWidgets Drug,Gun,InvenDrug,InvenGun; | |
- GtkWidget *JetButton,*vbox,*PlayerList,*TalkList; | |
- guint JetAccel; | |
+ GtkWidget *window, *messages; | |
+ Player *Play; | |
+ GtkItemFactory *Menu; | |
+ struct StatusWidgets Status; | |
+ struct InventoryWidgets Drug, Gun, InvenDrug, InvenGun; | |
+ GtkWidget *JetButton, *vbox, *PlayerList, *TalkList; | |
+ guint JetAccel; | |
}; | |
struct StartGameStruct { | |
- GtkWidget *dialog,*name,*hostname,*port,*antique,*status,*metaserv; | |
+ GtkWidget *dialog, *name, *hostname, *port, *antique, *status, *metaserv; | |
#ifdef NETWORKING | |
- HttpConnection *MetaConn; | |
- GSList *NewMetaList; | |
+ HttpConnection *MetaConn; | |
+ GSList *NewMetaList; | |
#endif | |
}; | |
static struct ClientDataStruct ClientData; | |
-static gboolean InGame=FALSE; | |
- | |
-static GtkWidget *FightDialog=NULL,*SpyReportsDialog; | |
-static gboolean IsShowingPlayerList=FALSE,IsShowingTalkList=FALSE, | |
- IsShowingInventory=FALSE,IsShowingGunShop=FALSE; | |
- | |
-static void display_intro(GtkWidget *widget,gpointer data); | |
-static void QuitGame(GtkWidget *widget,gpointer data); | |
-static void DestroyGtk(GtkWidget *widget,gpointer data); | |
-static void NewGame(GtkWidget *widget,gpointer data); | |
-static void ListScores(GtkWidget *widget,gpointer data); | |
-static void ListInventory(GtkWidget *widget,gpointer data); | |
+static gboolean InGame = FALSE; | |
+ | |
+static GtkWidget *FightDialog = NULL, *SpyReportsDialog; | |
+static gboolean IsShowingPlayerList = FALSE, IsShowingTalkList = FALSE; | |
+static gboolean IsShowingInventory = FALSE, IsShowingGunShop = FALSE; | |
+ | |
+static void display_intro(GtkWidget *widget, gpointer data); | |
+static void QuitGame(GtkWidget *widget, gpointer data); | |
+static void DestroyGtk(GtkWidget *widget, gpointer data); | |
+static void NewGame(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); | |
t@@ -100,1698 +102,1913 @@ 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, | |
+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 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; | |
+static GSList *MetaList = NULL; | |
#endif /* NETWORKING */ | |
-static void HandleClientMessage(char *buf,Player *Play); | |
+static void HandleClientMessage(char *buf, Player *Play); | |
static void PrepareHighScoreDialog(void); | |
static void AddScoreToDialog(char *Data); | |
static void CompleteHighScoreDialog(gboolean AtEnd); | |
static void PrintMessage(char *Data); | |
static void DisplayFightMessage(char *Data); | |
static GtkWidget *CreateStatusWidgets(struct StatusWidgets *Status); | |
-static void DisplayStats(Player *Play,struct StatusWidgets *Status); | |
+static void DisplayStats(Player *Play, struct StatusWidgets *Status); | |
static void UpdateStatus(Player *Play); | |
static void SetJetButtonTitle(GtkAccelGroup *accel_group); | |
static void UpdateInventory(struct InventoryWidgets *Inven, | |
- Inventory *Objects,int NumObjects, | |
+ Inventory *Objects, int NumObjects, | |
gboolean AreDrugs); | |
-static void JetButtonPressed(GtkWidget *widget,gpointer data); | |
-static void DealDrugs(GtkWidget *widget,gpointer data); | |
-static void DealGuns(GtkWidget *widget,gpointer data); | |
-static void QuestionDialog(char *Data,Player *From); | |
+static void JetButtonPressed(GtkWidget *widget, gpointer data); | |
+static void DealDrugs(GtkWidget *widget, gpointer data); | |
+static void DealGuns(GtkWidget *widget, gpointer data); | |
+static void QuestionDialog(char *Data, Player *From); | |
static void TransferDialog(gboolean Debt); | |
-static void ListPlayers(GtkWidget *widget,gpointer data); | |
-static void TalkToAll(GtkWidget *widget,gpointer data); | |
-static void TalkToPlayers(GtkWidget *widget,gpointer data); | |
+static void ListPlayers(GtkWidget *widget, gpointer data); | |
+static void TalkToAll(GtkWidget *widget, gpointer data); | |
+static void TalkToPlayers(GtkWidget *widget, gpointer data); | |
static void TalkDialog(gboolean TalkToAll); | |
static GtkWidget *CreatePlayerList(void); | |
-static void UpdatePlayerList(GtkWidget *clist,gboolean IncludeSelf); | |
-static void TipOff(GtkWidget *widget,gpointer data); | |
-static void SpyOnPlayer(GtkWidget *widget,gpointer data); | |
+static void UpdatePlayerList(GtkWidget *clist, gboolean IncludeSelf); | |
+static void TipOff(GtkWidget *widget, gpointer data); | |
+static void SpyOnPlayer(GtkWidget *widget, gpointer data); | |
static void ErrandDialog(gint ErrandType); | |
-static void SackBitch(GtkWidget *widget,gpointer data); | |
-static void DestroyShowing(GtkWidget *widget,gpointer data); | |
-static gint DisallowDelete(GtkWidget *widget,GdkEvent *event,gpointer data); | |
+static void SackBitch(GtkWidget *widget, gpointer data); | |
+static void DestroyShowing(GtkWidget *widget, gpointer data); | |
+static gint DisallowDelete(GtkWidget *widget, GdkEvent * event, | |
+ gpointer data); | |
static void GunShopDialog(void); | |
static void NewNameDialog(void); | |
static void UpdatePlayerLists(void); | |
-static void CreateInventory(GtkWidget *hbox,gchar *Objects, | |
+static void CreateInventory(GtkWidget *hbox, gchar *Objects, | |
GtkAccelGroup *accel_group, | |
- gboolean CreateButtons,gboolean CreateHere, | |
+ gboolean CreateButtons, gboolean CreateHere, | |
struct InventoryWidgets *widgets, | |
GtkSignalFunc CallBack); | |
-static void GetSpyReports(GtkWidget *widget,gpointer data); | |
+static void GetSpyReports(GtkWidget *widget, gpointer data); | |
static void DisplaySpyReports(Player *Play); | |
static GtkItemFactoryEntry menu_items[] = { | |
-/* The names of the the menus and their items in the GTK+ client */ | |
- { N_("/_Game"),NULL,NULL,0,"<Branch>" }, | |
- { N_("/Game/_New..."),"<control>N",NewGame,0,NULL }, | |
- { N_("/Game/_Quit..."),"<control>Q",QuitGame,0,NULL }, | |
- { N_("/_Talk"),NULL,NULL,0,"<Branch>" }, | |
- { N_("/Talk/To _All..."),NULL,TalkToAll,0,NULL }, | |
- { N_("/Talk/To _Player..."),NULL,TalkToPlayers,0,NULL }, | |
- { N_("/_List"),NULL,NULL,0,"<Branch>" }, | |
- { N_("/List/_Players..."),NULL,ListPlayers,0,NULL }, | |
- { N_("/List/_Scores..."),NULL,ListScores,0,NULL }, | |
- { N_("/List/_Inventory..."),NULL,ListInventory,0,NULL }, | |
- { N_("/_Errands"),NULL,NULL,0,"<Branch>" }, | |
- { N_("/Errands/_Spy..."),NULL,SpyOnPlayer,0,NULL }, | |
- { N_("/Errands/_Tipoff..."),NULL,TipOff,0,NULL }, | |
-/* N.B. "Sack Bitch" has to be recreated (and thus translated) at the start | |
- of each game, below, so is not marked for gettext here */ | |
- { "/Errands/S_ack Bitch...",NULL,SackBitch,0,NULL }, | |
- { N_("/Errands/_Get spy reports..."),NULL,GetSpyReports,0,NULL }, | |
- { N_("/_Help"),NULL,NULL,0,"<LastBranch>" }, | |
- { N_("/Help/_About..."),"F1",display_intro,0,NULL } | |
+ /* The names of the the menus and their items in the GTK+ client */ | |
+ {N_("/_Game"), NULL, NULL, 0, "<Branch>"}, | |
+ {N_("/Game/_New..."), "<control>N", NewGame, 0, NULL}, | |
+ {N_("/Game/_Quit..."), "<control>Q", QuitGame, 0, NULL}, | |
+ {N_("/_Talk"), NULL, NULL, 0, "<Branch>"}, | |
+ {N_("/Talk/To _All..."), NULL, TalkToAll, 0, NULL}, | |
+ {N_("/Talk/To _Player..."), NULL, TalkToPlayers, 0, NULL}, | |
+ {N_("/_List"), NULL, NULL, 0, "<Branch>"}, | |
+ {N_("/List/_Players..."), NULL, ListPlayers, 0, NULL}, | |
+ {N_("/List/_Scores..."), NULL, ListScores, 0, NULL}, | |
+ {N_("/List/_Inventory..."), NULL, ListInventory, 0, NULL}, | |
+ {N_("/_Errands"), NULL, NULL, 0, "<Branch>"}, | |
+ {N_("/Errands/_Spy..."), NULL, SpyOnPlayer, 0, NULL}, | |
+ {N_("/Errands/_Tipoff..."), NULL, TipOff, 0, NULL}, | |
+ /* N.B. "Sack Bitch" has to be recreated (and thus translated) at the | |
+ * start of each game, below, so is not marked for gettext here */ | |
+ {"/Errands/S_ack Bitch...", NULL, SackBitch, 0, NULL}, | |
+ {N_("/Errands/_Get spy reports..."), NULL, GetSpyReports, 0, NULL}, | |
+ {N_("/_Help"), NULL, NULL, 0, "<LastBranch>"}, | |
+ {N_("/Help/_About..."), "F1", display_intro, 0, NULL} | |
}; | |
-static gchar *MenuTranslate(const gchar *path,gpointer func_data) { | |
-/* Translate menu items, using gettext */ | |
- return _(path); | |
+static gchar *MenuTranslate(const gchar *path, gpointer func_data) | |
+{ | |
+ /* Translate menu items, using gettext */ | |
+ return _(path); | |
} | |
-static void LogMessage(const gchar *log_domain,GLogLevelFlags log_level, | |
- const gchar *message,gpointer user_data) { | |
- GtkMessageBox(NULL,message, | |
-/* Titles of the message boxes for warnings and errors */ | |
- log_level&G_LOG_LEVEL_WARNING ? _("Warning") : | |
- log_level&G_LOG_LEVEL_CRITICAL ? _("Error") : _("Message"), | |
- MB_OK|(gtk_main_level()>0 ? MB_IMMRETURN : 0)); | |
+static void LogMessage(const gchar *log_domain, GLogLevelFlags log_level, | |
+ const gchar *message, gpointer user_data) | |
+{ | |
+ GtkMessageBox(NULL, message, | |
+ /* Titles of the message boxes for warnings and errors */ | |
+ log_level & G_LOG_LEVEL_WARNING ? _("Warning") : | |
+ log_level & G_LOG_LEVEL_CRITICAL ? _("Error") : | |
+ _("Message"), | |
+ MB_OK | (gtk_main_level() > 0 ? MB_IMMRETURN : 0)); | |
} | |
-void QuitGame(GtkWidget *widget,gpointer data) { | |
- if (!InGame || | |
- GtkMessageBox(ClientData.window, | |
-/* Prompt in 'quit game' dialog */ | |
- _("Abandon current game?"), | |
-/* Title of 'quit game' dialog */ | |
- _("Quit Game"),MB_YESNO)==IDYES) { | |
- gtk_main_quit(); | |
- } | |
+void QuitGame(GtkWidget *widget, gpointer data) | |
+{ | |
+ if (!InGame || GtkMessageBox(ClientData.window, | |
+ /* Prompt in 'quit game' dialog */ | |
+ _("Abandon current game?"), | |
+ /* Title of 'quit game' dialog */ | |
+ _("Quit Game"), MB_YESNO) == IDYES) { | |
+ gtk_main_quit(); | |
+ } | |
} | |
-void DestroyGtk(GtkWidget *widget,gpointer data) { | |
- gtk_main_quit(); | |
+void DestroyGtk(GtkWidget *widget, gpointer data) | |
+{ | |
+ gtk_main_quit(); | |
} | |
-gint MainDelete(GtkWidget *widget,GdkEvent *event,gpointer data) { | |
- return (InGame && GtkMessageBox(ClientData.window,_("Abandon current game?"… | |
- _("Quit Game"),MB_YESNO)==IDNO); | |
+gint MainDelete(GtkWidget *widget, GdkEvent * event, gpointer data) | |
+{ | |
+ return (InGame | |
+ && GtkMessageBox(ClientData.window, _("Abandon current game?"), | |
+ _("Quit Game"), MB_YESNO) == IDNO); | |
} | |
-void NewGame(GtkWidget *widget,gpointer data) { | |
- if (InGame) { | |
- if (GtkMessageBox(ClientData.window, | |
- _("Abandon current game?"), | |
-/* Title of 'stop game to start a new game' dialog */ | |
- _("Start new game"),MB_YESNO)==IDYES) EndGame(); | |
- else return; | |
- } | |
- NewGameDialog(); | |
+void NewGame(GtkWidget *widget, gpointer data) | |
+{ | |
+ if (InGame) { | |
+ if (GtkMessageBox(ClientData.window, _("Abandon current game?"), | |
+ /* Title of 'stop game to start a new game' dialog */ | |
+ _("Start new game"), MB_YESNO) == IDYES) | |
+ EndGame(); | |
+ else | |
+ return; | |
+ } | |
+ NewGameDialog(); | |
} | |
-void ListScores(GtkWidget *widget,gpointer data) { | |
- SendClientMessage(ClientData.Play,C_NONE,C_REQUESTSCORE,NULL,NULL); | |
+void ListScores(GtkWidget *widget, gpointer data) | |
+{ | |
+ SendClientMessage(ClientData.Play, C_NONE, C_REQUESTSCORE, NULL, NULL); | |
} | |
-void ListInventory(GtkWidget *widget,gpointer data) { | |
- GtkWidget *window,*button,*hsep,*vbox,*hbox; | |
- GtkAccelGroup *accel_group; | |
+void ListInventory(GtkWidget *widget, gpointer data) | |
+{ | |
+ GtkWidget *window, *button, *hsep, *vbox, *hbox; | |
+ GtkAccelGroup *accel_group; | |
- if (IsShowingInventory) return; | |
- window=gtk_window_new(GTK_WINDOW_DIALOG); | |
- gtk_window_set_default_size(GTK_WINDOW(window),550,120); | |
- accel_group=gtk_accel_group_new(); | |
- gtk_window_add_accel_group(GTK_WINDOW(window),accel_group); | |
+ if (IsShowingInventory) | |
+ return; | |
+ window = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ gtk_window_set_default_size(GTK_WINDOW(window), 550, 120); | |
+ accel_group = gtk_accel_group_new(); | |
+ gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); | |
-/* Title of inventory window */ | |
- gtk_window_set_title(GTK_WINDOW(window),_("Inventory")); | |
+ /* Title of inventory window */ | |
+ gtk_window_set_title(GTK_WINDOW(window), _("Inventory")); | |
- IsShowingInventory=TRUE; | |
- gtk_window_set_modal(GTK_WINDOW(window),FALSE); | |
- gtk_object_set_data(GTK_OBJECT(window),"IsShowing", | |
- (gpointer)&IsShowingInventory); | |
- gtk_signal_connect(GTK_OBJECT(window),"destroy", | |
- GTK_SIGNAL_FUNC(DestroyShowing),NULL); | |
+ IsShowingInventory = TRUE; | |
+ gtk_window_set_modal(GTK_WINDOW(window), FALSE); | |
+ gtk_object_set_data(GTK_OBJECT(window), "IsShowing", | |
+ (gpointer)&IsShowingInventory); | |
+ gtk_signal_connect(GTK_OBJECT(window), "destroy", | |
+ GTK_SIGNAL_FUNC(DestroyShowing), NULL); | |
- gtk_window_set_transient_for(GTK_WINDOW(window), | |
- GTK_WINDOW(ClientData.window)); | |
- gtk_container_set_border_width(GTK_CONTAINER(window),7); | |
+ 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); | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
- hbox=gtk_hbox_new(FALSE,7); | |
- CreateInventory(hbox,Names.Drugs,accel_group,FALSE,FALSE, | |
- &ClientData.InvenDrug,NULL); | |
- CreateInventory(hbox,Names.Guns,accel_group,FALSE,FALSE, | |
- &ClientData.InvenGun,NULL); | |
+ hbox = gtk_hbox_new(FALSE, 7); | |
+ CreateInventory(hbox, Names.Drugs, accel_group, FALSE, FALSE, | |
+ &ClientData.InvenDrug, NULL); | |
+ CreateInventory(hbox, Names.Guns, accel_group, FALSE, FALSE, | |
+ &ClientData.InvenGun, NULL); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
-/* Caption of the button to close a dialog */ | |
- button=gtk_button_new_with_label(_("Close")); | |
- gtk_signal_connect_object(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
- (gpointer)window); | |
- gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0); | |
+ /* Caption of the button to close a dialog */ | |
+ button = gtk_button_new_with_label(_("Close")); | |
+ gtk_signal_connect_object(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)window); | |
+ gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); | |
- gtk_container_add(GTK_CONTAINER(window),vbox); | |
+ gtk_container_add(GTK_CONTAINER(window), vbox); | |
- UpdateInventory(&ClientData.InvenDrug,ClientData.Play->Drugs,NumDrug,TRUE); | |
- UpdateInventory(&ClientData.InvenGun,ClientData.Play->Guns,NumGun,FALSE); | |
+ UpdateInventory(&ClientData.InvenDrug, ClientData.Play->Drugs, NumDrug, | |
+ TRUE); | |
+ UpdateInventory(&ClientData.InvenGun, ClientData.Play->Guns, NumGun, | |
+ FALSE); | |
- gtk_widget_show_all(window); | |
+ gtk_widget_show_all(window); | |
} | |
#ifdef NETWORKING | |
-void GetClientMessage(gpointer data,gint socket, | |
- GdkInputCondition condition) { | |
- gchar *pt; | |
- NetworkBuffer *NetBuf; | |
- gboolean DoneOK,datawaiting; | |
- NBStatus status,oldstatus; | |
- NBSocksStatus oldsocks; | |
- | |
- NetBuf = &ClientData.Play->NetBuf; | |
- | |
- oldstatus = NetBuf->status; | |
- oldsocks = NetBuf->sockstat; | |
- | |
- datawaiting = PlayerHandleNetwork(ClientData.Play,condition&GDK_INPUT_READ, | |
- condition&GDK_INPUT_WRITE,&DoneOK); | |
- | |
- status = NetBuf->status; | |
- | |
- if (status!=NBS_CONNECTED) { | |
-/* The start game dialog isn't visible once we're connected... */ | |
- DisplayConnectStatus((struct StartGameStruct *)data,FALSE, | |
- oldstatus,oldsocks); | |
- } | |
- | |
- if (oldstatus!=NBS_CONNECTED && (status==NBS_CONNECTED || !DoneOK)) { | |
- FinishServerConnect(data,DoneOK); | |
- } | |
- if (status==NBS_CONNECTED && datawaiting) { | |
- while ((pt=GetWaitingPlayerMessage(ClientData.Play))!=NULL) { | |
- HandleClientMessage(pt,ClientData.Play); | |
- g_free(pt); | |
- } | |
- } | |
- if (!DoneOK) { | |
- if (status==NBS_CONNECTED) { | |
-/* The network connection to the server was dropped unexpectedly */ | |
- g_warning(_("Connection to server lost - switching to " | |
- "single player mode")); | |
- SwitchToSinglePlayer(ClientData.Play); | |
- UpdatePlayerLists(); | |
- UpdateMenus(); | |
- } else { | |
- ShutdownNetworkBuffer(&ClientData.Play->NetBuf); | |
- } | |
- } | |
-} | |
- | |
-void SocketStatus(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, | |
+void GetClientMessage(gpointer data, gint socket, | |
+ GdkInputCondition condition) | |
+{ | |
+ gchar *pt; | |
+ NetworkBuffer *NetBuf; | |
+ gboolean DoneOK, datawaiting; | |
+ NBStatus status, oldstatus; | |
+ NBSocksStatus oldsocks; | |
+ | |
+ NetBuf = &ClientData.Play->NetBuf; | |
+ | |
+ oldstatus = NetBuf->status; | |
+ oldsocks = NetBuf->sockstat; | |
+ | |
+ datawaiting = | |
+ PlayerHandleNetwork(ClientData.Play, condition & GDK_INPUT_READ, | |
+ condition & GDK_INPUT_WRITE, &DoneOK); | |
+ | |
+ status = NetBuf->status; | |
+ | |
+ if (status != NBS_CONNECTED) { | |
+ /* The start game dialog isn't visible once we're connected... */ | |
+ DisplayConnectStatus((struct StartGameStruct *)data, FALSE, | |
+ oldstatus, oldsocks); | |
+ } | |
+ | |
+ if (oldstatus != NBS_CONNECTED && (status == NBS_CONNECTED || !DoneOK)) { | |
+ FinishServerConnect(data, DoneOK); | |
+ } | |
+ if (status == NBS_CONNECTED && datawaiting) { | |
+ while ((pt = GetWaitingPlayerMessage(ClientData.Play)) != NULL) { | |
+ HandleClientMessage(pt, ClientData.Play); | |
+ g_free(pt); | |
+ } | |
+ } | |
+ if (!DoneOK) { | |
+ if (status == NBS_CONNECTED) { | |
+ /* The network connection to the server was dropped unexpectedly */ | |
+ g_warning(_("Connection to server lost - switching to " | |
+ "single player mode")); | |
+ SwitchToSinglePlayer(ClientData.Play); | |
+ UpdatePlayerLists(); | |
+ UpdateMenus(); | |
+ } else { | |
+ ShutdownNetworkBuffer(&ClientData.Play->NetBuf); | |
+ } | |
+ } | |
+} | |
+ | |
+void SocketStatus(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), | |
- GetClientMessage,NetBuf->CallBackData); | |
- } | |
- if (CallNow) GetClientMessage(NetBuf->CallBackData,NetBuf->fd,0); | |
+ GetClientMessage, | |
+ NetBuf->CallBackData); | |
+ } | |
+ if (CallNow) | |
+ GetClientMessage(NetBuf->CallBackData, NetBuf->fd, 0); | |
} | |
#endif /* NETWORKING */ | |
-void HandleClientMessage(char *pt,Player *Play) { | |
- char *Data; | |
- DispMode DisplayMode; | |
- AICode AI; | |
- MsgCode Code; | |
- Player *From,*tmp; | |
- gchar *text; | |
- gboolean Handled; | |
- GtkWidget *MenuItem; | |
- GSList *list; | |
- | |
- if (ProcessMessage(pt,Play,&From,&AI,&Code,&Data,FirstClient)==-1) { | |
- return; | |
- } | |
- | |
- Handled=HandleGenericClientMessage(From,AI,Code,Play,Data,&DisplayMode); | |
- switch(Code) { | |
- case C_STARTHISCORE: | |
- PrepareHighScoreDialog(); break; | |
- case C_HISCORE: | |
- AddScoreToDialog(Data); break; | |
- case C_ENDHISCORE: | |
- CompleteHighScoreDialog((strcmp(Data,"end")==0)); | |
- break; | |
- case C_PRINTMESSAGE: | |
- PrintMessage(Data); | |
- break; | |
- case C_FIGHTPRINT: | |
- DisplayFightMessage(Data); break; | |
- case C_PUSH: | |
-/* The server admin has asked us to leave - so warn the user, and do so */ | |
- g_warning(_("You have been pushed from the server.\n" | |
- "Switching to single player mode.")); | |
- SwitchToSinglePlayer(Play); | |
- UpdatePlayerLists(); | |
- UpdateMenus(); | |
- break; | |
- case C_QUIT: | |
-/* The server has sent us notice that it is shutting down */ | |
- g_warning(_("The server has terminated.\n" | |
- "Switching to single player mode.")); | |
- SwitchToSinglePlayer(Play); | |
- UpdatePlayerLists(); | |
- UpdateMenus(); | |
- break; | |
- case C_NEWNAME: | |
- NewNameDialog(); break; | |
- case C_BANK: | |
- TransferDialog(FALSE); break; | |
- case C_LOANSHARK: | |
- TransferDialog(TRUE); break; | |
- case C_GUNSHOP: | |
- GunShopDialog(); break; | |
- case C_MSG: | |
- text=g_strdup_printf("%s: %s",GetPlayerName(From),Data); | |
- PrintMessage(text); g_free(text); | |
- break; | |
- case C_MSGTO: | |
- text=g_strdup_printf("%s->%s: %s",GetPlayerName(From), | |
- GetPlayerName(Play),Data); | |
- PrintMessage(text); g_free(text); | |
- break; | |
- case C_JOIN: | |
- text=g_strdup_printf(_("%s joins the game!"),Data); | |
- PrintMessage(text); g_free(text); | |
- UpdatePlayerLists(); | |
- UpdateMenus(); | |
- break; | |
- case C_LEAVE: | |
- if (From!=&Noone) { | |
- text=g_strdup_printf(_("%s has left the game."),Data); | |
- PrintMessage(text); g_free(text); | |
- UpdatePlayerLists(); | |
- UpdateMenus(); | |
- } | |
- break; | |
- case C_QUESTION: | |
- QuestionDialog(Data,From==&Noone ? NULL : From); | |
- break; | |
- case C_SUBWAYFLASH: | |
- DisplayFightMessage(NULL); | |
- for (list=FirstClient;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- tmp->Flags &= ~FIGHTING; | |
- } | |
-/* Message displayed when the player "jets" to a new location */ | |
- text=dpg_strdup_printf(_("Jetting to %tde"), | |
- Location[(int)Play->IsAt].Name); | |
- PrintMessage(text); g_free(text); | |
- break; | |
- case C_ENDLIST: | |
- MenuItem=gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Errands/Sack Bitch..."); | |
- | |
-/* Text for the Errands/Sack Bitch menu item */ | |
- text=dpg_strdup_printf(_("%/Sack Bitch menu item/S_ack %Tde..."), | |
- Names.Bitch); | |
- SetAccelerator(MenuItem,text,NULL,NULL,NULL); | |
- g_free(text); | |
- | |
- MenuItem=gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Errands/Spy..."); | |
- | |
-/* Text to update the Errands/Spy menu item with the price for spying */ | |
- text=dpg_strdup_printf(_("_Spy\t(%P)"),Prices.Spy); | |
- SetAccelerator(MenuItem,text,NULL,NULL,NULL); | |
- g_free(text); | |
- | |
-/* Text to update the Errands/Tipoff menu item with the price for a tipoff */ | |
- text=dpg_strdup_printf(_("_Tipoff\t(%P)"),Prices.Tipoff); | |
- MenuItem=gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Errands/Tipoff..."); | |
- SetAccelerator(MenuItem,text,NULL,NULL,NULL); | |
- g_free(text); | |
- if (FirstClient->next) ListPlayers(NULL,NULL); | |
- UpdateMenus(); | |
- break; | |
- case C_UPDATE: | |
- if (From==&Noone) { | |
- ReceivePlayerData(Play,Data,Play); | |
- UpdateStatus(Play); | |
- } else { | |
- ReceivePlayerData(Play,Data,From); | |
- DisplaySpyReports(From); | |
- } | |
- break; | |
- case C_DRUGHERE: | |
- UpdateInventory(&ClientData.Drug,Play->Drugs,NumDrug,TRUE); | |
- gtk_clist_sort(GTK_CLIST(ClientData.Drug.HereList)); | |
- if (IsShowingInventory) { | |
- UpdateInventory(&ClientData.InvenDrug,Play->Drugs,NumDrug,TRUE); | |
- } | |
- break; | |
- default: | |
- if (!Handled) { | |
- g_print("Unknown network message received: %s^%c^%s^%s", | |
- GetPlayerName(From),Code,GetPlayerName(Play),Data); | |
- } | |
- break; | |
- } | |
+void HandleClientMessage(char *pt, Player *Play) | |
+{ | |
+ char *Data; | |
+ DispMode DisplayMode; | |
+ AICode AI; | |
+ MsgCode Code; | |
+ Player *From, *tmp; | |
+ gchar *text; | |
+ gboolean Handled; | |
+ GtkWidget *MenuItem; | |
+ GSList *list; | |
+ | |
+ if (ProcessMessage(pt, Play, &From, &AI, &Code, | |
+ &Data, FirstClient) == -1) { | |
+ return; | |
+ } | |
+ | |
+ Handled = | |
+ HandleGenericClientMessage(From, AI, Code, Play, Data, &DisplayMode); | |
+ switch (Code) { | |
+ case C_STARTHISCORE: | |
+ PrepareHighScoreDialog(); | |
+ break; | |
+ case C_HISCORE: | |
+ AddScoreToDialog(Data); | |
+ break; | |
+ case C_ENDHISCORE: | |
+ CompleteHighScoreDialog((strcmp(Data, "end") == 0)); | |
+ break; | |
+ case C_PRINTMESSAGE: | |
+ PrintMessage(Data); | |
+ break; | |
+ case C_FIGHTPRINT: | |
+ DisplayFightMessage(Data); | |
+ break; | |
+ case C_PUSH: | |
+ /* The server admin has asked us to leave - so warn the user, and do | |
+ * so */ | |
+ g_warning(_("You have been pushed from the server.\n" | |
+ "Switching to single player mode.")); | |
+ SwitchToSinglePlayer(Play); | |
+ UpdatePlayerLists(); | |
+ UpdateMenus(); | |
+ break; | |
+ case C_QUIT: | |
+ /* The server has sent us notice that it is shutting down */ | |
+ g_warning(_("The server has terminated.\n" | |
+ "Switching to single player mode.")); | |
+ SwitchToSinglePlayer(Play); | |
+ UpdatePlayerLists(); | |
+ UpdateMenus(); | |
+ break; | |
+ case C_NEWNAME: | |
+ NewNameDialog(); | |
+ break; | |
+ case C_BANK: | |
+ TransferDialog(FALSE); | |
+ break; | |
+ case C_LOANSHARK: | |
+ TransferDialog(TRUE); | |
+ break; | |
+ case C_GUNSHOP: | |
+ GunShopDialog(); | |
+ break; | |
+ case C_MSG: | |
+ text = g_strdup_printf("%s: %s", GetPlayerName(From), Data); | |
+ PrintMessage(text); | |
+ g_free(text); | |
+ break; | |
+ case C_MSGTO: | |
+ text = g_strdup_printf("%s->%s: %s", GetPlayerName(From), | |
+ GetPlayerName(Play), Data); | |
+ PrintMessage(text); | |
+ g_free(text); | |
+ break; | |
+ case C_JOIN: | |
+ text = g_strdup_printf(_("%s joins the game!"), Data); | |
+ PrintMessage(text); | |
+ g_free(text); | |
+ UpdatePlayerLists(); | |
+ UpdateMenus(); | |
+ break; | |
+ case C_LEAVE: | |
+ if (From != &Noone) { | |
+ text = g_strdup_printf(_("%s has left the game."), Data); | |
+ PrintMessage(text); | |
+ g_free(text); | |
+ UpdatePlayerLists(); | |
+ UpdateMenus(); | |
+ } | |
+ break; | |
+ case C_QUESTION: | |
+ QuestionDialog(Data, From == &Noone ? NULL : From); | |
+ break; | |
+ case C_SUBWAYFLASH: | |
+ DisplayFightMessage(NULL); | |
+ for (list = FirstClient; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ tmp->Flags &= ~FIGHTING; | |
+ } | |
+ /* Message displayed when the player "jets" to a new location */ | |
+ text = dpg_strdup_printf(_("Jetting to %tde"), | |
+ Location[(int)Play->IsAt].Name); | |
+ PrintMessage(text); | |
+ g_free(text); | |
+ break; | |
+ case C_ENDLIST: | |
+ MenuItem = gtk_item_factory_get_widget(ClientData.Menu, | |
+ "<main>/Errands/Sack Bitch..."); | |
+ | |
+ /* Text for the Errands/Sack Bitch menu item */ | |
+ text = dpg_strdup_printf(_("%/Sack Bitch menu item/S_ack %Tde..."), | |
+ Names.Bitch); | |
+ SetAccelerator(MenuItem, text, NULL, NULL, NULL); | |
+ g_free(text); | |
+ | |
+ MenuItem = gtk_item_factory_get_widget(ClientData.Menu, | |
+ "<main>/Errands/Spy..."); | |
+ | |
+ /* Text to update the Errands/Spy menu item with the price for spying */ | |
+ text = dpg_strdup_printf(_("_Spy\t(%P)"), Prices.Spy); | |
+ SetAccelerator(MenuItem, text, NULL, NULL, NULL); | |
+ g_free(text); | |
+ | |
+ /* Text to update the Errands/Tipoff menu item with the price for a | |
+ * tipoff */ | |
+ text = dpg_strdup_printf(_("_Tipoff\t(%P)"), Prices.Tipoff); | |
+ MenuItem = gtk_item_factory_get_widget(ClientData.Menu, | |
+ "<main>/Errands/Tipoff..."); | |
+ SetAccelerator(MenuItem, text, NULL, NULL, NULL); | |
+ g_free(text); | |
+ if (FirstClient->next) | |
+ ListPlayers(NULL, NULL); | |
+ UpdateMenus(); | |
+ break; | |
+ case C_UPDATE: | |
+ if (From == &Noone) { | |
+ ReceivePlayerData(Play, Data, Play); | |
+ UpdateStatus(Play); | |
+ } else { | |
+ ReceivePlayerData(Play, Data, From); | |
+ DisplaySpyReports(From); | |
+ } | |
+ break; | |
+ case C_DRUGHERE: | |
+ UpdateInventory(&ClientData.Drug, Play->Drugs, NumDrug, TRUE); | |
+ gtk_clist_sort(GTK_CLIST(ClientData.Drug.HereList)); | |
+ if (IsShowingInventory) { | |
+ UpdateInventory(&ClientData.InvenDrug, Play->Drugs, NumDrug, TRUE); | |
+ } | |
+ break; | |
+ default: | |
+ if (!Handled) { | |
+ g_print("Unknown network message received: %s^%c^%s^%s", | |
+ GetPlayerName(From), Code, GetPlayerName(Play), Data); | |
+ } | |
+ break; | |
+ } | |
} | |
struct HiScoreDiaStruct { | |
- GtkWidget *dialog,*table,*vbox; | |
+ GtkWidget *dialog, *table, *vbox; | |
}; | |
-static struct HiScoreDiaStruct HiScoreDialog = { NULL,NULL,NULL }; | |
- | |
-void PrepareHighScoreDialog(void) { | |
-/* Creates an empty dialog to display high scores */ | |
- GtkWidget *dialog,*vbox,*hsep,*table; | |
- | |
-/* Make sure the server doesn't fool us into creating | |
- multiple dialogs */ | |
- if (HiScoreDialog.dialog) return; | |
- | |
- HiScoreDialog.dialog=dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- | |
-/* Title of the GTK+ high score dialog */ | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("High Scores")); | |
- | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(ClientData.window)); | |
- | |
- HiScoreDialog.vbox=vbox=gtk_vbox_new(FALSE,7); | |
- HiScoreDialog.table=table=gtk_table_new(NUMHISCORE,4,FALSE); | |
- gtk_table_set_row_spacings(GTK_TABLE(table),5); | |
- gtk_table_set_col_spacings(GTK_TABLE(table),30); | |
- | |
- 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); | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- gtk_widget_show_all(dialog); | |
-} | |
- | |
-void AddScoreToDialog(char *Data) { | |
-/* Adds a single high score (coded in "Data", which is the information */ | |
-/* received in the relevant network message) to the dialog created by */ | |
-/* PrepareHighScoreDialog(), above. */ | |
- GtkWidget *label; | |
- char *cp; | |
- gchar **spl1,**spl2; | |
- int index,slen; | |
- gboolean bold; | |
- | |
- if (!HiScoreDialog.dialog) return; | |
- | |
- cp=Data; | |
- index=GetNextInt(&cp,0); | |
- if (!cp || strlen(cp)<3) return; | |
- | |
- bold = (*cp=='B'); /* Is this score "our" score? (Currently ignored) */ | |
- | |
-/* Step past the 'bold' character, and the initial '>' (if present) */ | |
- cp+=2; | |
- g_strchug(cp); | |
- | |
-/* Get the first word - the score */ | |
- spl1 = g_strsplit(cp," ",1); | |
- if (!spl1 || !spl1[0] || !spl1[1]) { | |
-/* Error - the high score from the server is invalid */ | |
- g_warning(_("Corrupt high score!")); | |
- g_strfreev(spl1); | |
- return; | |
- } | |
- label=gtk_label_new(spl1[0]); | |
- gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); | |
- gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table),label, | |
- 0,1,index,index+1); | |
- gtk_widget_show(label); | |
- | |
-/* Remove any leading whitespace from the remainder, since g_strsplit | |
- will split at every space character, not at a run of them */ | |
- g_strchug(spl1[1]); | |
- | |
-/* Get the second word - the date */ | |
- spl2 = g_strsplit(spl1[1]," ",1); | |
- if (!spl2 || !spl2[0] || !spl2[1]) { | |
- g_warning(_("Corrupt high score!")); | |
- g_strfreev(spl2); | |
- return; | |
- } | |
- label=gtk_label_new(spl2[0]); | |
- gtk_misc_set_alignment(GTK_MISC(label),0.5,0.5); | |
- gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table),label, | |
- 1,2,index,index+1); | |
- gtk_widget_show(label); | |
- | |
-/* The remainder is the name, terminated with (R.I.P.) if the player died, | |
- and '<' for the 'current' score */ | |
- g_strchug(spl2[1]); | |
- | |
-/* Remove '<' suffix if present */ | |
- slen=strlen(spl2[1]); | |
- if (slen>=1 && spl2[1][slen-1]=='<') { | |
- spl2[1][slen-1]='\0'; | |
- } | |
- slen--; | |
- | |
-/* Check for (R.I.P.) suffix, and add it to the 4th column if found */ | |
- if (slen>8 && spl2[1][slen-1]==')' && spl2[1][slen-8]=='(') { | |
- label=gtk_label_new(&spl2[1][slen-8]); | |
- gtk_misc_set_alignment(GTK_MISC(label),0.5,0.5); | |
- gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table),label, | |
- 3,4,index,index+1); | |
- gtk_widget_show(label); | |
- spl2[1][slen-8]='\0'; /* Remove suffix from the player name */ | |
- } | |
- | |
-/* Finally, add in what's left of the player name */ | |
- g_strchomp(spl2[1]); | |
- label=gtk_label_new(spl2[1]); | |
- gtk_misc_set_alignment(GTK_MISC(label),0,0.5); | |
- gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table),label, | |
- 2,3,index,index+1); | |
- gtk_widget_show(label); | |
- | |
- g_strfreev(spl1); g_strfreev(spl2); | |
-} | |
- | |
-static void EndHighScore(GtkWidget *widget) { | |
-/* If the high scores are being displayed at the end of the game, */ | |
-/* this function is used to end the game when the high score dialog's */ | |
-/* "OK" button is pressed. */ | |
- EndGame(); | |
-} | |
- | |
-void CompleteHighScoreDialog(gboolean AtEnd) { | |
-/* Called when all high scores have been received. Finishes off the */ | |
-/* high score dialog by adding an "OK" button. If the game has ended, */ | |
-/* then "AtEnd" is TRUE, and clicking this button will end the game. */ | |
- GtkWidget *OKButton,*dialog; | |
- dialog=HiScoreDialog.dialog; | |
- | |
- if (!HiScoreDialog.dialog) return; | |
- | |
-/* Caption of the "OK" button in dialogs */ | |
- OKButton=gtk_button_new_with_label(_("OK")); | |
- gtk_signal_connect_object(GTK_OBJECT(OKButton),"clicked", | |
- GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
- (gpointer)dialog); | |
- if (AtEnd) { | |
- InGame=FALSE; | |
- gtk_signal_connect_object(GTK_OBJECT(dialog),"destroy", | |
- GTK_SIGNAL_FUNC(EndHighScore),NULL); | |
- } | |
- gtk_box_pack_start(GTK_BOX(HiScoreDialog.vbox),OKButton,TRUE,TRUE,0); | |
- | |
- GTK_WIDGET_SET_FLAGS(OKButton,GTK_CAN_DEFAULT); | |
- gtk_widget_grab_default(OKButton); | |
- gtk_widget_show(OKButton); | |
- | |
-/* OK, we're done - allow the creation of new high score dialogs */ | |
- HiScoreDialog.dialog=NULL; | |
-} | |
- | |
-void PrintMessage(char *text) { | |
-/* Prints an information message in the display area of the GTK+ client. */ | |
-/* This area is used for displaying drug busts, messages from other */ | |
-/* players, etc. The message is passed in as the string "text". */ | |
- gint EditPos; | |
- char *cr="\n"; | |
- GtkEditable *messages; | |
- | |
- messages=GTK_EDITABLE(ClientData.messages); | |
- | |
- gtk_text_freeze(GTK_TEXT(messages)); | |
- g_strdelimit(text,"^",'\n'); | |
- EditPos=gtk_text_get_length(GTK_TEXT(ClientData.messages)); | |
- while (*text=='\n') text++; | |
- gtk_editable_insert_text(messages,text,strlen(text),&EditPos); | |
- if (text[strlen(text)-1]!='\n') { | |
- gtk_editable_insert_text(messages,cr,strlen(cr),&EditPos); | |
- } | |
- gtk_text_thaw(GTK_TEXT(messages)); | |
- gtk_editable_set_position(messages,EditPos); | |
-} | |
- | |
-static void FightCallback(GtkWidget *widget,gpointer data) { | |
-/* Called when one of the action buttons in the Fight dialog is clicked. */ | |
-/* "data" specifies which button (Deal Drugs/Run/Fight/Stand) was pressed. */ | |
- gint Answer; | |
- Player *Play; | |
- gchar text[4]; | |
- GtkWidget *window; | |
- gpointer CanRunHere=NULL; | |
- | |
- window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- if (window) CanRunHere=gtk_object_get_data(GTK_OBJECT(window),"CanRunHere"); | |
- | |
- Answer=GPOINTER_TO_INT(data); | |
- Play=ClientData.Play; | |
- switch(Answer) { | |
- case 'D': | |
- gtk_widget_hide(FightDialog); break; | |
- case 'R': | |
- if (CanRunHere) { | |
- SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,"R"); | |
- } else { | |
-/* gtk_widget_hide(FightDialog);*/ | |
- Jet(FightDialog); | |
- } | |
- break; | |
- case 'F': case 'S': | |
- text[0]=Answer; text[1]='\0'; | |
- SendClientMessage(Play,C_NONE,C_FIGHTACT,NULL,text); | |
- break; | |
- } | |
-} | |
- | |
-static GtkWidget *AddFightButton(gchar *Text,GtkAccelGroup *accel_group, | |
- GtkBox *box,gint Answer) { | |
-/* Adds an action button to the hbox at the base of the Fight dialog. */ | |
-/* The button's caption is given by "Text", and the keyboard shortcut */ | |
-/* (if any) is added to "accel_group". "Answer" gives the identifier */ | |
-/* passed to FightCallback, above. */ | |
- GtkWidget *button; | |
- button=gtk_button_new_with_label(""); | |
- SetAccelerator(button,Text,button,"clicked",accel_group); | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(FightCallback), | |
- GINT_TO_POINTER(Answer)); | |
- gtk_box_pack_start(box,button,TRUE,TRUE,0); | |
- return button; | |
+static struct HiScoreDiaStruct HiScoreDialog = { NULL, NULL, NULL }; | |
+ | |
+/* | |
+ * Creates an empty dialog to display high scores. | |
+ */ | |
+void PrepareHighScoreDialog(void) | |
+{ | |
+ GtkWidget *dialog, *vbox, *hsep, *table; | |
+ | |
+ /* Make sure the server doesn't fool us into creating multiple dialogs */ | |
+ if (HiScoreDialog.dialog) | |
+ return; | |
+ | |
+ HiScoreDialog.dialog = dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ | |
+ /* Title of the GTK+ high score dialog */ | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("High Scores")); | |
+ | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ GTK_WINDOW(ClientData.window)); | |
+ | |
+ HiScoreDialog.vbox = vbox = gtk_vbox_new(FALSE, 7); | |
+ HiScoreDialog.table = table = gtk_table_new(NUMHISCORE, 4, FALSE); | |
+ gtk_table_set_row_spacings(GTK_TABLE(table), 5); | |
+ gtk_table_set_col_spacings(GTK_TABLE(table), 30); | |
+ | |
+ 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); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ gtk_widget_show_all(dialog); | |
+} | |
+ | |
+/* | |
+ * Adds a single high score (coded in "Data", which is the information | |
+ * received in the relevant network message) to the dialog created by | |
+ * PrepareHighScoreDialog(), above. | |
+ */ | |
+void AddScoreToDialog(char *Data) | |
+{ | |
+ GtkWidget *label; | |
+ char *cp; | |
+ gchar **spl1, **spl2; | |
+ int index, slen; | |
+ gboolean bold; | |
+ | |
+ if (!HiScoreDialog.dialog) | |
+ return; | |
+ | |
+ cp = Data; | |
+ index = GetNextInt(&cp, 0); | |
+ if (!cp || strlen(cp) < 3) | |
+ return; | |
+ | |
+ bold = (*cp == 'B'); /* Is this score "our" score? (Currently | |
+ * ignored) */ | |
+ | |
+ /* Step past the 'bold' character, and the initial '>' (if present) */ | |
+ cp += 2; | |
+ g_strchug(cp); | |
+ | |
+ /* Get the first word - the score */ | |
+ spl1 = g_strsplit(cp, " ", 1); | |
+ if (!spl1 || !spl1[0] || !spl1[1]) { | |
+ /* Error - the high score from the server is invalid */ | |
+ g_warning(_("Corrupt high score!")); | |
+ g_strfreev(spl1); | |
+ return; | |
+ } | |
+ label = gtk_label_new(spl1[0]); | |
+ gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); | |
+ gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table), label, | |
+ 0, 1, index, index + 1); | |
+ gtk_widget_show(label); | |
+ | |
+ /* Remove any leading whitespace from the remainder, since g_strsplit | |
+ * will split at every space character, not at a run of them */ | |
+ g_strchug(spl1[1]); | |
+ | |
+ /* Get the second word - the date */ | |
+ spl2 = g_strsplit(spl1[1], " ", 1); | |
+ if (!spl2 || !spl2[0] || !spl2[1]) { | |
+ g_warning(_("Corrupt high score!")); | |
+ g_strfreev(spl2); | |
+ return; | |
+ } | |
+ label = gtk_label_new(spl2[0]); | |
+ gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); | |
+ gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table), label, | |
+ 1, 2, index, index + 1); | |
+ gtk_widget_show(label); | |
+ | |
+ /* The remainder is the name, terminated with (R.I.P.) if the player | |
+ * died, and '<' for the 'current' score */ | |
+ g_strchug(spl2[1]); | |
+ | |
+ /* Remove '<' suffix if present */ | |
+ slen = strlen(spl2[1]); | |
+ if (slen >= 1 && spl2[1][slen - 1] == '<') { | |
+ spl2[1][slen - 1] = '\0'; | |
+ } | |
+ slen--; | |
+ | |
+ /* Check for (R.I.P.) suffix, and add it to the 4th column if found */ | |
+ if (slen > 8 && spl2[1][slen - 1] == ')' && spl2[1][slen - 8] == '(') { | |
+ label = gtk_label_new(&spl2[1][slen - 8]); | |
+ gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); | |
+ gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table), label, | |
+ 3, 4, index, index + 1); | |
+ gtk_widget_show(label); | |
+ spl2[1][slen - 8] = '\0'; /* Remove suffix from the player name */ | |
+ } | |
+ | |
+ /* Finally, add in what's left of the player name */ | |
+ g_strchomp(spl2[1]); | |
+ label = gtk_label_new(spl2[1]); | |
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
+ gtk_table_attach_defaults(GTK_TABLE(HiScoreDialog.table), label, | |
+ 2, 3, index, index + 1); | |
+ gtk_widget_show(label); | |
+ | |
+ g_strfreev(spl1); | |
+ g_strfreev(spl2); | |
+} | |
+ | |
+/* | |
+ * If the high scores are being displayed at the end of the game, | |
+ * this function is used to end the game when the high score dialog's | |
+ * "OK" button is pressed. | |
+ */ | |
+static void EndHighScore(GtkWidget *widget) | |
+{ | |
+ EndGame(); | |
+} | |
+ | |
+/* | |
+ * Called when all high scores have been received. Finishes off the | |
+ * high score dialog by adding an "OK" button. If the game has ended, | |
+ * then "AtEnd" is TRUE, and clicking this button will end the game. | |
+ */ | |
+void CompleteHighScoreDialog(gboolean AtEnd) | |
+{ | |
+ GtkWidget *OKButton, *dialog; | |
+ | |
+ dialog = HiScoreDialog.dialog; | |
+ | |
+ if (!HiScoreDialog.dialog) | |
+ return; | |
+ | |
+ /* Caption of the "OK" button in dialogs */ | |
+ OKButton = gtk_button_new_with_label(_("OK")); | |
+ gtk_signal_connect_object(GTK_OBJECT(OKButton), "clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)dialog); | |
+ if (AtEnd) { | |
+ InGame = FALSE; | |
+ gtk_signal_connect_object(GTK_OBJECT(dialog), "destroy", | |
+ GTK_SIGNAL_FUNC(EndHighScore), NULL); | |
+ } | |
+ gtk_box_pack_start(GTK_BOX(HiScoreDialog.vbox), OKButton, TRUE, TRUE, 0); | |
+ | |
+ GTK_WIDGET_SET_FLAGS(OKButton, GTK_CAN_DEFAULT); | |
+ gtk_widget_grab_default(OKButton); | |
+ gtk_widget_show(OKButton); | |
+ | |
+ /* OK, we're done - allow the creation of new high score dialogs */ | |
+ HiScoreDialog.dialog = NULL; | |
+} | |
+ | |
+/* | |
+ * Prints an information message in the display area of the GTK+ client. | |
+ * This area is used for displaying drug busts, messages from other | |
+ * players, etc. The message is passed in as the string "text". | |
+ */ | |
+void PrintMessage(char *text) | |
+{ | |
+ gint EditPos; | |
+ char *cr = "\n"; | |
+ GtkEditable *messages; | |
+ | |
+ messages = GTK_EDITABLE(ClientData.messages); | |
+ | |
+ gtk_text_freeze(GTK_TEXT(messages)); | |
+ g_strdelimit(text, "^", '\n'); | |
+ EditPos = gtk_text_get_length(GTK_TEXT(ClientData.messages)); | |
+ while (*text == '\n') | |
+ text++; | |
+ gtk_editable_insert_text(messages, text, strlen(text), &EditPos); | |
+ if (text[strlen(text) - 1] != '\n') { | |
+ gtk_editable_insert_text(messages, cr, strlen(cr), &EditPos); | |
+ } | |
+ gtk_text_thaw(GTK_TEXT(messages)); | |
+ gtk_editable_set_position(messages, EditPos); | |
+} | |
+ | |
+/* | |
+ * Called when one of the action buttons in the Fight dialog is clicked. | |
+ * "data" specifies which button (Deal Drugs/Run/Fight/Stand) was pressed. | |
+ */ | |
+static void FightCallback(GtkWidget *widget, gpointer data) | |
+{ | |
+ gint Answer; | |
+ Player *Play; | |
+ gchar text[4]; | |
+ GtkWidget *window; | |
+ gpointer CanRunHere = NULL; | |
+ | |
+ window = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ if (window) | |
+ CanRunHere = gtk_object_get_data(GTK_OBJECT(window), "CanRunHere"); | |
+ | |
+ Answer = GPOINTER_TO_INT(data); | |
+ Play = ClientData.Play; | |
+ switch (Answer) { | |
+ case 'D': | |
+ gtk_widget_hide(FightDialog); | |
+ break; | |
+ case 'R': | |
+ if (CanRunHere) { | |
+ SendClientMessage(Play, C_NONE, C_FIGHTACT, NULL, "R"); | |
+ } else { | |
+ Jet(FightDialog); | |
+ } | |
+ break; | |
+ case 'F': | |
+ case 'S': | |
+ text[0] = Answer; | |
+ text[1] = '\0'; | |
+ SendClientMessage(Play, C_NONE, C_FIGHTACT, NULL, text); | |
+ break; | |
+ } | |
+} | |
+ | |
+/* | |
+ * Adds an action button to the hbox at the base of the Fight dialog. | |
+ * The button's caption is given by "Text", and the keyboard shortcut | |
+ * (if any) is added to "accel_group". "Answer" gives the identifier | |
+ * passed to FightCallback, above. | |
+ */ | |
+static GtkWidget *AddFightButton(gchar *Text, GtkAccelGroup *accel_group, | |
+ GtkBox *box, gint Answer) | |
+{ | |
+ GtkWidget *button; | |
+ | |
+ button = gtk_button_new_with_label(""); | |
+ SetAccelerator(button, Text, button, "clicked", accel_group); | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(FightCallback), | |
+ GINT_TO_POINTER(Answer)); | |
+ gtk_box_pack_start(box, button, TRUE, TRUE, 0); | |
+ return button; | |
} | |
/* Data used to keep track of the widgets giving the information about a | |
- player/cop involved in a fight */ | |
+ * player/cop involved in a fight */ | |
struct combatant { | |
- GtkWidget *name,*bitches,*healthprog,*healthlabel; | |
+ GtkWidget *name, *bitches, *healthprog, *healthlabel; | |
}; | |
-static void CreateFightDialog(void) { | |
-/* Creates an empty Fight dialog. Usually this only needs to be done once, */ | |
-/* as when the user "closes" it, it is only hidden, ready to be reshown */ | |
-/* later. Buttons for all actions are added here, and are hidden/shown */ | |
-/* as necessary. */ | |
- GtkWidget *dialog,*vbox,*button,*hbox,*hbbox,*hsep,*text,*table; | |
- GtkAccelGroup *accel_group; | |
- GArray *combatants; | |
- gchar *buf; | |
- | |
- FightDialog=dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- gtk_window_set_default_size(GTK_WINDOW(dialog),500,300); | |
- gtk_signal_connect(GTK_OBJECT(dialog),"delete_event", | |
- GTK_SIGNAL_FUNC(DisallowDelete),NULL); | |
- gtk_window_set_default_size(GTK_WINDOW(dialog),240,130); | |
- accel_group=gtk_accel_group_new(); | |
- gtk_window_add_accel_group(GTK_WINDOW(dialog),accel_group); | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("Fight")); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(ClientData.window)); | |
- | |
- vbox=gtk_vbox_new(FALSE,7); | |
- | |
- table=gtk_table_new(2,4,FALSE); | |
- gtk_table_set_row_spacings(GTK_TABLE(table),5); | |
- gtk_table_set_col_spacings(GTK_TABLE(table),5); | |
- | |
- hsep=gtk_hseparator_new(); | |
- gtk_table_attach_defaults(GTK_TABLE(table),hsep,0,4,1,2); | |
- gtk_widget_show_all(table); | |
- gtk_box_pack_start(GTK_BOX(vbox),table,FALSE,FALSE,0); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"table",table); | |
- | |
- combatants = g_array_new(FALSE,TRUE,sizeof(struct combatant)); | |
- g_array_set_size(combatants,1); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"combatants",combatants); | |
- | |
- text=gtk_scrolled_text_new(NULL,NULL,&hbox); | |
- gtk_widget_set_usize(text,150,120); | |
- | |
- gtk_text_set_editable(GTK_TEXT(text),FALSE); | |
- gtk_text_set_word_wrap(GTK_TEXT(text),TRUE); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"text",text); | |
- gtk_widget_show_all(hbox); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); | |
- | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
- gtk_widget_show(hsep); | |
- | |
- hbbox=gtk_hbutton_box_new(); | |
- | |
-/* Button for closing the "Fight" dialog and going back to dealing drugs | |
- (%Tde = "Drugs" by default) */ | |
- buf=dpg_strdup_printf(_("_Deal %Tde"),Names.Drugs); | |
- button=AddFightButton(buf,accel_group,GTK_BOX(hbbox),'D'); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"deal",button); | |
- g_free(buf); | |
- | |
-/* Button for shooting at other players in the "Fight" dialog, or for | |
- popping up the "Fight" dialog from the main window */ | |
- button=AddFightButton(_("_Fight"),accel_group,GTK_BOX(hbbox),'F'); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"fight",button); | |
- | |
-/* Button to stand and take it in the "Fight" dialog */ | |
- button=AddFightButton(_("_Stand"),accel_group,GTK_BOX(hbbox),'S'); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"stand",button); | |
- | |
-/* Button to run from combat in the "Fight" dialog */ | |
- button=AddFightButton(_("_Run"),accel_group,GTK_BOX(hbbox),'R'); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"run",button); | |
- | |
- gtk_widget_show(hsep); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbbox,FALSE,FALSE,0); | |
- gtk_widget_show(hbbox); | |
- gtk_widget_show(vbox); | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- gtk_widget_show(dialog); | |
-} | |
- | |
-static void UpdateCombatant(gchar *DefendName,int DefendBitches, | |
- gchar *BitchName,int DefendHealth) { | |
-/* Updates the display of information for a player/cop in the Fight dialog. */ | |
-/* If the player's name (DefendName) already exists, updates the display of */ | |
-/* total health and number of bitches - otherwise, adds a new entry. If */ | |
-/* DefendBitches is -1, then the player has left. */ | |
- guint i,RowIndex; | |
- gchar *name; | |
- struct combatant *compt; | |
- GArray *combatants; | |
- GtkWidget *table; | |
- gchar *BitchText,*HealthText; | |
- gfloat ProgPercent; | |
- | |
- combatants=(GArray *)gtk_object_get_data(GTK_OBJECT(FightDialog), | |
- "combatants"); | |
- table=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog),"table")); | |
- if (!combatants) return; | |
- | |
- if (DefendName[0]) { | |
- compt=NULL; | |
- for (i=1,RowIndex=2;i<combatants->len;i++,RowIndex++) { | |
- compt=&g_array_index(combatants,struct combatant,i); | |
- if (!compt || !compt->name) { compt=NULL; continue; } | |
- gtk_label_get(GTK_LABEL(compt->name),&name); | |
- if (name && strcmp(name,DefendName)==0) break; | |
- compt=NULL; | |
- } | |
- if (!compt) { | |
- i=combatants->len; | |
- g_array_set_size(combatants,i+1); | |
- compt=&g_array_index(combatants,struct combatant,i); | |
- gtk_table_resize(GTK_TABLE(table),i+2,4); | |
- RowIndex=i+1; | |
- } | |
- } else { | |
- compt=&g_array_index(combatants,struct combatant,0); | |
- RowIndex=0; | |
- } | |
- | |
-/* Display of number of bitches or deputies during combat (%tde="bitches" | |
- or "deputies" (etc.) by default) */ | |
- BitchText=dpg_strdup_printf(_("%/Combat: Bitches/%d %tde"), | |
- DefendBitches,BitchName); | |
- | |
-/* Display of health during combat */ | |
- if (DefendBitches == -1) { | |
- HealthText = g_strdup(_("(Left)")); | |
- } else if (DefendHealth == 0 && DefendBitches == 0) { | |
- HealthText = g_strdup(_("(Dead)")); | |
- } else { | |
- HealthText=g_strdup_printf(_("Health: %d"),DefendHealth); | |
- } | |
- | |
- ProgPercent=(gfloat)DefendHealth/100.0; | |
- | |
- if (compt->name) { | |
- if (DefendName[0]) { | |
- gtk_label_set_text(GTK_LABEL(compt->name),DefendName); | |
- } | |
- if (DefendBitches>=0) { | |
- gtk_label_set_text(GTK_LABEL(compt->bitches),BitchText); | |
- } | |
- gtk_label_set_text(GTK_LABEL(compt->healthlabel),HealthText); | |
- gtk_progress_bar_update(GTK_PROGRESS_BAR(compt->healthprog), | |
- ProgPercent); | |
- } else { | |
-/* Display of the current player's name during combat */ | |
- compt->name = gtk_label_new(DefendName[0] ? DefendName : _("You")); | |
- | |
- gtk_table_attach_defaults(GTK_TABLE(table),compt->name,0,1, | |
- RowIndex,RowIndex+1); | |
- compt->bitches = gtk_label_new(DefendBitches>=0 ? BitchText : ""); | |
- gtk_table_attach_defaults(GTK_TABLE(table),compt->bitches,1,2, | |
- RowIndex,RowIndex+1); | |
- compt->healthprog = gtk_progress_bar_new(); | |
- gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(compt->healthprog), | |
- GTK_PROGRESS_LEFT_TO_RIGHT); | |
- gtk_progress_bar_update(GTK_PROGRESS_BAR(compt->healthprog), | |
- ProgPercent); | |
- gtk_table_attach_defaults(GTK_TABLE(table),compt->healthprog,2,3, | |
- RowIndex,RowIndex+1); | |
- compt->healthlabel = gtk_label_new(HealthText); | |
- gtk_table_attach_defaults(GTK_TABLE(table),compt->healthlabel,3,4, | |
- RowIndex,RowIndex+1); | |
- gtk_widget_show(compt->name); | |
- gtk_widget_show(compt->bitches); | |
- gtk_widget_show(compt->healthprog); | |
- gtk_widget_show(compt->healthlabel); | |
- } | |
- | |
- g_free(BitchText); g_free(HealthText); | |
-} | |
- | |
-static void FreeCombatants(void) { | |
-/* Cleans up the list of all players/cops involved in a fight. */ | |
- GArray *combatants; | |
- combatants=(GArray *)gtk_object_get_data(GTK_OBJECT(FightDialog), | |
- "combatants"); | |
- if (!combatants) return; | |
- | |
- g_array_free(combatants,TRUE); | |
-} | |
- | |
-void DisplayFightMessage(char *Data) { | |
-/* Given the network message "Data" concerning some happening during */ | |
-/* combat, extracts the relevant data and updates the Fight dialog, */ | |
-/* creating and/or showing it if necessary. */ | |
-/* If "Data" is NULL, then closes the dialog. If "Data" is a blank */ | |
-/* string, then just shows the dialog, displaying no new messages. */ | |
- Player *Play; | |
- gint EditPos; | |
- GtkAccelGroup *accel_group; | |
- GtkWidget *Deal,*Fight,*Stand,*Run,*Text; | |
- char cr[] = "\n"; | |
- gchar *AttackName,*DefendName,*BitchName,*Message; | |
- FightPoint fp; | |
- int DefendHealth,DefendBitches,BitchesKilled,ArmPercent; | |
- gboolean CanRunHere,Loot,CanFire; | |
- | |
- if (!Data) { | |
- if (FightDialog) { | |
- FreeCombatants(); | |
- gtk_widget_destroy(FightDialog); FightDialog=NULL; | |
+/* | |
+ * Creates an empty Fight dialog. Usually this only needs to be done once, | |
+ * as when the user "closes" it, it is only hidden, ready to be reshown | |
+ * later. Buttons for all actions are added here, and are hidden/shown | |
+ * as necessary. | |
+ */ | |
+static void CreateFightDialog(void) | |
+{ | |
+ GtkWidget *dialog, *vbox, *button, *hbox, *hbbox, *hsep, *text, *table; | |
+ GtkAccelGroup *accel_group; | |
+ GArray *combatants; | |
+ gchar *buf; | |
+ | |
+ FightDialog = dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300); | |
+ gtk_signal_connect(GTK_OBJECT(dialog), "delete_event", | |
+ GTK_SIGNAL_FUNC(DisallowDelete), NULL); | |
+ gtk_window_set_default_size(GTK_WINDOW(dialog), 240, 130); | |
+ accel_group = gtk_accel_group_new(); | |
+ gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("Fight")); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ GTK_WINDOW(ClientData.window)); | |
+ | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ | |
+ table = gtk_table_new(2, 4, FALSE); | |
+ gtk_table_set_row_spacings(GTK_TABLE(table), 5); | |
+ gtk_table_set_col_spacings(GTK_TABLE(table), 5); | |
+ | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), hsep, 0, 4, 1, 2); | |
+ gtk_widget_show_all(table); | |
+ gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "table", table); | |
+ | |
+ combatants = g_array_new(FALSE, TRUE, sizeof(struct combatant)); | |
+ g_array_set_size(combatants, 1); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "combatants", combatants); | |
+ | |
+ text = gtk_scrolled_text_new(NULL, NULL, &hbox); | |
+ gtk_widget_set_usize(text, 150, 120); | |
+ | |
+ gtk_text_set_editable(GTK_TEXT(text), FALSE); | |
+ gtk_text_set_word_wrap(GTK_TEXT(text), TRUE); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "text", text); | |
+ gtk_widget_show_all(hbox); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); | |
+ | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
+ gtk_widget_show(hsep); | |
+ | |
+ hbbox = gtk_hbutton_box_new(); | |
+ | |
+ /* Button for closing the "Fight" dialog and going back to dealing drugs | |
+ * (%Tde = "Drugs" by default) */ | |
+ buf = dpg_strdup_printf(_("_Deal %Tde"), Names.Drugs); | |
+ button = AddFightButton(buf, accel_group, GTK_BOX(hbbox), 'D'); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "deal", button); | |
+ g_free(buf); | |
+ | |
+ /* Button for shooting at other players in the "Fight" dialog, or for | |
+ * popping up the "Fight" dialog from the main window */ | |
+ button = AddFightButton(_("_Fight"), accel_group, GTK_BOX(hbbox), 'F'); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "fight", button); | |
+ | |
+ /* Button to stand and take it in the "Fight" dialog */ | |
+ button = AddFightButton(_("_Stand"), accel_group, GTK_BOX(hbbox), 'S'); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "stand", button); | |
+ | |
+ /* Button to run from combat in the "Fight" dialog */ | |
+ button = AddFightButton(_("_Run"), accel_group, GTK_BOX(hbbox), 'R'); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "run", button); | |
+ | |
+ gtk_widget_show(hsep); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); | |
+ gtk_widget_show(hbbox); | |
+ gtk_widget_show(vbox); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ gtk_widget_show(dialog); | |
+} | |
+ | |
+/* | |
+ * Updates the display of information for a player/cop in the Fight dialog. | |
+ * If the player's name (DefendName) already exists, updates the display of | |
+ * total health and number of bitches - otherwise, adds a new entry. If | |
+ * DefendBitches is -1, then the player has left. | |
+ */ | |
+static void UpdateCombatant(gchar *DefendName, int DefendBitches, | |
+ gchar *BitchName, int DefendHealth) | |
+{ | |
+ guint i, RowIndex; | |
+ gchar *name; | |
+ struct combatant *compt; | |
+ GArray *combatants; | |
+ GtkWidget *table; | |
+ gchar *BitchText, *HealthText; | |
+ gfloat ProgPercent; | |
+ | |
+ combatants = (GArray *)gtk_object_get_data(GTK_OBJECT(FightDialog), | |
+ "combatants"); | |
+ table = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog), "table")); | |
+ if (!combatants) | |
+ return; | |
+ | |
+ if (DefendName[0]) { | |
+ compt = NULL; | |
+ for (i = 1, RowIndex = 2; i < combatants->len; i++, RowIndex++) { | |
+ compt = &g_array_index(combatants, struct combatant, i); | |
+ | |
+ if (!compt || !compt->name) { | |
+ compt = NULL; | |
+ continue; | |
} | |
- return; | |
- } | |
- if (FightDialog) { | |
- if (!GTK_WIDGET_VISIBLE(FightDialog)) gtk_widget_show(FightDialog); | |
- } else { | |
- CreateFightDialog(); | |
- } | |
- if (!FightDialog || !Data[0]) return; | |
- | |
- Deal=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog),"deal")); | |
- Fight=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog),"fight")); | |
- Stand=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog),"stand")); | |
- Run=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog),"run")); | |
- Text=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog),"text")); | |
- | |
- Play=ClientData.Play; | |
- | |
- if (HaveAbility(Play,A_NEWFIGHT)) { | |
- ReceiveFightMessage(Data,&AttackName,&DefendName,&DefendHealth, | |
- &DefendBitches,&BitchName,&BitchesKilled,&ArmPercent, | |
- &fp,&CanRunHere,&Loot,&CanFire,&Message); | |
- Play->Flags|=FIGHTING; | |
- switch(fp) { | |
- case F_HIT: case F_ARRIVED: case F_MISS: | |
- UpdateCombatant(DefendName,DefendBitches,BitchName,DefendHealth); | |
- break; | |
- case F_LEAVE: | |
- if (AttackName[0]) { | |
- UpdateCombatant(AttackName,-1,BitchName,0); | |
- } | |
- break; | |
- case F_LASTLEAVE: | |
- Play->Flags&= ~FIGHTING; | |
- break; | |
- default: | |
+ gtk_label_get(GTK_LABEL(compt->name), &name); | |
+ if (name && strcmp(name, DefendName) == 0) | |
+ break; | |
+ compt = NULL; | |
+ } | |
+ if (!compt) { | |
+ i = combatants->len; | |
+ g_array_set_size(combatants, i + 1); | |
+ compt = &g_array_index(combatants, struct combatant, i); | |
+ | |
+ gtk_table_resize(GTK_TABLE(table), i + 2, 4); | |
+ RowIndex = i + 1; | |
+ } | |
+ } else { | |
+ compt = &g_array_index(combatants, struct combatant, 0); | |
+ | |
+ RowIndex = 0; | |
+ } | |
+ | |
+ /* Display of number of bitches or deputies during combat | |
+ * (%tde="bitches" or "deputies" (etc.) by default) */ | |
+ BitchText = dpg_strdup_printf(_("%/Combat: Bitches/%d %tde"), | |
+ DefendBitches, BitchName); | |
+ | |
+ /* Display of health during combat */ | |
+ if (DefendBitches == -1) { | |
+ HealthText = g_strdup(_("(Left)")); | |
+ } else if (DefendHealth == 0 && DefendBitches == 0) { | |
+ HealthText = g_strdup(_("(Dead)")); | |
+ } else { | |
+ HealthText = g_strdup_printf(_("Health: %d"), DefendHealth); | |
+ } | |
+ | |
+ ProgPercent = (gfloat)DefendHealth / 100.0; | |
+ | |
+ if (compt->name) { | |
+ if (DefendName[0]) { | |
+ gtk_label_set_text(GTK_LABEL(compt->name), DefendName); | |
+ } | |
+ if (DefendBitches >= 0) { | |
+ gtk_label_set_text(GTK_LABEL(compt->bitches), BitchText); | |
+ } | |
+ gtk_label_set_text(GTK_LABEL(compt->healthlabel), HealthText); | |
+ gtk_progress_bar_update(GTK_PROGRESS_BAR(compt->healthprog), | |
+ ProgPercent); | |
+ } else { | |
+ /* Display of the current player's name during combat */ | |
+ compt->name = gtk_label_new(DefendName[0] ? DefendName : _("You")); | |
+ | |
+ gtk_table_attach_defaults(GTK_TABLE(table), compt->name, 0, 1, | |
+ RowIndex, RowIndex + 1); | |
+ compt->bitches = gtk_label_new(DefendBitches >= 0 ? BitchText : ""); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), compt->bitches, 1, 2, | |
+ RowIndex, RowIndex + 1); | |
+ compt->healthprog = gtk_progress_bar_new(); | |
+ gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(compt->healthprog), | |
+ GTK_PROGRESS_LEFT_TO_RIGHT); | |
+ gtk_progress_bar_update(GTK_PROGRESS_BAR(compt->healthprog), | |
+ ProgPercent); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), compt->healthprog, 2, 3, | |
+ RowIndex, RowIndex + 1); | |
+ compt->healthlabel = gtk_label_new(HealthText); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), compt->healthlabel, 3, 4, | |
+ RowIndex, RowIndex + 1); | |
+ gtk_widget_show(compt->name); | |
+ gtk_widget_show(compt->bitches); | |
+ gtk_widget_show(compt->healthprog); | |
+ gtk_widget_show(compt->healthlabel); | |
+ } | |
+ | |
+ g_free(BitchText); | |
+ g_free(HealthText); | |
+} | |
+ | |
+/* | |
+ * Cleans up the list of all players/cops involved in a fight. | |
+ */ | |
+static void FreeCombatants(void) | |
+{ | |
+ GArray *combatants; | |
+ | |
+ combatants = (GArray *)gtk_object_get_data(GTK_OBJECT(FightDialog), | |
+ "combatants"); | |
+ if (!combatants) | |
+ return; | |
+ | |
+ g_array_free(combatants, TRUE); | |
+} | |
+ | |
+/* | |
+ * Given the network message "Data" concerning some happening during | |
+ * combat, extracts the relevant data and updates the Fight dialog, | |
+ * creating and/or showing it if necessary. | |
+ * If "Data" is NULL, then closes the dialog. If "Data" is a blank | |
+ * string, then just shows the dialog, displaying no new messages. | |
+ */ | |
+void DisplayFightMessage(char *Data) | |
+{ | |
+ Player *Play; | |
+ gint EditPos; | |
+ GtkAccelGroup *accel_group; | |
+ GtkWidget *Deal, *Fight, *Stand, *Run, *Text; | |
+ char cr[] = "\n"; | |
+ gchar *AttackName, *DefendName, *BitchName, *Message; | |
+ FightPoint fp; | |
+ int DefendHealth, DefendBitches, BitchesKilled, ArmPercent; | |
+ gboolean CanRunHere, Loot, CanFire; | |
+ | |
+ if (!Data) { | |
+ if (FightDialog) { | |
+ FreeCombatants(); | |
+ gtk_widget_destroy(FightDialog); | |
+ FightDialog = NULL; | |
+ } | |
+ return; | |
+ } | |
+ if (FightDialog) { | |
+ if (!GTK_WIDGET_VISIBLE(FightDialog)) | |
+ gtk_widget_show(FightDialog); | |
+ } else { | |
+ CreateFightDialog(); | |
+ } | |
+ if (!FightDialog || !Data[0]) | |
+ return; | |
+ | |
+ Deal = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog), "deal")); | |
+ Fight = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog), "fight")); | |
+ Stand = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog), "stand")); | |
+ Run = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog), "run")); | |
+ Text = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(FightDialog), "text")); | |
+ | |
+ Play = ClientData.Play; | |
+ | |
+ if (HaveAbility(Play, A_NEWFIGHT)) { | |
+ ReceiveFightMessage(Data, &AttackName, &DefendName, &DefendHealth, | |
+ &DefendBitches, &BitchName, &BitchesKilled, | |
+ &ArmPercent, &fp, &CanRunHere, &Loot, &CanFire, | |
+ &Message); | |
+ Play->Flags |= FIGHTING; | |
+ switch (fp) { | |
+ case F_HIT: | |
+ case F_ARRIVED: | |
+ case F_MISS: | |
+ UpdateCombatant(DefendName, DefendBitches, BitchName, DefendHealth); | |
+ break; | |
+ case F_LEAVE: | |
+ if (AttackName[0]) { | |
+ UpdateCombatant(AttackName, -1, BitchName, 0); | |
} | |
- accel_group=(GtkAccelGroup *) | |
- gtk_object_get_data(GTK_OBJECT(ClientData.window),"accel_group"); | |
- SetJetButtonTitle(accel_group); | |
- } else { | |
- Message=Data; | |
- if (Play->Flags&FIGHTING) fp=F_MSG; else fp=F_LASTLEAVE; | |
- CanFire = (Play->Flags&CANSHOOT); | |
- CanRunHere=FALSE; | |
- } | |
- gtk_object_set_data(GTK_OBJECT(FightDialog),"CanRunHere", | |
- GINT_TO_POINTER(CanRunHere)); | |
- | |
- g_strdelimit(Message,"^",'\n'); | |
- if (strlen(Message)>0) { | |
- EditPos=gtk_text_get_length(GTK_TEXT(Text)); | |
- gtk_editable_insert_text(GTK_EDITABLE(Text),Message, | |
- strlen(Message),&EditPos); | |
- gtk_editable_insert_text(GTK_EDITABLE(Text),cr,strlen(cr),&EditPos); | |
- } | |
- | |
- if (!CanRunHere || fp==F_LASTLEAVE) | |
- gtk_widget_show(Deal); else gtk_widget_hide(Deal); | |
- if (CanFire && TotalGunsCarried(Play)>0) | |
- gtk_widget_show(Fight); else gtk_widget_hide(Fight); | |
- if (CanFire && TotalGunsCarried(Play)==0) | |
- gtk_widget_show(Stand); else gtk_widget_hide(Stand); | |
- if (fp!=F_LASTLEAVE) | |
- gtk_widget_show(Run); else gtk_widget_hide(Run); | |
-} | |
- | |
-void DisplayStats(Player *Play,struct StatusWidgets *Status) { | |
-/* Updates the display of pertinent data about player "Play" (location, */ | |
-/* health, etc. in the status widgets given by "Status". This can point */ | |
-/* to the widgets at the top of the main window, or those in a Spy */ | |
-/* Reports dialog. */ | |
- gchar *prstr; | |
- GString *text; | |
- | |
- text=g_string_new(NULL); | |
- | |
- gtk_label_set_text(GTK_LABEL(Status->Location), | |
- Location[(int)Play->IsAt].Name); | |
- | |
- g_string_sprintf(text,"%s%02d%s",Names.Month,Play->Turn,Names.Year); | |
- gtk_label_set_text(GTK_LABEL(Status->Date),text->str); | |
- | |
- g_string_sprintf(text,"%d",Play->CoatSize); | |
- gtk_label_set_text(GTK_LABEL(Status->SpaceValue),text->str); | |
- | |
- prstr=FormatPrice(Play->Cash); | |
- gtk_label_set_text(GTK_LABEL(Status->CashValue),prstr); | |
- g_free(prstr); | |
- | |
- prstr=FormatPrice(Play->Bank); | |
- gtk_label_set_text(GTK_LABEL(Status->BankValue),prstr); | |
- g_free(prstr); | |
- | |
- prstr=FormatPrice(Play->Debt); | |
- gtk_label_set_text(GTK_LABEL(Status->DebtValue),prstr); | |
- g_free(prstr); | |
- | |
-/* Display of carried guns in GTK+ client status window (%Tde="Guns" | |
- by default) */ | |
- dpg_string_sprintf(text,_("%/GTK Stats: Guns/%Tde"),Names.Guns); | |
- gtk_label_set_text(GTK_LABEL(Status->GunsName),text->str); | |
- g_string_sprintf(text,"%d",TotalGunsCarried(Play)); | |
- gtk_label_set_text(GTK_LABEL(Status->GunsValue),text->str); | |
- | |
- if (!WantAntique) { | |
-/* Display of number of bitches in GTK+ client status window (%Tde="Bitches" | |
- by default) */ | |
- dpg_string_sprintf(text,_("%/GTK Stats: Bitches/%Tde"),Names.Bitches); | |
- gtk_label_set_text(GTK_LABEL(Status->BitchesName),text->str); | |
- g_string_sprintf(text,"%d",Play->Bitches.Carried); | |
- gtk_label_set_text(GTK_LABEL(Status->BitchesValue),text->str); | |
- } else { | |
- gtk_label_set_text(GTK_LABEL(Status->BitchesName),NULL); | |
- gtk_label_set_text(GTK_LABEL(Status->BitchesValue),NULL); | |
- } | |
- | |
- g_string_sprintf(text,"%d",Play->Health); | |
- gtk_label_set_text(GTK_LABEL(Status->HealthValue),text->str); | |
- | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-void UpdateStatus(Player *Play) { | |
-/* Updates all of the player status in response to a message from the */ | |
-/* server. This includes the main window display, the gun shop (if */ | |
-/* displayed) and the inventory (if displayed). */ | |
- GtkAccelGroup *accel_group; | |
- DisplayStats(Play,&ClientData.Status); | |
- UpdateInventory(&ClientData.Drug,ClientData.Play->Drugs,NumDrug,TRUE); | |
- gtk_clist_sort(GTK_CLIST(ClientData.Drug.HereList)); | |
- accel_group=(GtkAccelGroup *) | |
- gtk_object_get_data(GTK_OBJECT(ClientData.window),"accel_group"); | |
- SetJetButtonTitle(accel_group); | |
- if (IsShowingGunShop) { | |
- UpdateInventory(&ClientData.Gun,ClientData.Play->Guns,NumGun,FALSE); | |
- } | |
- if (IsShowingInventory) { | |
- UpdateInventory(&ClientData.InvenDrug,ClientData.Play->Drugs, | |
- NumDrug,TRUE); | |
- UpdateInventory(&ClientData.InvenGun,ClientData.Play->Guns, | |
- NumGun,FALSE); | |
- } | |
+ break; | |
+ case F_LASTLEAVE: | |
+ Play->Flags &= ~FIGHTING; | |
+ break; | |
+ default: | |
+ } | |
+ accel_group = (GtkAccelGroup *) | |
+ gtk_object_get_data(GTK_OBJECT(ClientData.window), "accel_group"); | |
+ SetJetButtonTitle(accel_group); | |
+ } else { | |
+ Message = Data; | |
+ if (Play->Flags & FIGHTING) | |
+ fp = F_MSG; | |
+ else | |
+ fp = F_LASTLEAVE; | |
+ CanFire = (Play->Flags & CANSHOOT); | |
+ CanRunHere = FALSE; | |
+ } | |
+ gtk_object_set_data(GTK_OBJECT(FightDialog), "CanRunHere", | |
+ GINT_TO_POINTER(CanRunHere)); | |
+ | |
+ g_strdelimit(Message, "^", '\n'); | |
+ if (strlen(Message) > 0) { | |
+ EditPos = gtk_text_get_length(GTK_TEXT(Text)); | |
+ gtk_editable_insert_text(GTK_EDITABLE(Text), Message, | |
+ strlen(Message), &EditPos); | |
+ gtk_editable_insert_text(GTK_EDITABLE(Text), cr, strlen(cr), &EditPos); | |
+ } | |
+ | |
+ if (!CanRunHere || fp == F_LASTLEAVE) | |
+ gtk_widget_show(Deal); | |
+ else | |
+ gtk_widget_hide(Deal); | |
+ if (CanFire && TotalGunsCarried(Play) > 0) | |
+ gtk_widget_show(Fight); | |
+ else | |
+ gtk_widget_hide(Fight); | |
+ if (CanFire && TotalGunsCarried(Play) == 0) | |
+ gtk_widget_show(Stand); | |
+ else | |
+ gtk_widget_hide(Stand); | |
+ if (fp != F_LASTLEAVE) | |
+ gtk_widget_show(Run); | |
+ else | |
+ gtk_widget_hide(Run); | |
+} | |
+ | |
+/* | |
+ * Updates the display of pertinent data about player "Play" (location, | |
+ * health, etc. in the status widgets given by "Status". This can point | |
+ * to the widgets at the top of the main window, or those in a Spy | |
+ * Reports dialog. | |
+ */ | |
+void DisplayStats(Player *Play, struct StatusWidgets *Status) | |
+{ | |
+ gchar *prstr; | |
+ GString *text; | |
+ | |
+ text = g_string_new(NULL); | |
+ | |
+ gtk_label_set_text(GTK_LABEL(Status->Location), | |
+ Location[(int)Play->IsAt].Name); | |
+ | |
+ g_string_sprintf(text, "%s%02d%s", Names.Month, Play->Turn, Names.Year); | |
+ gtk_label_set_text(GTK_LABEL(Status->Date), text->str); | |
+ | |
+ g_string_sprintf(text, "%d", Play->CoatSize); | |
+ gtk_label_set_text(GTK_LABEL(Status->SpaceValue), text->str); | |
+ | |
+ prstr = FormatPrice(Play->Cash); | |
+ gtk_label_set_text(GTK_LABEL(Status->CashValue), prstr); | |
+ g_free(prstr); | |
+ | |
+ prstr = FormatPrice(Play->Bank); | |
+ gtk_label_set_text(GTK_LABEL(Status->BankValue), prstr); | |
+ g_free(prstr); | |
+ | |
+ prstr = FormatPrice(Play->Debt); | |
+ gtk_label_set_text(GTK_LABEL(Status->DebtValue), prstr); | |
+ g_free(prstr); | |
+ | |
+ /* Display of carried guns in GTK+ client status window (%Tde="Guns" by | |
+ * default) */ | |
+ dpg_string_sprintf(text, _("%/GTK Stats: Guns/%Tde"), Names.Guns); | |
+ gtk_label_set_text(GTK_LABEL(Status->GunsName), text->str); | |
+ g_string_sprintf(text, "%d", TotalGunsCarried(Play)); | |
+ gtk_label_set_text(GTK_LABEL(Status->GunsValue), text->str); | |
+ | |
+ if (!WantAntique) { | |
+ /* Display of number of bitches in GTK+ client status window | |
+ * (%Tde="Bitches" by default) */ | |
+ dpg_string_sprintf(text, _("%/GTK Stats: Bitches/%Tde"), | |
+ Names.Bitches); | |
+ gtk_label_set_text(GTK_LABEL(Status->BitchesName), text->str); | |
+ g_string_sprintf(text, "%d", Play->Bitches.Carried); | |
+ gtk_label_set_text(GTK_LABEL(Status->BitchesValue), text->str); | |
+ } else { | |
+ gtk_label_set_text(GTK_LABEL(Status->BitchesName), NULL); | |
+ gtk_label_set_text(GTK_LABEL(Status->BitchesValue), NULL); | |
+ } | |
+ | |
+ g_string_sprintf(text, "%d", Play->Health); | |
+ gtk_label_set_text(GTK_LABEL(Status->HealthValue), text->str); | |
+ | |
+ g_string_free(text, TRUE); | |
+} | |
+ | |
+/* | |
+ * Updates all of the player status in response to a message from the | |
+ * server. This includes the main window display, the gun shop (if | |
+ * displayed) and the inventory (if displayed). | |
+ */ | |
+void UpdateStatus(Player *Play) | |
+{ | |
+ GtkAccelGroup *accel_group; | |
+ | |
+ DisplayStats(Play, &ClientData.Status); | |
+ UpdateInventory(&ClientData.Drug, ClientData.Play->Drugs, NumDrug, TRUE); | |
+ gtk_clist_sort(GTK_CLIST(ClientData.Drug.HereList)); | |
+ accel_group = (GtkAccelGroup *) | |
+ gtk_object_get_data(GTK_OBJECT(ClientData.window), "accel_group"); | |
+ SetJetButtonTitle(accel_group); | |
+ if (IsShowingGunShop) { | |
+ UpdateInventory(&ClientData.Gun, ClientData.Play->Guns, NumGun, FALSE); | |
+ } | |
+ if (IsShowingInventory) { | |
+ UpdateInventory(&ClientData.InvenDrug, ClientData.Play->Drugs, | |
+ NumDrug, TRUE); | |
+ UpdateInventory(&ClientData.InvenGun, ClientData.Play->Guns, | |
+ NumGun, FALSE); | |
+ } | |
} | |
void UpdateInventory(struct InventoryWidgets *Inven, | |
- Inventory *Objects,int NumObjects,gboolean AreDrugs) { | |
- GtkWidget *herelist,*carrylist; | |
- Player *Play; | |
- gint i,row,selectrow[2]; | |
- gpointer rowdata; | |
- price_t price; | |
- gchar *titles[2]; | |
- gboolean CanBuy=FALSE,CanSell=FALSE,CanDrop=FALSE; | |
- GList *glist[2],*selection; | |
- GtkCList *clist[2]; | |
- int numlist; | |
- | |
- Play=ClientData.Play; | |
- herelist=Inven->HereList; | |
- carrylist=Inven->CarriedList; | |
- | |
- if (herelist) numlist=2; else numlist=1; | |
- | |
-/* Make lists of the current selections */ | |
- clist[0]=GTK_CLIST(carrylist); | |
- if (herelist) clist[1]=GTK_CLIST(herelist); else clist[1]=NULL; | |
- | |
- for (i=0;i<numlist;i++) { | |
- glist[i]=NULL; | |
- selectrow[i]=-1; | |
- for (selection=clist[i]->selection;selection; | |
- selection=g_list_next(selection)) { | |
- row=GPOINTER_TO_INT(selection->data); | |
- rowdata=gtk_clist_get_row_data(clist[i],row); | |
- glist[i]=g_list_append(glist[i],rowdata); | |
- } | |
- } | |
+ Inventory *Objects, int NumObjects, gboolean AreDrugs) | |
+{ | |
+ GtkWidget *herelist, *carrylist; | |
+ Player *Play; | |
+ gint i, row, selectrow[2]; | |
+ gpointer rowdata; | |
+ price_t price; | |
+ gchar *titles[2]; | |
+ gboolean CanBuy = FALSE, CanSell = FALSE, CanDrop = FALSE; | |
+ GList *glist[2], *selection; | |
+ GtkCList *clist[2]; | |
+ int numlist; | |
+ | |
+ Play = ClientData.Play; | |
+ herelist = Inven->HereList; | |
+ carrylist = Inven->CarriedList; | |
+ | |
+ if (herelist) | |
+ numlist = 2; | |
+ else | |
+ numlist = 1; | |
+ | |
+ /* Make lists of the current selections */ | |
+ clist[0] = GTK_CLIST(carrylist); | |
+ if (herelist) | |
+ clist[1] = GTK_CLIST(herelist); | |
+ else | |
+ clist[1] = NULL; | |
+ | |
+ for (i = 0; i < numlist; i++) { | |
+ glist[i] = NULL; | |
+ selectrow[i] = -1; | |
+ for (selection = clist[i]->selection; selection; | |
+ selection = g_list_next(selection)) { | |
+ row = GPOINTER_TO_INT(selection->data); | |
+ rowdata = gtk_clist_get_row_data(clist[i], row); | |
+ glist[i] = g_list_append(glist[i], rowdata); | |
+ } | |
+ } | |
- gtk_clist_freeze(GTK_CLIST(carrylist)); | |
- gtk_clist_clear(GTK_CLIST(carrylist)); | |
+ gtk_clist_freeze(GTK_CLIST(carrylist)); | |
+ gtk_clist_clear(GTK_CLIST(carrylist)); | |
- if (herelist) { | |
- gtk_clist_freeze(GTK_CLIST(herelist)); | |
- gtk_clist_clear(GTK_CLIST(herelist)); | |
- } | |
+ if (herelist) { | |
+ gtk_clist_freeze(GTK_CLIST(herelist)); | |
+ gtk_clist_clear(GTK_CLIST(herelist)); | |
+ } | |
- for (i=0;i<NumObjects;i++) { | |
- if (AreDrugs) { | |
- titles[0] = Drug[i].Name; price=Objects[i].Price; | |
- } else { | |
- titles[0]=Gun[i].Name; price=Gun[i].Price; | |
- } | |
+ for (i = 0; i < NumObjects; i++) { | |
+ if (AreDrugs) { | |
+ titles[0] = Drug[i].Name; | |
+ price = Objects[i].Price; | |
+ } else { | |
+ titles[0] = Gun[i].Name; | |
+ price = Gun[i].Price; | |
+ } | |
- if (herelist && price > 0) { | |
- CanBuy=TRUE; | |
- titles[1] = FormatPrice(price); | |
- row=gtk_clist_append(GTK_CLIST(herelist),titles); g_free(titles[1]); | |
- gtk_clist_set_row_data(GTK_CLIST(herelist),row,GINT_TO_POINTER(i)); | |
- if (g_list_find(glist[1],GINT_TO_POINTER(i))) { | |
- selectrow[1]=row; | |
- gtk_clist_select_row(GTK_CLIST(herelist),row,0); | |
- } | |
+ if (herelist && price > 0) { | |
+ CanBuy = TRUE; | |
+ titles[1] = FormatPrice(price); | |
+ row = gtk_clist_append(GTK_CLIST(herelist), titles); | |
+ g_free(titles[1]); | |
+ gtk_clist_set_row_data(GTK_CLIST(herelist), row, GINT_TO_POINTER(i)); | |
+ if (g_list_find(glist[1], GINT_TO_POINTER(i))) { | |
+ selectrow[1] = row; | |
+ gtk_clist_select_row(GTK_CLIST(herelist), row, 0); | |
} | |
+ } | |
- if (Objects[i].Carried > 0) { | |
- if (price>0) CanSell=TRUE; else CanDrop=TRUE; | |
- if (HaveAbility(ClientData.Play,A_DRUGVALUE) && AreDrugs) { | |
- titles[1] = dpg_strdup_printf("%d @ %P",Objects[i].Carried, | |
- Objects[i].TotalValue/Objects[i].Carried); | |
- } else { | |
- titles[1] = g_strdup_printf("%d",Objects[i].Carried); | |
- } | |
- row=gtk_clist_append(GTK_CLIST(carrylist),titles); g_free(titles[1]); | |
- gtk_clist_set_row_data(GTK_CLIST(carrylist),row,GINT_TO_POINTER(i)); | |
- if (g_list_find(glist[0],GINT_TO_POINTER(i))) { | |
- selectrow[0]=row; | |
- gtk_clist_select_row(GTK_CLIST(carrylist),row,0); | |
- } | |
+ if (Objects[i].Carried > 0) { | |
+ if (price > 0) | |
+ CanSell = TRUE; | |
+ else | |
+ CanDrop = TRUE; | |
+ if (HaveAbility(ClientData.Play, A_DRUGVALUE) && AreDrugs) { | |
+ titles[1] = dpg_strdup_printf("%d @ %P", Objects[i].Carried, | |
+ Objects[i].TotalValue / | |
+ Objects[i].Carried); | |
+ } else { | |
+ titles[1] = g_strdup_printf("%d", Objects[i].Carried); | |
} | |
- } | |
- | |
- for (i=0;i<numlist;i++) { | |
- if (selectrow[i]!=-1 && gtk_clist_row_is_visible(clist[i], | |
- selectrow[i])!=GTK_VISIBILITY_FULL) { | |
- gtk_clist_moveto(clist[i],selectrow[i],0,0.0,0.0); | |
+ row = gtk_clist_append(GTK_CLIST(carrylist), titles); | |
+ g_free(titles[1]); | |
+ gtk_clist_set_row_data(GTK_CLIST(carrylist), row, | |
+ GINT_TO_POINTER(i)); | |
+ if (g_list_find(glist[0], GINT_TO_POINTER(i))) { | |
+ selectrow[0] = row; | |
+ gtk_clist_select_row(GTK_CLIST(carrylist), row, 0); | |
} | |
- g_list_free(glist[i]); | |
- } | |
+ } | |
+ } | |
+ | |
+ for (i = 0; i < numlist; i++) { | |
+ if (selectrow[i] != -1 && gtk_clist_row_is_visible(clist[i], | |
+ selectrow[i]) != | |
+ GTK_VISIBILITY_FULL) { | |
+ gtk_clist_moveto(clist[i], selectrow[i], 0, 0.0, 0.0); | |
+ } | |
+ g_list_free(glist[i]); | |
+ } | |
- gtk_clist_thaw(GTK_CLIST(carrylist)); | |
- if (herelist) gtk_clist_thaw(GTK_CLIST(herelist)); | |
+ gtk_clist_thaw(GTK_CLIST(carrylist)); | |
+ if (herelist) | |
+ gtk_clist_thaw(GTK_CLIST(herelist)); | |
- if (Inven->vbbox) { | |
- gtk_widget_set_sensitive(Inven->BuyButton,CanBuy); | |
- gtk_widget_set_sensitive(Inven->SellButton,CanSell); | |
- gtk_widget_set_sensitive(Inven->DropButton,CanDrop); | |
- } | |
+ if (Inven->vbbox) { | |
+ gtk_widget_set_sensitive(Inven->BuyButton, CanBuy); | |
+ gtk_widget_set_sensitive(Inven->SellButton, CanSell); | |
+ gtk_widget_set_sensitive(Inven->DropButton, CanDrop); | |
+ } | |
} | |
-static void JetCallback(GtkWidget *widget,gpointer data) { | |
+static void JetCallback(GtkWidget *widget, gpointer data) | |
+{ | |
int NewLocation; | |
gchar *text; | |
GtkWidget *JetDialog; | |
- JetDialog = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(widget),"dialog")); | |
+ JetDialog = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(widget), "dialog")); | |
NewLocation = GPOINTER_TO_INT(data); | |
gtk_widget_destroy(JetDialog); | |
- text=g_strdup_printf("%d",NewLocation); | |
- SendClientMessage(ClientData.Play,C_NONE,C_REQUESTJET,NULL,text); | |
+ text = g_strdup_printf("%d", NewLocation); | |
+ SendClientMessage(ClientData.Play, C_NONE, C_REQUESTJET, NULL, text); | |
g_free(text); | |
} | |
-void JetButtonPressed(GtkWidget *widget,gpointer data) { | |
+void JetButtonPressed(GtkWidget *widget, gpointer data) | |
+{ | |
if (InGame) { | |
if (ClientData.Play->Flags & FIGHTING) { | |
- DisplayFightMessage(NULL); | |
+ DisplayFightMessage(NULL); | |
} else { | |
- Jet(NULL); | |
+ Jet(NULL); | |
} | |
} | |
} | |
-void Jet(GtkWidget *parent) { | |
- GtkWidget *dialog,*table,*button,*label,*vbox; | |
- GtkAccelGroup *accel_group; | |
- gint boxsize,i,row,col; | |
- gchar *name,AccelChar; | |
+void Jet(GtkWidget *parent) | |
+{ | |
+ GtkWidget *dialog, *table, *button, *label, *vbox; | |
+ GtkAccelGroup *accel_group; | |
+ gint boxsize, i, row, col; | |
+ gchar *name, AccelChar; | |
- accel_group=gtk_accel_group_new(); | |
+ accel_group = gtk_accel_group_new(); | |
- dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
-/* Title of 'Jet' dialog */ | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("Jet to location")); | |
+ dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ /* Title of 'Jet' dialog */ | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("Jet to location")); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- gtk_window_add_accel_group(GTK_WINDOW(dialog),accel_group); | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- parent ? GTK_WINDOW(parent) | |
- : GTK_WINDOW(ClientData.window)); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ parent ? GTK_WINDOW(parent) | |
+ : GTK_WINDOW(ClientData.window)); | |
+ | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ | |
+ /* Prompt in 'Jet' dialog */ | |
+ label = gtk_label_new(_("Where to, dude ? ")); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ | |
+ /* Generate a square box of buttons for all locations */ | |
+ boxsize = 1; | |
+ while (boxsize * boxsize < NumLocation) | |
+ boxsize++; | |
+ col = boxsize; | |
+ row = 1; | |
+ | |
+ /* Avoid creating a box with an entire row empty at the bottom */ | |
+ while (row * col < NumLocation) | |
+ row++; | |
+ | |
+ table = gtk_table_new(row, col, TRUE); | |
+ | |
+ for (i = 0; i < NumLocation; i++) { | |
+ if (i < 9) | |
+ AccelChar = '1' + i; | |
+ else if (i < 35) | |
+ AccelChar = 'A' + i - 9; | |
+ else | |
+ AccelChar = '\0'; | |
+ | |
+ row = i / boxsize; | |
+ col = i % boxsize; | |
+ if (AccelChar == '\0') { | |
+ button = gtk_button_new_with_label(Location[i].Name); | |
+ } else { | |
+ button = gtk_button_new_with_label(""); | |
+ | |
+ /* Display of locations in 'Jet' window (%tde="The Bronx" etc. by | |
+ * default) */ | |
+ name = dpg_strdup_printf(_("_%c. %tde"), AccelChar, Location[i].Name); | |
+ SetAccelerator(button, name, button, "clicked", accel_group); | |
+ /* Add keypad shortcuts as well */ | |
+ if (i < 9) { | |
+ gtk_widget_add_accelerator(button, "clicked", accel_group, | |
+ GDK_KP_1 + i, 0, | |
+ GTK_ACCEL_VISIBLE | | |
+ GTK_ACCEL_SIGNAL_VISIBLE); | |
+ } | |
+ g_free(name); | |
+ } | |
+ gtk_widget_set_sensitive(button, i != ClientData.Play->IsAt); | |
+ gtk_object_set_data(GTK_OBJECT(button), "dialog", dialog); | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(JetCallback), GINT_TO_POINTER(i)); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), button, col, col + 1, row, | |
+ row + 1); | |
+ } | |
+ gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0); | |
- vbox=gtk_vbox_new(FALSE,7); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ gtk_widget_show_all(dialog); | |
+} | |
-/* Prompt in 'Jet' dialog */ | |
- label=gtk_label_new(_("Where to, dude ? ")); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
+struct DealDiaStruct { | |
+ GtkWidget *dialog, *cost, *carrying, *space, *afford, *amount; | |
+ gint DrugInd; | |
+ gpointer Type; | |
+}; | |
+static struct DealDiaStruct DealDialog; | |
- /* Generate a square box of buttons for all locations */ | |
- boxsize=1; | |
- while (boxsize*boxsize < NumLocation) boxsize++; | |
- col=boxsize; row=1; | |
+static void UpdateDealDialog(void) | |
+{ | |
+ GString *text; | |
+ GtkAdjustment *spin_adj; | |
+ gint DrugInd, CanDrop, CanCarry, CanAfford, MaxDrug; | |
+ Player *Play; | |
- /* Avoid creating a box with an entire row empty at the bottom */ | |
- while (row*col < NumLocation) row++; | |
+ text = g_string_new(NULL); | |
+ DrugInd = DealDialog.DrugInd; | |
+ Play = ClientData.Play; | |
- table=gtk_table_new(row,col,TRUE); | |
+ /* Display of the current price of the selected drug in 'Deal Drugs' | |
+ * dialog */ | |
+ dpg_string_sprintf(text, _("at %P"), Play->Drugs[DrugInd].Price); | |
+ gtk_label_set_text(GTK_LABEL(DealDialog.cost), text->str); | |
- for (i=0;i<NumLocation;i++) { | |
- if (i<9) AccelChar='1'+i; | |
- else if (i<35) AccelChar='A'+i-9; | |
- else AccelChar='\0'; | |
+ CanDrop = Play->Drugs[DrugInd].Carried; | |
- row=i/boxsize; col=i%boxsize; | |
- if (AccelChar=='\0') { | |
- button=gtk_button_new_with_label(Location[i].Name); | |
- } else { | |
- button=gtk_button_new_with_label(""); | |
- | |
-/* Display of locations in 'Jet' window (%tde="The Bronx" etc. by default) */ | |
- name=dpg_strdup_printf(_("_%c. %tde"),AccelChar,Location[i].Name); | |
- SetAccelerator(button,name,button,"clicked",accel_group); | |
-/* Add keypad shortcuts as well */ | |
- if (i<9) { | |
- gtk_widget_add_accelerator(button,"clicked",accel_group,GDK_KP_1+i, | |
- 0,GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE); | |
- } | |
- g_free(name); | |
- } | |
- gtk_widget_set_sensitive(button,i != ClientData.Play->IsAt); | |
- gtk_object_set_data(GTK_OBJECT(button),"dialog",dialog); | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(JetCallback),GINT_TO_POINTER(i)); | |
- gtk_table_attach_defaults(GTK_TABLE(table),button,col,col+1,row,row+1); | |
- } | |
- gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,0); | |
+ /* Display of current inventory of the selected drug in 'Deal Drugs' | |
+ * dialog (%tde="Opium" etc. by default) */ | |
+ dpg_string_sprintf(text, _("You are currently carrying %d %tde"), | |
+ CanDrop, Drug[DrugInd].Name); | |
+ gtk_label_set_text(GTK_LABEL(DealDialog.carrying), text->str); | |
+ | |
+ CanCarry = Play->CoatSize; | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- gtk_widget_show_all(dialog); | |
+ /* Available space for drugs in 'Deal Drugs' dialog */ | |
+ g_string_sprintf(text, _("Available space: %d"), CanCarry); | |
+ gtk_label_set_text(GTK_LABEL(DealDialog.space), text->str); | |
+ | |
+ if (DealDialog.Type == BT_BUY) { | |
+ CanAfford = Play->Cash / Play->Drugs[DrugInd].Price; | |
+ | |
+ /* Number of the selected drug that you can afford in 'Deal Drugs' | |
+ * dialog */ | |
+ g_string_sprintf(text, _("You can afford %d"), CanAfford); | |
+ gtk_label_set_text(GTK_LABEL(DealDialog.afford), text->str); | |
+ MaxDrug = MIN(CanCarry, CanAfford); | |
+ } else | |
+ MaxDrug = CanDrop; | |
+ | |
+ spin_adj = (GtkAdjustment *)gtk_adjustment_new(MaxDrug, 1.0, MaxDrug, | |
+ 1.0, 10.0, 10.0); | |
+ gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(DealDialog.amount), | |
+ spin_adj); | |
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON(DealDialog.amount), MaxDrug); | |
+ | |
+ g_string_free(text, TRUE); | |
} | |
-struct DealDiaStruct { | |
- GtkWidget *dialog,*cost,*carrying,*space,*afford,*amount; | |
- gint DrugInd; | |
- gpointer Type; | |
-}; | |
-static struct DealDiaStruct DealDialog; | |
+static void DealSelectCallback(GtkWidget *widget, gpointer data) | |
+{ | |
+ DealDialog.DrugInd = GPOINTER_TO_INT(data); | |
+ UpdateDealDialog(); | |
+} | |
-static void UpdateDealDialog(void) { | |
- GString *text; | |
- GtkAdjustment *spin_adj; | |
- gint DrugInd,CanDrop,CanCarry,CanAfford,MaxDrug; | |
- Player *Play; | |
- | |
- text=g_string_new(NULL); | |
- DrugInd=DealDialog.DrugInd; | |
- Play=ClientData.Play; | |
- | |
-/* Display of the current price of the selected drug in 'Deal Drugs' dialog */ | |
- dpg_string_sprintf(text,_("at %P"),Play->Drugs[DrugInd].Price); | |
- gtk_label_set_text(GTK_LABEL(DealDialog.cost),text->str); | |
- | |
- CanDrop=Play->Drugs[DrugInd].Carried; | |
- | |
-/* Display of current inventory of the selected drug in 'Deal Drugs' dialog | |
- (%tde="Opium" etc. by default) */ | |
- dpg_string_sprintf(text,_("You are currently carrying %d %tde"), | |
- CanDrop,Drug[DrugInd].Name); | |
- gtk_label_set_text(GTK_LABEL(DealDialog.carrying),text->str); | |
- | |
- CanCarry=Play->CoatSize; | |
- | |
-/* Available space for drugs in 'Deal Drugs' dialog */ | |
- g_string_sprintf(text,_("Available space: %d"),CanCarry); | |
- gtk_label_set_text(GTK_LABEL(DealDialog.space),text->str); | |
- | |
- if (DealDialog.Type==BT_BUY) { | |
- CanAfford=Play->Cash/Play->Drugs[DrugInd].Price; | |
- | |
-/* Number of the selected drug that you can afford in 'Deal Drugs' dialog */ | |
- g_string_sprintf(text,_("You can afford %d"),CanAfford); | |
- gtk_label_set_text(GTK_LABEL(DealDialog.afford),text->str); | |
- MaxDrug=MIN(CanCarry,CanAfford); | |
- } else MaxDrug=CanDrop; | |
- | |
- spin_adj=(GtkAdjustment *)gtk_adjustment_new(MaxDrug,1.0,MaxDrug, | |
- 1.0,10.0,10.0); | |
- gtk_spin_button_set_adjustment(GTK_SPIN_BUTTON(DealDialog.amount),spin_adj); | |
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(DealDialog.amount),MaxDrug); | |
- | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-static void DealSelectCallback(GtkWidget *widget,gpointer data) { | |
- DealDialog.DrugInd=GPOINTER_TO_INT(data); | |
- UpdateDealDialog(); | |
-} | |
- | |
-static void DealOKCallback(GtkWidget *widget,gpointer data) { | |
- GtkWidget *spinner; | |
- gint amount; | |
- gchar *text; | |
- | |
- spinner=DealDialog.amount; | |
- | |
- gtk_spin_button_update(GTK_SPIN_BUTTON(spinner)); | |
- amount=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner)); | |
- | |
- text=g_strdup_printf("drug^%d^%d",DealDialog.DrugInd, | |
- data==BT_BUY ? amount : -amount); | |
- SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,text); | |
- g_free(text); | |
- | |
- gtk_widget_destroy(DealDialog.dialog); | |
-} | |
- | |
-void DealDrugs(GtkWidget *widget,gpointer data) { | |
- GtkWidget *dialog,*label,*hbox,*hbbox,*button,*spinner,*menu, | |
- *optionmenu,*menuitem,*vbox,*hsep; | |
- GtkAdjustment *spin_adj; | |
- GtkAccelGroup *accel_group; | |
- GtkWidget *clist; | |
- gchar *Action; | |
- GString *text; | |
- GList *selection; | |
- gint row; | |
- Player *Play; | |
- gint DrugInd,i,SelIndex,FirstInd; | |
- gboolean DrugIndOK; | |
- | |
-/* Action in 'Deal Drugs' dialog - "Buy/Sell/Drop Drugs" */ | |
- if (data==BT_BUY) Action=_("Buy"); | |
- else if (data==BT_SELL) Action=_("Sell"); | |
- else if (data==BT_DROP) Action=_("Drop"); | |
- else { | |
- g_warning("Bad DealDrug type"); return; | |
- } | |
- | |
- DealDialog.Type=data; | |
- Play=ClientData.Play; | |
- | |
- if (data==BT_BUY) clist=ClientData.Drug.HereList; | |
- else clist=ClientData.Drug.CarriedList; | |
- selection=GTK_CLIST(clist)->selection; | |
- if (selection) { | |
- row=GPOINTER_TO_INT(selection->data); | |
- DrugInd=GPOINTER_TO_INT(gtk_clist_get_row_data(GTK_CLIST(clist),row)); | |
- } else DrugInd=-1; | |
- | |
- DrugIndOK=FALSE; | |
- FirstInd=-1; | |
- for (i=0;i<NumDrug;i++) { | |
- if ((data==BT_DROP && Play->Drugs[i].Carried>0 && | |
- Play->Drugs[i].Price==0) || | |
- (data==BT_SELL && Play->Drugs[i].Carried>0 && | |
- Play->Drugs[i].Price!=0) || | |
- (data==BT_BUY && Play->Drugs[i].Price!=0)) { | |
- if (FirstInd==-1) FirstInd=i; | |
- if (DrugInd==i) DrugIndOK=TRUE; | |
- } | |
- } | |
- if (!DrugIndOK) { | |
- if (FirstInd==-1) return; | |
- else DrugInd=FirstInd; | |
- } | |
- | |
- text=g_string_new(NULL); | |
- accel_group=gtk_accel_group_new(); | |
- dialog=DealDialog.dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- gtk_window_set_title(GTK_WINDOW(dialog),Action); | |
- gtk_window_add_accel_group(GTK_WINDOW(dialog),accel_group); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(ClientData.window)); | |
- | |
- vbox=gtk_vbox_new(FALSE,7); | |
- | |
- hbox=gtk_hbox_new(FALSE,7); | |
- | |
- label=gtk_label_new(Action); | |
- gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); | |
- | |
- optionmenu=gtk_option_menu_new(); | |
- menu=gtk_menu_new(); | |
- SelIndex=-1; | |
- for (i=0;i<NumDrug;i++) { | |
- if ((data==BT_DROP && Play->Drugs[i].Carried>0 && | |
- Play->Drugs[i].Price==0) || | |
- (data==BT_SELL && Play->Drugs[i].Carried>0 && | |
- Play->Drugs[i].Price!=0) || | |
- (data==BT_BUY && Play->Drugs[i].Price!=0)) { | |
- menuitem=gtk_menu_item_new_with_label(Drug[i].Name); | |
- gtk_signal_connect(GTK_OBJECT(menuitem),"activate", | |
- GTK_SIGNAL_FUNC(DealSelectCallback), | |
- GINT_TO_POINTER(i)); | |
- gtk_menu_append(GTK_MENU(menu),menuitem); | |
- if (DrugInd>=i) SelIndex++; | |
- } | |
- } | |
- gtk_menu_set_active(GTK_MENU(menu),SelIndex); | |
- gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu),menu); | |
- gtk_box_pack_start(GTK_BOX(hbox),optionmenu,TRUE,TRUE,0); | |
- | |
- DealDialog.DrugInd=DrugInd; | |
- | |
- label=DealDialog.cost=gtk_label_new(NULL); | |
- gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); | |
- | |
- label=DealDialog.carrying=gtk_label_new(NULL); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
- | |
- label=DealDialog.space=gtk_label_new(NULL); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
- | |
- if (data==BT_BUY) { | |
- label=DealDialog.afford=gtk_label_new(NULL); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
- } | |
- hbox=gtk_hbox_new(FALSE,7); | |
- if (data==BT_BUY) { | |
-/* Prompts for action in the "deal drugs" dialog */ | |
- g_string_sprintf(text,_("Buy how many?")); | |
- } else if (data==BT_SELL) { | |
- g_string_sprintf(text,_("Sell how many?")); | |
- } else { | |
- g_string_sprintf(text,_("Drop how many?")); | |
- } | |
- label=gtk_label_new(text->str); | |
- gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); | |
- spin_adj=(GtkAdjustment *)gtk_adjustment_new(1.0,1.0,2.0,1.0,10.0,10.0); | |
- spinner=DealDialog.amount=gtk_spin_button_new(spin_adj,1.0,0); | |
- gtk_signal_connect(GTK_OBJECT(spinner),"activate", | |
- GTK_SIGNAL_FUNC(DealOKCallback),data); | |
- gtk_box_pack_start(GTK_BOX(hbox),spinner,FALSE,FALSE,0); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,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(DealOKCallback),data); | |
- GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT); | |
- gtk_widget_grab_default(button); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
- | |
-/* Caption of "Cancel" button for GTK+ client dialogs */ | |
- button=gtk_button_new_with_label(_("Cancel")); | |
- gtk_signal_connect_object(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
- (gpointer)dialog); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
- | |
- gtk_box_pack_start(GTK_BOX(vbox),hbbox,FALSE,FALSE,0); | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- | |
- g_string_free(text,TRUE); | |
- UpdateDealDialog(); | |
- | |
- gtk_widget_show_all(dialog); | |
-} | |
- | |
-void DealGuns(GtkWidget *widget,gpointer data) { | |
- GtkWidget *clist,*dialog; | |
- GList *selection; | |
- gint row,GunInd; | |
- gchar *Action,*Title; | |
- GString *text; | |
- | |
- dialog=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- if (data==BT_BUY) Action=_("Buy"); | |
- else if (data==BT_SELL) Action=_("Sell"); | |
- else Action=_("Drop"); | |
- | |
- if (data==BT_BUY) clist=ClientData.Gun.HereList; | |
- else clist=ClientData.Gun.CarriedList; | |
- selection=GTK_CLIST(clist)->selection; | |
- if (selection) { | |
- row=GPOINTER_TO_INT(selection->data); | |
- GunInd=GPOINTER_TO_INT(gtk_clist_get_row_data(GTK_CLIST(clist),row)); | |
- } else return; | |
- | |
- | |
-/* Title of 'gun shop' dialog (%tde="guns" by default) "Buy/Sell/Drop Guns" */ | |
- if (data==BT_BUY) Title=dpg_strdup_printf(_("Buy %tde"),Names.Guns); | |
- else if (data==BT_SELL) Title=dpg_strdup_printf(_("Sell %tde"),Names.Guns); | |
- else Title=dpg_strdup_printf(_("Drop %tde"),Names.Guns); | |
- | |
- text=g_string_new(""); | |
- | |
- if (data!=BT_BUY && TotalGunsCarried(ClientData.Play)==0) { | |
- dpg_string_sprintf(text,_("You don't have any %tde to sell!"),Names.Guns… | |
- GtkMessageBox(dialog,text->str,Title,MB_OK); | |
- } else if (data==BT_BUY && TotalGunsCarried(ClientData.Play) >= | |
- ClientData.Play->Bitches.Carried+2) { | |
- dpg_string_sprintf(text, | |
- _("You'll need more %tde to carry any more %tde!"), | |
- Names.Bitches,Names.Guns); | |
- GtkMessageBox(dialog,text->str,Title,MB_OK); | |
- } else if (data==BT_BUY && Gun[GunInd].Space > ClientData.Play->CoatSize) { | |
- dpg_string_sprintf(text, | |
- _("You don't have enough space to carry that %tde!"), | |
- Names.Gun); | |
- GtkMessageBox(dialog,text->str,Title,MB_OK); | |
- } else if (data==BT_BUY && Gun[GunInd].Price > ClientData.Play->Cash) { | |
- dpg_string_sprintf(text,_("You don't have enough cash to buy that %tde!"… | |
- Names.Gun); | |
- GtkMessageBox(dialog,text->str,Title,MB_OK); | |
- } else if (data==BT_SELL && ClientData.Play->Guns[GunInd].Carried == 0) { | |
- GtkMessageBox(dialog,_("You don't have any to sell!"),Title,MB_OK); | |
- } else { | |
- g_string_sprintf(text,"gun^%d^%d",GunInd,data==BT_BUY ? 1 : -1); | |
- SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,text->str); | |
- } | |
- g_free(Title); | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-static void QuestionCallback(GtkWidget *widget,gpointer data) { | |
- gint Answer; | |
- gchar text[5]; | |
- GtkWidget *dialog; | |
- Player *To; | |
- | |
- dialog = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(widget),"dialog")); | |
- To = (Player *)gtk_object_get_data(GTK_OBJECT(dialog),"From"); | |
- Answer = GPOINTER_TO_INT(data); | |
- | |
- text[0]=(gchar)Answer; text[1]='\0'; | |
- SendClientMessage(ClientData.Play,C_NONE,C_ANSWER,To,text); | |
- | |
- gtk_widget_destroy(dialog); | |
-} | |
- | |
-void QuestionDialog(char *Data,Player *From) { | |
- GtkWidget *dialog,*label,*vbox,*hsep,*hbbox,*button; | |
+static void DealOKCallback(GtkWidget *widget, gpointer data) | |
+{ | |
+ GtkWidget *spinner; | |
+ gint amount; | |
+ gchar *text; | |
+ | |
+ spinner = DealDialog.amount; | |
+ | |
+ gtk_spin_button_update(GTK_SPIN_BUTTON(spinner)); | |
+ amount = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner)); | |
+ | |
+ text = g_strdup_printf("drug^%d^%d", DealDialog.DrugInd, | |
+ data == BT_BUY ? amount : -amount); | |
+ SendClientMessage(ClientData.Play, C_NONE, C_BUYOBJECT, NULL, text); | |
+ g_free(text); | |
+ | |
+ gtk_widget_destroy(DealDialog.dialog); | |
+} | |
+ | |
+void DealDrugs(GtkWidget *widget, gpointer data) | |
+{ | |
+ GtkWidget *dialog, *label, *hbox, *hbbox, *button, *spinner, *menu, | |
+ *optionmenu, *menuitem, *vbox, *hsep; | |
+ GtkAdjustment *spin_adj; | |
GtkAccelGroup *accel_group; | |
- gchar *Responses,**split,*LabelText,*trword,*underline; | |
+ GtkWidget *clist; | |
+ gchar *Action; | |
+ GString *text; | |
+ GList *selection; | |
+ gint row; | |
+ Player *Play; | |
+ gint DrugInd, i, SelIndex, FirstInd; | |
+ gboolean DrugIndOK; | |
+ | |
+ /* Action in 'Deal Drugs' dialog - "Buy/Sell/Drop Drugs" */ | |
+ if (data == BT_BUY) | |
+ Action = _("Buy"); | |
+ else if (data == BT_SELL) | |
+ Action = _("Sell"); | |
+ else if (data == BT_DROP) | |
+ Action = _("Drop"); | |
+ else { | |
+ g_warning("Bad DealDrug type"); | |
+ return; | |
+ } | |
-/* Button titles that correspond to the single-keypress options provided | |
- by the curses client (e.g. _Yes corresponds to 'Y' etc.) */ | |
+ DealDialog.Type = data; | |
+ Play = ClientData.Play; | |
+ | |
+ if (data == BT_BUY) | |
+ clist = ClientData.Drug.HereList; | |
+ else | |
+ clist = ClientData.Drug.CarriedList; | |
+ selection = GTK_CLIST(clist)->selection; | |
+ if (selection) { | |
+ row = GPOINTER_TO_INT(selection->data); | |
+ DrugInd = | |
+ GPOINTER_TO_INT(gtk_clist_get_row_data(GTK_CLIST(clist), row)); | |
+ } else | |
+ DrugInd = -1; | |
+ | |
+ DrugIndOK = FALSE; | |
+ FirstInd = -1; | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if ((data == BT_DROP && Play->Drugs[i].Carried > 0 | |
+ && Play->Drugs[i].Price == 0) | |
+ || (data == BT_SELL && Play->Drugs[i].Carried > 0 | |
+ && Play->Drugs[i].Price != 0) | |
+ || (data == BT_BUY && Play->Drugs[i].Price != 0)) { | |
+ if (FirstInd == -1) | |
+ FirstInd = i; | |
+ if (DrugInd == i) | |
+ DrugIndOK = TRUE; | |
+ } | |
+ } | |
+ if (!DrugIndOK) { | |
+ if (FirstInd == -1) | |
+ return; | |
+ else | |
+ DrugInd = FirstInd; | |
+ } | |
+ | |
+ text = g_string_new(NULL); | |
+ accel_group = gtk_accel_group_new(); | |
+ dialog = DealDialog.dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ gtk_window_set_title(GTK_WINDOW(dialog), Action); | |
+ gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ GTK_WINDOW(ClientData.window)); | |
+ | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ | |
+ hbox = gtk_hbox_new(FALSE, 7); | |
+ | |
+ label = gtk_label_new(Action); | |
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
+ | |
+ optionmenu = gtk_option_menu_new(); | |
+ menu = gtk_menu_new(); | |
+ SelIndex = -1; | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if ((data == BT_DROP && Play->Drugs[i].Carried > 0 | |
+ && Play->Drugs[i].Price == 0) | |
+ || (data == BT_SELL && Play->Drugs[i].Carried > 0 | |
+ && Play->Drugs[i].Price != 0) | |
+ || (data == BT_BUY && Play->Drugs[i].Price != 0)) { | |
+ menuitem = gtk_menu_item_new_with_label(Drug[i].Name); | |
+ gtk_signal_connect(GTK_OBJECT(menuitem), "activate", | |
+ GTK_SIGNAL_FUNC(DealSelectCallback), | |
+ GINT_TO_POINTER(i)); | |
+ gtk_menu_append(GTK_MENU(menu), menuitem); | |
+ if (DrugInd >= i) | |
+ SelIndex++; | |
+ } | |
+ } | |
+ gtk_menu_set_active(GTK_MENU(menu), SelIndex); | |
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu); | |
+ gtk_box_pack_start(GTK_BOX(hbox), optionmenu, TRUE, TRUE, 0); | |
+ | |
+ DealDialog.DrugInd = DrugInd; | |
+ | |
+ label = DealDialog.cost = gtk_label_new(NULL); | |
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
+ | |
+ label = DealDialog.carrying = gtk_label_new(NULL); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ | |
+ label = DealDialog.space = gtk_label_new(NULL); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ | |
+ if (data == BT_BUY) { | |
+ label = DealDialog.afford = gtk_label_new(NULL); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ } | |
+ hbox = gtk_hbox_new(FALSE, 7); | |
+ if (data == BT_BUY) { | |
+ /* Prompts for action in the "deal drugs" dialog */ | |
+ g_string_sprintf(text, _("Buy how many?")); | |
+ } else if (data == BT_SELL) { | |
+ g_string_sprintf(text, _("Sell how many?")); | |
+ } else { | |
+ g_string_sprintf(text, _("Drop how many?")); | |
+ } | |
+ label = gtk_label_new(text->str); | |
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
+ spin_adj = (GtkAdjustment *)gtk_adjustment_new(1.0, 1.0, 2.0, | |
+ 1.0, 10.0, 10.0); | |
+ spinner = DealDialog.amount = gtk_spin_button_new(spin_adj, 1.0, 0); | |
+ gtk_signal_connect(GTK_OBJECT(spinner), "activate", | |
+ GTK_SIGNAL_FUNC(DealOKCallback), data); | |
+ gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 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(DealOKCallback), data); | |
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); | |
+ gtk_widget_grab_default(button); | |
+ gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0); | |
+ | |
+ /* Caption of "Cancel" button for GTK+ client dialogs */ | |
+ button = gtk_button_new_with_label(_("Cancel")); | |
+ gtk_signal_connect_object(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)dialog); | |
+ gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ | |
+ g_string_free(text, TRUE); | |
+ UpdateDealDialog(); | |
+ | |
+ gtk_widget_show_all(dialog); | |
+} | |
+ | |
+void DealGuns(GtkWidget *widget, gpointer data) | |
+{ | |
+ GtkWidget *clist, *dialog; | |
+ GList *selection; | |
+ gint row, GunInd; | |
+ gchar *Action, *Title; | |
+ GString *text; | |
+ | |
+ dialog = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ if (data == BT_BUY) | |
+ Action = _("Buy"); | |
+ else if (data == BT_SELL) | |
+ Action = _("Sell"); | |
+ else | |
+ Action = _("Drop"); | |
+ | |
+ if (data == BT_BUY) | |
+ clist = ClientData.Gun.HereList; | |
+ else | |
+ clist = ClientData.Gun.CarriedList; | |
+ selection = GTK_CLIST(clist)->selection; | |
+ if (selection) { | |
+ row = GPOINTER_TO_INT(selection->data); | |
+ GunInd = | |
+ GPOINTER_TO_INT(gtk_clist_get_row_data(GTK_CLIST(clist), row)); | |
+ } else | |
+ return; | |
+ | |
+ | |
+ /* Title of 'gun shop' dialog (%tde="guns" by default) "Buy/Sell/Drop | |
+ * Guns" */ | |
+ if (data == BT_BUY) | |
+ Title = dpg_strdup_printf(_("Buy %tde"), Names.Guns); | |
+ else if (data == BT_SELL) | |
+ Title = dpg_strdup_printf(_("Sell %tde"), Names.Guns); | |
+ else | |
+ Title = dpg_strdup_printf(_("Drop %tde"), Names.Guns); | |
+ | |
+ text = g_string_new(""); | |
+ | |
+ if (data != BT_BUY && TotalGunsCarried(ClientData.Play) == 0) { | |
+ dpg_string_sprintf(text, _("You don't have any %tde to sell!"), | |
+ Names.Guns); | |
+ GtkMessageBox(dialog, text->str, Title, MB_OK); | |
+ } else if (data == BT_BUY && TotalGunsCarried(ClientData.Play) >= | |
+ ClientData.Play->Bitches.Carried + 2) { | |
+ dpg_string_sprintf(text, | |
+ _("You'll need more %tde to carry any more %tde!"), | |
+ Names.Bitches, Names.Guns); | |
+ GtkMessageBox(dialog, text->str, Title, MB_OK); | |
+ } else if (data == BT_BUY | |
+ && Gun[GunInd].Space > ClientData.Play->CoatSize) { | |
+ dpg_string_sprintf(text, | |
+ _("You don't have enough space to carry that %tde!"), | |
+ Names.Gun); | |
+ GtkMessageBox(dialog, text->str, Title, MB_OK); | |
+ } else if (data == BT_BUY && Gun[GunInd].Price > ClientData.Play->Cash) { | |
+ dpg_string_sprintf(text, | |
+ _("You don't have enough cash to buy that %tde!"), | |
+ Names.Gun); | |
+ GtkMessageBox(dialog, text->str, Title, MB_OK); | |
+ } else if (data == BT_SELL && ClientData.Play->Guns[GunInd].Carried == 0) { | |
+ GtkMessageBox(dialog, _("You don't have any to sell!"), Title, MB_OK); | |
+ } else { | |
+ g_string_sprintf(text, "gun^%d^%d", GunInd, data == BT_BUY ? 1 : -1); | |
+ SendClientMessage(ClientData.Play, C_NONE, C_BUYOBJECT, NULL, | |
+ text->str); | |
+ } | |
+ g_free(Title); | |
+ g_string_free(text, TRUE); | |
+} | |
+ | |
+static void QuestionCallback(GtkWidget *widget, gpointer data) | |
+{ | |
+ gint Answer; | |
+ gchar text[5]; | |
+ GtkWidget *dialog; | |
+ Player *To; | |
+ | |
+ dialog = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(widget), "dialog")); | |
+ To = (Player *)gtk_object_get_data(GTK_OBJECT(dialog), "From"); | |
+ Answer = GPOINTER_TO_INT(data); | |
+ | |
+ text[0] = (gchar)Answer; | |
+ text[1] = '\0'; | |
+ SendClientMessage(ClientData.Play, C_NONE, C_ANSWER, To, text); | |
+ | |
+ gtk_widget_destroy(dialog); | |
+} | |
+ | |
+void QuestionDialog(char *Data, Player *From) | |
+{ | |
+ GtkWidget *dialog, *label, *vbox, *hsep, *hbbox, *button; | |
+ GtkAccelGroup *accel_group; | |
+ gchar *Responses, **split, *LabelText, *trword, *underline; | |
+ | |
+ /* Button titles that correspond to the single-keypress options provided | |
+ * by the curses client (e.g. _Yes corresponds to 'Y' etc.) */ | |
gchar *Words[] = { N_("_Yes"), N_("_No"), N_("_Run"), | |
- N_("_Fight"), N_("_Attack"), N_("_Evade") }; | |
+ N_("_Fight"), N_("_Attack"), N_("_Evade") | |
+ }; | |
gint numWords = sizeof(Words) / sizeof(Words[0]); | |
- gint i,j; | |
+ gint i, j; | |
- split=g_strsplit(Data,"^",1); | |
+ split = g_strsplit(Data, "^", 1); | |
if (!split[0] || !split[1]) { | |
- g_warning("Bad QUESTION message %s",Data); return; | |
+ g_warning("Bad QUESTION message %s", Data); | |
+ return; | |
} | |
- g_strdelimit(split[1],"^",'\n'); | |
+ g_strdelimit(split[1], "^", '\n'); | |
- Responses=split[0]; LabelText=split[1]; | |
+ Responses = split[0]; | |
+ LabelText = split[1]; | |
- dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- accel_group=gtk_accel_group_new(); | |
- gtk_signal_connect(GTK_OBJECT(dialog),"delete_event", | |
- GTK_SIGNAL_FUNC(DisallowDelete),NULL); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"From",(gpointer)From); | |
+ dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ accel_group = gtk_accel_group_new(); | |
+ gtk_signal_connect(GTK_OBJECT(dialog), "delete_event", | |
+ GTK_SIGNAL_FUNC(DisallowDelete), NULL); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "From", (gpointer)From); | |
-/* Title of the 'ask player a question' dialog */ | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("Question")); | |
+ /* Title of the 'ask player a question' dialog */ | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("Question")); | |
- gtk_window_add_accel_group(GTK_WINDOW(dialog),accel_group); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
+ gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
GTK_WINDOW(ClientData.window)); | |
- vbox=gtk_vbox_new(FALSE,7); | |
- while (*LabelText=='\n') LabelText++; | |
- label=gtk_label_new(LabelText); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ while (*LabelText == '\n') | |
+ LabelText++; | |
+ label = gtk_label_new(LabelText); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
- hbbox=gtk_hbutton_box_new(); | |
+ hbbox = gtk_hbutton_box_new(); | |
- for (i=0;i<strlen(Responses);i++) { | |
- for (j=0,trword=NULL;j<numWords && !trword;j++) { | |
- underline = strchr(Words[j],'_'); | |
- if (underline && toupper(underline[1])==Responses[i]) { | |
+ for (i = 0; i < strlen(Responses); i++) { | |
+ for (j = 0, trword = NULL; j < numWords && !trword; j++) { | |
+ underline = strchr(Words[j], '_'); | |
+ if (underline && toupper(underline[1]) == Responses[i]) { | |
trword = _(Words[j]); | |
} | |
} | |
- button=gtk_button_new_with_label(""); | |
+ button = gtk_button_new_with_label(""); | |
if (trword) { | |
- SetAccelerator(button,trword,button,"clicked",accel_group); | |
+ SetAccelerator(button, trword, button, "clicked", accel_group); | |
} else { | |
- trword = g_strdup_printf("_%c",Responses[i]); | |
- SetAccelerator(button,trword,button,"clicked",accel_group); | |
+ trword = g_strdup_printf("_%c", Responses[i]); | |
+ SetAccelerator(button, trword, button, "clicked", accel_group); | |
g_free(trword); | |
} | |
- gtk_object_set_data(GTK_OBJECT(button),"dialog",(gpointer)dialog); | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
+ gtk_object_set_data(GTK_OBJECT(button), "dialog", (gpointer)dialog); | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
GTK_SIGNAL_FUNC(QuestionCallback), | |
GINT_TO_POINTER((gint)Responses[i])); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
+ 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(dialog),vbox); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbbox, TRUE, TRUE, 0); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
gtk_widget_show_all(dialog); | |
- | |
+ | |
g_strfreev(split); | |
} | |
-void StartGame(void) { | |
- Player *Play=ClientData.Play; | |
- InitAbilities(Play); | |
- SendAbilities(Play); | |
- SendNullClientMessage(Play,C_NONE,C_NAME,NULL,GetPlayerName(Play)); | |
- InGame=TRUE; | |
- UpdateMenus(); | |
- gtk_widget_show_all(ClientData.vbox); | |
- UpdatePlayerLists(); | |
-} | |
- | |
-void EndGame(void) { | |
- DisplayFightMessage(NULL); | |
- gtk_widget_hide_all(ClientData.vbox); | |
- gtk_editable_delete_text(GTK_EDITABLE(ClientData.messages),0,-1); | |
- ShutdownNetwork(ClientData.Play); | |
- UpdatePlayerLists(); | |
- CleanUpServer(); | |
- RestoreConfig(); | |
- InGame=FALSE; | |
- UpdateMenus(); | |
-} | |
- | |
-static void ChangeDrugSort(GtkCList *clist,gint column,gpointer user_data) { | |
- if (column==0) { | |
- DrugSortMethod=(DrugSortMethod==DS_ATOZ ? DS_ZTOA : DS_ATOZ); | |
- } else { | |
- DrugSortMethod=(DrugSortMethod==DS_CHEAPFIRST ? DS_CHEAPLAST : | |
- DS_CHEAPFIRST); | |
- } | |
- gtk_clist_sort(clist); | |
-} | |
- | |
-static gint DrugSortFunc(GtkCList *clist,gconstpointer ptr1, | |
- gconstpointer ptr2) { | |
- int index1,index2; | |
- price_t pricediff; | |
- | |
- index1=GPOINTER_TO_INT(((const GtkCListRow *)ptr1)->data); | |
- index2=GPOINTER_TO_INT(((const GtkCListRow *)ptr2)->data); | |
- if (index1<0 || index1>=NumDrug || index2<0 || index2>=NumDrug) return 0; | |
- | |
- switch(DrugSortMethod) { | |
- case DS_ATOZ: | |
- return g_strcasecmp(Drug[index1].Name,Drug[index2].Name); | |
- case DS_ZTOA: | |
- return g_strcasecmp(Drug[index2].Name,Drug[index1].Name); | |
- case DS_CHEAPFIRST: | |
- pricediff=ClientData.Play->Drugs[index1].Price- | |
- ClientData.Play->Drugs[index2].Price; | |
- return pricediff==0 ? 0 : pricediff<0 ? -1 : 1; | |
- case DS_CHEAPLAST: | |
- pricediff=ClientData.Play->Drugs[index2].Price- | |
- ClientData.Play->Drugs[index1].Price; | |
- return pricediff==0 ? 0 : pricediff<0 ? -1 : 1; | |
- } | |
- return 0; | |
-} | |
- | |
-void UpdateMenus(void) { | |
- gboolean MultiPlayer; | |
- gint Bitches; | |
- | |
- MultiPlayer = (FirstClient && FirstClient->next!=NULL); | |
- Bitches = InGame && ClientData.Play ? ClientData.Play->Bitches.Carried : 0; | |
- | |
- gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Talk"),InGame && Network); | |
- gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/List"),InGame); | |
- gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/List/Players..."),InGame && Network); | |
- gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Errands"),InGame); | |
- gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Errands/Spy..."),InGame && MultiPlayer); | |
- gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Errands/Tipoff..."),InGame && MultiPlayer); | |
- gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Errands/Sack Bitch..."),Bitches>0); | |
- gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
- "<main>/Errands/Get spy reports..."), | |
- InGame && MultiPlayer); | |
-} | |
- | |
-GtkWidget *CreateStatusWidgets(struct StatusWidgets *Status) { | |
- GtkWidget *table,*label; | |
- | |
- table = gtk_table_new(3,6,FALSE); | |
- gtk_table_set_row_spacings(GTK_TABLE(table),3); | |
- gtk_table_set_col_spacings(GTK_TABLE(table),3); | |
- | |
- label=Status->Location = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,0,2,0,1); | |
- | |
- label=Status->Date = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,2,4,0,1); | |
- | |
-/* Available space label in GTK+ client status display */ | |
- label=Status->SpaceName = gtk_label_new(_("Space")); | |
- | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,0,1); | |
- label=Status->SpaceValue = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,5,6,0,1); | |
- | |
-/* Player's cash label in GTK+ client status display */ | |
- label=Status->CashName = gtk_label_new(_("Cash")); | |
- | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,1,2); | |
- label=Status->CashValue = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,1,2); | |
- | |
-/* Player's debt label in GTK+ client status display */ | |
- label=Status->DebtName = gtk_label_new(_("Debt")); | |
- | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,1,2); | |
- label=Status->DebtValue = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,3,4,1,2); | |
- | |
-/* Player's bank balance label in GTK+ client status display */ | |
- label=Status->BankName = gtk_label_new(_("Bank")); | |
- | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,1,2); | |
- label=Status->BankValue = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,5,6,1,2); | |
- | |
- label=Status->GunsName = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,3); | |
- label=Status->GunsValue = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,2,3); | |
- | |
- label=Status->BitchesName = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,2,3); | |
- label=Status->BitchesValue = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,3,4,2,3); | |
- | |
-/* Player's health label in GTK+ client status display */ | |
- label=Status->HealthName = gtk_label_new(_("Health")); | |
- | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,4,5,2,3); | |
- label=Status->HealthValue = gtk_label_new(NULL); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,5,6,2,3); | |
- return table; | |
-} | |
- | |
-void SetJetButtonTitle(GtkAccelGroup *accel_group) { | |
- GtkWidget *button; | |
- guint accel_key; | |
- | |
- button=ClientData.JetButton; | |
- accel_key=ClientData.JetAccel; | |
- | |
- if (accel_key) { | |
- gtk_widget_remove_accelerator(button,accel_group,accel_key,0); | |
- } | |
- | |
- ClientData.JetAccel=SetAccelerator(button, | |
- (ClientData.Play && ClientData.Play->Flags & FIGHTING) ? | |
- _("_Fight") : | |
-/* Caption of 'Jet' button in main window */ | |
- _("_Jet!"),button,"clicked",accel_group); | |
+void StartGame(void) | |
+{ | |
+ Player *Play = ClientData.Play; | |
+ | |
+ InitAbilities(Play); | |
+ SendAbilities(Play); | |
+ SendNullClientMessage(Play, C_NONE, C_NAME, NULL, GetPlayerName(Play)); | |
+ InGame = TRUE; | |
+ UpdateMenus(); | |
+ gtk_widget_show_all(ClientData.vbox); | |
+ UpdatePlayerLists(); | |
+} | |
+ | |
+void EndGame(void) | |
+{ | |
+ DisplayFightMessage(NULL); | |
+ gtk_widget_hide_all(ClientData.vbox); | |
+ gtk_editable_delete_text(GTK_EDITABLE(ClientData.messages), 0, -1); | |
+ ShutdownNetwork(ClientData.Play); | |
+ UpdatePlayerLists(); | |
+ CleanUpServer(); | |
+ RestoreConfig(); | |
+ InGame = FALSE; | |
+ UpdateMenus(); | |
+} | |
+ | |
+static void ChangeDrugSort(GtkCList *clist, gint column, | |
+ gpointer user_data) | |
+{ | |
+ if (column == 0) { | |
+ DrugSortMethod = (DrugSortMethod == DS_ATOZ ? DS_ZTOA : DS_ATOZ); | |
+ } else { | |
+ DrugSortMethod = (DrugSortMethod == DS_CHEAPFIRST ? DS_CHEAPLAST : | |
+ DS_CHEAPFIRST); | |
+ } | |
+ gtk_clist_sort(clist); | |
+} | |
+ | |
+static gint DrugSortFunc(GtkCList *clist, gconstpointer ptr1, | |
+ gconstpointer ptr2) | |
+{ | |
+ int index1, index2; | |
+ price_t pricediff; | |
+ | |
+ index1 = GPOINTER_TO_INT(((const GtkCListRow *)ptr1)->data); | |
+ index2 = GPOINTER_TO_INT(((const GtkCListRow *)ptr2)->data); | |
+ if (index1 < 0 || index1 >= NumDrug || index2 < 0 || index2 >= NumDrug) | |
+ return 0; | |
+ | |
+ switch (DrugSortMethod) { | |
+ case DS_ATOZ: | |
+ return g_strcasecmp(Drug[index1].Name, Drug[index2].Name); | |
+ case DS_ZTOA: | |
+ return g_strcasecmp(Drug[index2].Name, Drug[index1].Name); | |
+ case DS_CHEAPFIRST: | |
+ pricediff = ClientData.Play->Drugs[index1].Price - | |
+ ClientData.Play->Drugs[index2].Price; | |
+ return pricediff == 0 ? 0 : pricediff < 0 ? -1 : 1; | |
+ case DS_CHEAPLAST: | |
+ pricediff = ClientData.Play->Drugs[index2].Price - | |
+ ClientData.Play->Drugs[index1].Price; | |
+ return pricediff == 0 ? 0 : pricediff < 0 ? -1 : 1; | |
+ } | |
+ return 0; | |
+} | |
+ | |
+void UpdateMenus(void) | |
+{ | |
+ gboolean MultiPlayer; | |
+ gint Bitches; | |
+ | |
+ MultiPlayer = (FirstClient && FirstClient->next != NULL); | |
+ Bitches = InGame | |
+ && ClientData.Play ? ClientData.Play->Bitches.Carried : 0; | |
+ | |
+ gtk_widget_set_sensitive(gtk_item_factory_get_widget(ClientData.Menu, | |
+ "<main>/Talk"), | |
+ InGame && Network); | |
+ gtk_widget_set_sensitive(gtk_item_factory_get_widget | |
+ (ClientData.Menu, "<main>/List"), InGame); | |
+ gtk_widget_set_sensitive(gtk_item_factory_get_widget | |
+ (ClientData.Menu, "<main>/List/Players..."), | |
+ InGame && Network); | |
+ gtk_widget_set_sensitive(gtk_item_factory_get_widget | |
+ (ClientData.Menu, "<main>/Errands"), InGame); | |
+ gtk_widget_set_sensitive(gtk_item_factory_get_widget | |
+ (ClientData.Menu, "<main>/Errands/Spy..."), | |
+ InGame && MultiPlayer); | |
+ gtk_widget_set_sensitive(gtk_item_factory_get_widget | |
+ (ClientData.Menu, "<main>/Errands/Tipoff..."), | |
+ InGame && MultiPlayer); | |
+ gtk_widget_set_sensitive(gtk_item_factory_get_widget | |
+ (ClientData.Menu, | |
+ "<main>/Errands/Sack Bitch..."), Bitches > 0); | |
+ gtk_widget_set_sensitive(gtk_item_factory_get_widget | |
+ (ClientData.Menu, | |
+ "<main>/Errands/Get spy reports..."), InGame | |
+ && MultiPlayer); | |
+} | |
+ | |
+GtkWidget *CreateStatusWidgets(struct StatusWidgets *Status) | |
+{ | |
+ GtkWidget *table, *label; | |
+ | |
+ table = gtk_table_new(3, 6, FALSE); | |
+ gtk_table_set_row_spacings(GTK_TABLE(table), 3); | |
+ gtk_table_set_col_spacings(GTK_TABLE(table), 3); | |
+ | |
+ label = Status->Location = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 2, 0, 1); | |
+ | |
+ label = Status->Date = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 4, 0, 1); | |
+ | |
+ /* Available space label in GTK+ client status display */ | |
+ label = Status->SpaceName = gtk_label_new(_("Space")); | |
+ | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 4, 5, 0, 1); | |
+ label = Status->SpaceValue = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 5, 6, 0, 1); | |
+ | |
+ /* Player's cash label in GTK+ client status display */ | |
+ label = Status->CashName = gtk_label_new(_("Cash")); | |
+ | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); | |
+ label = Status->CashValue = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2); | |
+ | |
+ /* Player's debt label in GTK+ client status display */ | |
+ label = Status->DebtName = gtk_label_new(_("Debt")); | |
+ | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 1, 2); | |
+ label = Status->DebtValue = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, 1, 2); | |
+ | |
+ /* Player's bank balance label in GTK+ client status display */ | |
+ label = Status->BankName = gtk_label_new(_("Bank")); | |
+ | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 4, 5, 1, 2); | |
+ label = Status->BankValue = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 5, 6, 1, 2); | |
+ | |
+ label = Status->GunsName = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); | |
+ label = Status->GunsValue = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3); | |
+ | |
+ label = Status->BitchesName = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 2, 3); | |
+ label = Status->BitchesValue = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, 2, 3); | |
+ | |
+ /* Player's health label in GTK+ client status display */ | |
+ label = Status->HealthName = gtk_label_new(_("Health")); | |
+ | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 4, 5, 2, 3); | |
+ label = Status->HealthValue = gtk_label_new(NULL); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 5, 6, 2, 3); | |
+ return table; | |
+} | |
+ | |
+void SetJetButtonTitle(GtkAccelGroup *accel_group) | |
+{ | |
+ GtkWidget *button; | |
+ guint accel_key; | |
+ | |
+ button = ClientData.JetButton; | |
+ accel_key = ClientData.JetAccel; | |
+ | |
+ if (accel_key) { | |
+ gtk_widget_remove_accelerator(button, accel_group, accel_key, 0); | |
+ } | |
+ | |
+ ClientData.JetAccel = SetAccelerator(button, | |
+ (ClientData.Play | |
+ && ClientData.Play-> | |
+ Flags & FIGHTING) ? _("_Fight") : | |
+ /* Caption of 'Jet' button in main | |
+ * window */ | |
+ _("_Jet!"), button, "clicked", | |
+ accel_group); | |
} | |
static void SetIcon(GtkWidget *window, gchar **xpmdata) | |
t@@ -1801,369 +2018,414 @@ static void SetIcon(GtkWidget *window, gchar **xpmda… | |
GdkPixmap *icon; | |
GtkStyle *style; | |
- style = gtk_widget_get_style(window); | |
- icon = gdk_pixmap_create_from_xpm_d(window->window, &mask, | |
- &style->bg[GTK_STATE_NORMAL], | |
- xpmdata); | |
- gdk_window_set_icon(window->window, NULL, icon, mask); | |
-#endif | |
+ style = gtk_widget_get_style(window); | |
+ icon = gdk_pixmap_create_from_xpm_d(window->window, &mask, | |
+ &style->bg[GTK_STATE_NORMAL], | |
+ xpmdata); | |
+ gdk_window_set_icon(window->window, NULL, icon, mask); | |
+#endif | |
+} | |
+ | |
+#ifdef CYGWIN | |
+char GtkLoop(HINSTANCE hInstance, HINSTANCE hPrevInstance) | |
+{ | |
+#else | |
+char GtkLoop(int *argc, char **argv[], gboolean ReturnOnFail) | |
+{ | |
+#endif | |
+ GtkWidget *window, *vbox, *vbox2, *hbox, *frame, *table, *menubar, *text, | |
+ *vpaned, *button, *clist; | |
+ GtkAccelGroup *accel_group; | |
+ GtkItemFactory *item_factory; | |
+ GtkAdjustment *adj; | |
+ gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); | |
+ | |
+#ifdef CYGWIN | |
+ win32_init(hInstance, hPrevInstance, "mainicon"); | |
+#else | |
+ gtk_set_locale(); | |
+ if (ReturnOnFail && !gtk_init_check(argc, argv)) | |
+ return FALSE; | |
+ else if (!ReturnOnFail) | |
+ gtk_init(argc, argv); | |
+#endif | |
+ | |
+ /* Set up message handlers */ | |
+ ClientMessageHandlerPt = HandleClientMessage; | |
+ | |
+ /* Have the GLib log messages pop up in a nice dialog box */ | |
+ g_log_set_handler(NULL, | |
+ LogMask() | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING | | |
+ G_LOG_LEVEL_CRITICAL, LogMessage, NULL); | |
+ | |
+ if (!CheckHighScoreFileConfig()) | |
+ return TRUE; | |
+ | |
+ /* Create the main player */ | |
+ ClientData.Play = g_new(Player, 1); | |
+ FirstClient = AddPlayer(0, ClientData.Play, FirstClient); | |
+ | |
+ window = ClientData.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
+ | |
+ /* Title of main window in GTK+ client */ | |
+ gtk_window_set_title(GTK_WINDOW(window), _("dopewars")); | |
+ gtk_window_set_default_size(GTK_WINDOW(window), 450, 390); | |
+ gtk_signal_connect(GTK_OBJECT(window), "delete_event", | |
+ GTK_SIGNAL_FUNC(MainDelete), NULL); | |
+ gtk_signal_connect(GTK_OBJECT(window), "destroy", | |
+ GTK_SIGNAL_FUNC(DestroyGtk), NULL); | |
+ | |
+ accel_group = gtk_accel_group_new(); | |
+ gtk_object_set_data(GTK_OBJECT(window), "accel_group", accel_group); | |
+ item_factory = ClientData.Menu = gtk_item_factory_new(GTK_TYPE_MENU_BAR, | |
+ "<main>", | |
+ accel_group); | |
+ gtk_item_factory_set_translate_func(item_factory, MenuTranslate, NULL, | |
+ NULL); | |
+ | |
+ gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, | |
+ NULL); | |
+ gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); | |
+ menubar = gtk_item_factory_get_widget(item_factory, "<main>"); | |
+ | |
+ vbox2 = gtk_vbox_new(FALSE, 0); | |
+ gtk_box_pack_start(GTK_BOX(vbox2), menubar, FALSE, FALSE, 0); | |
+ gtk_widget_show_all(menubar); | |
+ UpdateMenus(); | |
+ | |
+ vbox = ClientData.vbox = gtk_vbox_new(FALSE, 5); | |
+ frame = gtk_frame_new(_("Stats")); | |
+ | |
+ table = CreateStatusWidgets(&ClientData.Status); | |
+ | |
+ gtk_container_add(GTK_CONTAINER(frame), table); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); | |
+ | |
+ vpaned = gtk_vpaned_new(); | |
+ | |
+ adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0.0, 100.0, | |
+ 1.0, 10.0, 10.0); | |
+ text = ClientData.messages = gtk_scrolled_text_new(NULL, adj, &hbox); | |
+ gtk_widget_set_usize(text, 100, 80); | |
+ gtk_text_set_point(GTK_TEXT(text), 0); | |
+ gtk_text_set_editable(GTK_TEXT(text), FALSE); | |
+ gtk_text_set_word_wrap(GTK_TEXT(text), TRUE); | |
+ gtk_paned_pack1(GTK_PANED(vpaned), hbox, TRUE, TRUE); | |
+ | |
+ hbox = gtk_hbox_new(FALSE, 7); | |
+ CreateInventory(hbox, Names.Drugs, accel_group, TRUE, TRUE, | |
+ &ClientData.Drug, DealDrugs); | |
+ clist = ClientData.Drug.HereList; | |
+ gtk_clist_column_titles_active(GTK_CLIST(clist)); | |
+ gtk_clist_set_compare_func(GTK_CLIST(clist), DrugSortFunc); | |
+ gtk_signal_connect(GTK_OBJECT(clist), "click-column", | |
+ GTK_SIGNAL_FUNC(ChangeDrugSort), NULL); | |
+ | |
+ button = ClientData.JetButton = gtk_button_new_with_label(""); | |
+ ClientData.JetAccel = 0; | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(JetButtonPressed), NULL); | |
+ gtk_box_pack_start(GTK_BOX(ClientData.Drug.vbbox), button, TRUE, TRUE, 0); | |
+ SetJetButtonTitle(accel_group); | |
+ | |
+ gtk_paned_pack2(GTK_PANED(vpaned), hbox, TRUE, TRUE); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox), vpaned, TRUE, TRUE, 0); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox2), vbox, TRUE, TRUE, 0); | |
+ gtk_container_add(GTK_CONTAINER(window), vbox2); | |
+ | |
+ /* Just show the window, not the vbox - we'll do that when the game | |
+ * starts */ | |
+ gtk_widget_show(vbox2); | |
+ gtk_widget_show(window); | |
+ | |
+ gtk_widget_realize(window); | |
+ | |
+ SetIcon(window, dopewars_pill_xpm); | |
+ | |
+ gtk_main(); | |
+ | |
+ /* Free the main player */ | |
+ FirstClient = RemovePlayer(ClientData.Play, FirstClient); | |
+ | |
+ return TRUE; | |
+} | |
+ | |
+void display_intro(GtkWidget *widget, gpointer data) | |
+{ | |
+ GtkWidget *dialog, *label, *table, *OKButton, *vbox, *hbox, *hsep; | |
+ gchar *VersionStr; | |
+ const int rows = 6, cols = 3; | |
+ int i, j; | |
+ gchar *table_data[6][3] = { | |
+ /* Credits labels in GTK+ 'about' dialog */ | |
+ {N_("Icons and graphics"), "Ocelot Mantis", NULL}, | |
+ {N_("Drug Dealing and Research"), "Dan Wolf", NULL}, | |
+ {N_("Play Testing"), "Phil Davis", "Owen Walsh"}, | |
+ {N_("Extensive Play Testing"), "Katherine Holt", | |
+ "Caroline Moore"}, | |
+ {N_("Constructive Criticism"), "Andrea Elliot-Smith", | |
+ "Pete Winn"}, | |
+ {N_("Unconstructive Criticism"), "James Matthews", NULL} | |
+ }; | |
+ | |
+ dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ | |
+ /* Title of GTK+ 'about' dialog */ | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("About dopewars")); | |
+ | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ GTK_WINDOW(ClientData.window)); | |
+ gtk_container_border_width(GTK_CONTAINER(dialog), 10); | |
+ | |
+ vbox = gtk_vbox_new(FALSE, 5); | |
+ | |
+ /* Main content of GTK+ 'about' dialog */ | |
+ label = gtk_label_new(_("Based on John E. Dell's old Drug Wars game, " | |
+ "dopewars is a simulation of an\nimaginary drug " | |
+ "market. dopewars is an All-American game which " | |
+ "features\nbuying, selling, and trying to get " | |
+ "past the cops!\n\nThe first thing you need to " | |
+ "do is pay off your debt to the Loan Shark. " | |
+ "After\nthat, your goal is to make as much " | |
+ "money as possible (and stay alive)! You\n" | |
+ "have one month of game time to make " | |
+ "your fortune.\n")); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ | |
+ /* Version and copyright notice in GTK+ 'about' dialog */ | |
+ VersionStr = g_strdup_printf(_("Version %s " | |
+ "Copyright (C) 1998-2002 " | |
+ "Ben Webb [email protected]\n" | |
+ "dopewars is released under the " | |
+ "GNU General Public Licence\n"), VERSION); | |
+ label = gtk_label_new(VersionStr); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ g_free(VersionStr); | |
+ | |
+ table = gtk_table_new(rows, cols, FALSE); | |
+ gtk_table_set_row_spacings(GTK_TABLE(table), 3); | |
+ gtk_table_set_col_spacings(GTK_TABLE(table), 3); | |
+ for (i = 0; i < rows; i++) | |
+ for (j = 0; j < cols; j++) | |
+ if (table_data[i][j]) { | |
+ if (j == 0) | |
+ label = gtk_label_new(_(table_data[i][j])); | |
+ else | |
+ label = gtk_label_new(table_data[i][j]); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, j, j + 1, i, | |
+ i + 1); | |
+ } | |
+ gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); | |
+ | |
+ /* Label at the bottom of GTK+ 'about' dialog */ | |
+ label = gtk_label_new(_("\nFor information on the command line " | |
+ "options, type dopewars -h at your\n" | |
+ "Unix prompt. This will display a help " | |
+ "screen, listing the available options.\n")); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ | |
+ /* There must surely be a nicer way of making the URL centred - but I | |
+ * can't think of one... */ | |
+ hbox = gtk_hbox_new(FALSE, 0); | |
+ label = gtk_label_new(""); | |
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0); | |
+ label = gtk_url_new("http://dopewars.sourceforge.net/", | |
+ "http://dopewars.sourceforge.net/", WebBrowser); | |
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
+ label = gtk_label_new(""); | |
+ gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
+ | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
+ | |
+ OKButton = gtk_button_new_with_label(_("OK")); | |
+ gtk_signal_connect_object(GTK_OBJECT(OKButton), "clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)dialog); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox), OKButton, FALSE, FALSE, 0); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ | |
+ GTK_WIDGET_SET_FLAGS(OKButton, GTK_CAN_DEFAULT); | |
+ gtk_widget_grab_default(OKButton); | |
+ | |
+ 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 CYGWIN | |
-char GtkLoop(HINSTANCE hInstance,HINSTANCE hPrevInstance) { | |
-#else | |
-char GtkLoop(int *argc,char **argv[],gboolean ReturnOnFail) { | |
-#endif | |
- GtkWidget *window,*vbox,*vbox2,*hbox,*frame,*table,*menubar,*text, | |
- *vpaned,*button,*clist; | |
- GtkAccelGroup *accel_group; | |
- GtkItemFactory *item_factory; | |
- GtkAdjustment *adj; | |
- gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); | |
+#ifdef NETWORKING | |
+static void ConnectError(struct StartGameStruct *widgets, gboolean meta) | |
+{ | |
+ GString *neterr; | |
+ gchar *text; | |
+ LastError *error; | |
-#ifdef CYGWIN | |
- win32_init(hInstance,hPrevInstance,"mainicon"); | |
-#else | |
- gtk_set_locale(); | |
- if (ReturnOnFail && !gtk_init_check(argc,argv)) return FALSE; | |
- else if (!ReturnOnFail) gtk_init(argc,argv); | |
-#endif | |
+ if (meta) | |
+ error = widgets->MetaConn->NetBuf.error; | |
+ else | |
+ error = ClientData.Play->NetBuf.error; | |
-/* Set up message handlers */ | |
- ClientMessageHandlerPt = HandleClientMessage; | |
+ neterr = g_string_new(""); | |
-/* Have the GLib log messages pop up in a nice dialog box */ | |
- g_log_set_handler(NULL,LogMask()|G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_WARNING | |
- | G_LOG_LEVEL_CRITICAL,LogMessage,NULL); | |
+ if (error) { | |
+ g_string_assign_error(neterr, error); | |
+ } else { | |
+ g_string_assign(neterr, _("Connection closed by remote host")); | |
+ } | |
- if (!CheckHighScoreFileConfig()) return TRUE; | |
+ 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); | |
+ } | |
-/* Create the main player */ | |
- ClientData.Play=g_new(Player,1); | |
- FirstClient=AddPlayer(0,ClientData.Play,FirstClient); | |
+ SetStartGameStatus(widgets, text); | |
+ g_free(text); | |
+ g_string_free(neterr, TRUE); | |
+} | |
- window=ClientData.window=gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
+void FinishServerConnect(struct StartGameStruct *widgets, | |
+ gboolean ConnectOK) | |
+{ | |
+ if (ConnectOK) { | |
+ Client = Network = TRUE; | |
+ gtk_widget_destroy(widgets->dialog); | |
+ StartGame(); | |
+ } else { | |
+ ConnectError(widgets, FALSE); | |
+ } | |
+} | |
-/* Title of main window in GTK+ client */ | |
- gtk_window_set_title(GTK_WINDOW(window),_("dopewars")); | |
- gtk_window_set_default_size(GTK_WINDOW(window),450,390); | |
- gtk_signal_connect(GTK_OBJECT(window),"delete_event", | |
- GTK_SIGNAL_FUNC(MainDelete),NULL); | |
- gtk_signal_connect(GTK_OBJECT(window),"destroy", | |
- GTK_SIGNAL_FUNC(DestroyGtk),NULL); | |
+static void DoConnect(struct StartGameStruct *widgets) | |
+{ | |
+ gchar *text; | |
+ NetworkBuffer *NetBuf; | |
+ NBStatus oldstatus; | |
+ NBSocksStatus oldsocks; | |
- accel_group = gtk_accel_group_new(); | |
- gtk_object_set_data(GTK_OBJECT(window),"accel_group",accel_group); | |
- item_factory = ClientData.Menu = gtk_item_factory_new(GTK_TYPE_MENU_BAR, | |
- "<main>",accel_group); | |
- gtk_item_factory_set_translate_func(item_factory,MenuTranslate,NULL,NULL); | |
+ NetBuf = &ClientData.Play->NetBuf; | |
- gtk_item_factory_create_items(item_factory,nmenu_items,menu_items,NULL); | |
- gtk_window_add_accel_group(GTK_WINDOW(window),accel_group); | |
- menubar = gtk_item_factory_get_widget(item_factory,"<main>"); | |
+ /* 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); | |
- vbox2=gtk_vbox_new(FALSE,0); | |
- gtk_box_pack_start(GTK_BOX(vbox2),menubar,FALSE,FALSE,0); | |
- gtk_widget_show_all(menubar); | |
- UpdateMenus(); | |
+ /* Terminate any existing connection attempts */ | |
+ ShutdownNetworkBuffer(NetBuf); | |
+ if (widgets->MetaConn) { | |
+ CloseHttpConnection(widgets->MetaConn); | |
+ widgets->MetaConn = NULL; | |
+ } | |
- vbox=ClientData.vbox=gtk_vbox_new(FALSE,5); | |
- frame=gtk_frame_new(_("Stats")); | |
- | |
- table = CreateStatusWidgets(&ClientData.Status); | |
- | |
- gtk_container_add(GTK_CONTAINER(frame),table); | |
- | |
- gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,0); | |
- | |
- vpaned=gtk_vpaned_new(); | |
- | |
- adj=(GtkAdjustment *)gtk_adjustment_new(0.0,0.0,100.0,1.0,10.0,10.0); | |
- text=ClientData.messages=gtk_scrolled_text_new(NULL,adj,&hbox); | |
- gtk_widget_set_usize(text,100,80); | |
- gtk_text_set_point(GTK_TEXT(text),0); | |
- gtk_text_set_editable(GTK_TEXT(text),FALSE); | |
- gtk_text_set_word_wrap(GTK_TEXT(text),TRUE); | |
- gtk_paned_pack1(GTK_PANED(vpaned),hbox,TRUE,TRUE); | |
- | |
- hbox=gtk_hbox_new(FALSE,7); | |
- CreateInventory(hbox,Names.Drugs,accel_group,TRUE,TRUE,&ClientData.Drug, | |
- DealDrugs); | |
- clist=ClientData.Drug.HereList; | |
- gtk_clist_column_titles_active(GTK_CLIST(clist)); | |
- gtk_clist_set_compare_func(GTK_CLIST(clist),DrugSortFunc); | |
- gtk_signal_connect(GTK_OBJECT(clist),"click-column", | |
- GTK_SIGNAL_FUNC(ChangeDrugSort),NULL); | |
- | |
- button=ClientData.JetButton=gtk_button_new_with_label(""); | |
- ClientData.JetAccel=0; | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(JetButtonPressed),NULL); | |
- gtk_box_pack_start(GTK_BOX(ClientData.Drug.vbbox),button,TRUE,TRUE,0); | |
- SetJetButtonTitle(accel_group); | |
- | |
- gtk_paned_pack2(GTK_PANED(vpaned),hbox,TRUE,TRUE); | |
- | |
- gtk_box_pack_start(GTK_BOX(vbox),vpaned,TRUE,TRUE,0); | |
- | |
- gtk_box_pack_start(GTK_BOX(vbox2),vbox,TRUE,TRUE,0); | |
- gtk_container_add(GTK_CONTAINER(window),vbox2); | |
- | |
-/* Just show the window, not the vbox - we'll do that when the game starts */ | |
- gtk_widget_show(vbox2); | |
- gtk_widget_show(window); | |
- | |
- gtk_widget_realize(window); | |
- | |
- SetIcon(window, dopewars_pill_xpm); | |
- | |
- gtk_main(); | |
- | |
-/* Free the main player */ | |
- FirstClient=RemovePlayer(ClientData.Play,FirstClient); | |
- | |
- return TRUE; | |
-} | |
- | |
-void display_intro(GtkWidget *widget,gpointer data) { | |
- GtkWidget *dialog, *label, *table, *OKButton, *vbox, *hbox, *hsep; | |
- gchar *VersionStr; | |
- const int rows=6,cols=3; | |
- int i,j; | |
- gchar *table_data[6][3] = { | |
-/* Credits labels in GTK+ 'about' dialog */ | |
- { N_("Icons and graphics"),"Ocelot Mantis", NULL }, | |
- { N_("Drug Dealing and Research"), "Dan Wolf", NULL }, | |
- { N_("Play Testing"), "Phil Davis", "Owen Walsh" }, | |
- { N_("Extensive Play Testing"), "Katherine Holt", | |
- "Caroline Moore" }, | |
- { N_("Constructive Criticism"), "Andrea Elliot-Smith", | |
- "Pete Winn" }, | |
- { N_("Unconstructive Criticism"), "James Matthews", NULL } | |
- }; | |
- | |
- dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- | |
-/* Title of GTK+ 'about' dialog */ | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("About dopewars")); | |
- | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(ClientData.window)); | |
- gtk_container_border_width(GTK_CONTAINER(dialog),10); | |
- | |
- vbox=gtk_vbox_new(FALSE,5); | |
- | |
- label=gtk_label_new( | |
-/* Main content of GTK+ 'about' dialog */ | |
-_("Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\… | |
-"imaginary drug market. dopewars is an All-American game which features\n" | |
-"buying, selling, and trying to get past the cops!\n\n" | |
-"The first thing you need to do is pay off your debt to the Loan Shark. After\… | |
-"that, your goal is to make as much money as possible (and stay alive)! You\n" | |
-"have one month of game time to make your fortune.\n")); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
- | |
-/* Version and copyright notice in GTK+ 'about' dialog */ | |
- VersionStr=g_strdup_printf(_("Version %s " | |
-"Copyright (C) 1998-2002 Ben Webb [email protected]\n" | |
-"dopewars is released under the GNU General Public Licence\n"),VERSION); | |
- label=gtk_label_new(VersionStr); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
- g_free(VersionStr); | |
- | |
- table = gtk_table_new(rows,cols,FALSE); | |
- gtk_table_set_row_spacings(GTK_TABLE(table),3); | |
- gtk_table_set_col_spacings(GTK_TABLE(table),3); | |
- for (i=0;i<rows;i++) for (j=0;j<cols;j++) if (table_data[i][j]) { | |
- if (j==0) label=gtk_label_new(_(table_data[i][j])); | |
- else label=gtk_label_new(table_data[i][j]); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,j,j+1,i,i+1); | |
- } | |
- gtk_box_pack_start(GTK_BOX(vbox),table,FALSE,FALSE,0); | |
- | |
- label=gtk_label_new( | |
-/* Label at the bottom of GTK+ 'about' dialog */ | |
-_("\nFor information on the command line options, type dopewars -h at your\n" | |
-"Unix prompt. This will display a help screen, listing the available " | |
-"options.\n")); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
- | |
- /* There must surely be a nicer way of making the URL | |
- * centred - but I can't think of one... | |
- */ | |
- hbox = gtk_hbox_new(FALSE, 0); | |
- label = gtk_label_new(""); | |
- gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0); | |
- label = gtk_url_new("http://dopewars.sourceforge.net/", | |
- "http://dopewars.sourceforge.net/", | |
- WebBrowser); | |
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
- label = gtk_label_new(""); | |
- gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); | |
- | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
- | |
- OKButton=gtk_button_new_with_label(_("OK")); | |
- gtk_signal_connect_object(GTK_OBJECT(OKButton),"clicked", | |
- GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
- (gpointer)dialog); | |
- | |
- gtk_box_pack_start(GTK_BOX(vbox),OKButton,FALSE,FALSE,0); | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- | |
- GTK_WIDGET_SET_FLAGS(OKButton,GTK_CAN_DEFAULT); | |
- gtk_widget_grab_default(OKButton); | |
- | |
- gtk_widget_show_all(dialog); | |
+ 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 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 ConnectToServer(GtkWidget *widget, | |
+ struct StartGameStruct *widgets) | |
+{ | |
+ gchar *text; | |
-static void SetStartGameStatus(struct StartGameStruct *widgets,gchar *msg) { | |
- gtk_label_set_text(GTK_LABEL(widgets->status), | |
- msg ? msg : _("Status: Waiting for user input")); | |
-} | |
+ 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); | |
-#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); | |
+ 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)); | |
+ 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) { | |
+void DisplayConnectStatus(struct StartGameStruct *widgets, gboolean meta, | |
+ NBStatus oldstatus, NBSocksStatus oldsocks) | |
+{ | |
NBStatus status; | |
NBSocksStatus sockstat; | |
gchar *text; | |
t@@ -2175,1344 +2437,1454 @@ void DisplayConnectStatus(struct StartGameStruct *… | |
status = ClientData.Play->NetBuf.status; | |
sockstat = ClientData.Play->NetBuf.sockstat; | |
} | |
- if (oldstatus==status && sockstat==oldsocks) return; | |
+ if (oldstatus == status && sockstat == oldsocks) | |
+ return; | |
switch (status) { | |
- case NBS_PRECONNECT: | |
+ 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 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; | |
- } | |
+ case NBSS_USERPASSWD: | |
+ SetStartGameStatus(widgets, | |
+ _("Status: Authenticating with SOCKS server")); | |
break; | |
- case NBS_CONNECTED: | |
- if (meta) SetStartGameStatus(widgets, | |
- _("Status: Obtaining server information from metaserver...")); | |
+ 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) { | |
+static void MetaDone(struct StartGameStruct *widgets) | |
+{ | |
if (IsHttpError(widgets->MetaConn)) { | |
- ConnectError(widgets,TRUE); | |
+ ConnectError(widgets, TRUE); | |
} else { | |
- SetStartGameStatus(widgets,NULL); | |
+ 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, | |
+ 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); | |
+ 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; | |
- } | |
+ 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); | |
- } | |
+ 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); | |
+ 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) { | |
+ 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); | |
+ /* 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,*frame,*button; | |
- GtkWidget *dialog; | |
- GtkAccelGroup *accel_group; | |
- static struct StartGameStruct widgets; | |
- guint AccelKey; | |
+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; | |
+ 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"); | |
+ /* 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; | |
+ 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)); | |
+ 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); | |
+ gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300); | |
#endif | |
- accel_group=gtk_accel_group_new(); | |
+ 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); | |
+ /* 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); | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ hbox = gtk_hbox_new(FALSE, 7); | |
- label=gtk_label_new(""); | |
+ 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); | |
+ 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); | |
+ 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); | |
- notebook=gtk_notebook_new(); | |
+ 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); | |
+ 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); | |
+ /* 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); | |
+ /* 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); | |
+ 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); | |
+ /* 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_container_add(GTK_CONTAINER(widgets.dialog), vbox); | |
- gtk_widget_grab_focus(widgets.name); | |
+ gtk_widget_grab_focus(widgets.name); | |
#ifdef NETWORKING | |
- if (UpdateMeta) { | |
- UpdateMetaServerList(NULL,&widgets); | |
- } else { | |
- FillMetaServerList(&widgets,FALSE); | |
- } | |
+ 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); | |
+ 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); | |
+static void SendDoneMessage(GtkWidget *widget, gpointer data) | |
+{ | |
+ SendClientMessage(ClientData.Play, C_NONE, C_DONE, NULL, NULL); | |
} | |
-static void TransferPayAll(GtkWidget *widget,GtkWidget *dialog) { | |
- gchar *text; | |
- text=pricetostr(ClientData.Play->Debt); | |
- SendClientMessage(ClientData.Play,C_NONE,C_PAYLOAN,NULL,text); | |
- g_free(text); | |
- gtk_widget_destroy(dialog); | |
+static void TransferPayAll(GtkWidget *widget, GtkWidget *dialog) | |
+{ | |
+ gchar *text; | |
+ | |
+ text = pricetostr(ClientData.Play->Debt); | |
+ SendClientMessage(ClientData.Play, C_NONE, C_PAYLOAN, NULL, text); | |
+ g_free(text); | |
+ gtk_widget_destroy(dialog); | |
} | |
-static void TransferOK(GtkWidget *widget,GtkWidget *dialog) { | |
+static void TransferOK(GtkWidget *widget, GtkWidget *dialog) | |
+{ | |
gpointer Debt; | |
- GtkWidget *deposit,*entry; | |
- gchar *text,*title; | |
+ GtkWidget *deposit, *entry; | |
+ gchar *text, *title; | |
price_t money; | |
- gboolean withdraw=FALSE; | |
+ gboolean withdraw = FALSE; | |
- Debt=gtk_object_get_data(GTK_OBJECT(dialog),"debt"); | |
- entry=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(dialog),"entry")); | |
- text=gtk_editable_get_chars(GTK_EDITABLE(entry),0,-1); | |
- money=strtoprice(text); | |
+ Debt = gtk_object_get_data(GTK_OBJECT(dialog), "debt"); | |
+ entry = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(dialog), "entry")); | |
+ text = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | |
+ money = strtoprice(text); | |
g_free(text); | |
if (Debt) { | |
-/* Title of loan shark dialog - (%Tde="The Loan Shark" by default) */ | |
+ /* Title of loan shark dialog - (%Tde="The Loan Shark" by default) */ | |
title = dpg_strdup_printf(_("%/LoanShark window title/%Tde"), | |
Names.LoanSharkName); | |
- if (money>ClientData.Play->Debt) money=ClientData.Play->Debt; | |
+ if (money > ClientData.Play->Debt) | |
+ money = ClientData.Play->Debt; | |
} else { | |
-/* Title of bank dialog - (%Tde="The Bank" by default) */ | |
+ /* Title of bank dialog - (%Tde="The Bank" by default) */ | |
title = dpg_strdup_printf(_("%/BankName window title/%Tde"), | |
Names.BankName); | |
- deposit=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(dialog),"deposit")); | |
+ deposit = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(dialog), "deposit")); | |
if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(deposit))) { | |
- withdraw=TRUE; | |
+ withdraw = TRUE; | |
} | |
} | |
- if (money<0) { | |
- GtkMessageBox(dialog,_("You must enter a positive amount of money!"), | |
- title,MB_OK); | |
- } else if (!Debt && withdraw && money>ClientData.Play->Bank) { | |
- GtkMessageBox(dialog,_("There isn't that much money available..."), | |
- title,MB_OK); | |
- } else if (!withdraw && money>ClientData.Play->Cash) { | |
- GtkMessageBox(dialog,_("You don't have that much money!"), | |
- title,MB_OK); | |
+ if (money < 0) { | |
+ GtkMessageBox(dialog, _("You must enter a positive amount of money!"), | |
+ title, MB_OK); | |
+ } else if (!Debt && withdraw && money > ClientData.Play->Bank) { | |
+ GtkMessageBox(dialog, _("There isn't that much money available..."), | |
+ title, MB_OK); | |
+ } else if (!withdraw && money > ClientData.Play->Cash) { | |
+ GtkMessageBox(dialog, _("You don't have that much money!"), | |
+ title, MB_OK); | |
} else { | |
- text=pricetostr(withdraw ? -money : money); | |
- SendClientMessage(ClientData.Play,C_NONE, | |
- Debt ? C_PAYLOAN : C_DEPOSIT,NULL,text); | |
+ text = pricetostr(withdraw ? -money : money); | |
+ SendClientMessage(ClientData.Play, C_NONE, | |
+ Debt ? C_PAYLOAN : C_DEPOSIT, NULL, text); | |
g_free(text); | |
gtk_widget_destroy(dialog); | |
} | |
g_free(title); | |
} | |
-void TransferDialog(gboolean Debt) { | |
- GtkWidget *dialog,*button,*label,*radio,*table,*vbox,*hbbox,*hsep,*entry; | |
- GSList *group; | |
- GString *text; | |
- | |
- text=g_string_new(""); | |
- | |
- dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- gtk_signal_connect(GTK_OBJECT(dialog),"destroy", | |
- GTK_SIGNAL_FUNC(SendDoneMessage),NULL); | |
- if (Debt) { | |
-/* Title of loan shark dialog - (%Tde="The Loan Shark" by default) */ | |
- dpg_string_sprintf(text,_("%/LoanShark window title/%Tde"), | |
- Names.LoanSharkName); | |
- } else { | |
-/* Title of bank dialog - (%Tde="The Bank" by default) */ | |
- dpg_string_sprintf(text,_("%/BankName window title/%Tde"), | |
- Names.BankName); | |
- } | |
- gtk_window_set_title(GTK_WINDOW(dialog),text->str); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(ClientData.window)); | |
- | |
- vbox=gtk_vbox_new(FALSE,7); | |
- table=gtk_table_new(4,3,FALSE); | |
- gtk_table_set_row_spacings(GTK_TABLE(table),4); | |
- gtk_table_set_col_spacings(GTK_TABLE(table),4); | |
- | |
-/* Display of player's cash in bank or loan shark dialog */ | |
- dpg_string_sprintf(text,_("Cash: %P"),ClientData.Play->Cash); | |
- label=gtk_label_new(text->str); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,0,3,0,1); | |
- | |
- if (Debt) { | |
-/* Display of player's debt in loan shark dialog */ | |
- dpg_string_sprintf(text,_("Debt: %P"),ClientData.Play->Debt); | |
- } else { | |
-/* Display of player's bank balance in bank dialog */ | |
- dpg_string_sprintf(text,_("Bank: %P"),ClientData.Play->Bank); | |
- } | |
- label=gtk_label_new(text->str); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,0,3,1,2); | |
- | |
- gtk_object_set_data(GTK_OBJECT(dialog),"debt",GINT_TO_POINTER(Debt)); | |
- if (Debt) { | |
-/* Prompt for paying back a loan */ | |
- label=gtk_label_new(_("Pay back:")); | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,0,1,2,4); | |
- } else { | |
-/* Radio button selected if you want to pay money into the bank */ | |
- radio=gtk_radio_button_new_with_label(NULL,_("Deposit")); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"deposit",radio); | |
- group=gtk_radio_button_group(GTK_RADIO_BUTTON(radio)); | |
- gtk_table_attach_defaults(GTK_TABLE(table),radio,0,1,2,3); | |
- | |
-/* Radio button selected if you want to withdraw money from the bank */ | |
- radio=gtk_radio_button_new_with_label(group,_("Withdraw")); | |
- gtk_table_attach_defaults(GTK_TABLE(table),radio,0,1,3,4); | |
- } | |
- label=gtk_label_new(Currency.Symbol); | |
- entry=gtk_entry_new(); | |
- gtk_entry_set_text(GTK_ENTRY(entry),"0"); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"entry",entry); | |
- gtk_signal_connect(GTK_OBJECT(entry),"activate", | |
- GTK_SIGNAL_FUNC(TransferOK),dialog); | |
- | |
- if (Currency.Prefix) { | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,1,2,2,4); | |
- gtk_table_attach_defaults(GTK_TABLE(table),entry,2,3,2,4); | |
- } else { | |
- gtk_table_attach_defaults(GTK_TABLE(table),label,2,3,2,4); | |
- gtk_table_attach_defaults(GTK_TABLE(table),entry,1,2,2,4); | |
- } | |
- | |
- 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(TransferOK),dialog); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
- | |
- if (Debt && ClientData.Play->Cash>=ClientData.Play->Debt) { | |
-/* Button to pay back the entire loan/debt */ | |
- button=gtk_button_new_with_label(_("Pay all")); | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(TransferPayAll),dialog); | |
- 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)dialog); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbbox,FALSE,FALSE,0); | |
- | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- | |
- gtk_widget_show_all(dialog); | |
- | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-void ListPlayers(GtkWidget *widget,gpointer data) { | |
- GtkWidget *dialog,*clist,*button,*vbox,*hsep; | |
- | |
- if (IsShowingPlayerList) return; | |
- dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- | |
-/* Title of player list dialog */ | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("Player List")); | |
- | |
- gtk_window_set_default_size(GTK_WINDOW(dialog),200,180); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- | |
- IsShowingPlayerList=TRUE; | |
- gtk_window_set_modal(GTK_WINDOW(dialog),FALSE); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"IsShowing", | |
- (gpointer)&IsShowingPlayerList); | |
- gtk_signal_connect(GTK_OBJECT(dialog),"destroy", | |
- GTK_SIGNAL_FUNC(DestroyShowing),NULL); | |
- | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(ClientData.window)); | |
- | |
- vbox=gtk_vbox_new(FALSE,7); | |
- | |
- clist=ClientData.PlayerList=CreatePlayerList(); | |
- UpdatePlayerList(clist,FALSE); | |
- gtk_box_pack_start(GTK_BOX(vbox),clist,TRUE,TRUE,0); | |
- | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
- | |
- button=gtk_button_new_with_label(_("OK")); | |
- gtk_signal_connect_object(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
- (gpointer)dialog); | |
- gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0); | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- gtk_widget_show_all(dialog); | |
+void TransferDialog(gboolean Debt) | |
+{ | |
+ GtkWidget *dialog, *button, *label, *radio, *table, *vbox; | |
+ GtkWidget *hbbox, *hsep, *entry; | |
+ GSList *group; | |
+ GString *text; | |
+ | |
+ text = g_string_new(""); | |
+ | |
+ dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ gtk_signal_connect(GTK_OBJECT(dialog), "destroy", | |
+ GTK_SIGNAL_FUNC(SendDoneMessage), NULL); | |
+ if (Debt) { | |
+ /* Title of loan shark dialog - (%Tde="The Loan Shark" by default) */ | |
+ dpg_string_sprintf(text, _("%/LoanShark window title/%Tde"), | |
+ Names.LoanSharkName); | |
+ } else { | |
+ /* Title of bank dialog - (%Tde="The Bank" by default) */ | |
+ dpg_string_sprintf(text, _("%/BankName window title/%Tde"), | |
+ Names.BankName); | |
+ } | |
+ gtk_window_set_title(GTK_WINDOW(dialog), text->str); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ GTK_WINDOW(ClientData.window)); | |
+ | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ table = gtk_table_new(4, 3, FALSE); | |
+ gtk_table_set_row_spacings(GTK_TABLE(table), 4); | |
+ gtk_table_set_col_spacings(GTK_TABLE(table), 4); | |
+ | |
+ /* Display of player's cash in bank or loan shark dialog */ | |
+ dpg_string_sprintf(text, _("Cash: %P"), ClientData.Play->Cash); | |
+ label = gtk_label_new(text->str); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 3, 0, 1); | |
+ | |
+ if (Debt) { | |
+ /* Display of player's debt in loan shark dialog */ | |
+ dpg_string_sprintf(text, _("Debt: %P"), ClientData.Play->Debt); | |
+ } else { | |
+ /* Display of player's bank balance in bank dialog */ | |
+ dpg_string_sprintf(text, _("Bank: %P"), ClientData.Play->Bank); | |
+ } | |
+ label = gtk_label_new(text->str); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 3, 1, 2); | |
+ | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "debt", GINT_TO_POINTER(Debt)); | |
+ if (Debt) { | |
+ /* Prompt for paying back a loan */ | |
+ label = gtk_label_new(_("Pay back:")); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 4); | |
+ } else { | |
+ /* Radio button selected if you want to pay money into the bank */ | |
+ radio = gtk_radio_button_new_with_label(NULL, _("Deposit")); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "deposit", radio); | |
+ group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio)); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), radio, 0, 1, 2, 3); | |
+ | |
+ /* Radio button selected if you want to withdraw money from the bank */ | |
+ radio = gtk_radio_button_new_with_label(group, _("Withdraw")); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), radio, 0, 1, 3, 4); | |
+ } | |
+ label = gtk_label_new(Currency.Symbol); | |
+ entry = gtk_entry_new(); | |
+ gtk_entry_set_text(GTK_ENTRY(entry), "0"); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "entry", entry); | |
+ gtk_signal_connect(GTK_OBJECT(entry), "activate", | |
+ GTK_SIGNAL_FUNC(TransferOK), dialog); | |
+ | |
+ if (Currency.Prefix) { | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 4); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), entry, 2, 3, 2, 4); | |
+ } else { | |
+ gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, 2, 4); | |
+ gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 2, 4); | |
+ } | |
+ | |
+ 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(TransferOK), dialog); | |
+ gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0); | |
+ | |
+ if (Debt && ClientData.Play->Cash >= ClientData.Play->Debt) { | |
+ /* Button to pay back the entire loan/debt */ | |
+ button = gtk_button_new_with_label(_("Pay all")); | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(TransferPayAll), dialog); | |
+ 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)dialog); | |
+ gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); | |
+ | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ | |
+ gtk_widget_show_all(dialog); | |
+ | |
+ g_string_free(text, TRUE); | |
+} | |
+ | |
+void ListPlayers(GtkWidget *widget, gpointer data) | |
+{ | |
+ GtkWidget *dialog, *clist, *button, *vbox, *hsep; | |
+ | |
+ if (IsShowingPlayerList) | |
+ return; | |
+ dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ | |
+ /* Title of player list dialog */ | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("Player List")); | |
+ | |
+ gtk_window_set_default_size(GTK_WINDOW(dialog), 200, 180); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ | |
+ IsShowingPlayerList = TRUE; | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), FALSE); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "IsShowing", | |
+ (gpointer)&IsShowingPlayerList); | |
+ gtk_signal_connect(GTK_OBJECT(dialog), "destroy", | |
+ GTK_SIGNAL_FUNC(DestroyShowing), NULL); | |
+ | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ GTK_WINDOW(ClientData.window)); | |
+ | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ | |
+ clist = ClientData.PlayerList = CreatePlayerList(); | |
+ UpdatePlayerList(clist, FALSE); | |
+ gtk_box_pack_start(GTK_BOX(vbox), clist, TRUE, TRUE, 0); | |
+ | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
+ | |
+ button = gtk_button_new_with_label(_("OK")); | |
+ gtk_signal_connect_object(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)dialog); | |
+ gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ gtk_widget_show_all(dialog); | |
} | |
struct TalkStruct { | |
- GtkWidget *dialog,*clist,*entry,*checkbutton; | |
+ GtkWidget *dialog, *clist, *entry, *checkbutton; | |
}; | |
-static void TalkSend(GtkWidget *widget,struct TalkStruct *TalkData) { | |
- gboolean AllPlayers; | |
- gchar *text; | |
- GString *msg; | |
- GList *selection; | |
- gint row; | |
- Player *Play; | |
- | |
- AllPlayers= | |
- gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(TalkData->checkbutton)); | |
- text=gtk_editable_get_chars(GTK_EDITABLE(TalkData->entry),0,-1); | |
- gtk_editable_delete_text(GTK_EDITABLE(TalkData->entry),0,-1); | |
- if (!text) return; | |
- | |
- msg=g_string_new(""); | |
- | |
- if (AllPlayers) { | |
- SendClientMessage(ClientData.Play,C_NONE,C_MSG,NULL,text); | |
- g_string_sprintf(msg,"%s: %s",GetPlayerName(ClientData.Play),text); | |
- PrintMessage(msg->str); | |
- } else { | |
- for(selection=GTK_CLIST(TalkData->clist)->selection;selection; | |
- selection=g_list_next(selection)) { | |
- row=GPOINTER_TO_INT(selection->data); | |
- Play=(Player *)gtk_clist_get_row_data(GTK_CLIST(TalkData->clist),row); | |
- if (Play) { | |
- SendClientMessage(ClientData.Play,C_NONE,C_MSGTO,Play,text); | |
- g_string_sprintf(msg,"%s->%s: %s",GetPlayerName(ClientData.Play), | |
- GetPlayerName(Play),text); | |
- PrintMessage(msg->str); | |
- } | |
+static void TalkSend(GtkWidget *widget, struct TalkStruct *TalkData) | |
+{ | |
+ gboolean AllPlayers; | |
+ gchar *text; | |
+ GString *msg; | |
+ GList *selection; | |
+ gint row; | |
+ Player *Play; | |
+ | |
+ AllPlayers = | |
+ gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON | |
+ (TalkData->checkbutton)); | |
+ text = gtk_editable_get_chars(GTK_EDITABLE(TalkData->entry), 0, -1); | |
+ gtk_editable_delete_text(GTK_EDITABLE(TalkData->entry), 0, -1); | |
+ if (!text) | |
+ return; | |
+ | |
+ msg = g_string_new(""); | |
+ | |
+ if (AllPlayers) { | |
+ SendClientMessage(ClientData.Play, C_NONE, C_MSG, NULL, text); | |
+ g_string_sprintf(msg, "%s: %s", GetPlayerName(ClientData.Play), text); | |
+ PrintMessage(msg->str); | |
+ } else { | |
+ for (selection = GTK_CLIST(TalkData->clist)->selection; selection; | |
+ selection = g_list_next(selection)) { | |
+ row = GPOINTER_TO_INT(selection->data); | |
+ Play = | |
+ (Player *)gtk_clist_get_row_data(GTK_CLIST(TalkData->clist), | |
+ row); | |
+ if (Play) { | |
+ SendClientMessage(ClientData.Play, C_NONE, C_MSGTO, Play, text); | |
+ g_string_sprintf(msg, "%s->%s: %s", GetPlayerName(ClientData.Play), | |
+ GetPlayerName(Play), text); | |
+ PrintMessage(msg->str); | |
} | |
- } | |
- g_free(text); | |
- g_string_free(msg,TRUE); | |
+ } | |
+ } | |
+ g_free(text); | |
+ g_string_free(msg, TRUE); | |
} | |
-void TalkToAll(GtkWidget *widget,gpointer data) { | |
- TalkDialog(TRUE); | |
+void TalkToAll(GtkWidget *widget, gpointer data) | |
+{ | |
+ TalkDialog(TRUE); | |
} | |
-void TalkToPlayers(GtkWidget *widget,gpointer data) { | |
- TalkDialog(FALSE); | |
+void TalkToPlayers(GtkWidget *widget, gpointer data) | |
+{ | |
+ TalkDialog(FALSE); | |
} | |
-void TalkDialog(gboolean TalkToAll) { | |
- GtkWidget *dialog,*clist,*button,*entry,*label,*vbox,*hsep, | |
- *checkbutton,*hbbox; | |
- static struct TalkStruct TalkData; | |
+void TalkDialog(gboolean TalkToAll) | |
+{ | |
+ GtkWidget *dialog, *clist, *button, *entry, *label, *vbox, *hsep, | |
+ *checkbutton, *hbbox; | |
+ static struct TalkStruct TalkData; | |
- if (IsShowingTalkList) return; | |
- dialog=TalkData.dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
+ if (IsShowingTalkList) | |
+ return; | |
+ dialog = TalkData.dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
-/* Title of talk dialog */ | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("Talk to player(s)")); | |
+ /* Title of talk dialog */ | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("Talk to player(s)")); | |
- gtk_window_set_default_size(GTK_WINDOW(dialog),200,190); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
+ gtk_window_set_default_size(GTK_WINDOW(dialog), 200, 190); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
- IsShowingTalkList=TRUE; | |
- gtk_window_set_modal(GTK_WINDOW(dialog),FALSE); | |
- gtk_object_set_data(GTK_OBJECT(dialog),"IsShowing", | |
- (gpointer)&IsShowingTalkList); | |
- gtk_signal_connect(GTK_OBJECT(dialog),"destroy", | |
- GTK_SIGNAL_FUNC(DestroyShowing),NULL); | |
+ IsShowingTalkList = TRUE; | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), FALSE); | |
+ gtk_object_set_data(GTK_OBJECT(dialog), "IsShowing", | |
+ (gpointer)&IsShowingTalkList); | |
+ gtk_signal_connect(GTK_OBJECT(dialog), "destroy", | |
+ GTK_SIGNAL_FUNC(DestroyShowing), NULL); | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(ClientData.window)); | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ GTK_WINDOW(ClientData.window)); | |
- vbox=gtk_vbox_new(FALSE,7); | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
- clist=TalkData.clist=ClientData.TalkList=CreatePlayerList(); | |
- UpdatePlayerList(clist,FALSE); | |
- gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_MULTIPLE); | |
- gtk_box_pack_start(GTK_BOX(vbox),clist,TRUE,TRUE,0); | |
+ clist = TalkData.clist = ClientData.TalkList = CreatePlayerList(); | |
+ UpdatePlayerList(clist, FALSE); | |
+ gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_MULTIPLE); | |
+ gtk_box_pack_start(GTK_BOX(vbox), clist, TRUE, TRUE, 0); | |
- checkbutton=TalkData.checkbutton= | |
-/* Checkbutton set if you want to talk to all players */ | |
- gtk_check_button_new_with_label(_("Talk to all players")); | |
+ checkbutton = TalkData.checkbutton = | |
+ /* Checkbutton set if you want to talk to all players */ | |
+ gtk_check_button_new_with_label(_("Talk to all players")); | |
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton),TalkToAll); | |
- gtk_box_pack_start(GTK_BOX(vbox),checkbutton,FALSE,FALSE,0); | |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TalkToAll); | |
+ gtk_box_pack_start(GTK_BOX(vbox), checkbutton, FALSE, FALSE, 0); | |
-/* Prompt for you to enter the message to be sent to other players */ | |
- label=gtk_label_new(_("Message:-")); | |
+ /* Prompt for you to enter the message to be sent to other players */ | |
+ label = gtk_label_new(_("Message:-")); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
- entry=TalkData.entry=gtk_entry_new(); | |
- gtk_signal_connect(GTK_OBJECT(entry),"activate", | |
- GTK_SIGNAL_FUNC(TalkSend), | |
- (gpointer)&TalkData); | |
- gtk_box_pack_start(GTK_BOX(vbox),entry,FALSE,FALSE,0); | |
+ entry = TalkData.entry = gtk_entry_new(); | |
+ gtk_signal_connect(GTK_OBJECT(entry), "activate", | |
+ GTK_SIGNAL_FUNC(TalkSend), (gpointer)&TalkData); | |
+ gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0); | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
- hbbox=gtk_hbutton_box_new(); | |
+ hbbox = gtk_hbutton_box_new(); | |
-/* Button to send a message to other players */ | |
- button=gtk_button_new_with_label(_("Send")); | |
+ /* Button to send a message to other players */ | |
+ button = gtk_button_new_with_label(_("Send")); | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(TalkSend), | |
- (gpointer)&TalkData); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(TalkSend), (gpointer)&TalkData); | |
+ gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0); | |
- button=gtk_button_new_with_label(_("Close")); | |
- gtk_signal_connect_object(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
- (gpointer)dialog); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
+ button = gtk_button_new_with_label(_("Close")); | |
+ gtk_signal_connect_object(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)dialog); | |
+ gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbbox,FALSE,FALSE,0); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- gtk_widget_show_all(dialog); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ gtk_widget_show_all(dialog); | |
} | |
-GtkWidget *CreatePlayerList(void) { | |
- GtkWidget *clist; | |
- gchar *text[1]; | |
+GtkWidget *CreatePlayerList(void) | |
+{ | |
+ GtkWidget *clist; | |
+ gchar *text[1]; | |
- text[0]="Name"; | |
- clist=gtk_clist_new_with_titles(1,text); | |
- gtk_clist_column_titles_passive(GTK_CLIST(clist)); | |
- gtk_clist_set_column_auto_resize(GTK_CLIST(clist),0,TRUE); | |
- return clist; | |
+ text[0] = "Name"; | |
+ clist = gtk_clist_new_with_titles(1, text); | |
+ gtk_clist_column_titles_passive(GTK_CLIST(clist)); | |
+ gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE); | |
+ return clist; | |
} | |
-void UpdatePlayerList(GtkWidget *clist,gboolean IncludeSelf) { | |
- GSList *list; | |
- gchar *text[1]; | |
- gint row; | |
- Player *Play; | |
- gtk_clist_freeze(GTK_CLIST(clist)); | |
- gtk_clist_clear(GTK_CLIST(clist)); | |
- for (list=FirstClient;list;list=g_slist_next(list)) { | |
- Play=(Player *)list->data; | |
- if (IncludeSelf || Play!=ClientData.Play) { | |
- text[0]=GetPlayerName(Play); | |
- row=gtk_clist_append(GTK_CLIST(clist),text); | |
- gtk_clist_set_row_data(GTK_CLIST(clist),row,Play); | |
- } | |
- } | |
- gtk_clist_thaw(GTK_CLIST(clist)); | |
-} | |
- | |
-static void ErrandOK(GtkWidget *widget,GtkWidget *clist) { | |
- GList *selection; | |
- Player *Play; | |
- gint row; | |
- GtkWidget *dialog; | |
- gint ErrandType; | |
- dialog=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(widget),"dialog")); | |
- ErrandType=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), | |
- "errandtype")); | |
- selection=GTK_CLIST(clist)->selection; | |
- if (selection) { | |
- row=GPOINTER_TO_INT(selection->data); | |
- Play=(Player *)gtk_clist_get_row_data(GTK_CLIST(clist),row); | |
- if (ErrandType==ET_SPY) { | |
- SendClientMessage(ClientData.Play,C_NONE,C_SPYON,Play,NULL); | |
- } else { | |
- SendClientMessage(ClientData.Play,C_NONE,C_TIPOFF,Play,NULL); | |
- } | |
- gtk_widget_destroy(dialog); | |
- } | |
-} | |
- | |
-void SpyOnPlayer(GtkWidget *widget,gpointer data) { | |
- ErrandDialog(ET_SPY); | |
-} | |
- | |
-void TipOff(GtkWidget *widget,gpointer data) { | |
- ErrandDialog(ET_TIPOFF); | |
-} | |
- | |
-void ErrandDialog(gint ErrandType) { | |
- GtkWidget *dialog,*clist,*button,*vbox,*hbbox,*hsep,*label; | |
- gchar *text; | |
- | |
- dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
- gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(ClientData.window)); | |
- | |
- vbox=gtk_vbox_new(FALSE,7); | |
- | |
- if (ErrandType==ET_SPY) { | |
-/* Title of dialog to select a player to spy on */ | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("Spy On Player")); | |
- | |
- text=dpg_strdup_printf( | |
-/* Informative text for "spy on player" dialog. (%tde = "bitch", "bitch", | |
- "guns", "drugs", respectively, by default) */ | |
-_("Please choose the player to spy on. Your %tde will\n" | |
-"then offer his services to the player, and if successful,\n" | |
-"you will be able to view the player's stats with the\n" | |
-"\"Get spy reports\" menu. Remember that the %tde will leave\n" | |
-"you, so any %tde or %tde that he's carrying may be lost!"), | |
-Names.Bitch,Names.Bitch,Names.Guns,Names.Drugs); | |
- label=gtk_label_new(text); g_free(text); | |
- } else { | |
- | |
-/* Title of dialog to select a player to tip the cops off to */ | |
- gtk_window_set_title(GTK_WINDOW(dialog),_("Tip Off The Cops")); | |
- | |
- text=dpg_strdup_printf( | |
-/* Informative text for "tip off cops" dialog. (%tde = "bitch", "bitch", | |
- "guns", "drugs", respectively, by default) */ | |
-_("Please choose the player to tip off the cops to. Your %tde will\n" | |
-"help the cops to attack that player, and then report back to you\n" | |
-"on the encounter. Remember that the %tde will leave you temporarily,\n" | |
-"so any %tde or %tde that he's carrying may be lost!"), | |
-Names.Bitch,Names.Bitch,Names.Guns,Names.Drugs); | |
- label=gtk_label_new(text); g_free(text); | |
- } | |
- | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
- | |
- clist=ClientData.PlayerList=CreatePlayerList(); | |
- UpdatePlayerList(clist,FALSE); | |
- gtk_box_pack_start(GTK_BOX(vbox),clist,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_object_set_data(GTK_OBJECT(button),"dialog",dialog); | |
- gtk_object_set_data(GTK_OBJECT(button),"errandtype", | |
- GINT_TO_POINTER(ErrandType)); | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(ErrandOK), | |
- (gpointer)clist); | |
- 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)dialog); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
- | |
- gtk_box_pack_start(GTK_BOX(vbox),hbbox,FALSE,FALSE,0); | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- gtk_widget_show_all(dialog); | |
-} | |
- | |
-void SackBitch(GtkWidget *widget,gpointer data) { | |
- char *title,*text; | |
- | |
-/* Cannot sack bitches if you don't have any! */ | |
- if (ClientData.Play->Bitches.Carried<=0) return; | |
- | |
-/* Title of dialog to sack a bitch (%Tde = "Bitch" by default) */ | |
- title=dpg_strdup_printf(_("%/Sack Bitch dialog title/Sack %Tde"), | |
- Names.Bitch); | |
- | |
-/* Confirmation message for sacking a bitch. (%tde = "guns", "drugs", | |
- "bitch", respectively, by default) */ | |
- text=dpg_strdup_printf(_("Are you sure? (Any %tde or %tde carried\n" | |
- "by this %tde may be lost!)"),Names.Guns, | |
- Names.Drugs,Names.Bitch); | |
- | |
- if (GtkMessageBox(ClientData.window,text,title,MB_YESNO)==IDYES) { | |
- ClientData.Play->Bitches.Carried--; | |
- UpdateMenus(); | |
- SendClientMessage(ClientData.Play,C_NONE,C_SACKBITCH,NULL,NULL); | |
- } | |
- g_free(text); g_free(title); | |
-} | |
- | |
-void CreateInventory(GtkWidget *hbox,gchar *Objects,GtkAccelGroup *accel_group, | |
- gboolean CreateButtons,gboolean CreateHere, | |
- struct InventoryWidgets *widgets,GtkSignalFunc CallBack) { | |
- GtkWidget *scrollwin,*clist,*vbbox,*frame[2],*button[3]; | |
- gint i,mini; | |
- GString *text; | |
- gchar *titles[2][2]; | |
- gchar *button_text[3]; | |
- gpointer button_type[3] = { BT_BUY, BT_SELL, BT_DROP }; | |
- | |
-/* Column titles for display of drugs/guns carried or available for purchase */ | |
- titles[0][0]=titles[1][0]=_("Name"); | |
- titles[0][1]=_("Price"); | |
- titles[1][1]=_("Number"); | |
- | |
-/* Button titles for buying/selling/dropping guns or drugs */ | |
- button_text[0]=_("_Buy ->"); | |
- button_text[1]=_("<- _Sell"); | |
- button_text[2]=_("_Drop <-"); | |
- | |
- text=g_string_new(""); | |
- | |
- if (CreateHere) { | |
-/* Title of the display of available drugs/guns (%Tde = "Guns" or "Drugs" | |
- by default) */ | |
- dpg_string_sprintf(text,_("%Tde here"),Objects); | |
- widgets->HereFrame=frame[0]=gtk_frame_new(text->str); | |
- } | |
- | |
-/* Title of the display of carried drugs/guns (%Tde = "Guns" or "Drugs" | |
- by default) */ | |
- dpg_string_sprintf(text,_("%Tde carried"),Objects); | |
- | |
- widgets->CarriedFrame=frame[1]=gtk_frame_new(text->str); | |
- | |
- widgets->HereList=widgets->CarriedList=NULL; | |
- if (CreateHere) mini=0; else mini=1; | |
- for (i=mini;i<2;i++) { | |
- gtk_container_set_border_width(GTK_CONTAINER(frame[i]),5); | |
- | |
- clist=gtk_scrolled_clist_new_with_titles(2,titles[i],&scrollwin); | |
- gtk_clist_set_column_auto_resize(GTK_CLIST(clist),0,TRUE); | |
- gtk_clist_set_column_auto_resize(GTK_CLIST(clist),1,TRUE); | |
- gtk_clist_column_titles_passive(GTK_CLIST(clist)); | |
- gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); | |
- gtk_clist_set_auto_sort(GTK_CLIST(clist),FALSE); | |
- gtk_container_add(GTK_CONTAINER(frame[i]),scrollwin); | |
- if (i==0) widgets->HereList=clist; else widgets->CarriedList=clist; | |
- } | |
- if (CreateHere) gtk_box_pack_start(GTK_BOX(hbox),frame[0],TRUE,TRUE,0); | |
- | |
- if (CreateButtons) { | |
- widgets->vbbox=vbbox=gtk_vbutton_box_new(); | |
- | |
- for (i=0;i<3;i++) { | |
- button[i]=gtk_button_new_with_label(""); | |
- SetAccelerator(button[i],_(button_text[i]),button[i], | |
- "clicked",accel_group); | |
- if (CallBack) gtk_signal_connect(GTK_OBJECT(button[i]),"clicked", | |
- GTK_SIGNAL_FUNC(CallBack), | |
- button_type[i]); | |
- gtk_box_pack_start(GTK_BOX(vbbox),button[i],TRUE,TRUE,0); | |
- } | |
- widgets->BuyButton=button[0]; | |
- widgets->SellButton=button[1]; | |
- widgets->DropButton=button[2]; | |
- gtk_box_pack_start(GTK_BOX(hbox),vbbox,FALSE,FALSE,0); | |
- } else widgets->vbbox=NULL; | |
- | |
- gtk_box_pack_start(GTK_BOX(hbox),frame[1],TRUE,TRUE,0); | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-void DestroyShowing(GtkWidget *widget,gpointer data) { | |
- gboolean *IsShowing; | |
- | |
- IsShowing=(gboolean *)gtk_object_get_data(GTK_OBJECT(widget),"IsShowing"); | |
- if (IsShowing) *IsShowing=FALSE; | |
-} | |
- | |
-static void NewNameOK(GtkWidget *widget,GtkWidget *window) { | |
- GtkWidget *entry; | |
- gchar *text; | |
- | |
- entry=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(window),"entry")); | |
- text=gtk_editable_get_chars(GTK_EDITABLE(entry),0,-1); | |
- if (text[0]) { | |
- SetPlayerName(ClientData.Play,text); | |
- SendNullClientMessage(ClientData.Play,C_NONE,C_NAME,NULL,text); | |
- gtk_widget_destroy(window); | |
- } | |
- g_free(text); | |
+void UpdatePlayerList(GtkWidget *clist, gboolean IncludeSelf) | |
+{ | |
+ GSList *list; | |
+ gchar *text[1]; | |
+ gint row; | |
+ Player *Play; | |
+ | |
+ gtk_clist_freeze(GTK_CLIST(clist)); | |
+ gtk_clist_clear(GTK_CLIST(clist)); | |
+ for (list = FirstClient; list; list = g_slist_next(list)) { | |
+ Play = (Player *)list->data; | |
+ if (IncludeSelf || Play != ClientData.Play) { | |
+ text[0] = GetPlayerName(Play); | |
+ row = gtk_clist_append(GTK_CLIST(clist), text); | |
+ gtk_clist_set_row_data(GTK_CLIST(clist), row, Play); | |
+ } | |
+ } | |
+ gtk_clist_thaw(GTK_CLIST(clist)); | |
+} | |
+ | |
+static void ErrandOK(GtkWidget *widget, GtkWidget *clist) | |
+{ | |
+ GList *selection; | |
+ Player *Play; | |
+ gint row; | |
+ GtkWidget *dialog; | |
+ gint ErrandType; | |
+ | |
+ dialog = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(widget), "dialog")); | |
+ ErrandType = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(widget), | |
+ "errandtype")); | |
+ selection = GTK_CLIST(clist)->selection; | |
+ if (selection) { | |
+ row = GPOINTER_TO_INT(selection->data); | |
+ Play = (Player *)gtk_clist_get_row_data(GTK_CLIST(clist), row); | |
+ if (ErrandType == ET_SPY) { | |
+ SendClientMessage(ClientData.Play, C_NONE, C_SPYON, Play, NULL); | |
+ } else { | |
+ SendClientMessage(ClientData.Play, C_NONE, C_TIPOFF, Play, NULL); | |
+ } | |
+ gtk_widget_destroy(dialog); | |
+ } | |
+} | |
+ | |
+void SpyOnPlayer(GtkWidget *widget, gpointer data) | |
+{ | |
+ ErrandDialog(ET_SPY); | |
+} | |
+ | |
+void TipOff(GtkWidget *widget, gpointer data) | |
+{ | |
+ ErrandDialog(ET_TIPOFF); | |
} | |
-void NewNameDialog(void) { | |
- GtkWidget *window,*button,*hsep,*vbox,*label,*entry; | |
+void ErrandDialog(gint ErrandType) | |
+{ | |
+ GtkWidget *dialog, *clist, *button, *vbox, *hbbox, *hsep, *label; | |
+ gchar *text; | |
- window=gtk_window_new(GTK_WINDOW_DIALOG); | |
+ dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
+ GTK_WINDOW(ClientData.window)); | |
-/* Title of dialog for changing a player's name */ | |
- gtk_window_set_title(GTK_WINDOW(window),_("Change Name")); | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ | |
+ if (ErrandType == ET_SPY) { | |
+ /* Title of dialog to select a player to spy on */ | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("Spy On Player")); | |
+ | |
+ /* Informative text for "spy on player" dialog. (%tde = "bitch", | |
+ * "bitch", "guns", "drugs", respectively, by default) */ | |
+ text = dpg_strdup_printf(_("Please choose the player to spy on. " | |
+ "Your %tde will\nthen offer his " | |
+ "services to the player, and if " | |
+ "successful,\nyou will be able to " | |
+ "view the player's stats with the\n" | |
+ "\"Get spy reports\" menu. Remember " | |
+ "that the %tde will leave\nyou, so " | |
+ "any %tde or %tde that he's " | |
+ "carrying may be lost!"), Names.Bitch, | |
+ Names.Bitch, Names.Guns, Names.Drugs); | |
+ label = gtk_label_new(text); | |
+ g_free(text); | |
+ } else { | |
- 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); | |
- gtk_signal_connect(GTK_OBJECT(window),"delete_event", | |
- GTK_SIGNAL_FUNC(DisallowDelete),NULL); | |
+ /* Title of dialog to select a player to tip the cops off to */ | |
+ gtk_window_set_title(GTK_WINDOW(dialog), _("Tip Off The Cops")); | |
+ | |
+ /* Informative text for "tip off cops" dialog. (%tde = "bitch", | |
+ * "bitch", "guns", "drugs", respectively, by default) */ | |
+ text = dpg_strdup_printf(_("Please choose the player to tip off " | |
+ "the cops to. Your %tde will\nhelp " | |
+ "the cops to attack that player, " | |
+ "and then report back to you\non " | |
+ "the encounter. Remember that the " | |
+ "%tde will leave you temporarily,\n" | |
+ "so any %tde or %tde that he's " | |
+ "carrying may be lost!"), Names.Bitch, | |
+ Names.Bitch, Names.Guns, Names.Drugs); | |
+ label = gtk_label_new(text); | |
+ g_free(text); | |
+ } | |
- vbox=gtk_vbox_new(FALSE,7); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ | |
+ clist = ClientData.PlayerList = CreatePlayerList(); | |
+ UpdatePlayerList(clist, FALSE); | |
+ gtk_box_pack_start(GTK_BOX(vbox), clist, 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_object_set_data(GTK_OBJECT(button), "dialog", dialog); | |
+ gtk_object_set_data(GTK_OBJECT(button), "errandtype", | |
+ GINT_TO_POINTER(ErrandType)); | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(ErrandOK), (gpointer)clist); | |
+ 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)dialog); | |
+ gtk_box_pack_start(GTK_BOX(hbbox), button, TRUE, TRUE, 0); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0); | |
+ gtk_container_add(GTK_CONTAINER(dialog), vbox); | |
+ gtk_widget_show_all(dialog); | |
+} | |
-/* Informational text to prompt the player to change his/her name */ | |
- label=gtk_label_new(_("Unfortunately, somebody else is already " | |
- "using \"your\" name. Please change it:-")); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
+void SackBitch(GtkWidget *widget, gpointer data) | |
+{ | |
+ char *title, *text; | |
+ | |
+ /* Cannot sack bitches if you don't have any! */ | |
+ if (ClientData.Play->Bitches.Carried <= 0) | |
+ return; | |
+ | |
+ /* Title of dialog to sack a bitch (%Tde = "Bitch" by default) */ | |
+ title = dpg_strdup_printf(_("%/Sack Bitch dialog title/Sack %Tde"), | |
+ Names.Bitch); | |
+ | |
+ /* Confirmation message for sacking a bitch. (%tde = "guns", "drugs", | |
+ * "bitch", respectively, by default) */ | |
+ text = dpg_strdup_printf(_("Are you sure? (Any %tde or %tde carried\n" | |
+ "by this %tde may be lost!)"), Names.Guns, | |
+ Names.Drugs, Names.Bitch); | |
+ | |
+ if (GtkMessageBox(ClientData.window, text, title, MB_YESNO) == IDYES) { | |
+ ClientData.Play->Bitches.Carried--; | |
+ UpdateMenus(); | |
+ SendClientMessage(ClientData.Play, C_NONE, C_SACKBITCH, NULL, NULL); | |
+ } | |
+ g_free(text); | |
+ g_free(title); | |
+} | |
- entry=gtk_entry_new(); | |
- gtk_object_set_data(GTK_OBJECT(window),"entry",entry); | |
- gtk_signal_connect(GTK_OBJECT(entry),"activate", | |
- GTK_SIGNAL_FUNC(NewNameOK),window); | |
- gtk_entry_set_text(GTK_ENTRY(entry),GetPlayerName(ClientData.Play)); | |
- gtk_box_pack_start(GTK_BOX(vbox),entry,FALSE,FALSE,0); | |
+void CreateInventory(GtkWidget *hbox, gchar *Objects, | |
+ GtkAccelGroup *accel_group, gboolean CreateButtons, | |
+ gboolean CreateHere, struct InventoryWidgets *widgets, | |
+ GtkSignalFunc CallBack) | |
+{ | |
+ GtkWidget *scrollwin, *clist, *vbbox, *frame[2], *button[3]; | |
+ gint i, mini; | |
+ GString *text; | |
+ gchar *titles[2][2]; | |
+ gchar *button_text[3]; | |
+ gpointer button_type[3] = { BT_BUY, BT_SELL, BT_DROP }; | |
+ | |
+ /* Column titles for display of drugs/guns carried or available for | |
+ * purchase */ | |
+ titles[0][0] = titles[1][0] = _("Name"); | |
+ titles[0][1] = _("Price"); | |
+ titles[1][1] = _("Number"); | |
+ | |
+ /* Button titles for buying/selling/dropping guns or drugs */ | |
+ button_text[0] = _("_Buy ->"); | |
+ button_text[1] = _("<- _Sell"); | |
+ button_text[2] = _("_Drop <-"); | |
+ | |
+ text = g_string_new(""); | |
+ | |
+ if (CreateHere) { | |
+ /* Title of the display of available drugs/guns (%Tde = "Guns" or | |
+ * "Drugs" by default) */ | |
+ dpg_string_sprintf(text, _("%Tde here"), Objects); | |
+ widgets->HereFrame = frame[0] = gtk_frame_new(text->str); | |
+ } | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
+ /* Title of the display of carried drugs/guns (%Tde = "Guns" or "Drugs" | |
+ * by default) */ | |
+ dpg_string_sprintf(text, _("%Tde carried"), Objects); | |
+ | |
+ widgets->CarriedFrame = frame[1] = gtk_frame_new(text->str); | |
+ | |
+ widgets->HereList = widgets->CarriedList = NULL; | |
+ if (CreateHere) | |
+ mini = 0; | |
+ else | |
+ mini = 1; | |
+ for (i = mini; i < 2; i++) { | |
+ gtk_container_set_border_width(GTK_CONTAINER(frame[i]), 5); | |
+ | |
+ clist = gtk_scrolled_clist_new_with_titles(2, titles[i], &scrollwin); | |
+ gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE); | |
+ gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 1, TRUE); | |
+ gtk_clist_column_titles_passive(GTK_CLIST(clist)); | |
+ gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE); | |
+ gtk_clist_set_auto_sort(GTK_CLIST(clist), FALSE); | |
+ gtk_container_add(GTK_CONTAINER(frame[i]), scrollwin); | |
+ if (i == 0) | |
+ widgets->HereList = clist; | |
+ else | |
+ widgets->CarriedList = clist; | |
+ } | |
+ if (CreateHere) | |
+ gtk_box_pack_start(GTK_BOX(hbox), frame[0], TRUE, TRUE, 0); | |
+ | |
+ if (CreateButtons) { | |
+ widgets->vbbox = vbbox = gtk_vbutton_box_new(); | |
+ | |
+ for (i = 0; i < 3; i++) { | |
+ button[i] = gtk_button_new_with_label(""); | |
+ SetAccelerator(button[i], _(button_text[i]), button[i], | |
+ "clicked", accel_group); | |
+ if (CallBack) | |
+ gtk_signal_connect(GTK_OBJECT(button[i]), "clicked", | |
+ GTK_SIGNAL_FUNC(CallBack), button_type[i]); | |
+ gtk_box_pack_start(GTK_BOX(vbbox), button[i], TRUE, TRUE, 0); | |
+ } | |
+ widgets->BuyButton = button[0]; | |
+ widgets->SellButton = button[1]; | |
+ widgets->DropButton = button[2]; | |
+ gtk_box_pack_start(GTK_BOX(hbox), vbbox, FALSE, FALSE, 0); | |
+ } else | |
+ widgets->vbbox = NULL; | |
- button=gtk_button_new_with_label(_("OK")); | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(NewNameOK),window); | |
- gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0); | |
- GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT); | |
- gtk_widget_grab_default(button); | |
- | |
- gtk_container_add(GTK_CONTAINER(window),vbox); | |
- gtk_widget_show_all(window); | |
+ gtk_box_pack_start(GTK_BOX(hbox), frame[1], TRUE, TRUE, 0); | |
+ g_string_free(text, TRUE); | |
} | |
-gint DisallowDelete(GtkWidget *widget,GdkEvent *event,gpointer data) { | |
- return(TRUE); | |
+void DestroyShowing(GtkWidget *widget, gpointer data) | |
+{ | |
+ gboolean *IsShowing; | |
+ | |
+ IsShowing = | |
+ (gboolean *)gtk_object_get_data(GTK_OBJECT(widget), "IsShowing"); | |
+ if (IsShowing) | |
+ *IsShowing = FALSE; | |
} | |
-void GunShopDialog(void) { | |
- GtkWidget *window,*button,*hsep,*vbox,*hbox; | |
- GtkAccelGroup *accel_group; | |
- gchar *text; | |
+static void NewNameOK(GtkWidget *widget, GtkWidget *window) | |
+{ | |
+ GtkWidget *entry; | |
+ gchar *text; | |
+ | |
+ entry = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(window), "entry")); | |
+ text = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); | |
+ if (text[0]) { | |
+ SetPlayerName(ClientData.Play, text); | |
+ SendNullClientMessage(ClientData.Play, C_NONE, C_NAME, NULL, text); | |
+ gtk_widget_destroy(window); | |
+ } | |
+ g_free(text); | |
+} | |
- window=gtk_window_new(GTK_WINDOW_DIALOG); | |
- gtk_window_set_default_size(GTK_WINDOW(window),600,190); | |
- gtk_signal_connect(GTK_OBJECT(window),"destroy", | |
- GTK_SIGNAL_FUNC(SendDoneMessage),NULL); | |
- accel_group=gtk_accel_group_new(); | |
- gtk_window_add_accel_group(GTK_WINDOW(window),accel_group); | |
+void NewNameDialog(void) | |
+{ | |
+ GtkWidget *window, *button, *hsep, *vbox, *label, *entry; | |
-/* Title of 'gun shop' dialog in GTK+ client (%Tde="Dan's House of Guns" | |
- by default) */ | |
- text=dpg_strdup_printf(_("%/GTK GunShop window title/%Tde"), | |
- Names.GunShopName); | |
- gtk_window_set_title(GTK_WINDOW(window),text); | |
- g_free(text); | |
- 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); | |
- IsShowingGunShop=TRUE; | |
- gtk_object_set_data(GTK_OBJECT(window),"IsShowing", | |
- (gpointer)&IsShowingGunShop); | |
- gtk_signal_connect(GTK_OBJECT(window),"destroy", | |
- GTK_SIGNAL_FUNC(DestroyShowing),NULL); | |
+ window = gtk_window_new(GTK_WINDOW_DIALOG); | |
- vbox=gtk_vbox_new(FALSE,7); | |
+ /* Title of dialog for changing a player's name */ | |
+ gtk_window_set_title(GTK_WINDOW(window), _("Change Name")); | |
- hbox=gtk_hbox_new(FALSE,7); | |
- CreateInventory(hbox,Names.Guns,accel_group,TRUE,TRUE,&ClientData.Gun, | |
- DealGuns); | |
+ 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); | |
+ gtk_signal_connect(GTK_OBJECT(window), "delete_event", | |
+ GTK_SIGNAL_FUNC(DisallowDelete), NULL); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
+ /* Informational text to prompt the player to change his/her name */ | |
+ label = gtk_label_new(_("Unfortunately, somebody else is already " | |
+ "using \"your\" name. Please change it:-")); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
-/* Button to finish buying/selling guns in the gun shop */ | |
- button=gtk_button_new_with_label(_("Done")); | |
+ entry = gtk_entry_new(); | |
+ gtk_object_set_data(GTK_OBJECT(window), "entry", entry); | |
+ gtk_signal_connect(GTK_OBJECT(entry), "activate", | |
+ GTK_SIGNAL_FUNC(NewNameOK), window); | |
+ gtk_entry_set_text(GTK_ENTRY(entry), GetPlayerName(ClientData.Play)); | |
+ gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0); | |
- gtk_signal_connect_object(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
- (gpointer)window); | |
- gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0); | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
- gtk_container_add(GTK_CONTAINER(window),vbox); | |
+ button = gtk_button_new_with_label(_("OK")); | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(NewNameOK), window); | |
+ gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); | |
+ GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); | |
+ gtk_widget_grab_default(button); | |
- UpdateInventory(&ClientData.Gun,ClientData.Play->Guns,NumGun,FALSE); | |
- gtk_widget_show_all(window); | |
+ gtk_container_add(GTK_CONTAINER(window), vbox); | |
+ gtk_widget_show_all(window); | |
} | |
-void UpdatePlayerLists(void) { | |
- if (IsShowingPlayerList) UpdatePlayerList(ClientData.PlayerList,FALSE); | |
- if (IsShowingTalkList) UpdatePlayerList(ClientData.TalkList,FALSE); | |
+gint DisallowDelete(GtkWidget *widget, GdkEvent *event, gpointer data) | |
+{ | |
+ return (TRUE); | |
} | |
-void GetSpyReports(GtkWidget *Widget,gpointer data) { | |
- SendClientMessage(ClientData.Play,C_NONE,C_CONTACTSPY,NULL,NULL); | |
-} | |
+void GunShopDialog(void) | |
+{ | |
+ GtkWidget *window, *button, *hsep, *vbox, *hbox; | |
+ GtkAccelGroup *accel_group; | |
+ gchar *text; | |
-static void DestroySpyReports(GtkWidget *widget,gpointer data) { | |
- SpyReportsDialog=NULL; | |
-} | |
+ window = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ gtk_window_set_default_size(GTK_WINDOW(window), 600, 190); | |
+ gtk_signal_connect(GTK_OBJECT(window), "destroy", | |
+ GTK_SIGNAL_FUNC(SendDoneMessage), NULL); | |
+ accel_group = gtk_accel_group_new(); | |
+ gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); | |
+ | |
+ /* Title of 'gun shop' dialog in GTK+ client (%Tde="Dan's House of Guns" | |
+ * by default) */ | |
+ text = dpg_strdup_printf(_("%/GTK GunShop window title/%Tde"), | |
+ Names.GunShopName); | |
+ gtk_window_set_title(GTK_WINDOW(window), text); | |
+ g_free(text); | |
+ 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); | |
+ IsShowingGunShop = TRUE; | |
+ gtk_object_set_data(GTK_OBJECT(window), "IsShowing", | |
+ (gpointer)&IsShowingGunShop); | |
+ gtk_signal_connect(GTK_OBJECT(window), "destroy", | |
+ GTK_SIGNAL_FUNC(DestroyShowing), NULL); | |
-static void CreateSpyReports(void) { | |
- GtkWidget *window,*button,*vbox,*notebook; | |
- GtkAccelGroup *accel_group; | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
- SpyReportsDialog=window=gtk_window_new(GTK_WINDOW_DIALOG); | |
- accel_group=gtk_accel_group_new(); | |
- gtk_object_set_data(GTK_OBJECT(window),"accel_group",accel_group); | |
- gtk_window_add_accel_group(GTK_WINDOW(window),accel_group); | |
+ hbox = gtk_hbox_new(FALSE, 7); | |
+ CreateInventory(hbox, Names.Guns, accel_group, TRUE, TRUE, | |
+ &ClientData.Gun, DealGuns); | |
-/* Title of window to display reports from spies with other players */ | |
- gtk_window_set_title(GTK_WINDOW(window),_("Spy reports")); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); | |
- 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); | |
- gtk_signal_connect(GTK_OBJECT(window),"destroy", | |
- GTK_SIGNAL_FUNC(DestroySpyReports),NULL); | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
- vbox=gtk_vbox_new(FALSE,5); | |
- notebook=gtk_notebook_new(); | |
- gtk_object_set_data(GTK_OBJECT(window),"notebook",notebook); | |
+ /* Button to finish buying/selling guns in the gun shop */ | |
+ button = gtk_button_new_with_label(_("Done")); | |
- gtk_box_pack_start(GTK_BOX(vbox),notebook,TRUE,TRUE,0); | |
+ gtk_signal_connect_object(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)window); | |
+ gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); | |
- button=gtk_button_new_with_label(_("Close")); | |
- gtk_signal_connect_object(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
- (gpointer)window); | |
- gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0); | |
+ gtk_container_add(GTK_CONTAINER(window), vbox); | |
- gtk_container_add(GTK_CONTAINER(window),vbox); | |
+ UpdateInventory(&ClientData.Gun, ClientData.Play->Guns, NumGun, FALSE); | |
+ gtk_widget_show_all(window); | |
+} | |
- gtk_widget_show_all(window); | |
+void UpdatePlayerLists(void) | |
+{ | |
+ if (IsShowingPlayerList) | |
+ UpdatePlayerList(ClientData.PlayerList, FALSE); | |
+ if (IsShowingTalkList) | |
+ UpdatePlayerList(ClientData.TalkList, FALSE); | |
} | |
-void DisplaySpyReports(Player *Play) { | |
- GtkWidget *dialog,*notebook,*vbox,*hbox,*frame,*label,*table; | |
- GtkAccelGroup *accel_group; | |
- struct StatusWidgets Status; | |
- struct InventoryWidgets SpyDrugs,SpyGuns; | |
+void GetSpyReports(GtkWidget *Widget, gpointer data) | |
+{ | |
+ SendClientMessage(ClientData.Play, C_NONE, C_CONTACTSPY, NULL, NULL); | |
+} | |
- if (!SpyReportsDialog) CreateSpyReports(); | |
- dialog=SpyReportsDialog; | |
- notebook=GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(dialog),"notebook")); | |
- accel_group=(GtkAccelGroup *)(gtk_object_get_data(GTK_OBJECT(dialog), | |
- "accel_group")); | |
- vbox=gtk_vbox_new(FALSE,5); | |
- frame=gtk_frame_new("Stats"); | |
- gtk_container_set_border_width(GTK_CONTAINER(frame),4); | |
- table=CreateStatusWidgets(&Status); | |
- gtk_container_add(GTK_CONTAINER(frame),table); | |
- gtk_box_pack_start(GTK_BOX(vbox),frame,FALSE,FALSE,0); | |
+static void DestroySpyReports(GtkWidget *widget, gpointer data) | |
+{ | |
+ SpyReportsDialog = NULL; | |
+} | |
- hbox=gtk_hbox_new(FALSE,5); | |
- CreateInventory(hbox,Names.Drugs,accel_group,FALSE,FALSE,&SpyDrugs,NULL); | |
- CreateInventory(hbox,Names.Guns,accel_group,FALSE,FALSE,&SpyGuns,NULL); | |
+static void CreateSpyReports(void) | |
+{ | |
+ GtkWidget *window, *button, *vbox, *notebook; | |
+ GtkAccelGroup *accel_group; | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); | |
- label=gtk_label_new(GetPlayerName(Play)); | |
+ SpyReportsDialog = window = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ accel_group = gtk_accel_group_new(); | |
+ gtk_object_set_data(GTK_OBJECT(window), "accel_group", accel_group); | |
+ gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); | |
- DisplayStats(Play,&Status); | |
- UpdateInventory(&SpyDrugs,Play->Drugs,NumDrug,TRUE); | |
- UpdateInventory(&SpyGuns,Play->Guns,NumGun,FALSE); | |
+ /* Title of window to display reports from spies with other players */ | |
+ gtk_window_set_title(GTK_WINDOW(window), _("Spy reports")); | |
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook),vbox,label); | |
+ 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); | |
+ gtk_signal_connect(GTK_OBJECT(window), "destroy", | |
+ GTK_SIGNAL_FUNC(DestroySpyReports), NULL); | |
- gtk_widget_show_all(notebook); | |
-} | |
+ vbox = gtk_vbox_new(FALSE, 5); | |
+ notebook = gtk_notebook_new(); | |
+ gtk_object_set_data(GTK_OBJECT(window), "notebook", 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); | |
-} | |
+ gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); | |
-static void DestroyAuthDialog(GtkWidget *window,gpointer data) { | |
- GtkWidget *userentry,*passwdentry; | |
- gchar *username=NULL,*password=NULL; | |
- gpointer proxy,authok; | |
- HttpConnection *conn; | |
+ button = gtk_button_new_with_label(_("Close")); | |
+ gtk_signal_connect_object(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(gtk_widget_destroy), | |
+ (gpointer)window); | |
+ gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0); | |
- 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); | |
+ gtk_container_add(GTK_CONTAINER(window), vbox); | |
- if (authok) { | |
- username = gtk_editable_get_chars(GTK_EDITABLE(userentry),0,-1); | |
- password = gtk_editable_get_chars(GTK_EDITABLE(passwdentry),0,-1); | |
- } | |
+ gtk_widget_show_all(window); | |
+} | |
- SetHttpAuthentication(conn,GPOINTER_TO_INT(proxy),username,password); | |
+void DisplaySpyReports(Player *Play) | |
+{ | |
+ GtkWidget *dialog, *notebook, *vbox, *hbox, *frame, *label, *table; | |
+ GtkAccelGroup *accel_group; | |
+ struct StatusWidgets Status; | |
+ struct InventoryWidgets SpyDrugs, SpyGuns; | |
+ | |
+ if (!SpyReportsDialog) | |
+ CreateSpyReports(); | |
+ dialog = SpyReportsDialog; | |
+ notebook = | |
+ GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(dialog), "notebook")); | |
+ accel_group = | |
+ (GtkAccelGroup | |
+ *)(gtk_object_get_data(GTK_OBJECT(dialog), "accel_group")); | |
+ vbox = gtk_vbox_new(FALSE, 5); | |
+ frame = gtk_frame_new("Stats"); | |
+ gtk_container_set_border_width(GTK_CONTAINER(frame), 4); | |
+ table = CreateStatusWidgets(&Status); | |
+ gtk_container_add(GTK_CONTAINER(frame), table); | |
+ gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); | |
+ | |
+ hbox = gtk_hbox_new(FALSE, 5); | |
+ CreateInventory(hbox, Names.Drugs, accel_group, FALSE, FALSE, &SpyDrugs, | |
+ NULL); | |
+ CreateInventory(hbox, Names.Guns, accel_group, FALSE, FALSE, &SpyGuns, | |
+ NULL); | |
+ | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); | |
+ label = gtk_label_new(GetPlayerName(Play)); | |
+ | |
+ DisplayStats(Play, &Status); | |
+ UpdateInventory(&SpyDrugs, Play->Drugs, NumDrug, TRUE); | |
+ UpdateInventory(&SpyGuns, Play->Guns, NumGun, FALSE); | |
+ | |
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label); | |
+ | |
+ gtk_widget_show_all(notebook); | |
+} | |
- g_free(username); g_free(password); | |
+#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); | |
} | |
-void AuthDialog(HttpConnection *conn,gboolean proxy,gchar *realm, | |
- gpointer data) { | |
- GtkWidget *window,*button,*hsep,*vbox,*label,*entry,*table,*hbbox; | |
+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); | |
+ } | |
- 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); | |
+ SetHttpAuthentication(conn, GPOINTER_TO_INT(proxy), username, password); | |
+ | |
+ g_free(username); | |
+ g_free(password); | |
+} | |
- 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")); | |
- } | |
+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); | |
+ 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); | |
+ 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); | |
+ 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, 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(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); | |
+ 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); | |
+ 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); | |
+ 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); | |
+ 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); | |
+ /* 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_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 2, 3); | |
- gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,0); | |
+ 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); | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
- hbbox = gtk_hbutton_box_new(); | |
+ 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(_("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); | |
+ 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_box_pack_start(GTK_BOX(vbox), hbbox, TRUE, TRUE, 0); | |
- gtk_container_add(GTK_CONTAINER(window),vbox); | |
- gtk_widget_show_all(window); | |
+ 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 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); | |
- } | |
+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); | |
+ 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; | |
+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)); | |
+ 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")); | |
+ /* 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); | |
+ 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); | |
+ 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); | |
+ 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); | |
+ 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); | |
+ 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); | |
+ 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); | |
+ 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); | |
+ /* 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_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 1, 2); | |
- gtk_box_pack_start(GTK_BOX(vbox),table,TRUE,TRUE,0); | |
+ 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); | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
- hbbox = gtk_hbutton_box_new(); | |
+ 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(_("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); | |
+ 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_box_pack_start(GTK_BOX(vbox), hbbox, TRUE, TRUE, 0); | |
- gtk_container_add(GTK_CONTAINER(window),vbox); | |
- gtk_widget_show_all(window); | |
+ gtk_container_add(GTK_CONTAINER(window), vbox); | |
+ gtk_widget_show_all(window); | |
} | |
-void MetaSocksAuthDialog(NetworkBuffer *netbuf,gpointer data) { | |
- RealSocksAuthDialog(netbuf,TRUE,data); | |
+void MetaSocksAuthDialog(NetworkBuffer *netbuf, gpointer data) | |
+{ | |
+ RealSocksAuthDialog(netbuf, TRUE, data); | |
} | |
-void SocksAuthDialog(NetworkBuffer *netbuf,gpointer data) { | |
- RealSocksAuthDialog(netbuf,FALSE,data); | |
+void SocksAuthDialog(NetworkBuffer *netbuf, gpointer data) | |
+{ | |
+ RealSocksAuthDialog(netbuf, FALSE, data); | |
} | |
#endif /* NETWORKING */ | |
t@@ -3520,17 +3892,18 @@ void SocksAuthDialog(NetworkBuffer *netbuf,gpointer da… | |
#else | |
#include <glib.h> | |
-#include "nls.h" /* We need this for the definition of '_' */ | |
+#include "nls.h" /* We need this for the definition of '_' */ | |
-char GtkLoop(int *argc,char **argv[],gboolean ReturnOnFail) { | |
- if (!ReturnOnFail) { | |
-/* Error message displayed if the user tries to run the graphical client | |
- when none is compiled into the dopewars binary. */ | |
- g_print(_("No graphical client available - rebuild the binary\n" | |
+char GtkLoop(int *argc, char **argv[], gboolean ReturnOnFail) | |
+{ | |
+ if (!ReturnOnFail) { | |
+ /* Error message displayed if the user tries to run the graphical | |
+ * client when none is compiled into the dopewars binary. */ | |
+ g_print(_("No graphical client available - rebuild the binary\n" | |
"passing the --enable-gui-client option to configure, or\n" | |
"use the curses client (if available) instead!\n")); | |
- } | |
- return FALSE; | |
+ } | |
+ return FALSE; | |
} | |
#endif /* GUI_CLIENT */ | |
diff --git a/src/gtk_client.h b/src/gtk_client.h | |
t@@ -1,23 +1,24 @@ | |
-/* gtk_client.h dopewars client using the GTK+ toolkit */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * gtk_client.h dopewars client using the GTK+ toolkit * | |
+ * 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 __GTK_CLIENT_H__ | |
#define __GTK_CLIENT_H__ | |
t@@ -29,9 +30,9 @@ | |
#include <glib.h> | |
#ifdef CYGWIN | |
-char GtkLoop(HINSTANCE hInstance,HINSTANCE hPrevInstance); | |
+char GtkLoop(HINSTANCE hInstance, HINSTANCE hPrevInstance); | |
#else | |
-char GtkLoop(int *argc,char **argv[],gboolean ReturnOnFail); | |
+char GtkLoop(int *argc, char **argv[], gboolean ReturnOnFail); | |
#endif | |
#endif | |
diff --git a/src/gtkport.c b/src/gtkport.c | |
t@@ -1,31 +1,33 @@ | |
-/* gtkport.c Portable "almost-GTK+" for Unix/Win32 */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * gtkport.c Portable "almost-GTK+" for Unix/Win32 * | |
+ * 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 | |
#ifndef CYGWIN | |
-#include <sys/types.h> /* For pid_t (fork) */ | |
+#include <sys/types.h> /* For pid_t (fork) */ | |
#ifdef HAVE_UNISTD_H | |
-#include <unistd.h> /* For fork and execv */ | |
+#include <unistd.h> /* For fork and execv */ | |
#endif | |
#endif /* !CYGWIN */ | |
t@@ -49,10 +51,10 @@ | |
#define PANED_STARTPOS 200 | |
-HICON mainIcon=NULL; | |
-static WNDPROC customWndProc=NULL; | |
+HICON mainIcon = NULL; | |
+static WNDPROC customWndProc = NULL; | |
-static guint RecurseLevel=0; | |
+static guint RecurseLevel = 0; | |
static const gchar *WC_GTKSEP = "WC_GTKSEP"; | |
static const gchar *WC_GTKVPANED = "WC_GTKVPANED"; | |
t@@ -81,27 +83,32 @@ static void gtk_radio_button_toggled(GtkRadioButton *radio… | |
static void gtk_container_destroy(GtkWidget *widget); | |
static void gtk_container_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_container_set_size(GtkWidget *widget,GtkAllocation *allocation… | |
-static void gtk_container_show_all(GtkWidget *widget,gboolean hWndOnly); | |
+static void gtk_container_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
+static void gtk_container_show_all(GtkWidget *widget, gboolean hWndOnly); | |
static void gtk_window_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_window_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
+static void gtk_window_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
static void gtk_window_destroy(GtkWidget *widget); | |
-static void gtk_window_set_menu(GtkWindow *window,GtkMenuBar *menu_bar); | |
-static GtkWidget *gtk_window_get_menu_ID(GtkWindow *window,gint ID); | |
+static void gtk_window_set_menu(GtkWindow *window, GtkMenuBar *menu_bar); | |
+static GtkWidget *gtk_window_get_menu_ID(GtkWindow *window, gint ID); | |
static void gtk_table_destroy(GtkWidget *widget); | |
static void gtk_table_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_table_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
+static void gtk_table_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
static void gtk_table_realize(GtkWidget *widget); | |
static void gtk_box_destroy(GtkWidget *widget); | |
static void gtk_hbox_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_hbox_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
+static void gtk_hbox_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
static void gtk_vbox_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_vbox_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
-static gint gtk_window_delete_event(GtkWidget *widget,GdkEvent *event); | |
+static void gtk_vbox_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
+static gint gtk_window_delete_event(GtkWidget *widget, GdkEvent *event); | |
static void gtk_window_realize(GtkWidget *widget); | |
static void gtk_window_show(GtkWidget *widget); | |
static void gtk_window_hide(GtkWidget *widget); | |
t@@ -127,43 +134,45 @@ static void gtk_label_realize(GtkWidget *widget); | |
static void gtk_url_realize(GtkWidget *widget); | |
static void gtk_frame_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_frame_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
+static void gtk_frame_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
static void gtk_frame_destroy(GtkWidget *widget); | |
static void gtk_frame_realize(GtkWidget *widget); | |
static void gtk_clist_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_clist_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
+static void gtk_clist_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
static void gtk_clist_realize(GtkWidget *widget); | |
static void gtk_clist_show(GtkWidget *widget); | |
static void gtk_clist_hide(GtkWidget *widget); | |
-static void gtk_clist_draw_row(GtkCList *clist,LPDRAWITEMSTRUCT lpdis); | |
-static void gtk_box_show_all(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_table_show_all(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_widget_show_all_full(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_widget_show_full(GtkWidget *widget,gboolean recurse); | |
-static void gtk_widget_update(GtkWidget *widget,gboolean ForceResize); | |
-static void gtk_container_hide_all(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_box_hide_all(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_table_hide_all(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_widget_hide_all_full(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_widget_hide_full(GtkWidget *widget,gboolean recurse); | |
- | |
-static void gtk_marshal_BOOL__GPOIN(GtkObject *object,GSList *actions, | |
+static void gtk_clist_draw_row(GtkCList *clist, LPDRAWITEMSTRUCT lpdis); | |
+static void gtk_box_show_all(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_table_show_all(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_widget_show_all_full(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_widget_show_full(GtkWidget *widget, gboolean recurse); | |
+static void gtk_widget_update(GtkWidget *widget, gboolean ForceResize); | |
+static void gtk_container_hide_all(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_box_hide_all(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_table_hide_all(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_widget_hide_all_full(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_widget_hide_full(GtkWidget *widget, gboolean recurse); | |
+ | |
+static void gtk_marshal_BOOL__GPOIN(GtkObject *object, GSList *actions, | |
GtkSignalFunc default_action, | |
va_list args); | |
-static void gtk_marshal_BOOL__GINT(GtkObject *object,GSList *actions, | |
+static void gtk_marshal_BOOL__GINT(GtkObject *object, GSList *actions, | |
GtkSignalFunc default_action, | |
va_list args); | |
-static void gtk_marshal_VOID__VOID(GtkObject *object,GSList *actions, | |
+static void gtk_marshal_VOID__VOID(GtkObject *object, GSList *actions, | |
GtkSignalFunc default_action, | |
va_list args); | |
-static void gtk_marshal_VOID__BOOL(GtkObject *object,GSList *actions, | |
+static void gtk_marshal_VOID__BOOL(GtkObject *object, GSList *actions, | |
GtkSignalFunc default_action, | |
va_list args); | |
-static void gtk_marshal_VOID__GPOIN(GtkObject *object,GSList *actions, | |
+static void gtk_marshal_VOID__GPOIN(GtkObject *object, GSList *actions, | |
GtkSignalFunc default_action, | |
va_list args); | |
-static void gtk_marshal_VOID__GINT(GtkObject *object,GSList *actions, | |
+static void gtk_marshal_VOID__GINT(GtkObject *object, GSList *actions, | |
GtkSignalFunc default_action, | |
va_list args); | |
static void gtk_menu_bar_realize(GtkWidget *widget); | |
t@@ -172,7 +181,8 @@ static void gtk_menu_item_enable(GtkWidget *widget); | |
static void gtk_menu_item_disable(GtkWidget *widget); | |
static void gtk_menu_realize(GtkWidget *widget); | |
static void gtk_menu_shell_realize(GtkWidget *widget); | |
-static GtkWidget *gtk_menu_shell_get_menu_ID(GtkMenuShell *menu_shell,gint ID); | |
+static GtkWidget *gtk_menu_shell_get_menu_ID(GtkMenuShell *menu_shell, | |
+ gint ID); | |
static void gtk_widget_create(GtkWidget *widget); | |
static void gtk_notebook_realize(GtkWidget *widget); | |
static void gtk_notebook_destroy(GtkWidget *widget); | |
t@@ -180,8 +190,8 @@ static void gtk_notebook_set_size(GtkWidget *widget, | |
GtkAllocation *allocation); | |
static void gtk_notebook_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_notebook_show_all(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_notebook_hide_all(GtkWidget *widget,gboolean hWndOnly); | |
+static void gtk_notebook_show_all(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_notebook_hide_all(GtkWidget *widget, gboolean hWndOnly); | |
static void gtk_spin_button_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
static void gtk_spin_button_set_size(GtkWidget *widget, | |
t@@ -193,8 +203,8 @@ static void gtk_spin_button_hide(GtkWidget *widget); | |
static void gtk_separator_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
static void gtk_separator_realize(GtkWidget *widget); | |
-static void gtk_paned_show_all(GtkWidget *widget,gboolean hWndOnly); | |
-static void gtk_paned_hide_all(GtkWidget *widget,gboolean hWndOnly); | |
+static void gtk_paned_show_all(GtkWidget *widget, gboolean hWndOnly); | |
+static void gtk_paned_hide_all(GtkWidget *widget, gboolean hWndOnly); | |
static void gtk_paned_realize(GtkWidget *widget); | |
static void gtk_vpaned_realize(GtkWidget *widget); | |
static void gtk_hpaned_realize(GtkWidget *widget); | |
t@@ -202,23 +212,26 @@ static void gtk_vpaned_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
static void gtk_hpaned_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
-static void gtk_vpaned_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
-static void gtk_hpaned_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
+static void gtk_vpaned_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
+static void gtk_hpaned_set_size(GtkWidget *widget, | |
+ GtkAllocation *allocation); | |
static void gtk_option_menu_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
static void gtk_option_menu_set_size(GtkWidget *widget, | |
GtkAllocation *allocation); | |
static void gtk_option_menu_realize(GtkWidget *widget); | |
static void gtk_clist_update_selection(GtkWidget *widget); | |
-static void gtk_button_set_text(GtkButton *button,gchar *text); | |
-static void gtk_menu_item_set_text(GtkMenuItem *menuitem,gchar *text); | |
+static void gtk_button_set_text(GtkButton *button, gchar *text); | |
+static void gtk_menu_item_set_text(GtkMenuItem *menuitem, gchar *text); | |
static void gtk_editable_create(GtkWidget *widget); | |
static void gtk_option_menu_update_selection(GtkWidget *widget); | |
-static void gtk_clist_update_widths(GtkCList *clist,gchar *text[]); | |
+static void gtk_clist_update_widths(GtkCList *clist, gchar *text[]); | |
static void gtk_clist_update_all_widths(GtkCList *clist); | |
static void gtk_clist_do_auto_resize(GtkCList *clist); | |
-static void gtk_clist_set_column_width_full(GtkCList *clist,gint column, | |
- gint width,gboolean ResizeHeader); | |
+static void gtk_clist_set_column_width_full(GtkCList *clist, gint column, | |
+ gint width, | |
+ gboolean ResizeHeader); | |
static void gtk_widget_set_focus(GtkWidget *widget); | |
static void gtk_widget_lose_focus(GtkWidget *widget); | |
static void gtk_window_update_focus(GtkWindow *window); | |
t@@ -234,202 +247,205 @@ static void gtk_window_set_initial_position(GtkWindow … | |
static void gtk_progress_bar_size_request(GtkWidget *widget, | |
GtkRequisition *requisition); | |
static void gtk_progress_bar_realize(GtkWidget *widget); | |
-static gint gtk_accel_group_add(GtkAccelGroup *accel_group,ACCEL *newaccel); | |
-static void gtk_accel_group_set_id(GtkAccelGroup *accel_group,gint ind,gint ID… | |
+static gint gtk_accel_group_add(GtkAccelGroup *accel_group, | |
+ ACCEL *newaccel); | |
+static void gtk_accel_group_set_id(GtkAccelGroup *accel_group, gint ind, | |
+ gint ID); | |
static void EnableParent(GtkWindow *window); | |
typedef struct _GdkInput GdkInput; | |
struct _GdkInput { | |
- gint source; | |
- GdkInputCondition condition; | |
- GdkInputFunction function; | |
- gpointer data; | |
+ gint source; | |
+ GdkInputCondition condition; | |
+ GdkInputFunction function; | |
+ gpointer data; | |
}; | |
typedef struct _GtkTimeout GtkTimeout; | |
struct _GtkTimeout { | |
- guint32 interval; | |
- GtkFunction function; | |
- gpointer data; | |
- guint id; | |
+ guint32 interval; | |
+ GtkFunction function; | |
+ gpointer data; | |
+ guint id; | |
}; | |
typedef struct _GtkItemFactoryChild GtkItemFactoryChild; | |
struct _GtkItemFactoryChild { | |
- gchar *path; | |
- GtkWidget *widget; | |
+ gchar *path; | |
+ GtkWidget *widget; | |
}; | |
static GtkSignalType GtkObjectSignals[] = { | |
- { "create",gtk_marshal_VOID__VOID,NULL }, | |
- { "",NULL,NULL } | |
+ {"create", gtk_marshal_VOID__VOID, NULL}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkObjectClass = { | |
- "object",NULL,sizeof(GtkObject),GtkObjectSignals | |
+ "object", NULL, sizeof(GtkObject), GtkObjectSignals | |
}; | |
static GtkClass GtkAdjustmentClass = { | |
- "adjustment",&GtkObjectClass,sizeof(GtkAdjustment),NULL | |
+ "adjustment", &GtkObjectClass, sizeof(GtkAdjustment), NULL | |
}; | |
static GtkClass GtkItemFactoryClass = { | |
- "itemfactory",&GtkObjectClass,sizeof(GtkItemFactory),NULL | |
+ "itemfactory", &GtkObjectClass, sizeof(GtkItemFactory), NULL | |
}; | |
static GtkSignalType GtkWidgetSignals[] = { | |
- { "create",gtk_marshal_VOID__VOID,gtk_widget_create }, | |
- { "size_request",gtk_marshal_VOID__GPOIN,NULL }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,NULL }, | |
- { "realize",gtk_marshal_VOID__VOID,NULL }, | |
- { "destroy",gtk_marshal_VOID__VOID,NULL }, | |
- { "show",gtk_marshal_VOID__VOID,NULL }, | |
- { "hide",gtk_marshal_VOID__VOID,NULL }, | |
- { "show_all",gtk_marshal_VOID__BOOL,NULL }, | |
- { "hide_all",gtk_marshal_VOID__BOOL,NULL }, | |
- { "enable",gtk_marshal_VOID__VOID,NULL }, | |
- { "disable",gtk_marshal_VOID__VOID,NULL }, | |
- { "",NULL,NULL } | |
+ {"create", gtk_marshal_VOID__VOID, gtk_widget_create}, | |
+ {"size_request", gtk_marshal_VOID__GPOIN, NULL}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, NULL}, | |
+ {"realize", gtk_marshal_VOID__VOID, NULL}, | |
+ {"destroy", gtk_marshal_VOID__VOID, NULL}, | |
+ {"show", gtk_marshal_VOID__VOID, NULL}, | |
+ {"hide", gtk_marshal_VOID__VOID, NULL}, | |
+ {"show_all", gtk_marshal_VOID__BOOL, NULL}, | |
+ {"hide_all", gtk_marshal_VOID__BOOL, NULL}, | |
+ {"enable", gtk_marshal_VOID__VOID, NULL}, | |
+ {"disable", gtk_marshal_VOID__VOID, NULL}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkWidgetClass = { | |
- "widget",&GtkObjectClass,sizeof(GtkWidget),GtkWidgetSignals | |
+ "widget", &GtkObjectClass, sizeof(GtkWidget), GtkWidgetSignals | |
}; | |
static GtkSignalType GtkSeparatorSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_separator_size_request }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_separator_realize }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_separator_size_request}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_separator_realize}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkMiscClass = { | |
- "misc",&GtkWidgetClass,sizeof(GtkMisc),NULL | |
+ "misc", &GtkWidgetClass, sizeof(GtkMisc), NULL | |
}; | |
static GtkSignalType GtkProgressBarSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_progress_bar_size_request }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_progress_bar_realize }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_progress_bar_size_request}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_progress_bar_realize}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkProgressBarClass = { | |
- "progressbar",&GtkWidgetClass,sizeof(GtkProgressBar),GtkProgressBarSignals | |
+ "progressbar", &GtkWidgetClass, sizeof(GtkProgressBar), | |
+ GtkProgressBarSignals | |
}; | |
static GtkClass GtkSeparatorClass = { | |
- "separator",&GtkWidgetClass,sizeof(GtkSeparator),GtkSeparatorSignals | |
+ "separator", &GtkWidgetClass, sizeof(GtkSeparator), GtkSeparatorSignals | |
}; | |
static GtkClass GtkHSeparatorClass = { | |
- "hseparator",&GtkSeparatorClass,sizeof(GtkHSeparator),NULL | |
+ "hseparator", &GtkSeparatorClass, sizeof(GtkHSeparator), NULL | |
}; | |
static GtkClass GtkVSeparatorClass = { | |
- "vseparator",&GtkSeparatorClass,sizeof(GtkVSeparator),NULL | |
+ "vseparator", &GtkSeparatorClass, sizeof(GtkVSeparator), NULL | |
}; | |
static GtkClass GtkMenuShellClass = { | |
- "menushell",&GtkWidgetClass,sizeof(GtkMenuShell),NULL | |
+ "menushell", &GtkWidgetClass, sizeof(GtkMenuShell), NULL | |
}; | |
static GtkSignalType GtkMenuBarSignals[] = { | |
- { "realize",gtk_marshal_VOID__VOID,gtk_menu_bar_realize }, | |
- { "",NULL,NULL } | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_menu_bar_realize}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkMenuBarClass = { | |
- "menubar",&GtkMenuShellClass,sizeof(GtkMenuBar),GtkMenuBarSignals | |
+ "menubar", &GtkMenuShellClass, sizeof(GtkMenuBar), GtkMenuBarSignals | |
}; | |
static GtkSignalType GtkMenuItemSignals[] = { | |
- { "realize",gtk_marshal_VOID__VOID,gtk_menu_item_realize }, | |
- { "set_text",gtk_marshal_VOID__GPOIN,gtk_menu_item_set_text }, | |
- { "activate",gtk_marshal_VOID__VOID,NULL }, | |
- { "enable",gtk_marshal_VOID__VOID,gtk_menu_item_enable }, | |
- { "disable",gtk_marshal_VOID__VOID,gtk_menu_item_disable }, | |
- { "",NULL,NULL } | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_menu_item_realize}, | |
+ {"set_text", gtk_marshal_VOID__GPOIN, gtk_menu_item_set_text}, | |
+ {"activate", gtk_marshal_VOID__VOID, NULL}, | |
+ {"enable", gtk_marshal_VOID__VOID, gtk_menu_item_enable}, | |
+ {"disable", gtk_marshal_VOID__VOID, gtk_menu_item_disable}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkMenuItemClass = { | |
- "menuitem",&GtkWidgetClass,sizeof(GtkMenuItem),GtkMenuItemSignals | |
+ "menuitem", &GtkWidgetClass, sizeof(GtkMenuItem), GtkMenuItemSignals | |
}; | |
static GtkSignalType GtkMenuSignals[] = { | |
- { "realize",gtk_marshal_VOID__VOID,gtk_menu_realize }, | |
- { "",NULL,NULL } | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_menu_realize}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkMenuClass = { | |
- "menu",&GtkMenuShellClass,sizeof(GtkMenu),GtkMenuSignals | |
+ "menu", &GtkMenuShellClass, sizeof(GtkMenu), GtkMenuSignals | |
}; | |
static GtkSignalType GtkEditableSignals[] = { | |
- { "create",gtk_marshal_VOID__VOID,gtk_editable_create }, | |
- { "activate",gtk_marshal_VOID__VOID,NULL }, | |
- { "",NULL,NULL } | |
+ {"create", gtk_marshal_VOID__VOID, gtk_editable_create}, | |
+ {"activate", gtk_marshal_VOID__VOID, NULL}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkEditableClass = { | |
- "editable",&GtkWidgetClass,sizeof(GtkEditable),GtkEditableSignals | |
+ "editable", &GtkWidgetClass, sizeof(GtkEditable), GtkEditableSignals | |
}; | |
static GtkSignalType GtkEntrySignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_entry_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_entry_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_entry_realize }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_entry_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_entry_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_entry_realize}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkEntryClass = { | |
- "entry",&GtkEditableClass,sizeof(GtkEntry),GtkEntrySignals | |
+ "entry", &GtkEditableClass, sizeof(GtkEntry), GtkEntrySignals | |
}; | |
static GtkSignalType GtkSpinButtonSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_spin_button_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_spin_button_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_spin_button_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_spin_button_destroy }, | |
- { "hide",gtk_marshal_VOID__VOID,gtk_spin_button_hide }, | |
- { "show",gtk_marshal_VOID__VOID,gtk_spin_button_show }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_spin_button_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_spin_button_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_spin_button_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_spin_button_destroy}, | |
+ {"hide", gtk_marshal_VOID__VOID, gtk_spin_button_hide}, | |
+ {"show", gtk_marshal_VOID__VOID, gtk_spin_button_show}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkSpinButtonClass = { | |
- "spinbutton",&GtkEntryClass,sizeof(GtkSpinButton),GtkSpinButtonSignals | |
+ "spinbutton", &GtkEntryClass, sizeof(GtkSpinButton), GtkSpinButtonSignals | |
}; | |
static GtkSignalType GtkTextSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_text_size_request }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_text_realize }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_text_size_request}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_text_realize}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkTextClass = { | |
- "text",&GtkEditableClass,sizeof(GtkText),GtkTextSignals | |
+ "text", &GtkEditableClass, sizeof(GtkText), GtkTextSignals | |
}; | |
static GtkSignalType GtkLabelSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_label_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_label_set_size }, | |
- { "set_text",gtk_marshal_VOID__GPOIN,gtk_label_set_text }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_label_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_label_destroy }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_label_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_label_set_size}, | |
+ {"set_text", gtk_marshal_VOID__GPOIN, gtk_label_set_text}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_label_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_label_destroy}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkLabelClass = { | |
- "label",&GtkWidgetClass,sizeof(GtkLabel),GtkLabelSignals | |
+ "label", &GtkWidgetClass, sizeof(GtkLabel), GtkLabelSignals | |
}; | |
static GtkSignalType GtkUrlSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_url_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_label_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_url_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_url_destroy }, | |
- { "", NULL, NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_url_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_label_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_url_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_url_destroy}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkUrlClass = { | |
t@@ -437,382 +453,410 @@ static GtkClass GtkUrlClass = { | |
}; | |
static GtkSignalType GtkButtonSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_button_size_request }, | |
- { "set_text",gtk_marshal_VOID__GPOIN,gtk_button_set_text }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_button_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_button_destroy }, | |
- { "clicked",gtk_marshal_VOID__VOID,NULL }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_button_size_request}, | |
+ {"set_text", gtk_marshal_VOID__GPOIN, gtk_button_set_text}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_button_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_button_destroy}, | |
+ {"clicked", gtk_marshal_VOID__VOID, NULL}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkButtonClass = { | |
- "button",&GtkWidgetClass,sizeof(GtkButton),GtkButtonSignals | |
+ "button", &GtkWidgetClass, sizeof(GtkButton), GtkButtonSignals | |
}; | |
static GtkSignalType GtkOptionMenuSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_option_menu_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_option_menu_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_option_menu_realize }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_option_menu_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_option_menu_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_option_menu_realize}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkOptionMenuClass = { | |
- "optionmenu",&GtkButtonClass,sizeof(GtkOptionMenu),GtkOptionMenuSignals | |
+ "optionmenu", &GtkButtonClass, sizeof(GtkOptionMenu), | |
+ GtkOptionMenuSignals | |
}; | |
static GtkSignalType GtkToggleButtonSignals[] = { | |
- { "toggled",gtk_marshal_VOID__VOID,NULL }, | |
- { "",NULL,NULL } | |
+ {"toggled", gtk_marshal_VOID__VOID, NULL}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkToggleButtonClass = { | |
- "toggle",&GtkButtonClass,sizeof(GtkToggleButton),GtkToggleButtonSignals | |
+ "toggle", &GtkButtonClass, sizeof(GtkToggleButton), | |
+ GtkToggleButtonSignals | |
}; | |
static GtkSignalType GtkCheckButtonSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_check_button_size_request }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_check_button_realize }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_check_button_size_request}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_check_button_realize}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkCheckButtonClass = { | |
- "check",&GtkToggleButtonClass,sizeof(GtkCheckButton),GtkCheckButtonSignals | |
+ "check", &GtkToggleButtonClass, sizeof(GtkCheckButton), | |
+ GtkCheckButtonSignals | |
}; | |
static GtkSignalType GtkRadioButtonSignals[] = { | |
- { "realize",gtk_marshal_VOID__VOID,gtk_radio_button_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_radio_button_destroy }, | |
- { "",NULL,NULL } | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_radio_button_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_radio_button_destroy}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkRadioButtonClass = { | |
- "radio",&GtkCheckButtonClass,sizeof(GtkRadioButton),GtkRadioButtonSignals | |
+ "radio", &GtkCheckButtonClass, sizeof(GtkRadioButton), | |
+ GtkRadioButtonSignals | |
}; | |
static GtkSignalType GtkContainerSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_container_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_container_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_container_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_container_destroy }, | |
- { "show_all",gtk_marshal_VOID__BOOL,gtk_container_show_all }, | |
- { "hide_all",gtk_marshal_VOID__BOOL,gtk_container_hide_all }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_container_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_container_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_container_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_container_destroy}, | |
+ {"show_all", gtk_marshal_VOID__BOOL, gtk_container_show_all}, | |
+ {"hide_all", gtk_marshal_VOID__BOOL, gtk_container_hide_all}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkContainerClass = { | |
- "container",&GtkWidgetClass,sizeof(GtkContainer),GtkContainerSignals | |
+ "container", &GtkWidgetClass, sizeof(GtkContainer), GtkContainerSignals | |
}; | |
static GtkSignalType GtkPanedSignals[] = { | |
- { "show_all",gtk_marshal_VOID__BOOL,gtk_paned_show_all }, | |
- { "hide_all",gtk_marshal_VOID__BOOL,gtk_paned_hide_all }, | |
- { "",NULL,NULL } | |
+ {"show_all", gtk_marshal_VOID__BOOL, gtk_paned_show_all}, | |
+ {"hide_all", gtk_marshal_VOID__BOOL, gtk_paned_hide_all}, | |
+ {"", NULL, NULL} | |
}; | |
+ | |
static GtkClass GtkPanedClass = { | |
- "paned",&GtkContainerClass,sizeof(GtkPaned),GtkPanedSignals | |
+ "paned", &GtkContainerClass, sizeof(GtkPaned), GtkPanedSignals | |
}; | |
static GtkSignalType GtkVPanedSignals[] = { | |
- { "realize",gtk_marshal_VOID__VOID,gtk_vpaned_realize }, | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_vpaned_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_vpaned_set_size }, | |
- { "",NULL,NULL } | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_vpaned_realize}, | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_vpaned_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_vpaned_set_size}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkVPanedClass = { | |
- "vpaned",&GtkPanedClass,sizeof(GtkVPaned),GtkVPanedSignals | |
+ "vpaned", &GtkPanedClass, sizeof(GtkVPaned), GtkVPanedSignals | |
}; | |
static GtkSignalType GtkHPanedSignals[] = { | |
- { "realize",gtk_marshal_VOID__VOID,gtk_hpaned_realize }, | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_hpaned_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_hpaned_set_size }, | |
- { "",NULL,NULL } | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_hpaned_realize}, | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_hpaned_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_hpaned_set_size}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkHPanedClass = { | |
- "hpaned",&GtkPanedClass,sizeof(GtkHPaned),GtkHPanedSignals | |
+ "hpaned", &GtkPanedClass, sizeof(GtkHPaned), GtkHPanedSignals | |
}; | |
static GtkSignalType GtkBoxSignals[] = { | |
- { "realize",gtk_marshal_VOID__VOID,gtk_box_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_box_destroy }, | |
- { "show_all",gtk_marshal_VOID__BOOL,gtk_box_show_all }, | |
- { "hide_all",gtk_marshal_VOID__BOOL,gtk_box_hide_all }, | |
- { "",NULL,NULL } | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_box_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_box_destroy}, | |
+ {"show_all", gtk_marshal_VOID__BOOL, gtk_box_show_all}, | |
+ {"hide_all", gtk_marshal_VOID__BOOL, gtk_box_hide_all}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkBoxClass = { | |
- "box",&GtkContainerClass,sizeof(GtkBox),GtkBoxSignals | |
+ "box", &GtkContainerClass, sizeof(GtkBox), GtkBoxSignals | |
}; | |
static GtkSignalType GtkNotebookSignals[] = { | |
- { "realize",gtk_marshal_VOID__VOID,gtk_notebook_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_notebook_destroy }, | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_notebook_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_notebook_set_size }, | |
- { "show_all",gtk_marshal_VOID__BOOL,gtk_notebook_show_all }, | |
- { "hide_all",gtk_marshal_VOID__BOOL,gtk_notebook_hide_all }, | |
- { "",NULL,NULL } | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_notebook_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_notebook_destroy}, | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_notebook_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_notebook_set_size}, | |
+ {"show_all", gtk_marshal_VOID__BOOL, gtk_notebook_show_all}, | |
+ {"hide_all", gtk_marshal_VOID__BOOL, gtk_notebook_hide_all}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkNotebookClass = { | |
- "notebook",&GtkContainerClass,sizeof(GtkNotebook),GtkNotebookSignals | |
+ "notebook", &GtkContainerClass, sizeof(GtkNotebook), GtkNotebookSignals | |
}; | |
static GtkSignalType GtkTableSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_table_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_table_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_table_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_table_destroy }, | |
- { "show_all",gtk_marshal_VOID__BOOL,gtk_table_show_all }, | |
- { "hide_all",gtk_marshal_VOID__BOOL,gtk_table_hide_all }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_table_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_table_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_table_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_table_destroy}, | |
+ {"show_all", gtk_marshal_VOID__BOOL, gtk_table_show_all}, | |
+ {"hide_all", gtk_marshal_VOID__BOOL, gtk_table_hide_all}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkTableClass = { | |
- "table",&GtkContainerClass,sizeof(GtkTable),GtkTableSignals | |
+ "table", &GtkContainerClass, sizeof(GtkTable), GtkTableSignals | |
}; | |
static GtkSignalType GtkCListSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_clist_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_clist_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_clist_realize }, | |
- { "click-column",gtk_marshal_VOID__GINT,NULL }, | |
- { "show",gtk_marshal_VOID__VOID,gtk_clist_show }, | |
- { "hide",gtk_marshal_VOID__VOID,gtk_clist_hide }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_clist_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_clist_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_clist_realize}, | |
+ {"click-column", gtk_marshal_VOID__GINT, NULL}, | |
+ {"show", gtk_marshal_VOID__VOID, gtk_clist_show}, | |
+ {"hide", gtk_marshal_VOID__VOID, gtk_clist_hide}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkCListClass = { | |
- "clist",&GtkContainerClass,sizeof(GtkCList),GtkCListSignals | |
+ "clist", &GtkContainerClass, sizeof(GtkCList), GtkCListSignals | |
}; | |
static GtkSignalType GtkHBoxSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_hbox_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_hbox_set_size }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_hbox_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_hbox_set_size}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkHBoxClass = { | |
- "hbox",&GtkBoxClass,sizeof(GtkHBox),GtkHBoxSignals | |
+ "hbox", &GtkBoxClass, sizeof(GtkHBox), GtkHBoxSignals | |
}; | |
static GtkSignalType GtkVBoxSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_vbox_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_vbox_set_size }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_vbox_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_vbox_set_size}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkVBoxClass = { | |
- "vbox",&GtkBoxClass,sizeof(GtkVBox),GtkVBoxSignals | |
+ "vbox", &GtkBoxClass, sizeof(GtkVBox), GtkVBoxSignals | |
}; | |
static GtkClass GtkBinClass = { | |
- "bin",&GtkContainerClass,sizeof(GtkBin),NULL | |
+ "bin", &GtkContainerClass, sizeof(GtkBin), NULL | |
}; | |
static GtkSignalType GtkFrameSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_frame_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_frame_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_frame_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_frame_destroy }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_frame_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_frame_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_frame_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_frame_destroy}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkFrameClass = { | |
- "frame",&GtkBinClass,sizeof(GtkFrame),GtkFrameSignals | |
+ "frame", &GtkBinClass, sizeof(GtkFrame), GtkFrameSignals | |
}; | |
static GtkSignalType GtkWindowSignals[] = { | |
- { "size_request",gtk_marshal_VOID__GPOIN,gtk_window_size_request }, | |
- { "set_size",gtk_marshal_VOID__GPOIN,gtk_window_set_size }, | |
- { "realize",gtk_marshal_VOID__VOID,gtk_window_realize }, | |
- { "destroy",gtk_marshal_VOID__VOID,gtk_window_destroy }, | |
- { "show",gtk_marshal_VOID__VOID,gtk_window_show }, | |
- { "hide",gtk_marshal_VOID__VOID,gtk_window_hide }, | |
- { "delete_event",gtk_marshal_BOOL__GPOIN, | |
- GTK_SIGNAL_FUNC(gtk_window_delete_event) }, | |
- { "",NULL,NULL } | |
+ {"size_request", gtk_marshal_VOID__GPOIN, gtk_window_size_request}, | |
+ {"set_size", gtk_marshal_VOID__GPOIN, gtk_window_set_size}, | |
+ {"realize", gtk_marshal_VOID__VOID, gtk_window_realize}, | |
+ {"destroy", gtk_marshal_VOID__VOID, gtk_window_destroy}, | |
+ {"show", gtk_marshal_VOID__VOID, gtk_window_show}, | |
+ {"hide", gtk_marshal_VOID__VOID, gtk_window_hide}, | |
+ {"delete_event", gtk_marshal_BOOL__GPOIN, | |
+ GTK_SIGNAL_FUNC(gtk_window_delete_event)}, | |
+ {"", NULL, NULL} | |
}; | |
static GtkClass GtkWindowClass = { | |
- "window",&GtkBinClass,sizeof(GtkWindow),GtkWindowSignals | |
+ "window", &GtkBinClass, sizeof(GtkWindow), GtkWindowSignals | |
}; | |
-const GtkType GTK_TYPE_WINDOW=&GtkWindowClass; | |
-const GtkType GTK_TYPE_MENU_BAR=&GtkMenuBarClass; | |
+const GtkType GTK_TYPE_WINDOW = &GtkWindowClass; | |
+const GtkType GTK_TYPE_MENU_BAR = &GtkMenuBarClass; | |
static HINSTANCE hInst; | |
static HFONT defFont, urlFont; | |
-static GSList *WindowList=NULL; | |
-static GSList *GdkInputs=NULL; | |
-static GSList *GtkTimeouts=NULL; | |
-static HWND TopLevel=NULL; | |
+static GSList *WindowList = NULL; | |
+static GSList *GdkInputs = NULL; | |
+static GSList *GtkTimeouts = NULL; | |
+static HWND TopLevel = NULL; | |
-static WNDPROC wpOrigEntryProc,wpOrigTextProc; | |
+static WNDPROC wpOrigEntryProc, wpOrigTextProc; | |
-static void gtk_set_default_font(HWND hWnd) { | |
- SendMessage(hWnd,WM_SETFONT,(WPARAM)defFont,MAKELPARAM(FALSE,0)); | |
+static void gtk_set_default_font(HWND hWnd) | |
+{ | |
+ SendMessage(hWnd, WM_SETFONT, (WPARAM)defFont, MAKELPARAM(FALSE, 0)); | |
} | |
-static GtkObject *GtkNewObject(GtkClass *klass) { | |
- GtkObject *newObj; | |
+static GtkObject *GtkNewObject(GtkClass *klass) | |
+{ | |
+ GtkObject *newObj; | |
+ | |
+ newObj = g_malloc0(klass->Size); | |
+ newObj->klass = klass; | |
+ gtk_signal_emit(newObj, "create"); | |
- newObj=g_malloc0(klass->Size); | |
- newObj->klass=klass; | |
- gtk_signal_emit(newObj,"create"); | |
+ return newObj; | |
+} | |
- return newObj; | |
+static void DispatchSocketEvent(SOCKET sock, long event) | |
+{ | |
+ GSList *list; | |
+ GdkInput *input; | |
+ | |
+ for (list = GdkInputs; list; list = g_slist_next(list)) { | |
+ input = (GdkInput *)(list->data); | |
+ if (input->source == sock) { | |
+ (*input->function) (input->data, input->source, | |
+ (event & (FD_READ | FD_CLOSE | FD_ACCEPT) ? | |
+ GDK_INPUT_READ : 0) | | |
+ (event & (FD_WRITE | FD_CONNECT) ? | |
+ GDK_INPUT_WRITE : 0)); | |
+ break; | |
+ } | |
+ } | |
} | |
-static void DispatchSocketEvent(SOCKET sock,long event) { | |
- GSList *list; | |
- GdkInput *input; | |
- for (list=GdkInputs;list;list=g_slist_next(list)) { | |
- input=(GdkInput *)(list->data); | |
- if (input->source==sock) { | |
- (*input->function)(input->data,input->source, | |
- (event&(FD_READ|FD_CLOSE|FD_ACCEPT) ? GDK_INPUT_READ:0) | | |
- (event&(FD_WRITE|FD_CONNECT) ? GDK_INPUT_WRITE:0)); | |
- break; | |
+static void DispatchTimeoutEvent(UINT id) | |
+{ | |
+ GSList *list; | |
+ GtkTimeout *timeout; | |
+ | |
+ for (list = GtkTimeouts; list; list = g_slist_next(list)) { | |
+ timeout = (GtkTimeout *)list->data; | |
+ if (timeout->id == id) { | |
+ if (timeout->function) { | |
+ if (!(*timeout->function) (timeout->data)) { | |
+ gtk_timeout_remove(id); | |
+ } | |
} | |
- } | |
-} | |
- | |
-static void DispatchTimeoutEvent(UINT id) { | |
- GSList *list; | |
- GtkTimeout *timeout; | |
- for (list=GtkTimeouts;list;list=g_slist_next(list)) { | |
- timeout=(GtkTimeout *)list->data; | |
- if (timeout->id == id) { | |
- if (timeout->function) { | |
- if (!(*timeout->function)(timeout->data)) { | |
- gtk_timeout_remove(id); | |
- } | |
- } | |
- break; | |
+ break; | |
+ } | |
+ } | |
+} | |
+ | |
+static void UpdatePanedGhostRect(GtkPaned *paned, RECT *OldRect, | |
+ RECT *NewRect, gint x, gint y) | |
+{ | |
+ HWND hWnd, parent; | |
+ RECT rect, clrect; | |
+ POINT MouseCoord; | |
+ HDC hDC; | |
+ GtkWidget *widget = GTK_WIDGET(paned); | |
+ | |
+ if (!OldRect && !NewRect) | |
+ return; | |
+ parent = gtk_get_parent_hwnd(widget); | |
+ hWnd = widget->hWnd; | |
+ if (!parent || !hWnd) | |
+ return; | |
+ | |
+ MouseCoord.x = x; | |
+ MouseCoord.y = y; | |
+ MapWindowPoints(hWnd, parent, &MouseCoord, 1); | |
+ | |
+ rect.left = paned->true_alloc.x; | |
+ rect.top = paned->true_alloc.y; | |
+ GetClientRect(hWnd, &clrect); | |
+ if (clrect.right > clrect.bottom) { | |
+ rect.right = paned->true_alloc.x + paned->true_alloc.width; | |
+ rect.bottom = MouseCoord.y; | |
+ } else { | |
+ rect.bottom = paned->true_alloc.y + paned->true_alloc.height; | |
+ rect.right = MouseCoord.x; | |
+ } | |
+ | |
+ if (OldRect && NewRect && OldRect->right == rect.right && | |
+ OldRect->bottom == rect.bottom) | |
+ return; | |
+ | |
+ hDC = GetDC(parent); | |
+ | |
+ if (OldRect) | |
+ DrawFocusRect(hDC, OldRect); | |
+ if (NewRect) { | |
+ CopyRect(NewRect, &rect); | |
+ DrawFocusRect(hDC, NewRect); | |
+ } | |
+ ReleaseDC(parent, hDC); | |
+} | |
+ | |
+LRESULT CALLBACK GtkPanedProc(HWND hwnd, UINT msg, UINT wParam, | |
+ LONG lParam) | |
+{ | |
+ PAINTSTRUCT ps; | |
+ HPEN oldpen, dkpen, ltpen; | |
+ RECT rect; | |
+ static RECT GhostRect; | |
+ HDC hDC; | |
+ gint newpos; | |
+ GtkPaned *paned; | |
+ | |
+ paned = GTK_PANED(GetWindowLong(hwnd, GWL_USERDATA)); | |
+ switch (msg) { | |
+ case WM_PAINT: | |
+ if (GetUpdateRect(hwnd, NULL, TRUE)) { | |
+ BeginPaint(hwnd, &ps); | |
+ GetClientRect(hwnd, &rect); | |
+ hDC = ps.hdc; | |
+ ltpen = | |
+ CreatePen(PS_SOLID, 0, (COLORREF)GetSysColor(COLOR_3DHILIGHT)); | |
+ dkpen = | |
+ CreatePen(PS_SOLID, 0, (COLORREF)GetSysColor(COLOR_3DSHADOW)); | |
+ | |
+ if (rect.right > rect.bottom) { | |
+ oldpen = SelectObject(hDC, ltpen); | |
+ MoveToEx(hDC, rect.left, rect.top, NULL); | |
+ LineTo(hDC, rect.right, rect.top); | |
+ | |
+ SelectObject(hDC, dkpen); | |
+ MoveToEx(hDC, rect.left, rect.bottom - 1, NULL); | |
+ LineTo(hDC, rect.right, rect.bottom - 1); | |
+ } else { | |
+ oldpen = SelectObject(hDC, ltpen); | |
+ MoveToEx(hDC, rect.left, rect.top, NULL); | |
+ LineTo(hDC, rect.left, rect.bottom); | |
+ | |
+ SelectObject(hDC, ltpen); | |
+ MoveToEx(hDC, rect.right - 1, rect.top, NULL); | |
+ LineTo(hDC, rect.right - 1, rect.bottom); | |
} | |
- } | |
-} | |
- | |
-static void UpdatePanedGhostRect(GtkPaned *paned,RECT *OldRect,RECT *NewRect, | |
- gint x,gint y) { | |
- HWND hWnd,parent; | |
- RECT rect,clrect; | |
- POINT MouseCoord; | |
- HDC hDC; | |
- GtkWidget *widget=GTK_WIDGET(paned); | |
- | |
- if (!OldRect && !NewRect) return; | |
- parent=gtk_get_parent_hwnd(widget); | |
- hWnd=widget->hWnd; | |
- if (!parent || !hWnd) return; | |
- | |
- MouseCoord.x=x; | |
- MouseCoord.y=y; | |
- MapWindowPoints(hWnd,parent,&MouseCoord,1); | |
- | |
- rect.left=paned->true_alloc.x; | |
- rect.top=paned->true_alloc.y; | |
- GetClientRect(hWnd,&clrect); | |
- if (clrect.right > clrect.bottom) { | |
- rect.right=paned->true_alloc.x+paned->true_alloc.width; | |
- rect.bottom=MouseCoord.y; | |
- } else { | |
- rect.bottom=paned->true_alloc.y+paned->true_alloc.height; | |
- rect.right=MouseCoord.x; | |
- } | |
- | |
- if (OldRect && NewRect && OldRect->right==rect.right && | |
- OldRect->bottom==rect.bottom) return; | |
- | |
- hDC=GetDC(parent); | |
- | |
- if (OldRect) DrawFocusRect(hDC,OldRect); | |
- if (NewRect) { | |
- CopyRect(NewRect,&rect); | |
- DrawFocusRect(hDC,NewRect); | |
- } | |
- ReleaseDC(parent,hDC); | |
-} | |
- | |
-LRESULT CALLBACK GtkPanedProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) { | |
- PAINTSTRUCT ps; | |
- HPEN oldpen,dkpen,ltpen; | |
- RECT rect; | |
- static RECT GhostRect; | |
- HDC hDC; | |
- gint newpos; | |
- GtkPaned *paned; | |
- paned=GTK_PANED(GetWindowLong(hwnd,GWL_USERDATA)); | |
- switch(msg) { | |
- case WM_PAINT: | |
- if (GetUpdateRect(hwnd,NULL,TRUE)) { | |
- BeginPaint(hwnd,&ps); | |
- GetClientRect(hwnd,&rect); | |
- hDC=ps.hdc; | |
- ltpen=CreatePen(PS_SOLID,0,(COLORREF)GetSysColor(COLOR_3DHILIGHT)); | |
- dkpen=CreatePen(PS_SOLID,0,(COLORREF)GetSysColor(COLOR_3DSHADOW)); | |
- | |
- if (rect.right > rect.bottom) { | |
- oldpen=SelectObject(hDC,ltpen); | |
- MoveToEx(hDC,rect.left,rect.top,NULL); | |
- LineTo(hDC,rect.right,rect.top); | |
- | |
- SelectObject(hDC,dkpen); | |
- MoveToEx(hDC,rect.left,rect.bottom-1,NULL); | |
- LineTo(hDC,rect.right,rect.bottom-1); | |
- } else { | |
- oldpen=SelectObject(hDC,ltpen); | |
- MoveToEx(hDC,rect.left,rect.top,NULL); | |
- LineTo(hDC,rect.left,rect.bottom); | |
- | |
- SelectObject(hDC,ltpen); | |
- MoveToEx(hDC,rect.right-1,rect.top,NULL); | |
- LineTo(hDC,rect.right-1,rect.bottom); | |
- } | |
- | |
- SelectObject(hDC,oldpen); | |
- DeleteObject(ltpen); DeleteObject(dkpen); | |
- EndPaint(hwnd,&ps); | |
- } | |
- return TRUE; | |
- case WM_LBUTTONDOWN: | |
- if (!paned) break; | |
- SetCapture(hwnd); | |
- paned->Tracking=TRUE; | |
- UpdatePanedGhostRect(paned,NULL,&GhostRect, | |
- LOWORD(lParam),HIWORD(lParam)); | |
- return TRUE; | |
- case WM_MOUSEMOVE: | |
- if (!paned||!paned->Tracking) break; | |
- UpdatePanedGhostRect(paned,&GhostRect,&GhostRect, | |
- LOWORD(lParam),HIWORD(lParam)); | |
- return TRUE; | |
- case WM_LBUTTONUP: | |
- if (!paned||!paned->Tracking) break; | |
- ReleaseCapture(); | |
- paned->Tracking=FALSE; | |
- UpdatePanedGhostRect(paned,&GhostRect,NULL, | |
- LOWORD(lParam),HIWORD(lParam)); | |
- GetClientRect(hwnd,&rect); | |
- if (rect.right > rect.bottom) { | |
- newpos=((gint16)HIWORD(lParam)+GTK_WIDGET(paned)->allocation.y- | |
- paned->true_alloc.y)*100/paned->true_alloc.height; | |
- } else { | |
- newpos=((gint16)LOWORD(lParam)+GTK_WIDGET(paned)->allocation.x- | |
- paned->true_alloc.x)*100/paned->true_alloc.width; | |
- } | |
- gtk_paned_set_position(paned,newpos); | |
- return TRUE; | |
- default: | |
- return DefWindowProc(hwnd,msg,wParam,lParam); | |
- } | |
- return FALSE; | |
-} | |
- | |
-LRESULT CALLBACK GtkUrlProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) { | |
+ | |
+ SelectObject(hDC, oldpen); | |
+ DeleteObject(ltpen); | |
+ DeleteObject(dkpen); | |
+ EndPaint(hwnd, &ps); | |
+ } | |
+ return TRUE; | |
+ case WM_LBUTTONDOWN: | |
+ if (!paned) | |
+ break; | |
+ SetCapture(hwnd); | |
+ paned->Tracking = TRUE; | |
+ UpdatePanedGhostRect(paned, NULL, &GhostRect, | |
+ LOWORD(lParam), HIWORD(lParam)); | |
+ return TRUE; | |
+ case WM_MOUSEMOVE: | |
+ if (!paned || !paned->Tracking) | |
+ break; | |
+ UpdatePanedGhostRect(paned, &GhostRect, &GhostRect, | |
+ LOWORD(lParam), HIWORD(lParam)); | |
+ return TRUE; | |
+ case WM_LBUTTONUP: | |
+ if (!paned || !paned->Tracking) | |
+ break; | |
+ ReleaseCapture(); | |
+ paned->Tracking = FALSE; | |
+ UpdatePanedGhostRect(paned, &GhostRect, NULL, | |
+ LOWORD(lParam), HIWORD(lParam)); | |
+ GetClientRect(hwnd, &rect); | |
+ if (rect.right > rect.bottom) { | |
+ newpos = ((gint16)HIWORD(lParam) + GTK_WIDGET(paned)->allocation.y - | |
+ paned->true_alloc.y) * 100 / paned->true_alloc.height; | |
+ } else { | |
+ newpos = ((gint16)LOWORD(lParam) + GTK_WIDGET(paned)->allocation.x - | |
+ paned->true_alloc.x) * 100 / paned->true_alloc.width; | |
+ } | |
+ gtk_paned_set_position(paned, newpos); | |
+ return TRUE; | |
+ default: | |
+ return DefWindowProc(hwnd, msg, wParam, lParam); | |
+ } | |
+ return FALSE; | |
+} | |
+ | |
+LRESULT CALLBACK GtkUrlProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) | |
+{ | |
GtkWidget *widget; | |
if (msg == WM_PAINT) { | |
t@@ -844,813 +888,925 @@ LRESULT CALLBACK GtkUrlProc(HWND hwnd, UINT msg, UINT … | |
ShellExecute(hwnd, "open", target, NULL, NULL, 0); | |
return FALSE; | |
- } else return DefWindowProc(hwnd, msg, wParam, lParam); | |
-} | |
- | |
-LRESULT CALLBACK GtkSepProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) { | |
- PAINTSTRUCT ps; | |
- HPEN oldpen,dkpen,ltpen; | |
- RECT rect; | |
- HDC hDC; | |
- if (msg==WM_PAINT) { | |
- if (GetUpdateRect(hwnd,NULL,TRUE)) { | |
- BeginPaint(hwnd,&ps); | |
- GetClientRect(hwnd,&rect); | |
- hDC=ps.hdc; | |
- ltpen=CreatePen(PS_SOLID,0,(COLORREF)GetSysColor(COLOR_3DHILIGHT)); | |
- dkpen=CreatePen(PS_SOLID,0,(COLORREF)GetSysColor(COLOR_3DSHADOW)); | |
- | |
- if (rect.right > rect.bottom) { | |
- oldpen=SelectObject(hDC,dkpen); | |
- MoveToEx(hDC,rect.left,rect.top,NULL); | |
- LineTo(hDC,rect.right,rect.top); | |
- | |
- SelectObject(hDC,ltpen); | |
- MoveToEx(hDC,rect.left,rect.top+1,NULL); | |
- LineTo(hDC,rect.right,rect.top+1); | |
- } else { | |
- oldpen=SelectObject(hDC,dkpen); | |
- MoveToEx(hDC,rect.left,rect.top,NULL); | |
- LineTo(hDC,rect.left,rect.bottom); | |
- | |
- SelectObject(hDC,ltpen); | |
- MoveToEx(hDC,rect.left+1,rect.top,NULL); | |
- LineTo(hDC,rect.left+1,rect.bottom); | |
- } | |
- | |
- SelectObject(hDC,oldpen); | |
- DeleteObject(ltpen); DeleteObject(dkpen); | |
- EndPaint(hwnd,&ps); | |
+ } else | |
+ return DefWindowProc(hwnd, msg, wParam, lParam); | |
+} | |
+ | |
+LRESULT CALLBACK GtkSepProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) | |
+{ | |
+ PAINTSTRUCT ps; | |
+ HPEN oldpen, dkpen, ltpen; | |
+ RECT rect; | |
+ HDC hDC; | |
+ | |
+ if (msg == WM_PAINT) { | |
+ if (GetUpdateRect(hwnd, NULL, TRUE)) { | |
+ BeginPaint(hwnd, &ps); | |
+ GetClientRect(hwnd, &rect); | |
+ hDC = ps.hdc; | |
+ ltpen = | |
+ CreatePen(PS_SOLID, 0, (COLORREF)GetSysColor(COLOR_3DHILIGHT)); | |
+ dkpen = | |
+ CreatePen(PS_SOLID, 0, (COLORREF)GetSysColor(COLOR_3DSHADOW)); | |
+ | |
+ if (rect.right > rect.bottom) { | |
+ oldpen = SelectObject(hDC, dkpen); | |
+ MoveToEx(hDC, rect.left, rect.top, NULL); | |
+ LineTo(hDC, rect.right, rect.top); | |
+ | |
+ SelectObject(hDC, ltpen); | |
+ MoveToEx(hDC, rect.left, rect.top + 1, NULL); | |
+ LineTo(hDC, rect.right, rect.top + 1); | |
+ } else { | |
+ oldpen = SelectObject(hDC, dkpen); | |
+ MoveToEx(hDC, rect.left, rect.top, NULL); | |
+ LineTo(hDC, rect.left, rect.bottom); | |
+ | |
+ SelectObject(hDC, ltpen); | |
+ MoveToEx(hDC, rect.left + 1, rect.top, NULL); | |
+ LineTo(hDC, rect.left + 1, rect.bottom); | |
+ } | |
+ | |
+ SelectObject(hDC, oldpen); | |
+ DeleteObject(ltpen); | |
+ DeleteObject(dkpen); | |
+ EndPaint(hwnd, &ps); | |
+ } | |
+ return TRUE; | |
+ } else | |
+ return DefWindowProc(hwnd, msg, wParam, lParam); | |
+} | |
+ | |
+LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam) | |
+{ | |
+ GtkWidget *window, *widget; | |
+ GtkClass *klass; | |
+ RECT rect; | |
+ GtkAllocation alloc; | |
+ gboolean signal_return; | |
+ GdkEvent event = 0; | |
+ LPMEASUREITEMSTRUCT lpmis; | |
+ HDC hDC; | |
+ TEXTMETRIC tm; | |
+ LPDRAWITEMSTRUCT lpdis; | |
+ HD_NOTIFY FAR *phdr; | |
+ NMHDR *nmhdr; | |
+ | |
+ if (customWndProc | |
+ && CallWindowProc(customWndProc, hwnd, msg, wParam, lParam)) | |
+ return TRUE; | |
+ | |
+ switch (msg) { | |
+ case WM_SIZE: | |
+ window = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA)); | |
+ GetWindowRect(hwnd, &rect); | |
+ alloc.x = rect.left; | |
+ alloc.y = rect.top; | |
+ alloc.width = rect.right - rect.left; | |
+ alloc.height = rect.bottom - rect.top; | |
+ gtk_window_handle_user_size(GTK_WINDOW(window), &alloc); | |
+ gtk_widget_set_size(window, &alloc); | |
+ break; | |
+ case WM_GETMINMAXINFO: | |
+ widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA)); | |
+ if (widget) | |
+ klass = GTK_OBJECT(widget)->klass; | |
+ else | |
+ klass = NULL; | |
+ if (klass == &GtkWindowClass) { | |
+ gtk_window_handle_minmax_size(GTK_WINDOW(widget), | |
+ (LPMINMAXINFO)lParam); | |
+ } | |
+ break; | |
+ case WM_ACTIVATE: | |
+ case WM_ACTIVATEAPP: | |
+ widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA)); | |
+ if (widget) | |
+ klass = GTK_OBJECT(widget)->klass; | |
+ else | |
+ klass = NULL; | |
+ if (klass == &GtkWindowClass) { | |
+ if ((msg == WM_ACTIVATE && LOWORD(wParam) != WA_INACTIVE) | |
+ || (msg == WM_ACTIVATEAPP && wParam)) { | |
+ if (GTK_WINDOW(widget)->focus) { | |
+ gtk_widget_set_focus(GTK_WINDOW(widget)->focus); | |
+ } | |
+ if (!GTK_WINDOW(widget)->focus) { | |
+ gtk_window_set_focus(GTK_WINDOW(widget)); | |
+ } | |
+ } else if (msg == WM_ACTIVATE && LOWORD(wParam) == WA_INACTIVE) { | |
+ gtk_window_update_focus(GTK_WINDOW(widget)); | |
} | |
+ } | |
+ break; | |
+ case WM_COMMAND: | |
+ widget = GTK_WIDGET(GetWindowLong((HWND)lParam, GWL_USERDATA)); | |
+ if (widget) | |
+ klass = GTK_OBJECT(widget)->klass; | |
+ else | |
+ klass = NULL; | |
+ | |
+ if (lParam && klass == &GtkCListClass | |
+ && HIWORD(wParam) == LBN_SELCHANGE) { | |
+ gtk_clist_update_selection(widget); | |
+ } else if (lParam && klass == &GtkOptionMenuClass && | |
+ HIWORD(wParam) == CBN_SELENDOK) { | |
+ gtk_option_menu_update_selection(widget); | |
+ } else if (lParam && HIWORD(wParam) == BN_CLICKED) { | |
+ gtk_signal_emit(GTK_OBJECT(widget), "clicked"); | |
+ } else if (HIWORD(wParam) == 0 || HIWORD(wParam) == 1) { | |
+ window = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA)); | |
+ widget = gtk_window_get_menu_ID(GTK_WINDOW(window), LOWORD(wParam)); | |
+ if (widget) | |
+ gtk_signal_emit(GTK_OBJECT(widget), "activate"); | |
+ } else | |
+ return TRUE; | |
+ break; | |
+ case WM_CLOSE: | |
+ gtk_signal_emit(GTK_OBJECT(GetWindowLong(hwnd, GWL_USERDATA)), | |
+ "delete_event", &event, &signal_return); | |
+ return TRUE; | |
+ break; | |
+ case WM_DRAWITEM: | |
+ lpdis = (LPDRAWITEMSTRUCT) lParam; | |
+ if (lpdis) { | |
+ gtk_clist_draw_row(GTK_CLIST(GetWindowLong(lpdis->hwndItem, | |
+ GWL_USERDATA)), lpdis); | |
+ return TRUE; | |
+ } | |
+ break; | |
+ case WM_MEASUREITEM: | |
+ lpmis = (LPMEASUREITEMSTRUCT)lParam; | |
+ hDC = GetDC(hwnd); | |
+ if (!GetTextMetrics(hDC, &tm)) | |
+ g_warning("GetTextMetrics failed"); | |
+ ReleaseDC(hwnd, hDC); | |
+ if (lpmis) { | |
+ lpmis->itemHeight = tm.tmHeight + LISTITEMVPACK * 2; | |
return TRUE; | |
- } else return DefWindowProc(hwnd,msg,wParam,lParam); | |
-} | |
- | |
-LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) { | |
- GtkWidget *window,*widget; | |
- GtkClass *klass; | |
- RECT rect; | |
- GtkAllocation alloc; | |
- gboolean signal_return; | |
- GdkEvent event=0; | |
- LPMEASUREITEMSTRUCT lpmis; | |
- HDC hDC; | |
- TEXTMETRIC tm; | |
- LPDRAWITEMSTRUCT lpdis; | |
- HD_NOTIFY FAR* phdr; | |
- NMHDR *nmhdr; | |
- if (customWndProc && | |
- CallWindowProc(customWndProc,hwnd,msg,wParam,lParam)) return TRUE; | |
- | |
- switch(msg) { | |
- case WM_SIZE: | |
- window=GTK_WIDGET(GetWindowLong(hwnd,GWL_USERDATA)); | |
- GetWindowRect(hwnd,&rect); | |
- alloc.x=rect.left; alloc.y=rect.top; | |
- alloc.width=rect.right-rect.left; | |
- alloc.height=rect.bottom-rect.top; | |
- gtk_window_handle_user_size(GTK_WINDOW(window),&alloc); | |
- gtk_widget_set_size(window,&alloc); | |
- break; | |
- case WM_GETMINMAXINFO: | |
- widget=GTK_WIDGET(GetWindowLong(hwnd,GWL_USERDATA)); | |
- if (widget) klass=GTK_OBJECT(widget)->klass; else klass=NULL; | |
- if (klass==&GtkWindowClass) { | |
- gtk_window_handle_minmax_size(GTK_WINDOW(widget), | |
- (LPMINMAXINFO)lParam); | |
- } | |
- break; | |
- case WM_ACTIVATE: | |
- case WM_ACTIVATEAPP: | |
- widget=GTK_WIDGET(GetWindowLong(hwnd,GWL_USERDATA)); | |
- if (widget) klass=GTK_OBJECT(widget)->klass; else klass=NULL; | |
- if (klass==&GtkWindowClass) { | |
- if ((msg==WM_ACTIVATE && LOWORD(wParam)!=WA_INACTIVE)|| | |
- (msg==WM_ACTIVATEAPP && wParam)) { | |
- if (GTK_WINDOW(widget)->focus) { | |
- gtk_widget_set_focus(GTK_WINDOW(widget)->focus); | |
- } | |
- if (!GTK_WINDOW(widget)->focus) { | |
- gtk_window_set_focus(GTK_WINDOW(widget)); | |
- } | |
- } else if (msg==WM_ACTIVATE && LOWORD(wParam)==WA_INACTIVE) { | |
- gtk_window_update_focus(GTK_WINDOW(widget)); | |
- } | |
- } | |
- break; | |
- case WM_COMMAND: | |
- widget=GTK_WIDGET(GetWindowLong((HWND)lParam,GWL_USERDATA)); | |
- if (widget) klass=GTK_OBJECT(widget)->klass; else klass=NULL; | |
- | |
- if (lParam && klass==&GtkCListClass && HIWORD(wParam)==LBN_SELCHANGE)… | |
- gtk_clist_update_selection(widget); | |
- } else if (lParam && klass==&GtkOptionMenuClass && | |
- HIWORD(wParam)==CBN_SELENDOK) { | |
- gtk_option_menu_update_selection(widget); | |
- } else if (lParam && HIWORD(wParam)==BN_CLICKED) { | |
- gtk_signal_emit(GTK_OBJECT(widget),"clicked"); | |
- } else if (HIWORD(wParam)==0 || HIWORD(wParam)==1) { | |
- window=GTK_WIDGET(GetWindowLong(hwnd,GWL_USERDATA)); | |
- widget=gtk_window_get_menu_ID(GTK_WINDOW(window),LOWORD(wParam)); | |
- if (widget) gtk_signal_emit(GTK_OBJECT(widget),"activate"); | |
- } else return TRUE; | |
- break; | |
- case WM_CLOSE: | |
- gtk_signal_emit(GTK_OBJECT(GetWindowLong(hwnd,GWL_USERDATA)), | |
- "delete_event",&event,&signal_return); | |
- return TRUE; | |
- break; | |
- case WM_DRAWITEM: | |
- lpdis=(LPDRAWITEMSTRUCT)lParam; | |
- if (lpdis) { | |
- gtk_clist_draw_row(GTK_CLIST(GetWindowLong(lpdis->hwndItem, | |
- GWL_USERDATA)),lpdis); | |
- return TRUE; | |
- } | |
- break; | |
- case WM_MEASUREITEM: | |
- lpmis=(LPMEASUREITEMSTRUCT)lParam; | |
- hDC=GetDC(hwnd); | |
- if (!GetTextMetrics(hDC,&tm)) g_warning("GetTextMetrics failed"); | |
- ReleaseDC(hwnd,hDC); | |
- if (lpmis) { | |
- lpmis->itemHeight = tm.tmHeight + LISTITEMVPACK*2; | |
- return TRUE; | |
- } | |
- break; | |
- case WM_NOTIFY: | |
- phdr=(HD_NOTIFY FAR *)lParam; | |
- nmhdr=(NMHDR *)lParam; | |
- if (!nmhdr) break; | |
- if (nmhdr->code==HDN_ENDTRACK) { | |
- gtk_clist_set_column_width_full( | |
- GTK_CLIST(GetWindowLong(nmhdr->hwndFrom,GWL_USERDATA)), | |
- phdr->iItem,phdr->pitem->cxy,FALSE); | |
- return FALSE; | |
- } else if (nmhdr->code==HDN_ITEMCLICK) { | |
- gtk_signal_emit( | |
- GTK_OBJECT(GetWindowLong(nmhdr->hwndFrom,GWL_USERDATA)), | |
- "click-column",(gint)phdr->iItem); | |
- return FALSE; | |
- } else if (nmhdr->code==TCN_SELCHANGE) { | |
- gtk_notebook_set_page( | |
- GTK_NOTEBOOK(GetWindowLong(nmhdr->hwndFrom,GWL_USERDATA)), | |
- TabCtrl_GetCurSel(nmhdr->hwndFrom)); | |
- return FALSE; | |
- } | |
- break; | |
- case MYWM_SOCKETDATA: | |
-/* Ignore network messages if in recursive message loops, to avoid dodgy | |
- race conditions */ | |
- if (RecurseLevel<=1) { | |
-/* Make any error available by the usual WSAGetLastError() mechanism */ | |
- WSASetLastError(WSAGETSELECTERROR(lParam)); | |
- DispatchSocketEvent((SOCKET)wParam,WSAGETSELECTEVENT(lParam)); | |
- } | |
- break; | |
- case WM_TIMER: | |
- DispatchTimeoutEvent((UINT)wParam); | |
- return FALSE; | |
- default: | |
- return DefWindowProc(hwnd,msg,wParam,lParam); | |
- } | |
- return FALSE; | |
-} | |
- | |
-LRESULT APIENTRY EntryWndProc(HWND hwnd,UINT msg,WPARAM wParam, | |
- LPARAM lParam) { | |
- GtkWidget *widget; | |
- if (msg==WM_KEYUP && wParam==VK_RETURN) { | |
- widget=GTK_WIDGET(GetWindowLong(hwnd,GWL_USERDATA)); | |
- if (widget) gtk_signal_emit(GTK_OBJECT(widget),"activate"); | |
+ } | |
+ break; | |
+ case WM_NOTIFY: | |
+ phdr = (HD_NOTIFY FAR *)lParam; | |
+ nmhdr = (NMHDR *)lParam; | |
+ if (!nmhdr) | |
+ break; | |
+ if (nmhdr->code == HDN_ENDTRACK) { | |
+ gtk_clist_set_column_width_full(GTK_CLIST | |
+ (GetWindowLong | |
+ (nmhdr->hwndFrom, GWL_USERDATA)), | |
+ phdr->iItem, phdr->pitem->cxy, | |
+ FALSE); | |
+ return FALSE; | |
+ } else if (nmhdr->code == HDN_ITEMCLICK) { | |
+ gtk_signal_emit(GTK_OBJECT | |
+ (GetWindowLong(nmhdr->hwndFrom, GWL_USERDATA)), | |
+ "click-column", (gint)phdr->iItem); | |
return FALSE; | |
- } | |
- return CallWindowProc(wpOrigEntryProc,hwnd,msg,wParam,lParam); | |
+ } else if (nmhdr->code == TCN_SELCHANGE) { | |
+ gtk_notebook_set_page(GTK_NOTEBOOK | |
+ (GetWindowLong(nmhdr->hwndFrom, GWL_USERDATA)), | |
+ TabCtrl_GetCurSel(nmhdr->hwndFrom)); | |
+ return FALSE; | |
+ } | |
+ break; | |
+ case MYWM_SOCKETDATA: | |
+ /* Ignore network messages if in recursive message loops, to avoid | |
+ * dodgy race conditions */ | |
+ if (RecurseLevel <= 1) { | |
+ /* Make any error available by the usual WSAGetLastError() mechanism | |
+ */ | |
+ WSASetLastError(WSAGETSELECTERROR(lParam)); | |
+ DispatchSocketEvent((SOCKET)wParam, WSAGETSELECTEVENT(lParam)); | |
+ } | |
+ break; | |
+ case WM_TIMER: | |
+ DispatchTimeoutEvent((UINT)wParam); | |
+ return FALSE; | |
+ default: | |
+ return DefWindowProc(hwnd, msg, wParam, lParam); | |
+ } | |
+ return FALSE; | |
} | |
-LRESULT APIENTRY TextWndProc(HWND hwnd,UINT msg,WPARAM wParam, | |
- LPARAM lParam) { | |
- GtkWidget *widget; | |
- if (msg==WM_GETDLGCODE) { | |
- widget=GTK_WIDGET(GetWindowLong(hwnd,GWL_USERDATA)); | |
- if (!GTK_EDITABLE(widget)->is_editable) { | |
- return DLGC_HASSETSEL|DLGC_WANTARROWS; | |
- } | |
- } | |
- return CallWindowProc(wpOrigTextProc,hwnd,msg,wParam,lParam); | |
+LRESULT APIENTRY EntryWndProc(HWND hwnd, UINT msg, WPARAM wParam, | |
+ LPARAM lParam) | |
+{ | |
+ GtkWidget *widget; | |
+ | |
+ if (msg == WM_KEYUP && wParam == VK_RETURN) { | |
+ widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA)); | |
+ if (widget) | |
+ gtk_signal_emit(GTK_OBJECT(widget), "activate"); | |
+ return FALSE; | |
+ } | |
+ return CallWindowProc(wpOrigEntryProc, hwnd, msg, wParam, lParam); | |
+} | |
+ | |
+LRESULT APIENTRY TextWndProc(HWND hwnd, UINT msg, WPARAM wParam, | |
+ LPARAM lParam) | |
+{ | |
+ GtkWidget *widget; | |
+ | |
+ if (msg == WM_GETDLGCODE) { | |
+ widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA)); | |
+ if (!GTK_EDITABLE(widget)->is_editable) { | |
+ return DLGC_HASSETSEL | DLGC_WANTARROWS; | |
+ } | |
+ } | |
+ return CallWindowProc(wpOrigTextProc, hwnd, msg, wParam, lParam); | |
} | |
-void SetCustomWndProc(WNDPROC wndproc) { | |
+void SetCustomWndProc(WNDPROC wndproc) | |
+{ | |
customWndProc = wndproc; | |
} | |
-void win32_init(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *MainIcon) { | |
- WNDCLASS wc; | |
- | |
- hInst=hInstance; | |
- defFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT); | |
- urlFont = CreateFont(14, 0, 0, 0, FW_SEMIBOLD, FALSE, TRUE, FALSE, | |
- ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, | |
- DEFAULT_QUALITY, FF_SWISS | DEFAULT_PITCH, NULL); | |
- WindowList=NULL; | |
- RecurseLevel=0; | |
- customWndProc = NULL; | |
- if (MainIcon) { | |
- mainIcon = LoadIcon(hInstance,MainIcon); | |
- } else { | |
- mainIcon = LoadIcon(NULL,IDI_APPLICATION); | |
- } | |
- if (!hPrevInstance) { | |
- wc.style = CS_HREDRAW|CS_VREDRAW; | |
- wc.lpfnWndProc = MainWndProc; | |
- wc.cbClsExtra = 0; | |
- wc.cbWndExtra = 0; | |
- wc.hInstance = hInstance; | |
- wc.hIcon = mainIcon; | |
- wc.hCursor = LoadCursor(NULL,IDC_ARROW); | |
- wc.hbrBackground = (HBRUSH)(1+COLOR_BTNFACE); | |
- wc.lpszMenuName = NULL; | |
- wc.lpszClassName = "mainwin"; | |
- RegisterClass(&wc); | |
- | |
- wc.style = CS_HREDRAW|CS_VREDRAW; | |
- wc.lpfnWndProc = MainWndProc; | |
- wc.cbClsExtra = 0; | |
- wc.cbWndExtra = 0; | |
- wc.hInstance = hInstance; | |
- wc.hIcon = NULL; | |
- wc.hCursor = LoadCursor(NULL,IDC_ARROW); | |
- wc.hbrBackground = (HBRUSH)(1+COLOR_BTNFACE); | |
- wc.lpszMenuName = NULL; | |
- wc.lpszClassName = WC_GTKDIALOG; | |
- RegisterClass(&wc); | |
- | |
- wc.style = CS_HREDRAW|CS_VREDRAW; | |
- wc.lpfnWndProc = GtkPanedProc; | |
- wc.cbClsExtra = 0; | |
- wc.cbWndExtra = 0; | |
- wc.hInstance = hInstance; | |
- wc.hIcon = NULL; | |
- wc.hCursor = LoadCursor(NULL,IDC_SIZEWE); | |
- wc.hbrBackground = (HBRUSH)(1+COLOR_BTNFACE); | |
- wc.lpszMenuName = NULL; | |
- wc.lpszClassName = WC_GTKHPANED; | |
- RegisterClass(&wc); | |
- | |
- wc.style = CS_HREDRAW|CS_VREDRAW; | |
- wc.lpfnWndProc = GtkPanedProc; | |
- wc.cbClsExtra = 0; | |
- wc.cbWndExtra = 0; | |
- wc.hInstance = hInstance; | |
- wc.hIcon = NULL; | |
- wc.hCursor = LoadCursor(NULL,IDC_SIZENS); | |
- wc.hbrBackground = (HBRUSH)(1+COLOR_BTNFACE); | |
- wc.lpszMenuName = NULL; | |
- wc.lpszClassName = WC_GTKVPANED; | |
- RegisterClass(&wc); | |
- | |
- wc.style = CS_HREDRAW|CS_VREDRAW; | |
- wc.lpfnWndProc = GtkSepProc; | |
- wc.cbClsExtra = 0; | |
- wc.cbWndExtra = 0; | |
- wc.hInstance = hInstance; | |
- wc.hIcon = NULL; | |
- wc.hCursor = LoadCursor(NULL,IDC_ARROW); | |
- wc.hbrBackground = (HBRUSH)(1+COLOR_BTNFACE); | |
- wc.lpszMenuName = NULL; | |
- wc.lpszClassName = WC_GTKSEP; | |
- RegisterClass(&wc); | |
- | |
- wc.style = CS_HREDRAW|CS_VREDRAW; | |
- wc.lpfnWndProc = GtkUrlProc; | |
- wc.cbClsExtra = 0; | |
- wc.cbWndExtra = 0; | |
- wc.hInstance = hInstance; | |
- wc.hIcon = NULL; | |
- wc.hCursor = LoadCursor(NULL,IDC_HAND); | |
- wc.hbrBackground = (HBRUSH)(1+COLOR_BTNFACE); | |
- wc.lpszMenuName = NULL; | |
- wc.lpszClassName = WC_GTKURL; | |
- RegisterClass(&wc); | |
- } | |
- | |
- InitCommonControls(); | |
-} | |
- | |
-guint gtk_main_level(void) { | |
+void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance, | |
+ char *MainIcon) | |
+{ | |
+ WNDCLASS wc; | |
+ | |
+ hInst = hInstance; | |
+ defFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT); | |
+ urlFont = CreateFont(14, 0, 0, 0, FW_SEMIBOLD, FALSE, TRUE, FALSE, | |
+ ANSI_CHARSET, OUT_DEFAULT_PRECIS, | |
+ CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, | |
+ FF_SWISS | DEFAULT_PITCH, NULL); | |
+ WindowList = NULL; | |
+ RecurseLevel = 0; | |
+ customWndProc = NULL; | |
+ if (MainIcon) { | |
+ mainIcon = LoadIcon(hInstance, MainIcon); | |
+ } else { | |
+ mainIcon = LoadIcon(NULL, IDI_APPLICATION); | |
+ } | |
+ if (!hPrevInstance) { | |
+ wc.style = CS_HREDRAW | CS_VREDRAW; | |
+ wc.lpfnWndProc = MainWndProc; | |
+ wc.cbClsExtra = 0; | |
+ wc.cbWndExtra = 0; | |
+ wc.hInstance = hInstance; | |
+ wc.hIcon = mainIcon; | |
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
+ wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); | |
+ wc.lpszMenuName = NULL; | |
+ wc.lpszClassName = "mainwin"; | |
+ RegisterClass(&wc); | |
+ | |
+ wc.style = CS_HREDRAW | CS_VREDRAW; | |
+ wc.lpfnWndProc = MainWndProc; | |
+ wc.cbClsExtra = 0; | |
+ wc.cbWndExtra = 0; | |
+ wc.hInstance = hInstance; | |
+ wc.hIcon = NULL; | |
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
+ wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); | |
+ wc.lpszMenuName = NULL; | |
+ wc.lpszClassName = WC_GTKDIALOG; | |
+ RegisterClass(&wc); | |
+ | |
+ wc.style = CS_HREDRAW | CS_VREDRAW; | |
+ wc.lpfnWndProc = GtkPanedProc; | |
+ wc.cbClsExtra = 0; | |
+ wc.cbWndExtra = 0; | |
+ wc.hInstance = hInstance; | |
+ wc.hIcon = NULL; | |
+ wc.hCursor = LoadCursor(NULL, IDC_SIZEWE); | |
+ wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); | |
+ wc.lpszMenuName = NULL; | |
+ wc.lpszClassName = WC_GTKHPANED; | |
+ RegisterClass(&wc); | |
+ | |
+ wc.style = CS_HREDRAW | CS_VREDRAW; | |
+ wc.lpfnWndProc = GtkPanedProc; | |
+ wc.cbClsExtra = 0; | |
+ wc.cbWndExtra = 0; | |
+ wc.hInstance = hInstance; | |
+ wc.hIcon = NULL; | |
+ wc.hCursor = LoadCursor(NULL, IDC_SIZENS); | |
+ wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); | |
+ wc.lpszMenuName = NULL; | |
+ wc.lpszClassName = WC_GTKVPANED; | |
+ RegisterClass(&wc); | |
+ | |
+ wc.style = CS_HREDRAW | CS_VREDRAW; | |
+ wc.lpfnWndProc = GtkSepProc; | |
+ wc.cbClsExtra = 0; | |
+ wc.cbWndExtra = 0; | |
+ wc.hInstance = hInstance; | |
+ wc.hIcon = NULL; | |
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
+ wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); | |
+ wc.lpszMenuName = NULL; | |
+ wc.lpszClassName = WC_GTKSEP; | |
+ RegisterClass(&wc); | |
+ | |
+ wc.style = CS_HREDRAW | CS_VREDRAW; | |
+ wc.lpfnWndProc = GtkUrlProc; | |
+ wc.cbClsExtra = 0; | |
+ wc.cbWndExtra = 0; | |
+ wc.hInstance = hInstance; | |
+ wc.hIcon = NULL; | |
+ wc.hCursor = LoadCursor(NULL, IDC_HAND); | |
+ wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); | |
+ wc.lpszMenuName = NULL; | |
+ wc.lpszClassName = WC_GTKURL; | |
+ RegisterClass(&wc); | |
+ } | |
+ | |
+ InitCommonControls(); | |
+} | |
+ | |
+guint gtk_main_level(void) | |
+{ | |
return RecurseLevel; | |
} | |
-void gtk_widget_update(GtkWidget *widget,gboolean ForceResize) { | |
- GtkRequisition req; | |
- GtkWidget *window; | |
- GtkAllocation alloc; | |
+void gtk_widget_update(GtkWidget *widget, gboolean ForceResize) | |
+{ | |
+ GtkRequisition req; | |
+ GtkWidget *window; | |
+ GtkAllocation alloc; | |
+ | |
+ if (!GTK_WIDGET_REALIZED(widget)) | |
+ return; | |
+ | |
+ gtk_widget_size_request(widget, &req); | |
+ window = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ if (window) { | |
+ alloc.x = alloc.y = 0; | |
+ alloc.width = window->requisition.width; | |
+ alloc.height = window->requisition.height; | |
+ gtk_window_handle_auto_size(GTK_WINDOW(window), &alloc); | |
+ if (alloc.width != window->allocation.width | |
+ || alloc.height != window->allocation.height || ForceResize) { | |
+ gtk_widget_set_size(window, &alloc); | |
+ } | |
+ } | |
+} | |
- if (!GTK_WIDGET_REALIZED(widget)) return; | |
+void gtk_widget_show(GtkWidget *widget) | |
+{ | |
+ gtk_widget_show_full(widget, TRUE); | |
+} | |
- gtk_widget_size_request(widget,&req); | |
- window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- if (window) { | |
- alloc.x=alloc.y=0; | |
- alloc.width=window->requisition.width; | |
- alloc.height=window->requisition.height; | |
- gtk_window_handle_auto_size(GTK_WINDOW(window),&alloc); | |
- if (alloc.width!=window->allocation.width || | |
- alloc.height!=window->allocation.height || ForceResize) { | |
- gtk_widget_set_size(window,&alloc); | |
- } | |
- } | |
+void gtk_widget_show_full(GtkWidget *widget, gboolean recurse) | |
+{ | |
+ GtkAllocation alloc; | |
+ | |
+ if (GTK_WIDGET_VISIBLE(widget)) | |
+ return; | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_VISIBLE); | |
+ | |
+ if (recurse) | |
+ gtk_widget_show_all_full(widget, TRUE); | |
+ else | |
+ gtk_signal_emit(GTK_OBJECT(widget), "show"); | |
+ | |
+ if (!GTK_WIDGET_REALIZED(widget) | |
+ && GTK_OBJECT(widget)->klass == &GtkWindowClass) { | |
+ gtk_widget_realize(widget); | |
+ alloc.x = alloc.y = 0; | |
+ alloc.width = widget->requisition.width; | |
+ alloc.height = widget->requisition.height; | |
+ gtk_window_set_initial_position(GTK_WINDOW(widget), &alloc); | |
+ gtk_widget_set_size(widget, &alloc); | |
+ ShowWindow(widget->hWnd, SW_SHOWNORMAL); | |
+ UpdateWindow(widget->hWnd); | |
+ } else if (GTK_WIDGET_REALIZED(widget) | |
+ && GTK_OBJECT(widget)->klass != &GtkWindowClass) { | |
+ gtk_widget_update(widget, TRUE); | |
+ if (!recurse) | |
+ ShowWindow(widget->hWnd, SW_SHOWNORMAL); | |
+ } | |
+ // g_print("widget show - set focus\n"); | |
+ gtk_widget_set_focus(widget); | |
+} | |
+ | |
+void gtk_widget_hide(GtkWidget *widget) | |
+{ | |
+ gtk_widget_hide_full(widget, TRUE); | |
+} | |
+ | |
+void gtk_widget_hide_full(GtkWidget *widget, gboolean recurse) | |
+{ | |
+ GtkAllocation alloc; | |
+ GtkRequisition req; | |
+ GtkWidget *window; | |
+ | |
+ if (!GTK_WIDGET_VISIBLE(widget)) | |
+ return; | |
+ | |
+ if (recurse) | |
+ gtk_widget_hide_all_full(widget, TRUE); | |
+ else { | |
+ gtk_signal_emit(GTK_OBJECT(widget), "hide"); | |
+ if (widget->hWnd) | |
+ ShowWindow(widget->hWnd, SW_HIDE); | |
+ } | |
+ | |
+ GTK_WIDGET_UNSET_FLAGS(widget, GTK_VISIBLE); | |
+ | |
+ gtk_widget_lose_focus(widget); | |
+ | |
+ gtk_widget_size_request(widget, &req); | |
+ if (GTK_WIDGET_REALIZED(widget)) { | |
+ window = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ if (window) { | |
+ alloc.x = alloc.y = 0; | |
+ alloc.width = window->requisition.width; | |
+ alloc.height = window->requisition.height; | |
+ gtk_window_handle_auto_size(GTK_WINDOW(window), &alloc); | |
+ gtk_widget_set_size(window, &alloc); | |
+ } | |
+ } | |
+} | |
+ | |
+void gtk_widget_set_focus(GtkWidget *widget) | |
+{ | |
+ GtkWidget *window; | |
+ | |
+ if (!widget || !GTK_WIDGET_CAN_FOCUS(widget) | |
+ || !GTK_WIDGET_SENSITIVE(widget) || !GTK_WIDGET_VISIBLE(widget)) | |
+ return; | |
+ window = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ gtk_window_update_focus(GTK_WINDOW(window)); | |
+ if (!window || GTK_WINDOW(window)->focus) | |
+ return; | |
+ | |
+ // g_print("Window %p focus set to widget %p | |
+ // (%s)\n",window,widget,GTK_OBJECT(widget)->klass->Name); | |
+ GTK_WINDOW(window)->focus = widget; | |
+ if (widget->hWnd) { | |
+ // if (!SetFocus(widget->hWnd)) g_print("SetFocus failed on widget | |
+ // %p\n",widget); | |
+ SetFocus(widget->hWnd); | |
+ } | |
+ // else g_print("Cannot call SetFocus - no hWnd\n"); | |
+} | |
+ | |
+static BOOL CALLBACK SetFocusEnum(HWND hWnd, LPARAM data) | |
+{ | |
+ GtkWidget *widget; | |
+ GtkWindow *window = GTK_WINDOW(data); | |
+ | |
+ widget = GTK_WIDGET(GetWindowLong(hWnd, GWL_USERDATA)); | |
+ if (!widget || !GTK_WIDGET_CAN_FOCUS(widget) || | |
+ !GTK_WIDGET_SENSITIVE(widget) || !GTK_WIDGET_VISIBLE(widget) || | |
+ window->focus == widget) { | |
+ return TRUE; | |
+ } else { | |
+ // g_print("gtk_window_set_focus: focus set to widget %p\n",widget); | |
+ window->focus = widget; | |
+ SetFocus(widget->hWnd); | |
+ return FALSE; | |
+ } | |
} | |
-void gtk_widget_show(GtkWidget *widget) { | |
- gtk_widget_show_full(widget,TRUE); | |
+void gtk_window_set_focus(GtkWindow *window) | |
+{ | |
+ if (!window || !GTK_WIDGET(window)->hWnd) | |
+ return; | |
+ EnumChildWindows(GTK_WIDGET(window)->hWnd, SetFocusEnum, (LPARAM)window); | |
} | |
-void gtk_widget_show_full(GtkWidget *widget,gboolean recurse) { | |
- GtkAllocation alloc; | |
+void gtk_widget_lose_focus(GtkWidget *widget) | |
+{ | |
+ GtkWidget *window; | |
+ | |
+ if (!widget || !GTK_WIDGET_CAN_FOCUS(widget)) | |
+ return; | |
+ window = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ gtk_window_update_focus(GTK_WINDOW(window)); | |
+ if (GTK_WINDOW(window)->focus == widget) { | |
+ gtk_window_set_focus(GTK_WINDOW(window)); | |
+ } | |
+} | |
- if (GTK_WIDGET_VISIBLE(widget)) return; | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_VISIBLE); | |
+void gtk_window_update_focus(GtkWindow *window) | |
+{ | |
+ GtkWidget *widget; | |
+ HWND FocusWnd; | |
+ | |
+ if (GTK_WIDGET(window)->hWnd != GetActiveWindow()) | |
+ return; | |
+ FocusWnd = GetFocus(); | |
+ window->focus = NULL; | |
+ if (FocusWnd) { | |
+ widget = GTK_WIDGET(GetWindowLong(FocusWnd, GWL_USERDATA)); | |
+ if (widget && GTK_WIDGET(window)->hWnd && | |
+ GetParent(FocusWnd) == GTK_WIDGET(window)->hWnd) { | |
+ window->focus = widget; | |
+ } | |
+ } | |
+} | |
- if (recurse) gtk_widget_show_all_full(widget,TRUE); | |
- else gtk_signal_emit(GTK_OBJECT(widget),"show"); | |
+void gtk_widget_realize(GtkWidget *widget) | |
+{ | |
+ GtkRequisition req; | |
- if (!GTK_WIDGET_REALIZED(widget) && | |
- GTK_OBJECT(widget)->klass==&GtkWindowClass) { | |
- gtk_widget_realize(widget); | |
- alloc.x=alloc.y=0; | |
- alloc.width=widget->requisition.width; | |
- alloc.height=widget->requisition.height; | |
- gtk_window_set_initial_position(GTK_WINDOW(widget),&alloc); | |
- gtk_widget_set_size(widget,&alloc); | |
- ShowWindow(widget->hWnd,SW_SHOWNORMAL); | |
- UpdateWindow(widget->hWnd); | |
- } else if (GTK_WIDGET_REALIZED(widget) && | |
- GTK_OBJECT(widget)->klass!=&GtkWindowClass) { | |
- gtk_widget_update(widget,TRUE); | |
- if (!recurse) ShowWindow(widget->hWnd,SW_SHOWNORMAL); | |
- } | |
+ if (GTK_WIDGET_REALIZED(widget)) | |
+ return; | |
+ gtk_signal_emit(GTK_OBJECT(widget), "realize", &req); | |
+ if (widget->hWnd) | |
+ SetWindowLong(widget->hWnd, GWL_USERDATA, (LONG)widget); | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); | |
+ gtk_widget_set_sensitive(widget, GTK_WIDGET_SENSITIVE(widget)); | |
-// g_print("widget show - set focus\n"); | |
- gtk_widget_set_focus(widget); | |
+ gtk_widget_size_request(widget, &req); | |
} | |
-void gtk_widget_hide(GtkWidget *widget) { | |
- gtk_widget_hide_full(widget,TRUE); | |
+void gtk_widget_create(GtkWidget *widget) | |
+{ | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_SENSITIVE); | |
+ widget->usize.width = 0; | |
+ widget->usize.height = 0; | |
} | |
-void gtk_widget_hide_full(GtkWidget *widget,gboolean recurse) { | |
- GtkAllocation alloc; | |
- GtkRequisition req; | |
- GtkWidget *window; | |
+void gtk_widget_destroy(GtkWidget *widget) | |
+{ | |
+ if (!widget) | |
+ return; | |
+ | |
+ /* If we're closing a modal window, reactivate the parent _before_ | |
+ * calling DestroyWindow, to avoid annoying flicker caused if Windows | |
+ * chooses to reactivate another application when we close the modal | |
+ * dialog */ | |
+ if (GTK_OBJECT(widget)->klass == &GtkWindowClass) { | |
+ EnableParent(GTK_WINDOW(widget)); | |
+ } | |
+ | |
+ gtk_widget_lose_focus(widget); | |
+ if (widget->hWnd) | |
+ DestroyWindow(widget->hWnd); | |
+ widget->hWnd = NULL; | |
+ gtk_signal_emit(GTK_OBJECT(widget), "destroy"); | |
+ g_free(widget); | |
+} | |
- if (!GTK_WIDGET_VISIBLE(widget)) return; | |
+void gtk_widget_set_sensitive(GtkWidget *widget, gboolean sensitive) | |
+{ | |
+ if (sensitive) { | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_SENSITIVE); | |
+ if (widget->hWnd) | |
+ EnableWindow(widget->hWnd, sensitive); | |
+ gtk_widget_set_focus(widget); | |
+ } else { | |
+ GTK_WIDGET_UNSET_FLAGS(widget, GTK_SENSITIVE); | |
+ gtk_widget_lose_focus(widget); | |
+ if (widget->hWnd) | |
+ EnableWindow(widget->hWnd, sensitive); | |
+ } | |
- if (recurse) gtk_widget_hide_all_full(widget,TRUE); | |
- else { | |
- gtk_signal_emit(GTK_OBJECT(widget),"hide"); | |
- if (widget->hWnd) ShowWindow(widget->hWnd,SW_HIDE); | |
- } | |
+ gtk_signal_emit(GTK_OBJECT(widget), sensitive ? "enable" : "disable"); | |
+ if (sensitive && widget->hWnd | |
+ && GTK_OBJECT(widget)->klass == &GtkWindowClass) | |
+ SetActiveWindow(widget->hWnd); | |
+} | |
- GTK_WIDGET_UNSET_FLAGS(widget,GTK_VISIBLE); | |
+void gtk_widget_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition) | |
+{ | |
+ GtkRequisition req; | |
- gtk_widget_lose_focus(widget); | |
+ requisition->width = requisition->height = 0; | |
+ if (GTK_WIDGET_VISIBLE(widget)) { | |
+ gtk_signal_emit(GTK_OBJECT(widget), "size_request", requisition); | |
+ } | |
+ if (requisition->width < widget->usize.width) | |
+ requisition->width = widget->usize.width; | |
+ if (requisition->height < widget->usize.height) | |
+ requisition->height = widget->usize.height; | |
+ if (requisition->width != widget->requisition.width || | |
+ requisition->height != widget->requisition.height) { | |
+ memcpy(&widget->requisition, requisition, sizeof(GtkRequisition)); | |
+ if (widget->parent) | |
+ gtk_widget_size_request(widget->parent, &req); | |
+ } | |
+} | |
- gtk_widget_size_request(widget,&req); | |
- if (GTK_WIDGET_REALIZED(widget)) { | |
- window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- if (window) { | |
- alloc.x=alloc.y=0; | |
- alloc.width=window->requisition.width; | |
- alloc.height=window->requisition.height; | |
- gtk_window_handle_auto_size(GTK_WINDOW(window),&alloc); | |
- gtk_widget_set_size(window,&alloc); | |
- } | |
- } | |
-} | |
- | |
-void gtk_widget_set_focus(GtkWidget *widget) { | |
- GtkWidget *window; | |
- if (!widget || !GTK_WIDGET_CAN_FOCUS(widget) || | |
- !GTK_WIDGET_SENSITIVE(widget) || !GTK_WIDGET_VISIBLE(widget)) return; | |
- window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- gtk_window_update_focus(GTK_WINDOW(window)); | |
- if (!window || GTK_WINDOW(window)->focus) return; | |
- | |
-// g_print("Window %p focus set to widget %p (%s)\n",window,widget,GTK_OBJECT(… | |
- GTK_WINDOW(window)->focus=widget; | |
- if (widget->hWnd) { | |
-// if (!SetFocus(widget->hWnd)) g_print("SetFocus failed on widget %p\n",wi… | |
- SetFocus(widget->hWnd); | |
- } | |
-// else g_print("Cannot call SetFocus - no hWnd\n"); | |
-} | |
- | |
-static BOOL CALLBACK SetFocusEnum(HWND hWnd,LPARAM data) { | |
- GtkWidget *widget; | |
- GtkWindow *window=GTK_WINDOW(data); | |
- widget=GTK_WIDGET(GetWindowLong(hWnd,GWL_USERDATA)); | |
- if (!widget || !GTK_WIDGET_CAN_FOCUS(widget) || | |
- !GTK_WIDGET_SENSITIVE(widget) || !GTK_WIDGET_VISIBLE(widget) || | |
- window->focus==widget) { | |
- return TRUE; | |
- } else { | |
-//g_print("gtk_window_set_focus: focus set to widget %p\n",widget); | |
- window->focus=widget; | |
- SetFocus(widget->hWnd); | |
- return FALSE; | |
- } | |
-} | |
- | |
-void gtk_window_set_focus(GtkWindow *window) { | |
- if (!window||!GTK_WIDGET(window)->hWnd) return; | |
- EnumChildWindows(GTK_WIDGET(window)->hWnd,SetFocusEnum,(LPARAM)window); | |
-} | |
- | |
-void gtk_widget_lose_focus(GtkWidget *widget) { | |
- GtkWidget *window; | |
- if (!widget || !GTK_WIDGET_CAN_FOCUS(widget)) return; | |
- window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- gtk_window_update_focus(GTK_WINDOW(window)); | |
- if (GTK_WINDOW(window)->focus==widget) { | |
- gtk_window_set_focus(GTK_WINDOW(window)); | |
- } | |
-} | |
- | |
-void gtk_window_update_focus(GtkWindow *window) { | |
- GtkWidget *widget; | |
- HWND FocusWnd; | |
- if (GTK_WIDGET(window)->hWnd != GetActiveWindow()) return; | |
- FocusWnd=GetFocus(); | |
- window->focus=NULL; | |
- if (FocusWnd) { | |
- widget=GTK_WIDGET(GetWindowLong(FocusWnd,GWL_USERDATA)); | |
- if (widget && GTK_WIDGET(window)->hWnd && | |
- GetParent(FocusWnd)==GTK_WIDGET(window)->hWnd) { | |
- window->focus=widget; | |
- } /*else g_print("Widget %p is not child of window %p\n",widget,window);… | |
- }// else g_print("GetFocus returned NULL\n"); | |
-} | |
- | |
-void gtk_widget_realize(GtkWidget *widget) { | |
- GtkRequisition req; | |
- if (GTK_WIDGET_REALIZED(widget)) return; | |
-/* g_print("Realizing widget %p of class %s\n",widget,GTK_OBJECT(widget)->klas… | |
- gtk_signal_emit(GTK_OBJECT(widget),"realize",&req); | |
- if (widget->hWnd) SetWindowLong(widget->hWnd,GWL_USERDATA,(LONG)widget); | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_REALIZED); | |
- gtk_widget_set_sensitive(widget,GTK_WIDGET_SENSITIVE(widget)); | |
- | |
- gtk_widget_size_request(widget,&req); | |
-} | |
- | |
-void gtk_widget_create(GtkWidget *widget) { | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_SENSITIVE); | |
- widget->usize.width=0; | |
- widget->usize.height=0; | |
-} | |
- | |
-void gtk_widget_destroy(GtkWidget *widget) { | |
- if (!widget) return; | |
- | |
- /* If we're closing a modal window, reactivate the parent | |
- * _before_ calling DestroyWindow, to avoid annoying | |
- * flicker caused if Windows chooses to reactivate another | |
- * application when we close the modal dialog */ | |
- if (GTK_OBJECT(widget)->klass == &GtkWindowClass) { | |
- EnableParent(GTK_WINDOW(widget)); | |
- } | |
- | |
- gtk_widget_lose_focus(widget); | |
- if (widget->hWnd) DestroyWindow(widget->hWnd); | |
- widget->hWnd=NULL; | |
-// g_print("gtk_widget_destroy on widget %p\n",widget); | |
- gtk_signal_emit(GTK_OBJECT(widget),"destroy"); | |
-// g_print("Freeing widget\n"); | |
- g_free(widget); | |
-// g_print("Widget freed\n"); | |
-} | |
- | |
-void gtk_widget_set_sensitive(GtkWidget *widget,gboolean sensitive) { | |
- if (sensitive) { | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_SENSITIVE); | |
- if (widget->hWnd) EnableWindow(widget->hWnd,sensitive); | |
- gtk_widget_set_focus(widget); | |
- } else { | |
- GTK_WIDGET_UNSET_FLAGS(widget,GTK_SENSITIVE); | |
- gtk_widget_lose_focus(widget); | |
- if (widget->hWnd) EnableWindow(widget->hWnd,sensitive); | |
- } | |
- | |
- gtk_signal_emit(GTK_OBJECT(widget),sensitive ? "enable" : "disable"); | |
- if (sensitive && widget->hWnd && GTK_OBJECT(widget)->klass==&GtkWindowClass) | |
- SetActiveWindow(widget->hWnd); | |
-} | |
- | |
-void gtk_widget_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- GtkRequisition req; | |
- requisition->width=requisition->height=0; | |
- if (GTK_WIDGET_VISIBLE(widget)) { | |
- gtk_signal_emit(GTK_OBJECT(widget),"size_request",requisition); | |
- } | |
- if (requisition->width < widget->usize.width) | |
- requisition->width = widget->usize.width; | |
- if (requisition->height < widget->usize.height) | |
- requisition->height = widget->usize.height; | |
- if (requisition->width != widget->requisition.width || | |
- requisition->height != widget->requisition.height) { | |
- memcpy(&widget->requisition,requisition,sizeof(GtkRequisition)); | |
- if (widget->parent) gtk_widget_size_request(widget->parent,&req); | |
- } | |
-} | |
- | |
-void gtk_widget_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- gtk_signal_emit(GTK_OBJECT(widget),"set_size",allocation); | |
- memcpy(&widget->allocation,allocation,sizeof(GtkAllocation)); | |
-/* g_print("Widget pos set to %d,%d, size %d,%d\n", | |
- allocation->x,allocation->y, | |
- allocation->width,allocation->height);*/ | |
- if (widget->hWnd) { | |
- SetWindowPos(widget->hWnd,HWND_TOP, | |
- allocation->x,allocation->y, | |
- allocation->width,allocation->height, | |
+void gtk_widget_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ gtk_signal_emit(GTK_OBJECT(widget), "set_size", allocation); | |
+ memcpy(&widget->allocation, allocation, sizeof(GtkAllocation)); | |
+ if (widget->hWnd) { | |
+ SetWindowPos(widget->hWnd, HWND_TOP, | |
+ allocation->x, allocation->y, | |
+ allocation->width, allocation->height, | |
SWP_NOZORDER | | |
- (GTK_OBJECT(widget)->klass==&GtkWindowClass ? SWP_NOMOVE : | |
- 0)); | |
- } | |
+ (GTK_OBJECT(widget)->klass == | |
+ &GtkWindowClass ? SWP_NOMOVE : 0)); | |
+ } | |
} | |
-GtkWidget *gtk_window_new(GtkWindowType type) { | |
- GtkWindow *win; | |
+GtkWidget *gtk_window_new(GtkWindowType type) | |
+{ | |
+ GtkWindow *win; | |
+ | |
+ win = GTK_WINDOW(GtkNewObject(&GtkWindowClass)); | |
- win=GTK_WINDOW(GtkNewObject(&GtkWindowClass)); | |
-// g_print("New window %p created\n",win); | |
+ win->title = g_strdup(""); | |
+ win->type = type; | |
+ win->allow_grow = TRUE; | |
- win->title=g_strdup(""); | |
- win->type=type; | |
- win->allow_grow = TRUE; | |
- | |
- return GTK_WIDGET(win); | |
+ return GTK_WIDGET(win); | |
} | |
-void gtk_window_set_title(GtkWindow *window,const gchar *title) { | |
- g_free(window->title); | |
- window->title=g_strdup(title); | |
+void gtk_window_set_title(GtkWindow *window, const gchar *title) | |
+{ | |
+ g_free(window->title); | |
+ window->title = g_strdup(title); | |
} | |
-gint gtk_window_delete_event(GtkWidget *widget,GdkEvent *event) { | |
- gtk_widget_destroy(widget); | |
- return TRUE; | |
+gint gtk_window_delete_event(GtkWidget *widget, GdkEvent *event) | |
+{ | |
+ gtk_widget_destroy(widget); | |
+ return TRUE; | |
} | |
-void gtk_window_set_default_size(GtkWindow *window,gint width,gint height) { | |
- window->default_width = width; | |
- window->default_height = height; | |
+void gtk_window_set_default_size(GtkWindow *window, gint width, | |
+ gint height) | |
+{ | |
+ window->default_width = width; | |
+ window->default_height = height; | |
} | |
-void gtk_window_set_transient_for(GtkWindow *window,GtkWindow *parent) { | |
- if (window && parent) { | |
- GTK_WIDGET(window)->parent = GTK_WIDGET(parent); | |
- if (GTK_WIDGET(window)->hWnd && GTK_WIDGET(parent)->hWnd) { | |
- SetParent(GTK_WIDGET(window)->hWnd,GTK_WIDGET(parent)->hWnd); | |
- } | |
- } | |
+void gtk_window_set_transient_for(GtkWindow *window, GtkWindow *parent) | |
+{ | |
+ if (window && parent) { | |
+ GTK_WIDGET(window)->parent = GTK_WIDGET(parent); | |
+ if (GTK_WIDGET(window)->hWnd && GTK_WIDGET(parent)->hWnd) { | |
+ SetParent(GTK_WIDGET(window)->hWnd, GTK_WIDGET(parent)->hWnd); | |
+ } | |
+ } | |
} | |
-void gtk_window_set_policy(GtkWindow *window,gint allow_shrink, | |
- gint allow_grow,gint auto_shrink) { | |
+void gtk_window_set_policy(GtkWindow *window, gint allow_shrink, | |
+ gint allow_grow, gint auto_shrink) | |
+{ | |
window->allow_shrink = allow_shrink; | |
window->allow_grow = allow_grow; | |
window->auto_shrink = auto_shrink; | |
} | |
-void gtk_window_set_menu(GtkWindow *window,GtkMenuBar *menu_bar) { | |
- HWND hWnd; | |
- HMENU hMenu; | |
- | |
- hWnd=GTK_WIDGET(window)->hWnd; | |
- hMenu=GTK_MENU_SHELL(menu_bar)->menu; | |
- | |
- if (hWnd && hMenu) SetMenu(hWnd,hMenu); | |
- window->menu_bar=menu_bar; | |
-} | |
- | |
-void gtk_container_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkContainer *container; | |
- GtkAllocation child_alloc; | |
- container=GTK_CONTAINER(widget); | |
- if (container->child) { | |
- child_alloc.x=allocation->x+container->border_width; | |
- child_alloc.y=allocation->y+container->border_width; | |
- child_alloc.width=allocation->width-container->border_width*2; | |
- child_alloc.height=allocation->height-container->border_width*2; | |
- gtk_widget_set_size(container->child,&child_alloc); | |
- } | |
-} | |
- | |
-void gtk_frame_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkFrame *frame; | |
- GtkAllocation child_alloc; | |
- | |
- frame=GTK_FRAME(widget); | |
- child_alloc.x = allocation->x+3; | |
- child_alloc.y = allocation->y + 3 + frame->label_req.height; | |
- child_alloc.width = allocation->width - 6; | |
- child_alloc.height = allocation->height - frame->label_req.height - 6; | |
- gtk_container_set_size(widget,&child_alloc); | |
-} | |
- | |
-void gtk_container_size_request(GtkWidget *widget,GtkRequisition *requisition)… | |
- GtkContainer *container; | |
-/*g_print("gtk_container_size_request\n");*/ | |
- container=GTK_CONTAINER(widget); | |
- if (container->child) { | |
-/*g_print("requesting size of child\n");*/ | |
- requisition->width=container->child->requisition.width+ | |
- container->border_width*2; | |
- requisition->height=container->child->requisition.height+ | |
- container->border_width*2; | |
-/* g_print("Container requesting size %d by %d\n",requisition->width, | |
- requisition->height);*/ | |
- } | |
-} | |
- | |
-void gtk_window_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
-/*g_print("gtk_window_size_request\n");*/ | |
- gtk_container_size_request(widget,requisition); | |
- requisition->width+=GetSystemMetrics(SM_CXSIZEFRAME)*2; | |
- requisition->height+=GetSystemMetrics(SM_CYSIZEFRAME)*2+ | |
- GetSystemMetrics(SM_CYCAPTION); | |
- if (GTK_WINDOW(widget)->menu_bar) { | |
- requisition->height+=GetSystemMetrics(SM_CYMENU); | |
- } | |
-} | |
- | |
-void gtk_window_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkAllocation child_alloc; | |
- GtkWindow *window=GTK_WINDOW(widget); | |
- | |
- child_alloc.x=child_alloc.y=0; | |
- child_alloc.width=allocation->width-GetSystemMetrics(SM_CXSIZEFRAME)*2; | |
- child_alloc.height=allocation->height-GetSystemMetrics(SM_CYSIZEFRAME)*2 | |
- -GetSystemMetrics(SM_CYCAPTION); | |
- if (window->menu_bar) { | |
- child_alloc.height-=GetSystemMetrics(SM_CYMENU); | |
- } | |
- gtk_container_set_size(widget,&child_alloc); | |
-} | |
- | |
-void gtk_button_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- SIZE size; | |
- GtkButton *but=GTK_BUTTON(widget); | |
- | |
- gtk_container_size_request(widget,requisition); | |
- | |
- if (GetTextSize(widget->hWnd, but->text, &size, defFont)) { | |
- requisition->width = size.cx + 15; | |
- requisition->height = size.cy + 10; | |
- } | |
-/* g_print("Button %p requesting size %d by %d\n",widget->hWnd, | |
- requisition->width,requisition->height);*/ | |
-} | |
- | |
-BOOL GetTextSize(HWND hWnd, char *text, LPSIZE lpSize, HFONT hFont) { | |
- HDC hDC; | |
- BOOL RetVal=0; | |
- SIZE LineSize; | |
- HFONT oldFont; | |
- char *endpt,*startpt; | |
- | |
- hDC=GetDC(hWnd); | |
- oldFont = SelectObject(hDC, hFont); | |
- | |
- startpt=text; | |
- lpSize->cx=lpSize->cy=0; | |
- | |
- while (startpt) { | |
- endpt=startpt; | |
- while (endpt && *endpt!='\n' && *endpt) endpt++; | |
- if (endpt) { | |
- if ((endpt==startpt && GetTextExtentPoint32(hDC,"W",1,&LineSize)) || | |
- (endpt!=startpt && GetTextExtentPoint32(hDC,startpt, | |
- endpt-startpt,&LineSize))) { | |
- RetVal=1; | |
- if (LineSize.cx > lpSize->cx) lpSize->cx=LineSize.cx; | |
- lpSize->cy+=LineSize.cy; | |
- } | |
- if (*endpt=='\0') break; | |
- startpt=endpt+1; | |
- } else break; | |
- } | |
- SelectObject(hDC,oldFont); | |
- ReleaseDC(hWnd,hDC); | |
- return RetVal; | |
-} | |
- | |
-void gtk_entry_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- SIZE size; | |
- if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) { | |
- requisition->width = size.cx; | |
- requisition->height = size.cy+8; | |
- } | |
+void gtk_window_set_menu(GtkWindow *window, GtkMenuBar *menu_bar) | |
+{ | |
+ HWND hWnd; | |
+ HMENU hMenu; | |
+ | |
+ hWnd = GTK_WIDGET(window)->hWnd; | |
+ hMenu = GTK_MENU_SHELL(menu_bar)->menu; | |
+ | |
+ if (hWnd && hMenu) | |
+ SetMenu(hWnd, hMenu); | |
+ window->menu_bar = menu_bar; | |
} | |
-void gtk_text_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- SIZE size; | |
- if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) { | |
- requisition->width = size.cx; | |
- requisition->height = size.cy*2+8; | |
- } | |
+void gtk_container_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkContainer *container; | |
+ GtkAllocation child_alloc; | |
+ | |
+ container = GTK_CONTAINER(widget); | |
+ if (container->child) { | |
+ child_alloc.x = allocation->x + container->border_width; | |
+ child_alloc.y = allocation->y + container->border_width; | |
+ child_alloc.width = allocation->width - container->border_width * 2; | |
+ child_alloc.height = allocation->height - container->border_width * 2; | |
+ gtk_widget_set_size(container->child, &child_alloc); | |
+ } | |
} | |
-void gtk_frame_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- SIZE size; | |
- GtkFrame *frame=GTK_FRAME(widget); | |
+void gtk_frame_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkFrame *frame; | |
+ GtkAllocation child_alloc; | |
+ | |
+ frame = GTK_FRAME(widget); | |
+ child_alloc.x = allocation->x + 3; | |
+ child_alloc.y = allocation->y + 3 + frame->label_req.height; | |
+ child_alloc.width = allocation->width - 6; | |
+ child_alloc.height = allocation->height - frame->label_req.height - 6; | |
+ gtk_container_set_size(widget, &child_alloc); | |
+} | |
- gtk_container_size_request(widget,requisition); | |
+void gtk_container_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition) | |
+{ | |
+ GtkContainer *container; | |
+ | |
+ container = GTK_CONTAINER(widget); | |
+ if (container->child) { | |
+ requisition->width = container->child->requisition.width + | |
+ container->border_width * 2; | |
+ requisition->height = container->child->requisition.height + | |
+ container->border_width * 2; | |
+ } | |
+} | |
- if (GetTextSize(widget->hWnd, frame->text, &size, defFont)) { | |
- frame->label_req.width = size.cx; | |
- frame->label_req.height = size.cy; | |
- if (size.cx > requisition->width) requisition->width=size.cx; | |
- requisition->width += 6; | |
- requisition->height += size.cy+6; | |
- } | |
-/* g_print("Frame requesting size %d by %d\n",requisition->width, | |
- requisition->height);*/ | |
+void gtk_window_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition) | |
+{ | |
+ gtk_container_size_request(widget, requisition); | |
+ requisition->width += GetSystemMetrics(SM_CXSIZEFRAME) * 2; | |
+ requisition->height += GetSystemMetrics(SM_CYSIZEFRAME) * 2 + | |
+ GetSystemMetrics(SM_CYCAPTION); | |
+ if (GTK_WINDOW(widget)->menu_bar) { | |
+ requisition->height += GetSystemMetrics(SM_CYMENU); | |
+ } | |
} | |
+void gtk_window_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkAllocation child_alloc; | |
+ GtkWindow *window = GTK_WINDOW(widget); | |
+ | |
+ child_alloc.x = child_alloc.y = 0; | |
+ child_alloc.width = | |
+ allocation->width - GetSystemMetrics(SM_CXSIZEFRAME) * 2; | |
+ child_alloc.height = | |
+ allocation->height - GetSystemMetrics(SM_CYSIZEFRAME) * 2 - | |
+ GetSystemMetrics(SM_CYCAPTION); | |
+ if (window->menu_bar) { | |
+ child_alloc.height -= GetSystemMetrics(SM_CYMENU); | |
+ } | |
+ gtk_container_set_size(widget, &child_alloc); | |
+} | |
-void gtk_check_button_size_request(GtkWidget *widget, | |
- GtkRequisition *requisition) { | |
- gtk_button_size_request(widget,requisition); | |
- requisition->width += 10; | |
+void gtk_button_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition) | |
+{ | |
+ SIZE size; | |
+ GtkButton *but = GTK_BUTTON(widget); | |
+ | |
+ gtk_container_size_request(widget, requisition); | |
+ | |
+ if (GetTextSize(widget->hWnd, but->text, &size, defFont)) { | |
+ requisition->width = size.cx + 15; | |
+ requisition->height = size.cy + 10; | |
+ } | |
+} | |
+ | |
+BOOL GetTextSize(HWND hWnd, char *text, LPSIZE lpSize, HFONT hFont) | |
+{ | |
+ HDC hDC; | |
+ BOOL RetVal = 0; | |
+ SIZE LineSize; | |
+ HFONT oldFont; | |
+ char *endpt, *startpt; | |
+ | |
+ hDC = GetDC(hWnd); | |
+ oldFont = SelectObject(hDC, hFont); | |
+ | |
+ startpt = text; | |
+ lpSize->cx = lpSize->cy = 0; | |
+ | |
+ while (startpt) { | |
+ endpt = startpt; | |
+ while (endpt && *endpt != '\n' && *endpt) | |
+ endpt++; | |
+ if (endpt) { | |
+ if ((endpt == startpt | |
+ && GetTextExtentPoint32(hDC, "W", 1, &LineSize)) | |
+ || (endpt != startpt | |
+ && GetTextExtentPoint32(hDC, startpt, endpt - startpt, | |
+ &LineSize))) { | |
+ RetVal = 1; | |
+ if (LineSize.cx > lpSize->cx) | |
+ lpSize->cx = LineSize.cx; | |
+ lpSize->cy += LineSize.cy; | |
+ } | |
+ if (*endpt == '\0') | |
+ break; | |
+ startpt = endpt + 1; | |
+ } else | |
+ break; | |
+ } | |
+ SelectObject(hDC, oldFont); | |
+ ReleaseDC(hWnd, hDC); | |
+ return RetVal; | |
} | |
-GtkWidget *gtk_button_new_with_label(const gchar *label) { | |
- GtkButton *but; | |
- gint i; | |
+void gtk_entry_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
+{ | |
+ SIZE size; | |
+ | |
+ if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) { | |
+ requisition->width = size.cx; | |
+ requisition->height = size.cy + 8; | |
+ } | |
+} | |
- but=GTK_BUTTON(GtkNewObject(&GtkButtonClass)); | |
- but->text = g_strdup(label); | |
- for (i=0;i<strlen(but->text);i++) { | |
- if (but->text[i]=='_') but->text[i]='&'; | |
- } | |
+void gtk_text_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
+{ | |
+ SIZE size; | |
- return GTK_WIDGET(but); | |
+ if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) { | |
+ requisition->width = size.cx; | |
+ requisition->height = size.cy * 2 + 8; | |
+ } | |
} | |
-GtkWidget *gtk_check_button_new_with_label(const gchar *label) { | |
- GtkButton *but; | |
- gint i; | |
+void gtk_frame_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
+{ | |
+ SIZE size; | |
+ GtkFrame *frame = GTK_FRAME(widget); | |
+ | |
+ gtk_container_size_request(widget, requisition); | |
+ | |
+ if (GetTextSize(widget->hWnd, frame->text, &size, defFont)) { | |
+ frame->label_req.width = size.cx; | |
+ frame->label_req.height = size.cy; | |
+ if (size.cx > requisition->width) | |
+ requisition->width = size.cx; | |
+ requisition->width += 6; | |
+ requisition->height += size.cy + 6; | |
+ } | |
+} | |
- but=GTK_BUTTON(GtkNewObject(&GtkCheckButtonClass)); | |
- but->text = g_strdup(label); | |
- for (i=0;i<strlen(but->text);i++) { | |
- if (but->text[i]=='_') but->text[i]='&'; | |
- } | |
- return GTK_WIDGET(but); | |
+void gtk_check_button_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition) | |
+{ | |
+ gtk_button_size_request(widget, requisition); | |
+ requisition->width += 10; | |
} | |
-GtkWidget *gtk_radio_button_new_with_label_from_widget(GtkRadioButton *group, | |
- const gchar *label) { | |
- GSList *list; | |
+GtkWidget *gtk_button_new_with_label(const gchar *label) | |
+{ | |
+ GtkButton *but; | |
+ gint i; | |
+ | |
+ but = GTK_BUTTON(GtkNewObject(&GtkButtonClass)); | |
+ but->text = g_strdup(label); | |
+ for (i = 0; i < strlen(but->text); i++) { | |
+ if (but->text[i] == '_') | |
+ but->text[i] = '&'; | |
+ } | |
- list=gtk_radio_button_group(group); | |
- return (gtk_radio_button_new_with_label(list,label)); | |
+ return GTK_WIDGET(but); | |
} | |
-GtkWidget *gtk_radio_button_new_with_label(GSList *group,const gchar *label) { | |
- GtkButton *but; | |
- GtkRadioButton *radio; | |
- GSList *listpt; | |
- gint i; | |
+GtkWidget *gtk_check_button_new_with_label(const gchar *label) | |
+{ | |
+ GtkButton *but; | |
+ gint i; | |
+ | |
+ but = GTK_BUTTON(GtkNewObject(&GtkCheckButtonClass)); | |
+ but->text = g_strdup(label); | |
+ for (i = 0; i < strlen(but->text); i++) { | |
+ if (but->text[i] == '_') | |
+ but->text[i] = '&'; | |
+ } | |
+ | |
+ return GTK_WIDGET(but); | |
+} | |
+ | |
+GtkWidget *gtk_radio_button_new_with_label_from_widget(GtkRadioButton *group, | |
+ const gchar *label) | |
+{ | |
+ GSList *list; | |
- but=GTK_BUTTON(GtkNewObject(&GtkRadioButtonClass)); | |
- but->text = g_strdup(label); | |
- for (i=0;i<strlen(but->text);i++) { | |
- if (but->text[i]=='_') but->text[i]='&'; | |
- } | |
+ list = gtk_radio_button_group(group); | |
+ return (gtk_radio_button_new_with_label(list, label)); | |
+} | |
+ | |
+GtkWidget *gtk_radio_button_new_with_label(GSList *group, | |
+ const gchar *label) | |
+{ | |
+ GtkButton *but; | |
+ GtkRadioButton *radio; | |
+ GSList *listpt; | |
+ gint i; | |
+ | |
+ but = GTK_BUTTON(GtkNewObject(&GtkRadioButtonClass)); | |
+ but->text = g_strdup(label); | |
+ for (i = 0; i < strlen(but->text); i++) { | |
+ if (but->text[i] == '_') | |
+ but->text[i] = '&'; | |
+ } | |
- if (group==NULL) GTK_TOGGLE_BUTTON(but)->toggled=TRUE; | |
+ if (group == NULL) | |
+ GTK_TOGGLE_BUTTON(but)->toggled = TRUE; | |
- group=g_slist_append(group,GTK_RADIO_BUTTON(but)); | |
- for (listpt=group;listpt;listpt=g_slist_next(listpt)) { | |
- radio=GTK_RADIO_BUTTON(listpt->data); | |
- radio->group = group; | |
- } | |
+ group = g_slist_append(group, GTK_RADIO_BUTTON(but)); | |
+ for (listpt = group; listpt; listpt = g_slist_next(listpt)) { | |
+ radio = GTK_RADIO_BUTTON(listpt->data); | |
+ radio->group = group; | |
+ } | |
- return GTK_WIDGET(but); | |
+ return GTK_WIDGET(but); | |
} | |
-GtkWidget *gtk_label_new(const gchar *text) { | |
- GtkLabel *label; | |
+GtkWidget *gtk_label_new(const gchar *text) | |
+{ | |
+ GtkLabel *label; | |
- label=GTK_LABEL(GtkNewObject(&GtkLabelClass)); | |
- gtk_label_set_text(label,text); | |
+ label = GTK_LABEL(GtkNewObject(&GtkLabelClass)); | |
+ gtk_label_set_text(label, text); | |
- return GTK_WIDGET(label); | |
+ return GTK_WIDGET(label); | |
} | |
GtkWidget *gtk_url_new(const gchar *text, const gchar *target, | |
t@@ -1663,240 +1819,272 @@ GtkWidget *gtk_url_new(const gchar *text, const gcha… | |
GTK_LABEL(url)->text = g_strdup(text); | |
url->target = g_strdup(target); | |
- /* N.B. "bin" is ignored under Win32 */ | |
+ /* N.B. "bin" argument is ignored under Win32 */ | |
return GTK_WIDGET(url); | |
} | |
-GtkWidget *gtk_hbox_new(gboolean homogeneous,gint spacing) { | |
- GtkBox *hbox; | |
+GtkWidget *gtk_hbox_new(gboolean homogeneous, gint spacing) | |
+{ | |
+ GtkBox *hbox; | |
- hbox=GTK_BOX(GtkNewObject(&GtkHBoxClass)); | |
+ hbox = GTK_BOX(GtkNewObject(&GtkHBoxClass)); | |
- hbox->spacing=spacing; | |
- hbox->homogeneous=homogeneous; | |
- return GTK_WIDGET(hbox); | |
+ hbox->spacing = spacing; | |
+ hbox->homogeneous = homogeneous; | |
+ return GTK_WIDGET(hbox); | |
} | |
-GtkWidget *gtk_vbox_new(gboolean homogeneous,gint spacing) { | |
- GtkBox *vbox; | |
+GtkWidget *gtk_vbox_new(gboolean homogeneous, gint spacing) | |
+{ | |
+ GtkBox *vbox; | |
- vbox=GTK_BOX(GtkNewObject(&GtkVBoxClass)); | |
+ vbox = GTK_BOX(GtkNewObject(&GtkVBoxClass)); | |
- vbox->spacing=spacing; | |
- vbox->homogeneous=homogeneous; | |
- return GTK_WIDGET(vbox); | |
+ vbox->spacing = spacing; | |
+ vbox->homogeneous = homogeneous; | |
+ return GTK_WIDGET(vbox); | |
} | |
-GtkWidget *gtk_frame_new(const gchar *text) { | |
- GtkFrame *frame; | |
+GtkWidget *gtk_frame_new(const gchar *text) | |
+{ | |
+ GtkFrame *frame; | |
- frame=GTK_FRAME(GtkNewObject(&GtkFrameClass)); | |
- frame->text = g_strdup(text); | |
-/*g_print("Frame created with caption %s\n",frame->text);*/ | |
+ frame = GTK_FRAME(GtkNewObject(&GtkFrameClass)); | |
+ frame->text = g_strdup(text); | |
- return GTK_WIDGET(frame); | |
+ return GTK_WIDGET(frame); | |
} | |
-GtkWidget *gtk_text_new(GtkAdjustment *hadj,GtkAdjustment *vadj) { | |
- return GTK_WIDGET(GtkNewObject(&GtkTextClass)); | |
+GtkWidget *gtk_text_new(GtkAdjustment *hadj, GtkAdjustment *vadj) | |
+{ | |
+ return GTK_WIDGET(GtkNewObject(&GtkTextClass)); | |
} | |
-GtkWidget *gtk_scrolled_text_new(GtkAdjustment *hadj,GtkAdjustment *vadj, | |
- GtkWidget **pack_widg) { | |
- GtkWidget *text; | |
- text=gtk_text_new(hadj,vadj); | |
- *pack_widg=text; | |
- return text; | |
+GtkWidget *gtk_scrolled_text_new(GtkAdjustment *hadj, GtkAdjustment *vadj, | |
+ GtkWidget **pack_widg) | |
+{ | |
+ GtkWidget *text; | |
+ | |
+ text = gtk_text_new(hadj, vadj); | |
+ *pack_widg = text; | |
+ return text; | |
} | |
-GtkWidget *gtk_entry_new() { | |
- GtkEntry *entry; | |
+GtkWidget *gtk_entry_new() | |
+{ | |
+ GtkEntry *entry; | |
- entry = GTK_ENTRY(GtkNewObject(&GtkEntryClass)); | |
- entry->is_visible = TRUE; | |
+ entry = GTK_ENTRY(GtkNewObject(&GtkEntryClass)); | |
+ entry->is_visible = TRUE; | |
- return GTK_WIDGET(entry); | |
+ return GTK_WIDGET(entry); | |
} | |
-GtkWidget *gtk_clist_new(gint columns) { | |
- GtkCList *clist; | |
- int i; | |
- | |
- clist=GTK_CLIST(GtkNewObject(&GtkCListClass)); | |
- clist->ncols=columns; | |
- clist->cols=g_new0(GtkCListColumn,columns); | |
- for (i=0;i<columns;i++) { | |
- clist->cols[i].width=0; | |
- clist->cols[i].visible=TRUE; | |
- clist->cols[i].resizeable=TRUE; | |
- } | |
+GtkWidget *gtk_clist_new(gint columns) | |
+{ | |
+ GtkCList *clist; | |
+ int i; | |
+ | |
+ clist = GTK_CLIST(GtkNewObject(&GtkCListClass)); | |
+ clist->ncols = columns; | |
+ clist->cols = g_new0(GtkCListColumn, columns); | |
+ for (i = 0; i < columns; i++) { | |
+ clist->cols[i].width = 0; | |
+ clist->cols[i].visible = TRUE; | |
+ clist->cols[i].resizeable = TRUE; | |
+ } | |
- return GTK_WIDGET(clist); | |
+ return GTK_WIDGET(clist); | |
} | |
-GSList *gtk_radio_button_group(GtkRadioButton *radio_button) { | |
- return radio_button->group; | |
+GSList *gtk_radio_button_group(GtkRadioButton *radio_button) | |
+{ | |
+ return radio_button->group; | |
} | |
-static void gtk_editable_sync_text(GtkEditable *editable) { | |
- HWND hWnd; | |
- gint textlen; | |
- gchar *buffer; | |
+static void gtk_editable_sync_text(GtkEditable *editable) | |
+{ | |
+ HWND hWnd; | |
+ gint textlen; | |
+ gchar *buffer; | |
- hWnd=GTK_WIDGET(editable)->hWnd; | |
- if (!hWnd) return; | |
+ hWnd = GTK_WIDGET(editable)->hWnd; | |
+ if (!hWnd) | |
+ return; | |
- textlen=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0); | |
- buffer=g_new(gchar,textlen+1); | |
- SendMessage(hWnd,WM_GETTEXT,(WPARAM)(textlen+1),(LPARAM)buffer); | |
- g_string_assign(editable->text,buffer); | |
- g_free(buffer); | |
+ textlen = SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); | |
+ buffer = g_new(gchar, textlen + 1); | |
+ SendMessage(hWnd, WM_GETTEXT, (WPARAM)(textlen + 1), (LPARAM)buffer); | |
+ g_string_assign(editable->text, buffer); | |
+ g_free(buffer); | |
} | |
-void gtk_editable_insert_text(GtkEditable *editable,const gchar *new_text, | |
- gint new_text_length,gint *position) { | |
- GtkWidget *widget=GTK_WIDGET(editable); | |
- HWND hWnd; | |
- gint i; | |
- GString *newstr; | |
- | |
- gtk_editable_sync_text(editable); | |
- | |
- /* Convert Unix-style lone '\n' to Windows-style '\r\n' */ | |
- newstr=g_string_new(""); | |
- for (i=0;i<new_text_length && new_text[i];i++) { | |
- if (new_text[i]=='\n' && (i==0 || new_text[i-1]!='\r')) { | |
- g_string_append_c(newstr,'\r'); | |
- } | |
- g_string_append_c(newstr,new_text[i]); | |
- } | |
- g_string_insert(editable->text,*position,newstr->str); | |
- | |
- hWnd=widget->hWnd; | |
- if (hWnd) { | |
- SendMessage(hWnd,EM_SETSEL,(WPARAM)*position,(LPARAM)*position); | |
- SendMessage(hWnd,EM_REPLACESEL,(WPARAM)FALSE,(LPARAM)newstr->str); | |
- *position+=newstr->len; | |
- gtk_editable_set_position(editable,*position); | |
- } | |
- g_string_free(newstr,TRUE); | |
-} | |
+void gtk_editable_insert_text(GtkEditable *editable, const gchar *new_text, | |
+ gint new_text_length, gint *position) | |
+{ | |
+ GtkWidget *widget = GTK_WIDGET(editable); | |
+ HWND hWnd; | |
+ gint i; | |
+ GString *newstr; | |
+ | |
+ gtk_editable_sync_text(editable); | |
+ | |
+ /* Convert Unix-style lone '\n' to Windows-style '\r\n' */ | |
+ newstr = g_string_new(""); | |
+ for (i = 0; i < new_text_length && new_text[i]; i++) { | |
+ if (new_text[i] == '\n' && (i == 0 || new_text[i - 1] != '\r')) { | |
+ g_string_append_c(newstr, '\r'); | |
+ } | |
+ g_string_append_c(newstr, new_text[i]); | |
+ } | |
+ g_string_insert(editable->text, *position, newstr->str); | |
+ | |
+ hWnd = widget->hWnd; | |
+ if (hWnd) { | |
+ SendMessage(hWnd, EM_SETSEL, (WPARAM)*position, (LPARAM)*position); | |
+ SendMessage(hWnd, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)newstr->str); | |
+ *position += newstr->len; | |
+ gtk_editable_set_position(editable, *position); | |
+ } | |
+ g_string_free(newstr, TRUE); | |
+} | |
void gtk_editable_delete_text(GtkEditable *editable, | |
- gint start_pos,gint end_pos) { | |
- GtkWidget *widget=GTK_WIDGET(editable); | |
- HWND hWnd; | |
+ gint start_pos, gint end_pos) | |
+{ | |
+ GtkWidget *widget = GTK_WIDGET(editable); | |
+ HWND hWnd; | |
- gtk_editable_sync_text(editable); | |
- if (end_pos < 0 || end_pos >= editable->text->len) | |
- end_pos=editable->text->len; | |
- g_string_erase(editable->text,start_pos,end_pos-start_pos); | |
+ gtk_editable_sync_text(editable); | |
+ if (end_pos < 0 || end_pos >= editable->text->len) | |
+ end_pos = editable->text->len; | |
+ g_string_erase(editable->text, start_pos, end_pos - start_pos); | |
- hWnd=widget->hWnd; | |
- if (hWnd) { | |
- SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)editable->text->str); | |
- } | |
+ hWnd = widget->hWnd; | |
+ if (hWnd) { | |
+ SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)editable->text->str); | |
+ } | |
} | |
gchar *gtk_editable_get_chars(GtkEditable *editable, | |
- gint start_pos,gint end_pos) { | |
- gchar *retbuf; | |
- gint copylen; | |
- gtk_editable_sync_text(editable); | |
- if (end_pos < 0 || end_pos >= editable->text->len) | |
- end_pos=editable->text->len; | |
- copylen=end_pos-start_pos+1; | |
- retbuf=g_new(gchar,copylen); | |
- memcpy(retbuf,&editable->text->str[start_pos],copylen); | |
- retbuf[copylen]='\0'; | |
- return retbuf; | |
+ gint start_pos, gint end_pos) | |
+{ | |
+ gchar *retbuf; | |
+ gint copylen; | |
+ | |
+ gtk_editable_sync_text(editable); | |
+ if (end_pos < 0 || end_pos >= editable->text->len) | |
+ end_pos = editable->text->len; | |
+ copylen = end_pos - start_pos + 1; | |
+ retbuf = g_new(gchar, copylen); | |
+ | |
+ memcpy(retbuf, &editable->text->str[start_pos], copylen); | |
+ retbuf[copylen] = '\0'; | |
+ return retbuf; | |
} | |
-void gtk_editable_set_editable(GtkEditable *editable,gboolean is_editable) { | |
- GtkWidget *widget=GTK_WIDGET(editable); | |
- HWND hWnd; | |
- editable->is_editable=is_editable; | |
- hWnd=widget->hWnd; | |
- if (hWnd) SendMessage(hWnd,EM_SETREADONLY,(WPARAM)(!is_editable),(LPARAM)0); | |
+void gtk_editable_set_editable(GtkEditable *editable, gboolean is_editable) | |
+{ | |
+ GtkWidget *widget = GTK_WIDGET(editable); | |
+ HWND hWnd; | |
+ | |
+ editable->is_editable = is_editable; | |
+ hWnd = widget->hWnd; | |
+ if (hWnd) | |
+ SendMessage(hWnd, EM_SETREADONLY, (WPARAM)(!is_editable), (LPARAM)0); | |
} | |
-void gtk_editable_set_position(GtkEditable *editable,gint position) { | |
- GtkWidget *widget=GTK_WIDGET(editable); | |
- HWND hWnd; | |
- if (!GTK_WIDGET_REALIZED(widget)) return; | |
- hWnd=widget->hWnd; | |
- SendMessage(hWnd,EM_SETSEL,(WPARAM)position,(LPARAM)position); | |
- SendMessage(hWnd,EM_SCROLLCARET,0,0); | |
+void gtk_editable_set_position(GtkEditable *editable, gint position) | |
+{ | |
+ GtkWidget *widget = GTK_WIDGET(editable); | |
+ HWND hWnd; | |
+ | |
+ if (!GTK_WIDGET_REALIZED(widget)) | |
+ return; | |
+ hWnd = widget->hWnd; | |
+ SendMessage(hWnd, EM_SETSEL, (WPARAM)position, (LPARAM)position); | |
+ SendMessage(hWnd, EM_SCROLLCARET, 0, 0); | |
} | |
-gint gtk_editable_get_position(GtkEditable *editable) { | |
- GtkWidget *widget=GTK_WIDGET(editable); | |
- HWND hWnd; | |
- DWORD EndPos; | |
- if (!GTK_WIDGET_REALIZED(widget)) return 0; | |
- hWnd=widget->hWnd; | |
- SendMessage(hWnd,EM_GETSEL,(WPARAM)NULL,(LPARAM)&EndPos); | |
- return (gint)EndPos; | |
+gint gtk_editable_get_position(GtkEditable *editable) | |
+{ | |
+ GtkWidget *widget = GTK_WIDGET(editable); | |
+ HWND hWnd; | |
+ DWORD EndPos; | |
+ | |
+ if (!GTK_WIDGET_REALIZED(widget)) | |
+ return 0; | |
+ hWnd = widget->hWnd; | |
+ SendMessage(hWnd, EM_GETSEL, (WPARAM)NULL, (LPARAM)&EndPos); | |
+ return (gint)EndPos; | |
} | |
-guint gtk_text_get_length(GtkText *text) { | |
- return GTK_EDITABLE(text)->text->len; | |
+guint gtk_text_get_length(GtkText *text) | |
+{ | |
+ return GTK_EDITABLE(text)->text->len; | |
} | |
-void gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean Expand, | |
- gboolean Fill,gint Padding) { | |
- GtkBoxChild *newChild; | |
+void gtk_box_pack_start(GtkBox *box, GtkWidget *child, gboolean Expand, | |
+ gboolean Fill, gint Padding) | |
+{ | |
+ GtkBoxChild *newChild; | |
+ | |
+ newChild = g_new0(GtkBoxChild, 1); | |
- newChild=g_new0(GtkBoxChild,1); | |
- newChild->widget=child; | |
- newChild->expand=Expand; | |
- newChild->fill=Fill; | |
+ newChild->widget = child; | |
+ newChild->expand = Expand; | |
+ newChild->fill = Fill; | |
- box->children = g_list_append(box->children,(gpointer)newChild); | |
- child->parent = GTK_WIDGET(box); | |
- if (GTK_WIDGET_REALIZED(GTK_WIDGET(box))) { | |
- gtk_widget_realize(child); | |
- gtk_widget_update(GTK_WIDGET(box),TRUE); | |
- } | |
+ box->children = g_list_append(box->children, (gpointer)newChild); | |
+ child->parent = GTK_WIDGET(box); | |
+ if (GTK_WIDGET_REALIZED(GTK_WIDGET(box))) { | |
+ gtk_widget_realize(child); | |
+ gtk_widget_update(GTK_WIDGET(box), TRUE); | |
+ } | |
} | |
-void gtk_button_destroy(GtkWidget *widget) { | |
-/* g_print("Destroying button %p\n",widget);*/ | |
- g_free(GTK_BUTTON(widget)->text); | |
+void gtk_button_destroy(GtkWidget *widget) | |
+{ | |
+ g_free(GTK_BUTTON(widget)->text); | |
} | |
-void gtk_frame_destroy(GtkWidget *widget) { | |
- gtk_container_destroy(widget); | |
- g_free(GTK_FRAME(widget)->text); | |
+void gtk_frame_destroy(GtkWidget *widget) | |
+{ | |
+ gtk_container_destroy(widget); | |
+ g_free(GTK_FRAME(widget)->text); | |
} | |
-void gtk_container_destroy(GtkWidget *widget) { | |
- GtkWidget *child=GTK_CONTAINER(widget)->child; | |
-/* g_print("Destroying container %p\n",widget); | |
- if (child) g_print("Destroying container child %p\n",child);*/ | |
- if (child) gtk_widget_destroy(child); | |
+void gtk_container_destroy(GtkWidget *widget) | |
+{ | |
+ GtkWidget *child = GTK_CONTAINER(widget)->child; | |
+ | |
+ if (child) | |
+ gtk_widget_destroy(child); | |
} | |
-void gtk_box_destroy(GtkWidget *widget) { | |
- GtkBoxChild *child; | |
- GList *children; | |
- gtk_container_destroy(widget); | |
+void gtk_box_destroy(GtkWidget *widget) | |
+{ | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ | |
+ gtk_container_destroy(widget); | |
- for (children=GTK_BOX(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
-/* if (child && child->widget) g_print("Destroying box child %p\n",child->w… | |
- if (child && child->widget) gtk_widget_destroy(child->widget); | |
- g_free(child); | |
- } | |
- g_list_free(GTK_BOX(widget)->children); | |
+ for (children = GTK_BOX(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget) | |
+ gtk_widget_destroy(child->widget); | |
+ g_free(child); | |
+ } | |
+ g_list_free(GTK_BOX(widget)->children); | |
} | |
-static void EnableParent(GtkWindow *window) { | |
+static void EnableParent(GtkWindow *window) | |
+{ | |
GtkWidget *parent; | |
- parent=GTK_WIDGET(window)->parent; | |
+ parent = GTK_WIDGET(window)->parent; | |
if (window->modal && parent) { | |
GSList *list; | |
t@@ -1905,13 +2093,14 @@ static void EnableParent(GtkWindow *window) { | |
ourhWnd = GTK_WIDGET(window)->hWnd; | |
parenthWnd = parent->hWnd; | |
- for (list=WindowList;list;list=g_slist_next(list)) { | |
- listwin=GTK_WINDOW(list->data); | |
- if (listwin!=window && listwin->modal | |
+ for (list = WindowList; list; list = g_slist_next(list)) { | |
+ listwin = GTK_WINDOW(list->data); | |
+ if (listwin != window && listwin->modal | |
&& GTK_WIDGET_VISIBLE(GTK_WIDGET(listwin)) | |
- && GTK_WIDGET(listwin)->parent==parent) return; | |
+ && GTK_WIDGET(listwin)->parent == parent) | |
+ return; | |
} | |
- gtk_widget_set_sensitive(parent,TRUE); | |
+ gtk_widget_set_sensitive(parent, TRUE); | |
if (ourhWnd && parenthWnd && ourhWnd == GetActiveWindow()) { | |
SetActiveWindow(parenthWnd); | |
t@@ -1919,819 +2108,931 @@ static void EnableParent(GtkWindow *window) { | |
} | |
} | |
-void gtk_window_destroy(GtkWidget *widget) { | |
- GtkWindow *window=GTK_WINDOW(widget); | |
-// EnableParent(window); | |
-// g_print("gtk_window_destroy on widget %p\n",widget); | |
- WindowList=g_slist_remove(WindowList,(gpointer)window); | |
- gtk_container_destroy(widget); | |
- if (window->accel_group) gtk_accel_group_destroy(window->accel_group); | |
- if (window->hAccel) DestroyAcceleratorTable(window->hAccel); | |
- g_free(window->title); | |
-// if (widget->hWnd) DestroyWindow(widget->hWnd); | |
-// widget->hWnd=NULL; | |
-} | |
- | |
-void gtk_window_show(GtkWidget *widget) { | |
- GtkWindow *window=GTK_WINDOW(widget); | |
- if (window->modal && widget->parent) | |
- gtk_widget_set_sensitive(widget->parent,FALSE); | |
-} | |
- | |
-void gtk_window_hide(GtkWidget *widget) { | |
- GtkWindow *window=GTK_WINDOW(widget); | |
- EnableParent(window); | |
-} | |
- | |
-void gtk_hbox_size_request(GtkWidget *widget, | |
- GtkRequisition *requisition) { | |
- GtkBoxChild *child; | |
- GList *children; | |
- GtkRequisition *child_req; | |
- gint spacing=GTK_BOX(widget)->spacing,numchildren=0; | |
- gint maxreq=0; | |
- gboolean homogeneous=GTK_BOX(widget)->homogeneous; | |
- | |
- for (children=GTK_BOX(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
- if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget)) { | |
- child_req=&child->widget->requisition; | |
- if (homogeneous) { | |
- numchildren++; | |
- if (child_req->width > maxreq) maxreq=child_req->width; | |
- } else { | |
- requisition->width+=child_req->width; | |
- } | |
- if (g_list_next(children)) requisition->width+=spacing; | |
- if (child_req->height > requisition->height) | |
- requisition->height=child_req->height; | |
- } | |
- } | |
- if (homogeneous) requisition->width+=numchildren*maxreq; | |
- GTK_BOX(widget)->maxreq=maxreq; | |
- requisition->width+=2*GTK_CONTAINER(widget)->border_width; | |
- requisition->height+=2*GTK_CONTAINER(widget)->border_width; | |
-} | |
- | |
-void gtk_vbox_size_request(GtkWidget *widget, | |
- GtkRequisition *requisition) { | |
- GtkBoxChild *child; | |
- GList *children; | |
- GtkRequisition *child_req; | |
- gint spacing=GTK_BOX(widget)->spacing,numchildren=0; | |
- gint maxreq=0; | |
- gboolean homogeneous=GTK_BOX(widget)->homogeneous; | |
- | |
- for (children=GTK_BOX(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
- if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget)) { | |
- child_req=&child->widget->requisition; | |
- if (homogeneous) { | |
- numchildren++; | |
- if (child_req->height > maxreq) maxreq=child_req->height; | |
- } else { | |
- requisition->height+=child_req->height; | |
- } | |
- if (g_list_next(children)) requisition->height+=spacing; | |
- if (child_req->width > requisition->width) | |
- requisition->width=child_req->width; | |
- } | |
- } | |
- if (homogeneous) requisition->height+=numchildren*maxreq; | |
- GTK_BOX(widget)->maxreq=maxreq; | |
- requisition->width+=2*GTK_CONTAINER(widget)->border_width; | |
- requisition->height+=2*GTK_CONTAINER(widget)->border_width; | |
-} | |
- | |
-static void gtk_box_count_children(GtkBox *box,gint16 allocation, | |
- gint16 requisition,gint *extra) { | |
- GtkBoxChild *child; | |
- GList *children; | |
- gint NumCanExpand=0; | |
- | |
- for (children=box->children;children;children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
- if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget) && | |
- child->expand) NumCanExpand++; | |
- } | |
- | |
- *extra = allocation-requisition; | |
- if (NumCanExpand>0) *extra /= NumCanExpand; | |
-} | |
- | |
-static void gtk_box_size_child(GtkBox *box,GtkBoxChild *child, | |
- gint extra,gint16 maxpos,gint16 requisition, | |
- gint16 *pos,gint16 *size, | |
- GList *listpt,gint16 *curpos) { | |
- gboolean TooSmall=FALSE; | |
- *pos=*curpos; | |
- if (extra<0) { | |
- extra=0; | |
- TooSmall=TRUE; | |
- } | |
- if (child->expand && child->fill) { | |
- *size=requisition+extra; | |
- *curpos+=requisition+extra; | |
- } else if (child->expand) { | |
- *size=requisition; | |
- *pos+=extra/2; | |
- *curpos+=requisition+extra; | |
- } else { | |
- *size=requisition; | |
- *curpos+=requisition; | |
- } | |
- if (g_list_next(listpt)) *curpos+=box->spacing; | |
- if (TooSmall) { | |
- if (*pos >= maxpos) { *pos=*size=0; } | |
- else if (*pos+*size > maxpos) { *size=maxpos-*pos; } | |
- } | |
-} | |
- | |
-void gtk_hbox_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkBox *box; | |
- GtkBoxChild *child; | |
- GList *children; | |
- GtkAllocation child_alloc; | |
- gint extra; | |
- gint16 curpos; | |
- gint maxpos,height,border_width; | |
- | |
- border_width=GTK_CONTAINER(widget)->border_width; | |
- maxpos=allocation->x+allocation->width-border_width; | |
- height=allocation->height-2*border_width; | |
- | |
- box=GTK_BOX(widget); | |
- | |
- curpos = allocation->x+border_width; | |
- gtk_box_count_children(box,allocation->width,widget->requisition.width, | |
- &extra); | |
- | |
- for (children=box->children;children;children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
- if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget)) { | |
- gtk_box_size_child(box,child,extra,maxpos, | |
- box->homogeneous ? box->maxreq : | |
- child->widget->requisition.width, | |
- &child_alloc.x,&child_alloc.width, | |
- children,&curpos); | |
- child_alloc.y = allocation->y+border_width; | |
- child_alloc.height = height; | |
- gtk_widget_set_size(child->widget,&child_alloc); | |
- } | |
- } | |
-} | |
- | |
-void gtk_vbox_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkBox *box; | |
- GtkBoxChild *child; | |
- GList *children; | |
- GtkAllocation child_alloc; | |
- gint extra; | |
- gint16 curpos; | |
- gint width,maxpos,border_width; | |
- | |
- border_width=GTK_CONTAINER(widget)->border_width; | |
- width=allocation->width-2*border_width; | |
- maxpos=allocation->y+allocation->height-border_width; | |
- | |
- box=GTK_BOX(widget); | |
- | |
- curpos = allocation->y+border_width; | |
- gtk_box_count_children(box,allocation->height,widget->requisition.height, | |
- &extra); | |
- | |
- for (children=box->children;children;children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
- if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget)) { | |
- gtk_box_size_child(box,child,extra,maxpos, | |
- box->homogeneous ? box->maxreq : | |
- child->widget->requisition.height, | |
- &child_alloc.y,&child_alloc.height, | |
- children,&curpos); | |
- child_alloc.x = allocation->x+border_width; | |
- child_alloc.width = width; | |
- gtk_widget_set_size(child->widget,&child_alloc); | |
- } | |
- } | |
-} | |
- | |
-void gtk_window_realize(GtkWidget *widget) { | |
- GtkWindow *win=GTK_WINDOW(widget); | |
- HWND Parent; | |
- DWORD resize=0; | |
- | |
- if (win->allow_shrink || win->allow_grow) resize=WS_SIZEBOX; | |
- | |
- Parent=gtk_get_parent_hwnd(widget->parent); | |
- if (win->type==GTK_WINDOW_TOPLEVEL) { | |
- widget->hWnd = CreateWindow("mainwin",win->title, | |
- WS_OVERLAPPEDWINDOW|CS_HREDRAW|CS_VREDRAW|resize, | |
- CW_USEDEFAULT,0,0,0,Parent,NULL,hInst,NULL); | |
- if (!TopLevel) TopLevel=widget->hWnd; | |
- } else { | |
- widget->hWnd = CreateWindow(WC_GTKDIALOG,win->title, | |
- WS_CAPTION|WS_SYSMENU|CS_HREDRAW|CS_VREDRAW|resize, | |
- CW_USEDEFAULT,0,0,0,Parent,NULL,hInst,NULL); | |
- } | |
- WindowList=g_slist_append(WindowList,(gpointer)win); | |
- gtk_set_default_font(widget->hWnd); | |
-/* g_print("Window window %p created\n",widget->hWnd);*/ | |
- gtk_container_realize(widget); | |
- | |
- if (win->accel_group && win->accel_group->numaccel) { | |
- win->hAccel = CreateAcceleratorTable(win->accel_group->accel, | |
- win->accel_group->numaccel); | |
- } | |
-// if (win->focus && win->focus->hWnd) SetFocus(win->focus->hWnd); | |
-} | |
- | |
-void gtk_container_realize(GtkWidget *widget) { | |
- GtkWidget *child=GTK_CONTAINER(widget)->child; | |
-/*g_print("Realizing container\n"); | |
- if (child) g_print("Realizing container widget %p\n",child);*/ | |
- if (child) gtk_widget_realize(child); | |
-} | |
- | |
-void gtk_box_realize(GtkWidget *widget) { | |
- GtkBoxChild *child; | |
- GList *children; | |
- | |
-/* g_print("Realizing box...\n");*/ | |
- gtk_container_realize(widget); | |
- | |
- for (children=GTK_BOX(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
-/* if (child) g_print("Realizing box widget %p\n",child);*/ | |
- if (child && child->widget) gtk_widget_realize(child->widget); | |
- } | |
-} | |
- | |
-HWND gtk_get_parent_hwnd(GtkWidget *widget) { | |
- widget=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- if (widget) return widget->hWnd; else return NULL; | |
-} | |
- | |
-void gtk_button_realize(GtkWidget *widget) { | |
- GtkButton *but=GTK_BUTTON(widget); | |
- HWND Parent; | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- Parent=gtk_get_parent_hwnd(widget); | |
- widget->hWnd = CreateWindow("BUTTON",but->text, | |
- WS_CHILD|WS_TABSTOP| | |
- (GTK_WIDGET_FLAGS(widget)>K_IS_DEFAULT ? | |
- BS_DEFPUSHBUTTON : BS_PUSHBUTTON), | |
- widget->allocation.x,widget->allocation.y, | |
- widget->allocation.width,widget->allocation.height, | |
- Parent,NULL,hInst,NULL); | |
- gtk_set_default_font(widget->hWnd); | |
-} | |
- | |
-void gtk_entry_realize(GtkWidget *widget) { | |
- HWND Parent; | |
- Parent=gtk_get_parent_hwnd(widget); | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","", | |
- WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL, | |
- widget->allocation.x,widget->allocation.y, | |
- widget->allocation.width,widget->allocation.height, | |
- Parent,NULL,hInst,NULL); | |
-/* Subclass the window (we assume that all edit boxes have the same window | |
- procedure) */ | |
- wpOrigEntryProc = (WNDPROC) SetWindowLong(widget->hWnd, | |
- GWL_WNDPROC, | |
- (LONG)EntryWndProc); | |
- gtk_set_default_font(widget->hWnd); | |
- gtk_editable_set_editable(GTK_EDITABLE(widget), | |
- GTK_EDITABLE(widget)->is_editable); | |
- gtk_entry_set_visibility(GTK_ENTRY(widget),GTK_ENTRY(widget)->is_visible); | |
- SendMessage(widget->hWnd,WM_SETTEXT,0, | |
- (LPARAM)GTK_EDITABLE(widget)->text->str); | |
-} | |
- | |
-void gtk_text_realize(GtkWidget *widget) { | |
- HWND Parent; | |
- gboolean editable; | |
- | |
- Parent=gtk_get_parent_hwnd(widget); | |
- editable=GTK_EDITABLE(widget)->is_editable; | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","", | |
- WS_CHILD|(editable ? WS_TABSTOP : 0)| | |
- ES_MULTILINE|ES_WANTRETURN|WS_VSCROLL| | |
- (GTK_TEXT(widget)->word_wrap ? 0 : ES_AUTOHSCROLL), | |
- 0,0,0,0,Parent,NULL,hInst,NULL); | |
-/* Subclass the window (we assume that all multiline edit boxes have the same | |
- window procedure) */ | |
- wpOrigTextProc = (WNDPROC) SetWindowLong(widget->hWnd, | |
- GWL_WNDPROC, | |
- (LONG)TextWndProc); | |
- gtk_set_default_font(widget->hWnd); | |
- gtk_editable_set_editable(GTK_EDITABLE(widget), | |
- GTK_EDITABLE(widget)->is_editable); | |
- SendMessage(widget->hWnd,WM_SETTEXT,0, | |
- (LPARAM)GTK_EDITABLE(widget)->text->str); | |
-} | |
- | |
-void gtk_frame_realize(GtkWidget *widget) { | |
- GtkFrame *frame=GTK_FRAME(widget); | |
- HWND Parent; | |
- gtk_container_realize(widget); | |
- Parent=gtk_get_parent_hwnd(widget); | |
-/*g_print("Creating frame window with caption %s\n",frame->text);*/ | |
- widget->hWnd = CreateWindow("BUTTON",frame->text, | |
- WS_CHILD|BS_GROUPBOX, | |
- widget->allocation.x,widget->allocation.y, | |
- widget->allocation.width,widget->allocation.height, | |
- Parent,NULL,hInst,NULL); | |
- gtk_set_default_font(widget->hWnd); | |
-} | |
- | |
-void gtk_check_button_realize(GtkWidget *widget) { | |
- GtkButton *but=GTK_BUTTON(widget); | |
- HWND Parent; | |
- gboolean toggled; | |
- Parent=gtk_get_parent_hwnd(widget); | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- widget->hWnd = CreateWindow("BUTTON",but->text, | |
- WS_CHILD|WS_TABSTOP|BS_CHECKBOX, | |
- widget->allocation.x,widget->allocation.y, | |
- widget->allocation.width,widget->allocation.height, | |
- Parent,NULL,hInst,NULL); | |
- gtk_set_default_font(widget->hWnd); | |
- gtk_signal_connect(GTK_OBJECT(widget),"clicked", | |
- gtk_toggle_button_toggled,NULL); | |
- gtk_signal_connect(GTK_OBJECT(widget),"toggled", | |
- gtk_check_button_toggled,NULL); | |
- toggled=GTK_TOGGLE_BUTTON(widget)->toggled; | |
- GTK_TOGGLE_BUTTON(widget)->toggled = !toggled; | |
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),toggled); | |
-} | |
- | |
-void gtk_radio_button_realize(GtkWidget *widget) { | |
- GtkButton *but=GTK_BUTTON(widget); | |
- HWND Parent; | |
- gboolean toggled; | |
- Parent=gtk_get_parent_hwnd(widget); | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- widget->hWnd = CreateWindow("BUTTON",but->text, | |
- WS_CHILD|WS_TABSTOP|BS_RADIOBUTTON, | |
- widget->allocation.x,widget->allocation.y, | |
- widget->allocation.width,widget->allocation.height, | |
- Parent,NULL,hInst,NULL); | |
- gtk_set_default_font(widget->hWnd); | |
- gtk_signal_connect(GTK_OBJECT(widget),"clicked", | |
- gtk_radio_button_clicked,NULL); | |
- gtk_signal_connect(GTK_OBJECT(widget),"toggled", | |
- gtk_radio_button_toggled,NULL); | |
- toggled=GTK_TOGGLE_BUTTON(widget)->toggled; | |
- GTK_TOGGLE_BUTTON(widget)->toggled = !toggled; | |
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),toggled); | |
-} | |
- | |
-void gtk_radio_button_destroy(GtkWidget *widget) { | |
- GSList *group,*listpt; | |
- GtkRadioButton *radio; | |
- | |
- gtk_button_destroy(widget); | |
- group=GTK_RADIO_BUTTON(widget)->group; | |
- group=g_slist_remove(group,GTK_RADIO_BUTTON(widget)); | |
- for (listpt=group;listpt;listpt=g_slist_next(listpt)) { | |
- radio=GTK_RADIO_BUTTON(listpt->data); | |
- radio->group = group; | |
- } | |
-} | |
- | |
- | |
-void gtk_clist_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- SIZE size; | |
- | |
- if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) { | |
- requisition->width = size.cx; | |
- requisition->height = size.cy*6+12; | |
- } | |
-} | |
- | |
-void gtk_clist_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkCList *clist=GTK_CLIST(widget); | |
- gtk_container_set_size(widget,allocation); | |
- if (clist->header) { | |
- SetWindowPos(clist->header,HWND_TOP, | |
- allocation->x,allocation->y, | |
- allocation->width,clist->header_size, | |
- SWP_NOZORDER); | |
- allocation->y+=clist->header_size-1; | |
- allocation->height-=clist->header_size-1; | |
- } | |
-} | |
- | |
-void gtk_clist_realize(GtkWidget *widget) { | |
- HWND Parent,header; | |
- HD_LAYOUT hdl; | |
- HD_ITEM hdi; | |
- RECT rcParent; | |
- WINDOWPOS wp; | |
- GtkCList *clist=GTK_CLIST(widget); | |
- GSList *rows; | |
- GtkCListRow *row; | |
- gint i; | |
- | |
- gtk_container_realize(widget); | |
- Parent=gtk_get_parent_hwnd(widget); | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- rcParent.left = rcParent.top = 0; | |
- rcParent.right = rcParent.bottom = 800; | |
- header=CreateWindowEx(0,WC_HEADER,NULL, | |
- WS_CHILD|WS_BORDER|HDS_HORZ | |
- | (GTK_CLIST(widget)->cols[0].button_passive ? | |
- 0 : HDS_BUTTONS), | |
- 0,0,0,0,Parent,NULL,hInst,NULL); | |
- SetWindowLong(header,GWL_USERDATA,(LONG)widget); | |
- GTK_CLIST(widget)->header=header; | |
- gtk_set_default_font(header); | |
- hdl.prc = &rcParent; | |
- hdl.pwpos = ℘ | |
- SendMessage(header,HDM_LAYOUT,0,(LPARAM)&hdl); | |
- clist->header_size=wp.cy; | |
- widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"LISTBOX","", | |
- WS_CHILD|WS_TABSTOP|LBS_DISABLENOSCROLL| | |
- WS_VSCROLL| | |
- LBS_OWNERDRAWFIXED|LBS_NOTIFY, | |
- 0,0,0,0,Parent,NULL,hInst,NULL); | |
- gtk_set_default_font(widget->hWnd); | |
- | |
- gtk_clist_update_all_widths(clist); | |
- for (rows=clist->rows;rows;rows=g_slist_next(rows)) { | |
- row=(GtkCListRow *)rows->data; | |
- if (row) SendMessage(widget->hWnd,LB_ADDSTRING,0,(LPARAM)row->data); | |
- } | |
- | |
- for (i=0;i<clist->ncols;i++) { | |
- hdi.mask = HDI_TEXT|HDI_FORMAT|HDI_WIDTH; | |
- hdi.pszText=clist->cols[i].title; | |
- if (hdi.pszText) { | |
- if (i==clist->ncols-1) hdi.cxy=9000; | |
- else hdi.cxy=clist->cols[i].width; | |
- hdi.cchTextMax=strlen(hdi.pszText); | |
- hdi.fmt = HDF_LEFT|HDF_STRING; | |
- SendMessage(header,HDM_INSERTITEM,i+1,(LPARAM)&hdi); | |
- } | |
- } | |
- | |
-} | |
- | |
-void gtk_clist_show(GtkWidget *widget) { | |
- if (GTK_WIDGET_REALIZED(widget)) { | |
- ShowWindow(GTK_CLIST(widget)->header,SW_SHOWNORMAL); | |
- } | |
-} | |
- | |
-void gtk_clist_hide(GtkWidget *widget) { | |
- if (GTK_WIDGET_REALIZED(widget)) { | |
- ShowWindow(GTK_CLIST(widget)->header,SW_HIDE); | |
- } | |
-} | |
- | |
-void gtk_clist_draw_row(GtkCList *clist,LPDRAWITEMSTRUCT lpdis) { | |
- HBRUSH bkgrnd; | |
- COLORREF textcol,oldtextcol; | |
- RECT rcCol; | |
- gint i,CurrentX; | |
- GtkCListRow *row; | |
- | |
- if (lpdis->itemState&ODS_SELECTED) { | |
- bkgrnd=(HBRUSH)(1+COLOR_HIGHLIGHT); | |
- textcol=(COLORREF)GetSysColor(COLOR_HIGHLIGHTTEXT); | |
- } else { | |
- bkgrnd=(HBRUSH)(1+COLOR_WINDOW); | |
- textcol=(COLORREF)GetSysColor(COLOR_WINDOWTEXT); | |
- } | |
- oldtextcol=SetTextColor(lpdis->hDC,textcol); | |
- SetBkMode(lpdis->hDC,TRANSPARENT); | |
- FillRect(lpdis->hDC,&lpdis->rcItem,bkgrnd); | |
- | |
- if (lpdis->itemID >= 0 && lpdis->itemID < g_slist_length(clist->rows)) { | |
- row=(GtkCListRow *)g_slist_nth_data(clist->rows,lpdis->itemID); | |
- CurrentX=lpdis->rcItem.left; | |
- rcCol.top=lpdis->rcItem.top; | |
- rcCol.bottom=lpdis->rcItem.bottom; | |
- if (row->text) for (i=0;i<clist->ncols;i++) { | |
- rcCol.left=CurrentX+LISTITEMHPACK; | |
- CurrentX+=clist->cols[i].width; | |
- rcCol.right=CurrentX-LISTITEMHPACK; | |
- if (rcCol.left > lpdis->rcItem.right) rcCol.left=lpdis->rcItem.right; | |
- if (rcCol.right > lpdis->rcItem.right) rcCol.right=lpdis->rcItem.righ… | |
- if (i==clist->ncols-1) rcCol.right=lpdis->rcItem.right; | |
- if (row->text[i]) { | |
- DrawText(lpdis->hDC,row->text[i],-1,&rcCol, | |
- DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS); | |
- } | |
- } | |
- } | |
+void gtk_window_destroy(GtkWidget *widget) | |
+{ | |
+ GtkWindow *window = GTK_WINDOW(widget); | |
- SetTextColor(lpdis->hDC,oldtextcol); | |
- SetBkMode(lpdis->hDC,OPAQUE); | |
- if (lpdis->itemState&ODS_FOCUS) DrawFocusRect(lpdis->hDC,&lpdis->rcItem); | |
+ WindowList = g_slist_remove(WindowList, (gpointer)window); | |
+ gtk_container_destroy(widget); | |
+ if (window->accel_group) | |
+ gtk_accel_group_destroy(window->accel_group); | |
+ if (window->hAccel) | |
+ DestroyAcceleratorTable(window->hAccel); | |
+ g_free(window->title); | |
} | |
-void gtk_clist_do_auto_resize(GtkCList *clist) { | |
- gint i; | |
- for (i=0;i<clist->ncols;i++) if (clist->cols[i].auto_resize) { | |
- gtk_clist_set_column_width(clist,i,clist->cols[i].width); | |
- } | |
+void gtk_window_show(GtkWidget *widget) | |
+{ | |
+ GtkWindow *window = GTK_WINDOW(widget); | |
+ | |
+ if (window->modal && widget->parent) | |
+ gtk_widget_set_sensitive(widget->parent, FALSE); | |
} | |
-void gtk_clist_update_all_widths(GtkCList *clist) { | |
- GSList *list; | |
- GtkCListRow *row; | |
- gint i; | |
- SIZE size; | |
- HWND header; | |
+void gtk_window_hide(GtkWidget *widget) | |
+{ | |
+ GtkWindow *window = GTK_WINDOW(widget); | |
- header=clist->header; | |
- if (header) for (i=0;i<clist->ncols;i++) { | |
- if (GetTextSize(header, clist->cols[i].title, &size, defFont) && | |
- clist->cols[i].width<size.cx+2*LISTHEADERPACK) { | |
- clist->cols[i].width=size.cx+2*LISTHEADERPACK; | |
+ EnableParent(window); | |
+} | |
+ | |
+void gtk_hbox_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
+{ | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ GtkRequisition *child_req; | |
+ gint spacing = GTK_BOX(widget)->spacing, numchildren = 0; | |
+ gint maxreq = 0; | |
+ gboolean homogeneous = GTK_BOX(widget)->homogeneous; | |
+ | |
+ for (children = GTK_BOX(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget)) { | |
+ child_req = &child->widget->requisition; | |
+ if (homogeneous) { | |
+ numchildren++; | |
+ if (child_req->width > maxreq) | |
+ maxreq = child_req->width; | |
+ } else { | |
+ requisition->width += child_req->width; | |
} | |
- } | |
- | |
- for (list=clist->rows;list;list=g_slist_next(list)) { | |
- row=(GtkCListRow *)list->data; | |
- if (row && row->text) gtk_clist_update_widths(clist,row->text); | |
- } | |
-} | |
- | |
-void gtk_clist_update_widths(GtkCList *clist,gchar *text[]) { | |
- gint i; | |
- SIZE size; | |
- HWND hWnd; | |
- hWnd=GTK_WIDGET(clist)->hWnd; | |
- if (!hWnd) return; | |
- for (i=0;i<clist->ncols;i++) { | |
- if (clist->cols[i].auto_resize | |
- && GetTextSize(hWnd, text[i], &size, defFont) | |
- && size.cx+2*LISTITEMHPACK > clist->cols[i].width) { | |
- clist->cols[i].width = size.cx+2*LISTITEMHPACK; | |
+ if (g_list_next(children)) | |
+ requisition->width += spacing; | |
+ if (child_req->height > requisition->height) | |
+ requisition->height = child_req->height; | |
+ } | |
+ } | |
+ if (homogeneous) | |
+ requisition->width += numchildren * maxreq; | |
+ GTK_BOX(widget)->maxreq = maxreq; | |
+ requisition->width += 2 * GTK_CONTAINER(widget)->border_width; | |
+ requisition->height += 2 * GTK_CONTAINER(widget)->border_width; | |
+} | |
+ | |
+void gtk_vbox_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
+{ | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ GtkRequisition *child_req; | |
+ gint spacing = GTK_BOX(widget)->spacing, numchildren = 0; | |
+ gint maxreq = 0; | |
+ gboolean homogeneous = GTK_BOX(widget)->homogeneous; | |
+ | |
+ for (children = GTK_BOX(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget)) { | |
+ child_req = &child->widget->requisition; | |
+ if (homogeneous) { | |
+ numchildren++; | |
+ if (child_req->height > maxreq) | |
+ maxreq = child_req->height; | |
+ } else { | |
+ requisition->height += child_req->height; | |
} | |
- } | |
+ if (g_list_next(children)) | |
+ requisition->height += spacing; | |
+ if (child_req->width > requisition->width) | |
+ requisition->width = child_req->width; | |
+ } | |
+ } | |
+ if (homogeneous) | |
+ requisition->height += numchildren * maxreq; | |
+ GTK_BOX(widget)->maxreq = maxreq; | |
+ requisition->width += 2 * GTK_CONTAINER(widget)->border_width; | |
+ requisition->height += 2 * GTK_CONTAINER(widget)->border_width; | |
} | |
-gint gtk_clist_insert(GtkCList *clist,gint row,gchar *text[]) { | |
- GtkWidget *widget=GTK_WIDGET(clist); | |
- HWND hWnd; | |
- GtkCListRow *new_row; | |
- gint i; | |
+static void gtk_box_count_children(GtkBox *box, gint16 allocation, | |
+ gint16 requisition, gint *extra) | |
+{ | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ gint NumCanExpand = 0; | |
+ | |
+ for (children = box->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget) && | |
+ child->expand) | |
+ NumCanExpand++; | |
+ } | |
- if (row<0) row=g_slist_length(clist->rows); | |
+ *extra = allocation - requisition; | |
+ if (NumCanExpand > 0) | |
+ *extra /= NumCanExpand; | |
+} | |
- new_row=g_new0(GtkCListRow,1); | |
- new_row->text=g_new0(gchar *,clist->ncols); | |
- for (i=0;i<clist->ncols;i++) { | |
- new_row->text[i]=g_strdup(text[i]); | |
- } | |
- gtk_clist_update_widths(clist,new_row->text); | |
- gtk_clist_do_auto_resize(clist); | |
- clist->rows=g_slist_insert(clist->rows,(gpointer)new_row,row); | |
+static void gtk_box_size_child(GtkBox *box, GtkBoxChild *child, | |
+ gint extra, gint16 maxpos, | |
+ gint16 requisition, gint16 *pos, | |
+ gint16 *size, GList *listpt, gint16 *curpos) | |
+{ | |
+ gboolean TooSmall = FALSE; | |
- if (GTK_WIDGET_REALIZED(widget)) { | |
- hWnd=widget->hWnd; | |
- SendMessage(hWnd,LB_INSERTSTRING,(WPARAM)row,(LPARAM)NULL); | |
- } | |
+ *pos = *curpos; | |
+ if (extra < 0) { | |
+ extra = 0; | |
+ TooSmall = TRUE; | |
+ } | |
+ if (child->expand && child->fill) { | |
+ *size = requisition + extra; | |
+ *curpos += requisition + extra; | |
+ } else if (child->expand) { | |
+ *size = requisition; | |
+ *pos += extra / 2; | |
+ *curpos += requisition + extra; | |
+ } else { | |
+ *size = requisition; | |
+ *curpos += requisition; | |
+ } | |
+ if (g_list_next(listpt)) | |
+ *curpos += box->spacing; | |
+ if (TooSmall) { | |
+ if (*pos >= maxpos) { | |
+ *pos = *size = 0; | |
+ } else if (*pos + *size > maxpos) { | |
+ *size = maxpos - *pos; | |
+ } | |
+ } | |
+} | |
- return row; | |
+void gtk_hbox_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkBox *box; | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ GtkAllocation child_alloc; | |
+ gint extra; | |
+ gint16 curpos; | |
+ gint maxpos, height, border_width; | |
+ | |
+ border_width = GTK_CONTAINER(widget)->border_width; | |
+ maxpos = allocation->x + allocation->width - border_width; | |
+ height = allocation->height - 2 * border_width; | |
+ | |
+ box = GTK_BOX(widget); | |
+ | |
+ curpos = allocation->x + border_width; | |
+ gtk_box_count_children(box, allocation->width, widget->requisition.width, | |
+ &extra); | |
+ | |
+ for (children = box->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget)) { | |
+ gtk_box_size_child(box, child, extra, maxpos, | |
+ box->homogeneous ? box->maxreq : | |
+ child->widget->requisition.width, | |
+ &child_alloc.x, &child_alloc.width, | |
+ children, &curpos); | |
+ child_alloc.y = allocation->y + border_width; | |
+ child_alloc.height = height; | |
+ gtk_widget_set_size(child->widget, &child_alloc); | |
+ } | |
+ } | |
} | |
-GtkWidget *gtk_clist_new_with_titles(gint columns,gchar *titles[]) { | |
- GtkWidget *widget; | |
- GtkCList *clist; | |
- gint i; | |
+void gtk_vbox_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkBox *box; | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ GtkAllocation child_alloc; | |
+ gint extra; | |
+ gint16 curpos; | |
+ gint width, maxpos, border_width; | |
+ | |
+ border_width = GTK_CONTAINER(widget)->border_width; | |
+ width = allocation->width - 2 * border_width; | |
+ maxpos = allocation->y + allocation->height - border_width; | |
+ | |
+ box = GTK_BOX(widget); | |
+ | |
+ curpos = allocation->y + border_width; | |
+ gtk_box_count_children(box, allocation->height, | |
+ widget->requisition.height, &extra); | |
+ | |
+ for (children = box->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget && GTK_WIDGET_VISIBLE(child->widget)) { | |
+ gtk_box_size_child(box, child, extra, maxpos, | |
+ box->homogeneous ? box->maxreq : | |
+ child->widget->requisition.height, | |
+ &child_alloc.y, &child_alloc.height, | |
+ children, &curpos); | |
+ child_alloc.x = allocation->x + border_width; | |
+ child_alloc.width = width; | |
+ gtk_widget_set_size(child->widget, &child_alloc); | |
+ } | |
+ } | |
+} | |
- widget=gtk_clist_new(columns); | |
- clist=GTK_CLIST(widget); | |
- for (i=0;i<clist->ncols;i++) { | |
- gtk_clist_set_column_title(clist,i,titles[i]); | |
- } | |
- return widget; | |
+void gtk_window_realize(GtkWidget *widget) | |
+{ | |
+ GtkWindow *win = GTK_WINDOW(widget); | |
+ HWND Parent; | |
+ DWORD resize = 0; | |
+ | |
+ if (win->allow_shrink || win->allow_grow) | |
+ resize = WS_SIZEBOX; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget->parent); | |
+ if (win->type == GTK_WINDOW_TOPLEVEL) { | |
+ widget->hWnd = CreateWindow("mainwin", win->title, | |
+ WS_OVERLAPPEDWINDOW | CS_HREDRAW | | |
+ CS_VREDRAW | resize, CW_USEDEFAULT, 0, 0, | |
+ 0, Parent, NULL, hInst, NULL); | |
+ if (!TopLevel) | |
+ TopLevel = widget->hWnd; | |
+ } else { | |
+ widget->hWnd = CreateWindow(WC_GTKDIALOG, win->title, | |
+ WS_CAPTION | WS_SYSMENU | CS_HREDRAW | | |
+ CS_VREDRAW | resize, CW_USEDEFAULT, 0, 0, | |
+ 0, Parent, NULL, hInst, NULL); | |
+ } | |
+ WindowList = g_slist_append(WindowList, (gpointer)win); | |
+ gtk_set_default_font(widget->hWnd); | |
+ gtk_container_realize(widget); | |
+ | |
+ if (win->accel_group && win->accel_group->numaccel) { | |
+ win->hAccel = CreateAcceleratorTable(win->accel_group->accel, | |
+ win->accel_group->numaccel); | |
+ } | |
} | |
-GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns,gchar *titles[], | |
- GtkWidget **pack_widg) { | |
- GtkWidget *widget; | |
- widget=gtk_clist_new_with_titles(columns,titles); | |
- *pack_widg=widget; | |
- return widget; | |
+void gtk_container_realize(GtkWidget *widget) | |
+{ | |
+ GtkWidget *child = GTK_CONTAINER(widget)->child; | |
+ | |
+ if (child) | |
+ gtk_widget_realize(child); | |
} | |
-gint gtk_clist_append(GtkCList *clist,gchar *text[]) { | |
- return gtk_clist_insert(clist,-1,text); | |
+void gtk_box_realize(GtkWidget *widget) | |
+{ | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ | |
+ gtk_container_realize(widget); | |
+ | |
+ for (children = GTK_BOX(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget) | |
+ gtk_widget_realize(child->widget); | |
+ } | |
} | |
-void gtk_clist_set_column_title(GtkCList *clist,gint column, | |
- const gchar *title) { | |
- HWND hWnd; | |
- if (column<0 || column>=clist->ncols) return; | |
- g_free(clist->cols[column].title); | |
- clist->cols[column].title=g_strdup(title); | |
- if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) { | |
- hWnd=GTK_WIDGET(clist)->hWnd; | |
- InvalidateRect(hWnd,NULL,FALSE); | |
- UpdateWindow(hWnd); | |
- } | |
+HWND gtk_get_parent_hwnd(GtkWidget *widget) | |
+{ | |
+ widget = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ if (widget) | |
+ return widget->hWnd; | |
+ else | |
+ return NULL; | |
} | |
-void gtk_clist_column_title_passive(GtkCList *clist,gint column) { | |
- if (column>=0 && column<clist->ncols) | |
- clist->cols[column].button_passive=TRUE; | |
+void gtk_button_realize(GtkWidget *widget) | |
+{ | |
+ GtkButton *but = GTK_BUTTON(widget); | |
+ HWND Parent; | |
+ | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ widget->hWnd = CreateWindow("BUTTON", but->text, | |
+ WS_CHILD | WS_TABSTOP | | |
+ (GTK_WIDGET_FLAGS(widget) & GTK_IS_DEFAULT ? | |
+ BS_DEFPUSHBUTTON : BS_PUSHBUTTON), | |
+ widget->allocation.x, widget->allocation.y, | |
+ widget->allocation.width, | |
+ widget->allocation.height, Parent, NULL, | |
+ hInst, NULL); | |
+ gtk_set_default_font(widget->hWnd); | |
+} | |
+ | |
+void gtk_entry_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", | |
+ WS_CHILD | WS_TABSTOP | ES_AUTOHSCROLL, | |
+ widget->allocation.x, widget->allocation.y, | |
+ widget->allocation.width, | |
+ widget->allocation.height, Parent, NULL, | |
+ hInst, NULL); | |
+ /* Subclass the window (we assume that all edit boxes have the same | |
+ * window procedure) */ | |
+ wpOrigEntryProc = (WNDPROC)SetWindowLong(widget->hWnd, | |
+ GWL_WNDPROC, | |
+ (LONG)EntryWndProc); | |
+ gtk_set_default_font(widget->hWnd); | |
+ gtk_editable_set_editable(GTK_EDITABLE(widget), | |
+ GTK_EDITABLE(widget)->is_editable); | |
+ gtk_entry_set_visibility(GTK_ENTRY(widget), | |
+ GTK_ENTRY(widget)->is_visible); | |
+ SendMessage(widget->hWnd, WM_SETTEXT, 0, | |
+ (LPARAM)GTK_EDITABLE(widget)->text->str); | |
+} | |
+ | |
+void gtk_text_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent; | |
+ gboolean editable; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ editable = GTK_EDITABLE(widget)->is_editable; | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", | |
+ WS_CHILD | (editable ? WS_TABSTOP : 0) | | |
+ ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL | | |
+ (GTK_TEXT(widget)->word_wrap ? | |
+ 0 : ES_AUTOHSCROLL), 0, 0, 0, | |
+ 0, Parent, NULL, hInst, NULL); | |
+ /* Subclass the window (we assume that all multiline edit boxes have the | |
+ * same window procedure) */ | |
+ wpOrigTextProc = (WNDPROC)SetWindowLong(widget->hWnd, | |
+ GWL_WNDPROC, | |
+ (LONG)TextWndProc); | |
+ gtk_set_default_font(widget->hWnd); | |
+ gtk_editable_set_editable(GTK_EDITABLE(widget), | |
+ GTK_EDITABLE(widget)->is_editable); | |
+ SendMessage(widget->hWnd, WM_SETTEXT, 0, | |
+ (LPARAM)GTK_EDITABLE(widget)->text->str); | |
+} | |
+ | |
+void gtk_frame_realize(GtkWidget *widget) | |
+{ | |
+ GtkFrame *frame = GTK_FRAME(widget); | |
+ HWND Parent; | |
+ | |
+ gtk_container_realize(widget); | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ widget->hWnd = CreateWindow("BUTTON", frame->text, | |
+ WS_CHILD | BS_GROUPBOX, | |
+ widget->allocation.x, widget->allocation.y, | |
+ widget->allocation.width, | |
+ widget->allocation.height, Parent, NULL, | |
+ hInst, NULL); | |
+ gtk_set_default_font(widget->hWnd); | |
} | |
-void gtk_clist_column_titles_passive(GtkCList *clist) { | |
- gint i; | |
- for (i=0;i<clist->ncols;i++) { | |
- gtk_clist_column_title_passive(clist,i); | |
- } | |
+void gtk_check_button_realize(GtkWidget *widget) | |
+{ | |
+ GtkButton *but = GTK_BUTTON(widget); | |
+ HWND Parent; | |
+ gboolean toggled; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ widget->hWnd = CreateWindow("BUTTON", but->text, | |
+ WS_CHILD | WS_TABSTOP | BS_CHECKBOX, | |
+ widget->allocation.x, widget->allocation.y, | |
+ widget->allocation.width, | |
+ widget->allocation.height, Parent, NULL, | |
+ hInst, NULL); | |
+ gtk_set_default_font(widget->hWnd); | |
+ gtk_signal_connect(GTK_OBJECT(widget), "clicked", | |
+ gtk_toggle_button_toggled, NULL); | |
+ gtk_signal_connect(GTK_OBJECT(widget), "toggled", | |
+ gtk_check_button_toggled, NULL); | |
+ toggled = GTK_TOGGLE_BUTTON(widget)->toggled; | |
+ GTK_TOGGLE_BUTTON(widget)->toggled = !toggled; | |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), toggled); | |
+} | |
+ | |
+void gtk_radio_button_realize(GtkWidget *widget) | |
+{ | |
+ GtkButton *but = GTK_BUTTON(widget); | |
+ HWND Parent; | |
+ gboolean toggled; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ widget->hWnd = CreateWindow("BUTTON", but->text, | |
+ WS_CHILD | WS_TABSTOP | BS_RADIOBUTTON, | |
+ widget->allocation.x, widget->allocation.y, | |
+ widget->allocation.width, | |
+ widget->allocation.height, Parent, NULL, | |
+ hInst, NULL); | |
+ gtk_set_default_font(widget->hWnd); | |
+ gtk_signal_connect(GTK_OBJECT(widget), "clicked", | |
+ gtk_radio_button_clicked, NULL); | |
+ gtk_signal_connect(GTK_OBJECT(widget), "toggled", | |
+ gtk_radio_button_toggled, NULL); | |
+ toggled = GTK_TOGGLE_BUTTON(widget)->toggled; | |
+ GTK_TOGGLE_BUTTON(widget)->toggled = !toggled; | |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), toggled); | |
+} | |
+ | |
+void gtk_radio_button_destroy(GtkWidget *widget) | |
+{ | |
+ GSList *group, *listpt; | |
+ GtkRadioButton *radio; | |
+ | |
+ gtk_button_destroy(widget); | |
+ group = GTK_RADIO_BUTTON(widget)->group; | |
+ group = g_slist_remove(group, GTK_RADIO_BUTTON(widget)); | |
+ for (listpt = group; listpt; listpt = g_slist_next(listpt)) { | |
+ radio = GTK_RADIO_BUTTON(listpt->data); | |
+ radio->group = group; | |
+ } | |
} | |
-void gtk_clist_column_title_active(GtkCList *clist,gint column) { | |
- if (column>=0 && column<clist->ncols) | |
- clist->cols[column].button_passive=FALSE; | |
+ | |
+void gtk_clist_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
+{ | |
+ SIZE size; | |
+ | |
+ if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) { | |
+ requisition->width = size.cx; | |
+ requisition->height = size.cy * 6 + 12; | |
+ } | |
} | |
-void gtk_clist_column_titles_active(GtkCList *clist) { | |
- gint i; | |
- for (i=0;i<clist->ncols;i++) { | |
- gtk_clist_column_title_active(clist,i); | |
- } | |
+void gtk_clist_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkCList *clist = GTK_CLIST(widget); | |
+ | |
+ gtk_container_set_size(widget, allocation); | |
+ if (clist->header) { | |
+ SetWindowPos(clist->header, HWND_TOP, | |
+ allocation->x, allocation->y, | |
+ allocation->width, clist->header_size, SWP_NOZORDER); | |
+ allocation->y += clist->header_size - 1; | |
+ allocation->height -= clist->header_size - 1; | |
+ } | |
} | |
-void gtk_clist_set_column_width(GtkCList *clist,gint column,gint width) { | |
- gtk_clist_set_column_width_full(clist,column,width,TRUE); | |
+void gtk_clist_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent, header; | |
+ HD_LAYOUT hdl; | |
+ HD_ITEM hdi; | |
+ RECT rcParent; | |
+ WINDOWPOS wp; | |
+ GtkCList *clist = GTK_CLIST(widget); | |
+ GSList *rows; | |
+ GtkCListRow *row; | |
+ gint i; | |
+ | |
+ gtk_container_realize(widget); | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ rcParent.left = rcParent.top = 0; | |
+ rcParent.right = rcParent.bottom = 800; | |
+ header = CreateWindowEx(0, WC_HEADER, NULL, | |
+ WS_CHILD | WS_BORDER | HDS_HORZ | |
+ | (GTK_CLIST(widget)->cols[0].button_passive ? | |
+ 0 : HDS_BUTTONS), | |
+ 0, 0, 0, 0, Parent, NULL, hInst, NULL); | |
+ SetWindowLong(header, GWL_USERDATA, (LONG)widget); | |
+ GTK_CLIST(widget)->header = header; | |
+ gtk_set_default_font(header); | |
+ hdl.prc = &rcParent; | |
+ hdl.pwpos = ℘ | |
+ SendMessage(header, HDM_LAYOUT, 0, (LPARAM)&hdl); | |
+ clist->header_size = wp.cy; | |
+ widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", | |
+ WS_CHILD | WS_TABSTOP | LBS_DISABLENOSCROLL | |
+ | WS_VSCROLL | LBS_OWNERDRAWFIXED | | |
+ LBS_NOTIFY, 0, 0, 0, 0, Parent, NULL, | |
+ hInst, NULL); | |
+ gtk_set_default_font(widget->hWnd); | |
+ | |
+ gtk_clist_update_all_widths(clist); | |
+ for (rows = clist->rows; rows; rows = g_slist_next(rows)) { | |
+ row = (GtkCListRow *)rows->data; | |
+ if (row) | |
+ SendMessage(widget->hWnd, LB_ADDSTRING, 0, (LPARAM)row->data); | |
+ } | |
+ | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ hdi.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH; | |
+ hdi.pszText = clist->cols[i].title; | |
+ if (hdi.pszText) { | |
+ if (i == clist->ncols - 1) | |
+ hdi.cxy = 9000; | |
+ else | |
+ hdi.cxy = clist->cols[i].width; | |
+ hdi.cchTextMax = strlen(hdi.pszText); | |
+ hdi.fmt = HDF_LEFT | HDF_STRING; | |
+ SendMessage(header, HDM_INSERTITEM, i + 1, (LPARAM)&hdi); | |
+ } | |
+ } | |
} | |
-void gtk_clist_set_column_width_full(GtkCList *clist,gint column,gint width, | |
- gboolean ResizeHeader) { | |
- HWND hWnd,header; | |
- HD_ITEM hdi; | |
+void gtk_clist_show(GtkWidget *widget) | |
+{ | |
+ if (GTK_WIDGET_REALIZED(widget)) { | |
+ ShowWindow(GTK_CLIST(widget)->header, SW_SHOWNORMAL); | |
+ } | |
+} | |
- if (column<0 || column>=clist->ncols) return; | |
+void gtk_clist_hide(GtkWidget *widget) | |
+{ | |
+ if (GTK_WIDGET_REALIZED(widget)) { | |
+ ShowWindow(GTK_CLIST(widget)->header, SW_HIDE); | |
+ } | |
+} | |
- clist->cols[column].width=width; | |
- if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) { | |
- header=clist->header; | |
- if (ResizeHeader && header) { | |
- hdi.mask=HDI_WIDTH; | |
- if (column==clist->ncols-1) width=9000; | |
- hdi.cxy=width; | |
- if (SendMessage(header,HDM_GETITEM,(WPARAM)column,(LPARAM)&hdi) && | |
- hdi.cxy!=width) { | |
- hdi.mask=HDI_WIDTH; | |
- hdi.cxy=width; | |
- SendMessage(header,HDM_SETITEM,(WPARAM)column,(LPARAM)&hdi); | |
- } | |
+void gtk_clist_draw_row(GtkCList *clist, LPDRAWITEMSTRUCT lpdis) | |
+{ | |
+ HBRUSH bkgrnd; | |
+ COLORREF textcol, oldtextcol; | |
+ RECT rcCol; | |
+ gint i, CurrentX; | |
+ GtkCListRow *row; | |
+ | |
+ if (lpdis->itemState & ODS_SELECTED) { | |
+ bkgrnd = (HBRUSH)(1 + COLOR_HIGHLIGHT); | |
+ textcol = (COLORREF)GetSysColor(COLOR_HIGHLIGHTTEXT); | |
+ } else { | |
+ bkgrnd = (HBRUSH)(1 + COLOR_WINDOW); | |
+ textcol = (COLORREF)GetSysColor(COLOR_WINDOWTEXT); | |
+ } | |
+ oldtextcol = SetTextColor(lpdis->hDC, textcol); | |
+ SetBkMode(lpdis->hDC, TRANSPARENT); | |
+ FillRect(lpdis->hDC, &lpdis->rcItem, bkgrnd); | |
+ | |
+ if (lpdis->itemID >= 0 && lpdis->itemID < g_slist_length(clist->rows)) { | |
+ row = (GtkCListRow *)g_slist_nth_data(clist->rows, lpdis->itemID); | |
+ CurrentX = lpdis->rcItem.left; | |
+ rcCol.top = lpdis->rcItem.top; | |
+ rcCol.bottom = lpdis->rcItem.bottom; | |
+ if (row->text) | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ rcCol.left = CurrentX + LISTITEMHPACK; | |
+ CurrentX += clist->cols[i].width; | |
+ rcCol.right = CurrentX - LISTITEMHPACK; | |
+ if (rcCol.left > lpdis->rcItem.right) | |
+ rcCol.left = lpdis->rcItem.right; | |
+ if (rcCol.right > lpdis->rcItem.right) | |
+ rcCol.right = lpdis->rcItem.right; | |
+ if (i == clist->ncols - 1) | |
+ rcCol.right = lpdis->rcItem.right; | |
+ if (row->text[i]) { | |
+ DrawText(lpdis->hDC, row->text[i], -1, &rcCol, | |
+ DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS); | |
+ } | |
} | |
- hWnd=GTK_WIDGET(clist)->hWnd; | |
- if (hWnd /*&& clist->cols[column].width!=width*/) | |
- InvalidateRect(hWnd,NULL,FALSE); | |
- } | |
+ } | |
+ | |
+ SetTextColor(lpdis->hDC, oldtextcol); | |
+ SetBkMode(lpdis->hDC, OPAQUE); | |
+ if (lpdis->itemState & ODS_FOCUS) | |
+ DrawFocusRect(lpdis->hDC, &lpdis->rcItem); | |
} | |
-void gtk_clist_set_selection_mode(GtkCList *clist,GtkSelectionMode mode) { | |
- clist->mode=mode; | |
+void gtk_clist_do_auto_resize(GtkCList *clist) | |
+{ | |
+ gint i; | |
+ | |
+ for (i = 0; i < clist->ncols; i++) | |
+ if (clist->cols[i].auto_resize) { | |
+ gtk_clist_set_column_width(clist, i, clist->cols[i].width); | |
+ } | |
} | |
-void gtk_container_show_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GtkContainer *container=GTK_CONTAINER(widget); | |
+void gtk_clist_update_all_widths(GtkCList *clist) | |
+{ | |
+ GSList *list; | |
+ GtkCListRow *row; | |
+ gint i; | |
+ SIZE size; | |
+ HWND header; | |
+ | |
+ header = clist->header; | |
+ if (header) | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ if (GetTextSize(header, clist->cols[i].title, &size, defFont) && | |
+ clist->cols[i].width < size.cx + 2 * LISTHEADERPACK) { | |
+ clist->cols[i].width = size.cx + 2 * LISTHEADERPACK; | |
+ } | |
+ } | |
- if (container->child) gtk_widget_show_all_full(container->child,hWndOnly); | |
+ for (list = clist->rows; list; list = g_slist_next(list)) { | |
+ row = (GtkCListRow *)list->data; | |
+ if (row && row->text) | |
+ gtk_clist_update_widths(clist, row->text); | |
+ } | |
} | |
-void gtk_container_hide_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GtkContainer *container=GTK_CONTAINER(widget); | |
+void gtk_clist_update_widths(GtkCList *clist, gchar *text[]) | |
+{ | |
+ gint i; | |
+ SIZE size; | |
+ HWND hWnd; | |
+ | |
+ hWnd = GTK_WIDGET(clist)->hWnd; | |
+ if (!hWnd) | |
+ return; | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ if (clist->cols[i].auto_resize | |
+ && GetTextSize(hWnd, text[i], &size, defFont) | |
+ && size.cx + 2 * LISTITEMHPACK > clist->cols[i].width) { | |
+ clist->cols[i].width = size.cx + 2 * LISTITEMHPACK; | |
+ } | |
+ } | |
+} | |
+ | |
+gint gtk_clist_insert(GtkCList *clist, gint row, gchar *text[]) | |
+{ | |
+ GtkWidget *widget = GTK_WIDGET(clist); | |
+ HWND hWnd; | |
+ GtkCListRow *new_row; | |
+ gint i; | |
+ | |
+ if (row < 0) | |
+ row = g_slist_length(clist->rows); | |
+ | |
+ new_row = g_new0(GtkCListRow, 1); | |
+ new_row->text = g_new0(gchar *, clist->ncols); | |
- if (container->child) gtk_widget_hide_all_full(container->child,hWndOnly); | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ new_row->text[i] = g_strdup(text[i]); | |
+ } | |
+ gtk_clist_update_widths(clist, new_row->text); | |
+ gtk_clist_do_auto_resize(clist); | |
+ clist->rows = g_slist_insert(clist->rows, (gpointer)new_row, row); | |
+ | |
+ if (GTK_WIDGET_REALIZED(widget)) { | |
+ hWnd = widget->hWnd; | |
+ SendMessage(hWnd, LB_INSERTSTRING, (WPARAM)row, (LPARAM)NULL); | |
+ } | |
+ | |
+ return row; | |
} | |
-void gtk_box_show_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GtkBoxChild *child; | |
- GList *children; | |
+GtkWidget *gtk_clist_new_with_titles(gint columns, gchar *titles[]) | |
+{ | |
+ GtkWidget *widget; | |
+ GtkCList *clist; | |
+ gint i; | |
+ | |
+ widget = gtk_clist_new(columns); | |
+ clist = GTK_CLIST(widget); | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ gtk_clist_set_column_title(clist, i, titles[i]); | |
+ } | |
+ return widget; | |
+} | |
- gtk_container_show_all(widget,hWndOnly); | |
+GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns, | |
+ gchar *titles[], | |
+ GtkWidget **pack_widg) | |
+{ | |
+ GtkWidget *widget; | |
- for (children=GTK_BOX(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
- if (child && child->widget) | |
- gtk_widget_show_all_full(child->widget,hWndOnly); | |
- } | |
+ widget = gtk_clist_new_with_titles(columns, titles); | |
+ *pack_widg = widget; | |
+ return widget; | |
} | |
-void gtk_box_hide_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GtkBoxChild *child; | |
- GList *children; | |
+gint gtk_clist_append(GtkCList *clist, gchar *text[]) | |
+{ | |
+ return gtk_clist_insert(clist, -1, text); | |
+} | |
- gtk_container_hide_all(widget,hWndOnly); | |
+void gtk_clist_set_column_title(GtkCList *clist, gint column, | |
+ const gchar *title) | |
+{ | |
+ HWND hWnd; | |
+ | |
+ if (column < 0 || column >= clist->ncols) | |
+ return; | |
+ g_free(clist->cols[column].title); | |
+ clist->cols[column].title = g_strdup(title); | |
+ if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) { | |
+ hWnd = GTK_WIDGET(clist)->hWnd; | |
+ InvalidateRect(hWnd, NULL, FALSE); | |
+ UpdateWindow(hWnd); | |
+ } | |
+} | |
- for (children=GTK_BOX(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkBoxChild *)(children->data); | |
- if (child && child->widget) | |
- gtk_widget_hide_all_full(child->widget,hWndOnly); | |
- } | |
+void gtk_clist_column_title_passive(GtkCList *clist, gint column) | |
+{ | |
+ if (column >= 0 && column < clist->ncols) | |
+ clist->cols[column].button_passive = TRUE; | |
} | |
-void gtk_table_show_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GList *children; | |
- GtkTableChild *child; | |
+void gtk_clist_column_titles_passive(GtkCList *clist) | |
+{ | |
+ gint i; | |
- gtk_container_show_all(widget,hWndOnly); | |
- for (children=GTK_TABLE(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkTableChild *)(children->data); | |
- if (child && child->widget) | |
- gtk_widget_show_all_full(child->widget,hWndOnly); | |
- } | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ gtk_clist_column_title_passive(clist, i); | |
+ } | |
} | |
-void gtk_table_hide_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GList *children; | |
- GtkTableChild *child; | |
+void gtk_clist_column_title_active(GtkCList *clist, gint column) | |
+{ | |
+ if (column >= 0 && column < clist->ncols) | |
+ clist->cols[column].button_passive = FALSE; | |
+} | |
+ | |
+void gtk_clist_column_titles_active(GtkCList *clist) | |
+{ | |
+ gint i; | |
- gtk_container_hide_all(widget,hWndOnly); | |
- for (children=GTK_TABLE(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkTableChild *)(children->data); | |
- if (child && child->widget) | |
- gtk_widget_hide_all_full(child->widget,hWndOnly); | |
- } | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ gtk_clist_column_title_active(clist, i); | |
+ } | |
} | |
-void gtk_widget_hide_all(GtkWidget *widget) { | |
- gtk_widget_hide_all_full(widget,FALSE); | |
+void gtk_clist_set_column_width(GtkCList *clist, gint column, gint width) | |
+{ | |
+ gtk_clist_set_column_width_full(clist, column, width, TRUE); | |
} | |
-void gtk_widget_hide_all_full(GtkWidget *widget,gboolean hWndOnly) { | |
- gtk_signal_emit(GTK_OBJECT(widget),"hide_all",hWndOnly); | |
- if (hWndOnly) { | |
- gtk_signal_emit(GTK_OBJECT(widget),"hide"); | |
- if (widget->hWnd) ShowWindow(widget->hWnd,SW_HIDE); | |
- } else gtk_widget_hide_full(widget,FALSE); | |
+void gtk_clist_set_column_width_full(GtkCList *clist, gint column, | |
+ gint width, gboolean ResizeHeader) | |
+{ | |
+ HWND hWnd, header; | |
+ HD_ITEM hdi; | |
+ | |
+ if (column < 0 || column >= clist->ncols) | |
+ return; | |
+ | |
+ clist->cols[column].width = width; | |
+ if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) { | |
+ header = clist->header; | |
+ if (ResizeHeader && header) { | |
+ hdi.mask = HDI_WIDTH; | |
+ if (column == clist->ncols - 1) | |
+ width = 9000; | |
+ hdi.cxy = width; | |
+ if (SendMessage(header, HDM_GETITEM, (WPARAM)column, (LPARAM)&hdi) && | |
+ hdi.cxy != width) { | |
+ hdi.mask = HDI_WIDTH; | |
+ hdi.cxy = width; | |
+ SendMessage(header, HDM_SETITEM, (WPARAM)column, (LPARAM)&hdi); | |
+ } | |
+ } | |
+ hWnd = GTK_WIDGET(clist)->hWnd; | |
+ if (hWnd /* && clist->cols[column].width!=width */ ) | |
+ InvalidateRect(hWnd, NULL, FALSE); | |
+ } | |
} | |
-void gtk_widget_show_all(GtkWidget *widget) { | |
- gtk_widget_show_all_full(widget,FALSE); | |
+void gtk_clist_set_selection_mode(GtkCList *clist, GtkSelectionMode mode) | |
+{ | |
+ clist->mode = mode; | |
} | |
-void gtk_widget_show_all_full(GtkWidget *widget,gboolean hWndOnly) { | |
- GtkAllocation alloc; | |
- gboolean InitWindow=FALSE; | |
+void gtk_container_show_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GtkContainer *container = GTK_CONTAINER(widget); | |
- if (!GTK_WIDGET_REALIZED(widget) && | |
- GTK_OBJECT(widget)->klass==&GtkWindowClass) InitWindow=TRUE; | |
+ if (container->child) | |
+ gtk_widget_show_all_full(container->child, hWndOnly); | |
+} | |
- if (InitWindow) gtk_widget_realize(widget); | |
- | |
- gtk_signal_emit(GTK_OBJECT(widget),"show_all",hWndOnly); | |
+void gtk_container_hide_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GtkContainer *container = GTK_CONTAINER(widget); | |
- if (hWndOnly) { | |
- if (GTK_WIDGET_VISIBLE(widget)) { | |
- gtk_signal_emit(GTK_OBJECT(widget),"show"); | |
- if (widget->hWnd) ShowWindow(widget->hWnd,SW_SHOWNORMAL); | |
- } | |
- } else gtk_widget_show_full(widget,FALSE); | |
+ if (container->child) | |
+ gtk_widget_hide_all_full(container->child, hWndOnly); | |
+} | |
+ | |
+void gtk_box_show_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ | |
+ gtk_container_show_all(widget, hWndOnly); | |
+ | |
+ for (children = GTK_BOX(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget) | |
+ gtk_widget_show_all_full(child->widget, hWndOnly); | |
+ } | |
+} | |
- if (InitWindow) { | |
- gtk_widget_update(widget,TRUE); | |
- alloc.x=alloc.y=0; | |
- alloc.width=widget->requisition.width; | |
- alloc.height=widget->requisition.height; | |
- gtk_window_set_initial_position(GTK_WINDOW(widget),&alloc); | |
-// gtk_widget_set_size(widget,&alloc); | |
- ShowWindow(widget->hWnd,SW_SHOWNORMAL); | |
- UpdateWindow(widget->hWnd); | |
- } | |
+void gtk_box_hide_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GtkBoxChild *child; | |
+ GList *children; | |
+ | |
+ gtk_container_hide_all(widget, hWndOnly); | |
+ for (children = GTK_BOX(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkBoxChild *)(children->data); | |
+ if (child && child->widget) | |
+ gtk_widget_hide_all_full(child->widget, hWndOnly); | |
+ } | |
} | |
-GtkWidget *gtk_widget_get_ancestor(GtkWidget *widget,GtkType type) { | |
- if (!widget) return NULL; | |
- while (widget && GTK_OBJECT(widget)->klass!=type) { | |
- widget=widget->parent; | |
- } | |
- return widget; | |
+void gtk_table_show_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GList *children; | |
+ GtkTableChild *child; | |
+ | |
+ gtk_container_show_all(widget, hWndOnly); | |
+ for (children = GTK_TABLE(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkTableChild *)(children->data); | |
+ if (child && child->widget) | |
+ gtk_widget_show_all_full(child->widget, hWndOnly); | |
+ } | |
} | |
-void gtk_label_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- SIZE size; | |
- GtkLabel *label=GTK_LABEL(widget); | |
+void gtk_table_hide_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GList *children; | |
+ GtkTableChild *child; | |
+ | |
+ gtk_container_hide_all(widget, hWndOnly); | |
+ for (children = GTK_TABLE(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkTableChild *)(children->data); | |
+ if (child && child->widget) | |
+ gtk_widget_hide_all_full(child->widget, hWndOnly); | |
+ } | |
+} | |
- if (GetTextSize(widget->hWnd, label->text, &size, defFont)) { | |
- requisition->width = size.cx; | |
- requisition->height = size.cy; | |
- } | |
-/* g_print("Label requesting size %d by %d\n",requisition->width, | |
- requisition->height);*/ | |
+void gtk_widget_hide_all(GtkWidget *widget) | |
+{ | |
+ gtk_widget_hide_all_full(widget, FALSE); | |
+} | |
+ | |
+void gtk_widget_hide_all_full(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ gtk_signal_emit(GTK_OBJECT(widget), "hide_all", hWndOnly); | |
+ if (hWndOnly) { | |
+ gtk_signal_emit(GTK_OBJECT(widget), "hide"); | |
+ if (widget->hWnd) | |
+ ShowWindow(widget->hWnd, SW_HIDE); | |
+ } else | |
+ gtk_widget_hide_full(widget, FALSE); | |
+} | |
+ | |
+void gtk_widget_show_all(GtkWidget *widget) | |
+{ | |
+ gtk_widget_show_all_full(widget, FALSE); | |
+} | |
+ | |
+void gtk_widget_show_all_full(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GtkAllocation alloc; | |
+ gboolean InitWindow = FALSE; | |
+ | |
+ if (!GTK_WIDGET_REALIZED(widget) && | |
+ GTK_OBJECT(widget)->klass == &GtkWindowClass) | |
+ InitWindow = TRUE; | |
+ | |
+ if (InitWindow) | |
+ gtk_widget_realize(widget); | |
+ | |
+ gtk_signal_emit(GTK_OBJECT(widget), "show_all", hWndOnly); | |
+ | |
+ if (hWndOnly) { | |
+ if (GTK_WIDGET_VISIBLE(widget)) { | |
+ gtk_signal_emit(GTK_OBJECT(widget), "show"); | |
+ if (widget->hWnd) | |
+ ShowWindow(widget->hWnd, SW_SHOWNORMAL); | |
+ } | |
+ } else { | |
+ gtk_widget_show_full(widget, FALSE); | |
+ } | |
+ | |
+ if (InitWindow) { | |
+ gtk_widget_update(widget, TRUE); | |
+ alloc.x = alloc.y = 0; | |
+ alloc.width = widget->requisition.width; | |
+ alloc.height = widget->requisition.height; | |
+ gtk_window_set_initial_position(GTK_WINDOW(widget), &alloc); | |
+ ShowWindow(widget->hWnd, SW_SHOWNORMAL); | |
+ UpdateWindow(widget->hWnd); | |
+ } | |
+} | |
+ | |
+GtkWidget *gtk_widget_get_ancestor(GtkWidget *widget, GtkType type) | |
+{ | |
+ if (!widget) | |
+ return NULL; | |
+ while (widget && GTK_OBJECT(widget)->klass != type) { | |
+ widget = widget->parent; | |
+ } | |
+ return widget; | |
+} | |
+ | |
+void gtk_label_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
+{ | |
+ SIZE size; | |
+ GtkLabel *label = GTK_LABEL(widget); | |
+ | |
+ if (GetTextSize(widget->hWnd, label->text, &size, defFont)) { | |
+ requisition->width = size.cx; | |
+ requisition->height = size.cy; | |
+ } | |
} | |
void gtk_url_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
t@@ -2745,26 +3046,31 @@ void gtk_url_size_request(GtkWidget *widget, GtkRequis… | |
} | |
} | |
-void gtk_label_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- gint yexcess; | |
- yexcess=allocation->height-widget->requisition.height; | |
- if (yexcess > 0) { | |
- allocation->y += yexcess/2; | |
- allocation->height -= yexcess; | |
- } | |
+void gtk_label_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ gint yexcess; | |
+ | |
+ yexcess = allocation->height - widget->requisition.height; | |
+ if (yexcess > 0) { | |
+ allocation->y += yexcess / 2; | |
+ allocation->height -= yexcess; | |
+ } | |
} | |
-void gtk_entry_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- gint yexcess; | |
- yexcess=allocation->height-widget->requisition.height; | |
- if (yexcess > 0) { | |
- allocation->y += yexcess/2; | |
- allocation->height -= yexcess; | |
- } | |
+void gtk_entry_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ gint yexcess; | |
+ | |
+ yexcess = allocation->height - widget->requisition.height; | |
+ if (yexcess > 0) { | |
+ allocation->y += yexcess / 2; | |
+ allocation->height -= yexcess; | |
+ } | |
} | |
-void gtk_label_destroy(GtkWidget *widget) { | |
- g_free(GTK_LABEL(widget)->text); | |
+void gtk_label_destroy(GtkWidget *widget) | |
+{ | |
+ g_free(GTK_LABEL(widget)->text); | |
} | |
void gtk_url_destroy(GtkWidget *widget) | |
t@@ -2773,596 +3079,692 @@ void gtk_url_destroy(GtkWidget *widget) | |
g_free(GTK_URL(widget)->target); | |
} | |
-void gtk_label_realize(GtkWidget *widget) { | |
- GtkLabel *label=GTK_LABEL(widget); | |
- HWND Parent; | |
- Parent=gtk_get_parent_hwnd(widget); | |
- widget->hWnd = CreateWindow("STATIC",label->text, | |
- WS_CHILD|SS_CENTER, | |
- widget->allocation.x,widget->allocation.y, | |
- widget->allocation.width,widget->allocation.height, | |
- Parent,NULL,hInst,NULL); | |
- gtk_set_default_font(widget->hWnd); | |
+void gtk_label_realize(GtkWidget *widget) | |
+{ | |
+ GtkLabel *label = GTK_LABEL(widget); | |
+ HWND Parent; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ widget->hWnd = CreateWindow("STATIC", label->text, | |
+ WS_CHILD | SS_CENTER, | |
+ widget->allocation.x, widget->allocation.y, | |
+ widget->allocation.width, | |
+ widget->allocation.height, Parent, NULL, | |
+ hInst, NULL); | |
+ gtk_set_default_font(widget->hWnd); | |
} | |
-void gtk_url_realize(GtkWidget *widget) { | |
- HWND Parent; | |
- Parent=gtk_get_parent_hwnd(widget); | |
- widget->hWnd = CreateWindow(WC_GTKURL,GTK_LABEL(widget)->text, | |
- WS_CHILD, | |
- widget->allocation.x,widget->allocation.y, | |
- widget->allocation.width,widget->allocation.height, | |
- Parent,NULL,hInst,NULL); | |
+void gtk_url_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ widget->hWnd = CreateWindow(WC_GTKURL, GTK_LABEL(widget)->text, | |
+ WS_CHILD, | |
+ widget->allocation.x, widget->allocation.y, | |
+ widget->allocation.width, | |
+ widget->allocation.height, Parent, NULL, | |
+ hInst, NULL); | |
} | |
-void gtk_container_add(GtkContainer *container,GtkWidget *widget) { | |
- container->child=widget; | |
- widget->parent=GTK_WIDGET(container); | |
- if (GTK_WIDGET_REALIZED(GTK_WIDGET(container))) { | |
- gtk_widget_realize(widget); | |
- gtk_widget_update(GTK_WIDGET(container),TRUE); | |
- } | |
+void gtk_container_add(GtkContainer *container, GtkWidget *widget) | |
+{ | |
+ container->child = widget; | |
+ widget->parent = GTK_WIDGET(container); | |
+ if (GTK_WIDGET_REALIZED(GTK_WIDGET(container))) { | |
+ gtk_widget_realize(widget); | |
+ gtk_widget_update(GTK_WIDGET(container), TRUE); | |
+ } | |
} | |
void gtk_container_set_border_width(GtkContainer *container, | |
- guint border_width) { | |
- container->border_width = border_width; | |
-} | |
- | |
-GtkWidget *gtk_table_new(guint rows,guint cols,gboolean homogeneous) { | |
- GtkTable *table; | |
- | |
- table=GTK_TABLE(GtkNewObject(&GtkTableClass)); | |
- | |
- table->nrows=rows; | |
- table->ncols=cols; | |
- table->homogeneous=homogeneous; | |
- | |
- table->rows = g_new0(GtkTableRowCol,rows); | |
- table->cols = g_new0(GtkTableRowCol,cols); | |
- | |
- return GTK_WIDGET(table); | |
-} | |
- | |
-void gtk_table_resize(GtkTable *table,guint rows,guint cols) { | |
- gint i; | |
- table->rows = g_realloc(table->rows,sizeof(GtkTableRowCol)*rows); | |
- table->cols = g_realloc(table->cols,sizeof(GtkTableRowCol)*cols); | |
- | |
- for (i=table->nrows;i<rows;i++) { | |
- table->rows[i].requisition=0; | |
- table->rows[i].allocation=0; | |
- table->rows[i].spacing=table->row_spacing; | |
- } | |
- for (i=table->ncols;i<cols;i++) { | |
- table->cols[i].requisition=0; | |
- table->cols[i].allocation=0; | |
- table->cols[i].spacing=table->column_spacing; | |
- } | |
- table->nrows = rows; | |
- table->ncols = cols; | |
- gtk_widget_update(GTK_WIDGET(table),FALSE); | |
-} | |
- | |
-void gtk_table_attach_defaults(GtkTable *table,GtkWidget *widget, | |
- guint left_attach,guint right_attach, | |
- guint top_attach,guint bottom_attach) { | |
- gtk_table_attach(table,widget,left_attach,right_attach, | |
- top_attach,bottom_attach,GTK_EXPAND,GTK_EXPAND,0,0); | |
-} | |
- | |
-void gtk_table_attach(GtkTable *table,GtkWidget *widget, | |
- guint left_attach,guint right_attach, | |
- guint top_attach,guint bottom_attach, | |
- GtkAttachOptions xoptions,GtkAttachOptions yoptions, | |
- guint xpadding,guint ypadding) { | |
- GtkTableChild *newChild; | |
- | |
- newChild=g_new0(GtkTableChild,1); | |
- newChild->widget=widget; | |
- newChild->left_attach=left_attach; | |
- newChild->right_attach=right_attach; | |
- newChild->top_attach=top_attach; | |
- newChild->bottom_attach=bottom_attach; | |
- | |
- table->children=g_list_append(table->children,(gpointer)newChild); | |
- widget->parent = GTK_WIDGET(table); | |
- if (GTK_WIDGET_REALIZED(GTK_WIDGET(table))) { | |
- gtk_widget_realize(widget); | |
- gtk_widget_update(GTK_WIDGET(table),TRUE); | |
- } | |
-} | |
- | |
-void gtk_table_destroy(GtkWidget *widget) { | |
- GList *children; | |
- GtkTableChild *child; | |
- | |
- gtk_container_destroy(widget); | |
- for (children=GTK_TABLE(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkTableChild *)(children->data); | |
- if (child->widget) gtk_widget_destroy(child->widget); | |
- g_free(child); | |
- } | |
- g_list_free(GTK_TABLE(widget)->children); | |
-} | |
- | |
-void gtk_table_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- GList *children; | |
- GtkTableChild *child; | |
- GtkWidget *child_wid; | |
- GtkRequisition child_req; | |
- GtkTable *table; | |
- gint16 MaxReq; | |
- int i; | |
- | |
- table=GTK_TABLE(widget); | |
- for (i=0;i<table->ncols;i++) table->cols[i].requisition=0; | |
- for (i=0;i<table->nrows;i++) table->rows[i].requisition=0; | |
- | |
- gtk_container_size_request(widget,requisition); | |
- for (children=table->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkTableChild *)(children->data); | |
- if (!child) continue; | |
- child_wid=child->widget; | |
- if (child_wid && child->left_attach<child->right_attach && | |
- child->top_attach<child->bottom_attach && | |
- GTK_WIDGET_VISIBLE(child_wid)) { | |
- child_req.width=child_wid->requisition.width; | |
- child_req.height=child_wid->requisition.height; | |
- child_req.width /= (child->right_attach-child->left_attach); | |
- child_req.height /= (child->bottom_attach-child->top_attach); | |
- for (i=child->left_attach;i<child->right_attach;i++) { | |
- if (child_req.width > table->cols[i].requisition) | |
- table->cols[i].requisition = child_req.width; | |
- } | |
- for (i=child->top_attach;i<child->bottom_attach;i++) { | |
- if (child_req.height > table->rows[i].requisition) | |
- table->rows[i].requisition = child_req.height; | |
- } | |
- } | |
- } | |
+ guint border_width) | |
+{ | |
+ container->border_width = border_width; | |
+} | |
- if (table->homogeneous) { | |
- MaxReq=0; | |
- for (i=0;i<table->ncols;i++) if (table->cols[i].requisition>MaxReq) { | |
- MaxReq=table->cols[i].requisition; | |
- } | |
- for (i=0;i<table->ncols;i++) table->cols[i].requisition=MaxReq; | |
+GtkWidget *gtk_table_new(guint rows, guint cols, gboolean homogeneous) | |
+{ | |
+ GtkTable *table; | |
- MaxReq=0; | |
- for (i=0;i<table->nrows;i++) if (table->rows[i].requisition>MaxReq) { | |
- MaxReq=table->rows[i].requisition; | |
- } | |
- for (i=0;i<table->nrows;i++) table->rows[i].requisition=MaxReq; | |
- } | |
- | |
- requisition->width=requisition->height=2*GTK_CONTAINER(widget)->border_widt… | |
- | |
- for (i=0;i<table->ncols;i++) requisition->width+=table->cols[i].requisition; | |
- for (i=0;i<table->ncols-1;i++) requisition->width+=table->cols[i].spacing; | |
- for (i=0;i<table->nrows;i++) requisition->height+=table->rows[i].requisitio… | |
- for (i=0;i<table->nrows-1;i++) requisition->height+=table->rows[i].spacing; | |
- | |
-} | |
- | |
-void gtk_table_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkTable *table; | |
- gint row_extra=0,col_extra=0,i; | |
- GtkAllocation child_alloc; | |
- GList *children; | |
- GtkTableChild *child; | |
- gint border_width; | |
- | |
- table=GTK_TABLE(widget); | |
- border_width=GTK_CONTAINER(widget)->border_width; | |
- | |
- if (table->ncols) { | |
- col_extra = (allocation->width-widget->requisition.width)/table->ncols; | |
- } | |
- if (table->nrows) { | |
- row_extra = (allocation->height-widget->requisition.height)/table->nrows; | |
- } | |
- for (i=0;i<table->ncols;i++) { | |
- table->cols[i].allocation = table->cols[i].requisition+col_extra; | |
- } | |
- for (i=0;i<table->nrows;i++) { | |
- table->rows[i].allocation = table->rows[i].requisition+row_extra; | |
- } | |
- for (children=table->children;children;children=g_list_next(children)) { | |
- child=(GtkTableChild *)(children->data); | |
- if (!child || !child->widget || | |
- !GTK_WIDGET_VISIBLE(child->widget)) continue; | |
- child_alloc.x = allocation->x+border_width; | |
- child_alloc.y = allocation->y+border_width; | |
- child_alloc.width = child_alloc.height = 0; | |
- for (i=0;i<child->left_attach;i++) { | |
- child_alloc.x+=table->cols[i].allocation+table->cols[i].spacing; | |
+ table = GTK_TABLE(GtkNewObject(&GtkTableClass)); | |
+ | |
+ table->nrows = rows; | |
+ table->ncols = cols; | |
+ table->homogeneous = homogeneous; | |
+ | |
+ table->rows = g_new0(GtkTableRowCol, rows); | |
+ table->cols = g_new0(GtkTableRowCol, cols); | |
+ | |
+ return GTK_WIDGET(table); | |
+} | |
+ | |
+void gtk_table_resize(GtkTable *table, guint rows, guint cols) | |
+{ | |
+ gint i; | |
+ | |
+ table->rows = g_realloc(table->rows, sizeof(GtkTableRowCol) * rows); | |
+ table->cols = g_realloc(table->cols, sizeof(GtkTableRowCol) * cols); | |
+ | |
+ for (i = table->nrows; i < rows; i++) { | |
+ table->rows[i].requisition = 0; | |
+ table->rows[i].allocation = 0; | |
+ table->rows[i].spacing = table->row_spacing; | |
+ } | |
+ for (i = table->ncols; i < cols; i++) { | |
+ table->cols[i].requisition = 0; | |
+ table->cols[i].allocation = 0; | |
+ table->cols[i].spacing = table->column_spacing; | |
+ } | |
+ table->nrows = rows; | |
+ table->ncols = cols; | |
+ gtk_widget_update(GTK_WIDGET(table), FALSE); | |
+} | |
+ | |
+void gtk_table_attach_defaults(GtkTable *table, GtkWidget *widget, | |
+ guint left_attach, guint right_attach, | |
+ guint top_attach, guint bottom_attach) | |
+{ | |
+ gtk_table_attach(table, widget, left_attach, right_attach, top_attach, | |
+ bottom_attach, GTK_EXPAND, GTK_EXPAND, 0, 0); | |
+} | |
+ | |
+void gtk_table_attach(GtkTable *table, GtkWidget *widget, | |
+ guint left_attach, guint right_attach, | |
+ guint top_attach, guint bottom_attach, | |
+ GtkAttachOptions xoptions, GtkAttachOptions yoptions, | |
+ guint xpadding, guint ypadding) | |
+{ | |
+ GtkTableChild *newChild; | |
+ | |
+ newChild = g_new0(GtkTableChild, 1); | |
+ | |
+ newChild->widget = widget; | |
+ newChild->left_attach = left_attach; | |
+ newChild->right_attach = right_attach; | |
+ newChild->top_attach = top_attach; | |
+ newChild->bottom_attach = bottom_attach; | |
+ | |
+ table->children = g_list_append(table->children, (gpointer)newChild); | |
+ widget->parent = GTK_WIDGET(table); | |
+ if (GTK_WIDGET_REALIZED(GTK_WIDGET(table))) { | |
+ gtk_widget_realize(widget); | |
+ gtk_widget_update(GTK_WIDGET(table), TRUE); | |
+ } | |
+} | |
+ | |
+void gtk_table_destroy(GtkWidget *widget) | |
+{ | |
+ GList *children; | |
+ GtkTableChild *child; | |
+ | |
+ gtk_container_destroy(widget); | |
+ for (children = GTK_TABLE(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkTableChild *)(children->data); | |
+ if (child->widget) | |
+ gtk_widget_destroy(child->widget); | |
+ g_free(child); | |
+ } | |
+ g_list_free(GTK_TABLE(widget)->children); | |
+} | |
+ | |
+void gtk_table_size_request(GtkWidget *widget, GtkRequisition *requisition) | |
+{ | |
+ GList *children; | |
+ GtkTableChild *child; | |
+ GtkWidget *child_wid; | |
+ GtkRequisition child_req; | |
+ GtkTable *table; | |
+ gint16 MaxReq; | |
+ int i; | |
+ | |
+ table = GTK_TABLE(widget); | |
+ for (i = 0; i < table->ncols; i++) | |
+ table->cols[i].requisition = 0; | |
+ for (i = 0; i < table->nrows; i++) | |
+ table->rows[i].requisition = 0; | |
+ | |
+ gtk_container_size_request(widget, requisition); | |
+ for (children = table->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkTableChild *)(children->data); | |
+ if (!child) | |
+ continue; | |
+ child_wid = child->widget; | |
+ if (child_wid && child->left_attach < child->right_attach && | |
+ child->top_attach < child->bottom_attach && | |
+ GTK_WIDGET_VISIBLE(child_wid)) { | |
+ child_req.width = child_wid->requisition.width; | |
+ child_req.height = child_wid->requisition.height; | |
+ child_req.width /= (child->right_attach - child->left_attach); | |
+ child_req.height /= (child->bottom_attach - child->top_attach); | |
+ for (i = child->left_attach; i < child->right_attach; i++) { | |
+ if (child_req.width > table->cols[i].requisition) | |
+ table->cols[i].requisition = child_req.width; | |
} | |
- for (i=0;i<child->top_attach;i++) { | |
- child_alloc.y+=table->rows[i].allocation+table->rows[i].spacing; | |
+ for (i = child->top_attach; i < child->bottom_attach; i++) { | |
+ if (child_req.height > table->rows[i].requisition) | |
+ table->rows[i].requisition = child_req.height; | |
} | |
- for (i=child->left_attach;i<child->right_attach;i++) { | |
- child_alloc.width+=table->cols[i].allocation; | |
+ } | |
+ } | |
+ | |
+ if (table->homogeneous) { | |
+ MaxReq = 0; | |
+ for (i = 0; i < table->ncols; i++) | |
+ if (table->cols[i].requisition > MaxReq) { | |
+ MaxReq = table->cols[i].requisition; | |
} | |
- for (i=child->top_attach;i<child->bottom_attach;i++) { | |
- child_alloc.height+=table->rows[i].allocation; | |
+ for (i = 0; i < table->ncols; i++) | |
+ table->cols[i].requisition = MaxReq; | |
+ | |
+ MaxReq = 0; | |
+ for (i = 0; i < table->nrows; i++) | |
+ if (table->rows[i].requisition > MaxReq) { | |
+ MaxReq = table->rows[i].requisition; | |
} | |
- gtk_widget_set_size(child->widget,&child_alloc); | |
- } | |
+ for (i = 0; i < table->nrows; i++) | |
+ table->rows[i].requisition = MaxReq; | |
+ } | |
+ | |
+ requisition->width = requisition->height = | |
+ 2 * GTK_CONTAINER(widget)->border_width; | |
+ | |
+ for (i = 0; i < table->ncols; i++) | |
+ requisition->width += table->cols[i].requisition; | |
+ for (i = 0; i < table->ncols - 1; i++) | |
+ requisition->width += table->cols[i].spacing; | |
+ for (i = 0; i < table->nrows; i++) | |
+ requisition->height += table->rows[i].requisition; | |
+ for (i = 0; i < table->nrows - 1; i++) | |
+ requisition->height += table->rows[i].spacing; | |
+ | |
} | |
-void gtk_table_realize(GtkWidget *widget) { | |
- GList *children; | |
- GtkTableChild *child; | |
+void gtk_table_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkTable *table; | |
+ gint row_extra = 0, col_extra = 0, i; | |
+ GtkAllocation child_alloc; | |
+ GList *children; | |
+ GtkTableChild *child; | |
+ gint border_width; | |
+ | |
+ table = GTK_TABLE(widget); | |
+ border_width = GTK_CONTAINER(widget)->border_width; | |
+ | |
+ if (table->ncols) { | |
+ col_extra = | |
+ (allocation->width - widget->requisition.width) / table->ncols; | |
+ } | |
+ if (table->nrows) { | |
+ row_extra = | |
+ (allocation->height - widget->requisition.height) / table->nrows; | |
+ } | |
+ for (i = 0; i < table->ncols; i++) { | |
+ table->cols[i].allocation = table->cols[i].requisition + col_extra; | |
+ } | |
+ for (i = 0; i < table->nrows; i++) { | |
+ table->rows[i].allocation = table->rows[i].requisition + row_extra; | |
+ } | |
+ for (children = table->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkTableChild *)(children->data); | |
+ if (!child || !child->widget || !GTK_WIDGET_VISIBLE(child->widget)) | |
+ continue; | |
+ child_alloc.x = allocation->x + border_width; | |
+ child_alloc.y = allocation->y + border_width; | |
+ child_alloc.width = child_alloc.height = 0; | |
+ for (i = 0; i < child->left_attach; i++) { | |
+ child_alloc.x += table->cols[i].allocation + table->cols[i].spacing; | |
+ } | |
+ for (i = 0; i < child->top_attach; i++) { | |
+ child_alloc.y += table->rows[i].allocation + table->rows[i].spacing; | |
+ } | |
+ for (i = child->left_attach; i < child->right_attach; i++) { | |
+ child_alloc.width += table->cols[i].allocation; | |
+ } | |
+ for (i = child->top_attach; i < child->bottom_attach; i++) { | |
+ child_alloc.height += table->rows[i].allocation; | |
+ } | |
+ gtk_widget_set_size(child->widget, &child_alloc); | |
+ } | |
+} | |
- gtk_container_realize(widget); | |
- for (children=GTK_TABLE(widget)->children;children; | |
- children=g_list_next(children)) { | |
- child=(GtkTableChild *)(children->data); | |
- if (child->widget) gtk_widget_realize(child->widget); | |
- } | |
+void gtk_table_realize(GtkWidget *widget) | |
+{ | |
+ GList *children; | |
+ GtkTableChild *child; | |
+ | |
+ gtk_container_realize(widget); | |
+ for (children = GTK_TABLE(widget)->children; children; | |
+ children = g_list_next(children)) { | |
+ child = (GtkTableChild *)(children->data); | |
+ if (child->widget) | |
+ gtk_widget_realize(child->widget); | |
+ } | |
} | |
-void gtk_table_set_row_spacing(GtkTable *table,guint row,guint spacing) { | |
- if (table && row>=0 && row<table->nrows) { | |
- table->rows[row].spacing=spacing; | |
- } | |
+void gtk_table_set_row_spacing(GtkTable *table, guint row, guint spacing) | |
+{ | |
+ if (table && row >= 0 && row < table->nrows) { | |
+ table->rows[row].spacing = spacing; | |
+ } | |
} | |
-void gtk_table_set_col_spacing(GtkTable *table,guint column,guint spacing) { | |
- if (table && column>=0 && column<table->ncols) { | |
- table->cols[column].spacing=spacing; | |
- } | |
+void gtk_table_set_col_spacing(GtkTable *table, guint column, | |
+ guint spacing) | |
+{ | |
+ if (table && column >= 0 && column < table->ncols) { | |
+ table->cols[column].spacing = spacing; | |
+ } | |
} | |
-void gtk_table_set_row_spacings(GtkTable *table,guint spacing) { | |
- int i; | |
- table->row_spacing=spacing; | |
- for (i=0;i<table->nrows;i++) table->rows[i].spacing=spacing; | |
+void gtk_table_set_row_spacings(GtkTable *table, guint spacing) | |
+{ | |
+ int i; | |
+ | |
+ table->row_spacing = spacing; | |
+ for (i = 0; i < table->nrows; i++) | |
+ table->rows[i].spacing = spacing; | |
} | |
-void gtk_table_set_col_spacings(GtkTable *table,guint spacing) { | |
- int i; | |
- table->column_spacing=spacing; | |
- for (i=0;i<table->ncols;i++) table->cols[i].spacing=spacing; | |
+void gtk_table_set_col_spacings(GtkTable *table, guint spacing) | |
+{ | |
+ int i; | |
+ | |
+ table->column_spacing = spacing; | |
+ for (i = 0; i < table->ncols; i++) | |
+ table->cols[i].spacing = spacing; | |
} | |
-void gtk_toggle_button_toggled(GtkToggleButton *toggle_button) { | |
- toggle_button->toggled = !toggle_button->toggled; | |
- gtk_signal_emit(GTK_OBJECT(toggle_button),"toggled"); | |
+void gtk_toggle_button_toggled(GtkToggleButton *toggle_button) | |
+{ | |
+ toggle_button->toggled = !toggle_button->toggled; | |
+ gtk_signal_emit(GTK_OBJECT(toggle_button), "toggled"); | |
} | |
-void gtk_check_button_toggled(GtkCheckButton *check_button,gpointer data) { | |
- HWND hWnd; | |
- gboolean is_active = GTK_TOGGLE_BUTTON(check_button)->toggled; | |
- hWnd=GTK_WIDGET(check_button)->hWnd; | |
- if (hWnd) { | |
- SendMessage(hWnd,BM_SETCHECK,is_active ? BST_CHECKED : BST_UNCHECKED,0); | |
- } | |
+void gtk_check_button_toggled(GtkCheckButton *check_button, gpointer data) | |
+{ | |
+ HWND hWnd; | |
+ gboolean is_active = GTK_TOGGLE_BUTTON(check_button)->toggled; | |
+ | |
+ hWnd = GTK_WIDGET(check_button)->hWnd; | |
+ if (hWnd) { | |
+ SendMessage(hWnd, BM_SETCHECK, | |
+ is_active ? BST_CHECKED : BST_UNCHECKED, 0); | |
+ } | |
} | |
-void gtk_radio_button_clicked(GtkRadioButton *radio_button,gpointer data) { | |
- GtkToggleButton *toggle=GTK_TOGGLE_BUTTON(radio_button); | |
+void gtk_radio_button_clicked(GtkRadioButton *radio_button, gpointer data) | |
+{ | |
+ GtkToggleButton *toggle = GTK_TOGGLE_BUTTON(radio_button); | |
- if (toggle->toggled) return; | |
- else gtk_toggle_button_toggled(toggle); | |
+ if (toggle->toggled) | |
+ return; | |
+ else | |
+ gtk_toggle_button_toggled(toggle); | |
} | |
-void gtk_radio_button_toggled(GtkRadioButton *radio_button,gpointer data) { | |
- HWND hWnd; | |
- GSList *group; | |
- GtkRadioButton *radio; | |
- gboolean is_active = GTK_TOGGLE_BUTTON(radio_button)->toggled; | |
- hWnd=GTK_WIDGET(radio_button)->hWnd; | |
- if (hWnd) { | |
- SendMessage(hWnd,BM_SETCHECK,is_active ? BST_CHECKED : BST_UNCHECKED,0); | |
- } | |
- if (is_active) { | |
- for (group=radio_button->group;group;group=g_slist_next(group)) { | |
- radio=GTK_RADIO_BUTTON(group->data); | |
- if (radio && radio!=radio_button) { | |
- GTK_TOGGLE_BUTTON(radio)->toggled=FALSE; | |
- hWnd=GTK_WIDGET(radio)->hWnd; | |
- if (hWnd) SendMessage(hWnd,BM_SETCHECK,BST_UNCHECKED,0); | |
- } | |
+void gtk_radio_button_toggled(GtkRadioButton *radio_button, gpointer data) | |
+{ | |
+ HWND hWnd; | |
+ GSList *group; | |
+ GtkRadioButton *radio; | |
+ gboolean is_active = GTK_TOGGLE_BUTTON(radio_button)->toggled; | |
+ | |
+ hWnd = GTK_WIDGET(radio_button)->hWnd; | |
+ if (hWnd) { | |
+ SendMessage(hWnd, BM_SETCHECK, | |
+ is_active ? BST_CHECKED : BST_UNCHECKED, 0); | |
+ } | |
+ if (is_active) { | |
+ for (group = radio_button->group; group; group = g_slist_next(group)) { | |
+ radio = GTK_RADIO_BUTTON(group->data); | |
+ if (radio && radio != radio_button) { | |
+ GTK_TOGGLE_BUTTON(radio)->toggled = FALSE; | |
+ hWnd = GTK_WIDGET(radio)->hWnd; | |
+ if (hWnd) | |
+ SendMessage(hWnd, BM_SETCHECK, BST_UNCHECKED, 0); | |
} | |
- } | |
+ } | |
+ } | |
} | |
-gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button) { | |
- return (toggle_button->toggled); | |
+gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button) | |
+{ | |
+ return (toggle_button->toggled); | |
} | |
void gtk_toggle_button_set_active(GtkToggleButton *toggle_button, | |
- gboolean is_active) { | |
- if (toggle_button->toggled == is_active) return; | |
- else gtk_toggle_button_toggled(toggle_button); | |
+ gboolean is_active) | |
+{ | |
+ if (toggle_button->toggled == is_active) | |
+ return; | |
+ else | |
+ gtk_toggle_button_toggled(toggle_button); | |
} | |
-void gtk_main_quit() { | |
- PostQuitMessage(0); | |
+void gtk_main_quit() | |
+{ | |
+ PostQuitMessage(0); | |
} | |
-void gtk_main() { | |
- MSG msg; | |
- GSList *list; | |
- BOOL MsgDone; | |
- GtkWidget *widget,*window; | |
- HACCEL hAccel; | |
- | |
- RecurseLevel++; | |
- | |
- while (GetMessage(&msg,NULL,0,0)) { | |
- MsgDone=FALSE; | |
- widget=GTK_WIDGET(GetWindowLong(msg.hwnd,GWL_USERDATA)); | |
- window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- if (window) { | |
- hAccel=GTK_WINDOW(window)->hAccel; | |
- if (hAccel) { | |
- MsgDone=TranslateAccelerator(window->hWnd,hAccel,&msg); | |
- } | |
- } | |
- if (!MsgDone) for (list=WindowList;list && !MsgDone; | |
- list=g_slist_next(list)) { | |
- widget=GTK_WIDGET(list->data); | |
- if (widget && widget->hWnd && | |
- (MsgDone=IsDialogMessage(widget->hWnd,&msg))==TRUE) break; | |
+void gtk_main() | |
+{ | |
+ MSG msg; | |
+ GSList *list; | |
+ BOOL MsgDone; | |
+ GtkWidget *widget, *window; | |
+ HACCEL hAccel; | |
+ | |
+ RecurseLevel++; | |
+ | |
+ while (GetMessage(&msg, NULL, 0, 0)) { | |
+ MsgDone = FALSE; | |
+ widget = GTK_WIDGET(GetWindowLong(msg.hwnd, GWL_USERDATA)); | |
+ window = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ if (window) { | |
+ hAccel = GTK_WINDOW(window)->hAccel; | |
+ if (hAccel) { | |
+ MsgDone = TranslateAccelerator(window->hWnd, hAccel, &msg); | |
} | |
- if (!MsgDone) { | |
- TranslateMessage(&msg); | |
- DispatchMessage(&msg); | |
+ } | |
+ if (!MsgDone) | |
+ for (list = WindowList; list && !MsgDone; list = g_slist_next(list)) { | |
+ widget = GTK_WIDGET(list->data); | |
+ if (widget && widget->hWnd | |
+ && (MsgDone = IsDialogMessage(widget->hWnd, &msg)) == TRUE) | |
+ break; | |
} | |
- } | |
- RecurseLevel--; | |
+ if (!MsgDone) { | |
+ TranslateMessage(&msg); | |
+ DispatchMessage(&msg); | |
+ } | |
+ } | |
+ RecurseLevel--; | |
} | |
typedef struct _GtkSignal GtkSignal; | |
struct _GtkSignal { | |
- GtkSignalFunc func; | |
- GtkObject *slot_object; | |
- gpointer func_data; | |
+ GtkSignalFunc func; | |
+ GtkObject *slot_object; | |
+ gpointer func_data; | |
}; | |
typedef gint (*GtkGIntSignalFunc) (); | |
-void gtk_marshal_BOOL__GINT(GtkObject *object,GSList *actions, | |
- GtkSignalFunc default_action, | |
- va_list args) { | |
- gboolean *retval; | |
- gint arg1; | |
- GtkSignal *signal; | |
- GtkGIntSignalFunc sigfunc; | |
- | |
- arg1=va_arg(args,gint); | |
- retval=va_arg(args,gboolean *); | |
- if (!retval) { g_warning("gtk_marshal_BOOL__GINT: retval NULL"); return; } | |
- | |
- while (actions) { | |
- signal=(GtkSignal*)actions->data; | |
- sigfunc = (GtkGIntSignalFunc)signal->func; | |
- if (signal->slot_object) { | |
- *retval = (*sigfunc)(signal->slot_object,arg1); | |
- } else *retval = (*sigfunc)(object,arg1,signal->func_data); | |
- if (*retval) return; | |
- actions=g_slist_next(actions); | |
- } | |
- sigfunc=(GtkGIntSignalFunc)default_action; | |
- if (sigfunc) *retval = (*sigfunc)(object,arg1); | |
-} | |
- | |
-void gtk_marshal_BOOL__GPOIN(GtkObject *object,GSList *actions, | |
- GtkSignalFunc default_action, | |
- va_list args) { | |
- gboolean *retval; | |
- gpointer arg1; | |
- GtkSignal *signal; | |
- GtkGIntSignalFunc sigfunc; | |
- | |
- arg1=va_arg(args,gpointer); | |
- retval=va_arg(args,gboolean *); | |
- if (!retval) { g_warning("gtk_marshal_BOOL__GPOIN: retval NULL"); return; } | |
- | |
- while (actions) { | |
- signal=(GtkSignal*)actions->data; | |
- sigfunc = (GtkGIntSignalFunc)signal->func; | |
- if (signal->slot_object) { | |
- *retval = (*sigfunc)(signal->slot_object,arg1); | |
- } else *retval = (*sigfunc)(object,arg1,signal->func_data); | |
- if (*retval) return; | |
- actions=g_slist_next(actions); | |
- } | |
- sigfunc=(GtkGIntSignalFunc)default_action; | |
- if (sigfunc) *retval = (*sigfunc)(object,arg1); | |
-} | |
- | |
-void gtk_marshal_VOID__VOID(GtkObject *object,GSList *actions, | |
- GtkSignalFunc default_action, | |
- va_list args) { | |
- GtkSignal *signal; | |
- | |
- while (actions) { | |
-// g_print("processing action...\n"); | |
- signal=(GtkSignal*)actions->data; | |
- if (signal->slot_object) { | |
- (*signal->func)(signal->slot_object); | |
- } else (*signal->func)(object,signal->func_data); | |
- actions=g_slist_next(actions); | |
- } | |
- if (default_action) (*default_action)(object); | |
-} | |
- | |
-void gtk_marshal_VOID__GINT(GtkObject *object,GSList *actions, | |
- GtkSignalFunc default_action, | |
- va_list args) { | |
- gint arg1; | |
- GtkSignal *signal; | |
- | |
- arg1=va_arg(args,gint); | |
- | |
- while (actions) { | |
- signal=(GtkSignal*)actions->data; | |
- if (signal->slot_object) { | |
- (*signal->func)(signal->slot_object,arg1); | |
- } else (*signal->func)(object,arg1,signal->func_data); | |
- actions=g_slist_next(actions); | |
- } | |
- if (default_action) (*default_action)(object,arg1); | |
-} | |
- | |
-void gtk_marshal_VOID__GPOIN(GtkObject *object,GSList *actions, | |
- GtkSignalFunc default_action, | |
- va_list args) { | |
- gpointer arg1; | |
- GtkSignal *signal; | |
- | |
- arg1=va_arg(args,gpointer); | |
- | |
- while (actions) { | |
- signal=(GtkSignal*)actions->data; | |
- if (signal->slot_object) { | |
- (*signal->func)(signal->slot_object,arg1); | |
- } else (*signal->func)(object,arg1,signal->func_data); | |
- actions=g_slist_next(actions); | |
- } | |
- if (default_action) (*default_action)(object,arg1); | |
-} | |
- | |
-void gtk_marshal_VOID__BOOL(GtkObject *object,GSList *actions, | |
- GtkSignalFunc default_action, | |
- va_list args) { | |
- gboolean arg1; | |
- GtkSignal *signal; | |
- | |
- arg1=va_arg(args,gboolean); | |
- | |
- while (actions) { | |
- signal=(GtkSignal*)actions->data; | |
- if (signal->slot_object) { | |
- (*signal->func)(signal->slot_object,arg1); | |
- } else (*signal->func)(object,arg1,signal->func_data); | |
- actions=g_slist_next(actions); | |
- } | |
- if (default_action) (*default_action)(object,arg1); | |
+void gtk_marshal_BOOL__GINT(GtkObject *object, GSList *actions, | |
+ GtkSignalFunc default_action, va_list args) | |
+{ | |
+ gboolean *retval; | |
+ gint arg1; | |
+ GtkSignal *signal; | |
+ GtkGIntSignalFunc sigfunc; | |
+ | |
+ arg1 = va_arg(args, gint); | |
+ retval = va_arg(args, gboolean *); | |
+ | |
+ if (!retval) { | |
+ g_warning("gtk_marshal_BOOL__GINT: retval NULL"); | |
+ return; | |
+ } | |
+ | |
+ while (actions) { | |
+ signal = (GtkSignal *)actions->data; | |
+ sigfunc = (GtkGIntSignalFunc)signal->func; | |
+ if (signal->slot_object) { | |
+ *retval = (*sigfunc) (signal->slot_object, arg1); | |
+ } else | |
+ *retval = (*sigfunc) (object, arg1, signal->func_data); | |
+ if (*retval) | |
+ return; | |
+ actions = g_slist_next(actions); | |
+ } | |
+ sigfunc = (GtkGIntSignalFunc)default_action; | |
+ if (sigfunc) | |
+ *retval = (*sigfunc) (object, arg1); | |
+} | |
+ | |
+void gtk_marshal_BOOL__GPOIN(GtkObject *object, GSList *actions, | |
+ GtkSignalFunc default_action, va_list args) | |
+{ | |
+ gboolean *retval; | |
+ gpointer arg1; | |
+ GtkSignal *signal; | |
+ GtkGIntSignalFunc sigfunc; | |
+ | |
+ arg1 = va_arg(args, gpointer); | |
+ retval = va_arg(args, gboolean *); | |
+ | |
+ if (!retval) { | |
+ g_warning("gtk_marshal_BOOL__GPOIN: retval NULL"); | |
+ return; | |
+ } | |
+ | |
+ while (actions) { | |
+ signal = (GtkSignal *)actions->data; | |
+ sigfunc = (GtkGIntSignalFunc)signal->func; | |
+ if (signal->slot_object) { | |
+ *retval = (*sigfunc) (signal->slot_object, arg1); | |
+ } else | |
+ *retval = (*sigfunc) (object, arg1, signal->func_data); | |
+ if (*retval) | |
+ return; | |
+ actions = g_slist_next(actions); | |
+ } | |
+ sigfunc = (GtkGIntSignalFunc)default_action; | |
+ if (sigfunc) | |
+ *retval = (*sigfunc) (object, arg1); | |
+} | |
+ | |
+void gtk_marshal_VOID__VOID(GtkObject *object, GSList *actions, | |
+ GtkSignalFunc default_action, va_list args) | |
+{ | |
+ GtkSignal *signal; | |
+ | |
+ while (actions) { | |
+ signal = (GtkSignal *)actions->data; | |
+ if (signal->slot_object) { | |
+ (*signal->func) (signal->slot_object); | |
+ } else | |
+ (*signal->func) (object, signal->func_data); | |
+ actions = g_slist_next(actions); | |
+ } | |
+ if (default_action) | |
+ (*default_action) (object); | |
+} | |
+ | |
+void gtk_marshal_VOID__GINT(GtkObject *object, GSList *actions, | |
+ GtkSignalFunc default_action, va_list args) | |
+{ | |
+ gint arg1; | |
+ GtkSignal *signal; | |
+ | |
+ arg1 = va_arg(args, gint); | |
+ | |
+ while (actions) { | |
+ signal = (GtkSignal *)actions->data; | |
+ if (signal->slot_object) { | |
+ (*signal->func) (signal->slot_object, arg1); | |
+ } else | |
+ (*signal->func) (object, arg1, signal->func_data); | |
+ actions = g_slist_next(actions); | |
+ } | |
+ if (default_action) | |
+ (*default_action) (object, arg1); | |
+} | |
+ | |
+void gtk_marshal_VOID__GPOIN(GtkObject *object, GSList *actions, | |
+ GtkSignalFunc default_action, va_list args) | |
+{ | |
+ gpointer arg1; | |
+ GtkSignal *signal; | |
+ | |
+ arg1 = va_arg(args, gpointer); | |
+ | |
+ while (actions) { | |
+ signal = (GtkSignal *)actions->data; | |
+ if (signal->slot_object) { | |
+ (*signal->func) (signal->slot_object, arg1); | |
+ } else | |
+ (*signal->func) (object, arg1, signal->func_data); | |
+ actions = g_slist_next(actions); | |
+ } | |
+ if (default_action) | |
+ (*default_action) (object, arg1); | |
+} | |
+ | |
+void gtk_marshal_VOID__BOOL(GtkObject *object, GSList *actions, | |
+ GtkSignalFunc default_action, va_list args) | |
+{ | |
+ gboolean arg1; | |
+ GtkSignal *signal; | |
+ | |
+ arg1 = va_arg(args, gboolean); | |
+ | |
+ while (actions) { | |
+ signal = (GtkSignal *)actions->data; | |
+ if (signal->slot_object) { | |
+ (*signal->func) (signal->slot_object, arg1); | |
+ } else | |
+ (*signal->func) (object, arg1, signal->func_data); | |
+ actions = g_slist_next(actions); | |
+ } | |
+ if (default_action) | |
+ (*default_action) (object, arg1); | |
} | |
static GtkSignalType *gtk_get_signal_type(GtkObject *object, | |
- const gchar *name) { | |
- GtkClass *klass; | |
- GtkSignalType *signals; | |
- | |
- for (klass=object->klass;klass;klass=klass->parent) { | |
-/* g_print("Searching for signal %s in class %s\n",name,klass->Name);*/ | |
- for (signals=klass->signals;signals && signals->name[0];signals++) { | |
- if (strcmp(signals->name,name)==0) return signals; | |
- } | |
- } | |
- return NULL; | |
-} | |
- | |
-void gtk_signal_emit(GtkObject *object,const gchar *name, ...) { | |
- GSList *signal_list; | |
- GtkSignalType *signal_type; | |
- va_list ap; | |
- | |
-/* g_print("gtk_signal_emit of signal %s on object %p, type %p\n", | |
- name,object,object->klass);*/ | |
- | |
- if (!object) return; | |
- | |
-// g_print("Initialising va_list\n"); | |
- va_start(ap,name); | |
-// g_print("Getting signal list\n"); | |
- signal_list=(GSList *)g_datalist_get_data(&object->signals,name); | |
-// g_print("Getting signal list %p\n",signal_list); | |
- signal_type=gtk_get_signal_type(object,name); | |
-// g_print("Getting signal type %p\n",signal_type); | |
- if (signal_type && signal_type->marshaller) { | |
-/* g_print("Calling marshaller %p with signal_list %p\n", | |
- signal_type->marshaller,signal_list);*/ | |
- (*signal_type->marshaller)(object,signal_list, | |
- signal_type->default_action,ap); | |
- } | |
- va_end(ap); | |
- if (!signal_type) g_warning("gtk_signal_emit: unknown signal %s",name); | |
-// g_print("Signal emission done\n"); | |
-} | |
- | |
-guint gtk_signal_connect(GtkObject *object,const gchar *name, | |
- GtkSignalFunc func,gpointer func_data) { | |
- GtkSignal *signal; | |
- GtkSignalType *signal_type; | |
- GSList *signal_list; | |
- | |
-// g_print("Attempting to connect signal %s to object %p\n",name,object); | |
- if (!object) return 0; | |
- signal_type=gtk_get_signal_type(object,name); | |
- if (!signal_type) { | |
- g_warning("gtk_signal_connect: unknown signal %s",name); | |
- return 0; | |
- } | |
- signal_list=(GSList *)g_datalist_get_data(&object->signals,name); | |
- signal=g_new0(GtkSignal,1); | |
- signal->func=func; signal->func_data=func_data; | |
- signal_list=g_slist_append(signal_list,signal); | |
- g_datalist_set_data(&object->signals,name,signal_list); | |
- return 0; | |
-} | |
- | |
-guint gtk_signal_connect_object(GtkObject *object,const gchar *name, | |
- GtkSignalFunc func,GtkObject *slot_object) { | |
- GtkSignal *signal; | |
- GtkSignalType *signal_type; | |
- GSList *signal_list; | |
- | |
- if (!object) return 0; | |
- signal_type=gtk_get_signal_type(object,name); | |
- if (!signal_type) { | |
- g_warning("gtk_signal_connect_object: unknown signal %s",name); | |
- return 0; | |
- } | |
- signal_list=(GSList *)g_datalist_get_data(&object->signals,name); | |
- signal=g_new0(GtkSignal,1); | |
- signal->func=func; signal->slot_object=slot_object; | |
- signal_list=g_slist_append(signal_list,signal); | |
- g_datalist_set_data(&object->signals,name,signal_list); | |
- return 0; | |
+ const gchar *name) | |
+{ | |
+ GtkClass *klass; | |
+ GtkSignalType *signals; | |
+ | |
+ for (klass = object->klass; klass; klass = klass->parent) { | |
+ for (signals = klass->signals; signals && signals->name[0]; signals++) { | |
+ if (strcmp(signals->name, name) == 0) | |
+ return signals; | |
+ } | |
+ } | |
+ return NULL; | |
} | |
-GtkItemFactory *gtk_item_factory_new(GtkType container_type, | |
- const gchar *path, | |
- GtkAccelGroup *accel_group) { | |
- GtkItemFactory *new_fac; | |
- new_fac=(GtkItemFactory *)GtkNewObject(&GtkItemFactoryClass); | |
- new_fac->path=g_strdup(path); | |
- new_fac->accel_group = accel_group; | |
- new_fac->top_widget=gtk_menu_bar_new(); | |
- new_fac->translate_func=NULL; | |
- return new_fac; | |
+void gtk_signal_emit(GtkObject *object, const gchar *name, ...) | |
+{ | |
+ GSList *signal_list; | |
+ GtkSignalType *signal_type; | |
+ va_list ap; | |
+ | |
+ if (!object) | |
+ return; | |
+ | |
+ va_start(ap, name); | |
+ signal_list = (GSList *)g_datalist_get_data(&object->signals, name); | |
+ signal_type = gtk_get_signal_type(object, name); | |
+ if (signal_type && signal_type->marshaller) { | |
+ (*signal_type->marshaller) (object, signal_list, | |
+ signal_type->default_action, ap); | |
+ } | |
+ va_end(ap); | |
+ if (!signal_type) | |
+ g_warning("gtk_signal_emit: unknown signal %s", name); | |
} | |
-static gint PathCmp(const gchar *path1,const gchar *path2) { | |
- gint Match=1; | |
+guint gtk_signal_connect(GtkObject *object, const gchar *name, | |
+ GtkSignalFunc func, gpointer func_data) | |
+{ | |
+ GtkSignal *signal; | |
+ GtkSignalType *signal_type; | |
+ GSList *signal_list; | |
+ | |
+ if (!object) | |
+ return 0; | |
+ signal_type = gtk_get_signal_type(object, name); | |
+ if (!signal_type) { | |
+ g_warning("gtk_signal_connect: unknown signal %s", name); | |
+ return 0; | |
+ } | |
+ signal_list = (GSList *)g_datalist_get_data(&object->signals, name); | |
+ signal = g_new0(GtkSignal, 1); | |
- if (!path1 || !path2) return 0; | |
+ signal->func = func; | |
+ signal->func_data = func_data; | |
+ signal_list = g_slist_append(signal_list, signal); | |
+ g_datalist_set_data(&object->signals, name, signal_list); | |
+ return 0; | |
+} | |
- while (*path1 && *path2 && Match) { | |
- while (*path1=='_') path1++; | |
- while (*path2=='_') path2++; | |
- if (*path1==*path2) { path1++; path2++; } | |
- else Match=0; | |
- } | |
- if (*path1 || *path2) Match=0; | |
- return Match; | |
+guint gtk_signal_connect_object(GtkObject *object, const gchar *name, | |
+ GtkSignalFunc func, GtkObject *slot_object) | |
+{ | |
+ GtkSignal *signal; | |
+ GtkSignalType *signal_type; | |
+ GSList *signal_list; | |
+ | |
+ if (!object) | |
+ return 0; | |
+ signal_type = gtk_get_signal_type(object, name); | |
+ if (!signal_type) { | |
+ g_warning("gtk_signal_connect_object: unknown signal %s", name); | |
+ return 0; | |
+ } | |
+ signal_list = (GSList *)g_datalist_get_data(&object->signals, name); | |
+ signal = g_new0(GtkSignal, 1); | |
+ | |
+ signal->func = func; | |
+ signal->slot_object = slot_object; | |
+ signal_list = g_slist_append(signal_list, signal); | |
+ g_datalist_set_data(&object->signals, name, signal_list); | |
+ return 0; | |
} | |
-static gchar *TransPath(GtkItemFactory *ifactory,gchar *path) { | |
- gchar *transpath=NULL; | |
+GtkItemFactory *gtk_item_factory_new(GtkType container_type, | |
+ const gchar *path, | |
+ GtkAccelGroup *accel_group) | |
+{ | |
+ GtkItemFactory *new_fac; | |
+ | |
+ new_fac = (GtkItemFactory *)GtkNewObject(&GtkItemFactoryClass); | |
+ new_fac->path = g_strdup(path); | |
+ new_fac->accel_group = accel_group; | |
+ new_fac->top_widget = gtk_menu_bar_new(); | |
+ new_fac->translate_func = NULL; | |
+ return new_fac; | |
+} | |
+ | |
+static gint PathCmp(const gchar *path1, const gchar *path2) | |
+{ | |
+ gint Match = 1; | |
+ | |
+ if (!path1 || !path2) | |
+ return 0; | |
+ | |
+ while (*path1 && *path2 && Match) { | |
+ while (*path1 == '_') | |
+ path1++; | |
+ while (*path2 == '_') | |
+ path2++; | |
+ if (*path1 == *path2) { | |
+ path1++; | |
+ path2++; | |
+ } else | |
+ Match = 0; | |
+ } | |
+ if (*path1 || *path2) | |
+ Match = 0; | |
+ return Match; | |
+} | |
+ | |
+static gchar *TransPath(GtkItemFactory *ifactory, gchar *path) | |
+{ | |
+ gchar *transpath = NULL; | |
if (ifactory->translate_func) { | |
- transpath = (*ifactory->translate_func)(path,ifactory->translate_data); | |
+ transpath = | |
+ (*ifactory->translate_func) (path, ifactory->translate_data); | |
} | |
return transpath ? transpath : path; | |
t@@ -3371,24 +3773,28 @@ static gchar *TransPath(GtkItemFactory *ifactory,gchar… | |
static void gtk_item_factory_parse_path(GtkItemFactory *ifactory, | |
gchar *path, | |
GtkItemFactoryChild **parent, | |
- GString *menu_title) { | |
+ GString *menu_title) | |
+{ | |
GSList *list; | |
GtkItemFactoryChild *child; | |
- gchar *root,*pt,*transpath; | |
- | |
- transpath = TransPath(ifactory,path); | |
- pt=strrchr(transpath,'/'); | |
- if (pt) g_string_assign(menu_title,pt+1); | |
- | |
- pt=strrchr(path,'/'); | |
- if (!pt) return; | |
- root=g_strdup(path); | |
- root[pt-path]='\0'; | |
- | |
- for (list=ifactory->children;list;list=g_slist_next(list)) { | |
- child=(GtkItemFactoryChild *)list->data; | |
- if (PathCmp(child->path,root)==1) { | |
- *parent=child; break; | |
+ gchar *root, *pt, *transpath; | |
+ | |
+ transpath = TransPath(ifactory, path); | |
+ pt = strrchr(transpath, '/'); | |
+ if (pt) | |
+ g_string_assign(menu_title, pt + 1); | |
+ | |
+ pt = strrchr(path, '/'); | |
+ if (!pt) | |
+ return; | |
+ root = g_strdup(path); | |
+ root[pt - path] = '\0'; | |
+ | |
+ for (list = ifactory->children; list; list = g_slist_next(list)) { | |
+ child = (GtkItemFactoryChild *)list->data; | |
+ if (PathCmp(child->path, root) == 1) { | |
+ *parent = child; | |
+ break; | |
} | |
} | |
g_free(root); | |
t@@ -3396,672 +3802,800 @@ static void gtk_item_factory_parse_path(GtkItemFacto… | |
static gboolean gtk_item_factory_parse_accel(GtkItemFactory *ifactory, | |
gchar *accelerator, | |
- GString *menu_title,ACCEL *accel)… | |
+ GString *menu_title, | |
+ ACCEL *accel) | |
+{ | |
gchar *apt; | |
- if (!accelerator) return FALSE; | |
+ if (!accelerator) | |
+ return FALSE; | |
- apt=accelerator; | |
- accel->fVirt=0; | |
- accel->key=0; | |
- accel->cmd=0; | |
+ apt = accelerator; | |
+ accel->fVirt = 0; | |
+ accel->key = 0; | |
+ accel->cmd = 0; | |
- g_string_append(menu_title,"\t"); | |
+ g_string_append(menu_title, "\t"); | |
- if (strncmp(apt,"<control>",9)==0) { | |
+ if (strncmp(apt, "<control>", 9) == 0) { | |
accel->fVirt |= FCONTROL; | |
- g_string_append(menu_title,"Ctrl+"); | |
- apt+=9; | |
+ g_string_append(menu_title, "Ctrl+"); | |
+ apt += 9; | |
} | |
- if (strlen(apt)==1) { | |
- g_string_append_c(menu_title,*apt); | |
+ if (strlen(apt) == 1) { | |
+ g_string_append_c(menu_title, *apt); | |
accel->key = *apt; | |
accel->fVirt |= FVIRTKEY; | |
- } else if (strcmp(apt,"F1")==0) { | |
- g_string_append(menu_title,apt); | |
+ } else if (strcmp(apt, "F1") == 0) { | |
+ g_string_append(menu_title, apt); | |
accel->fVirt |= FVIRTKEY; | |
accel->key = VK_F1; | |
} | |
- return (accel->key!=0); | |
+ return (accel->key != 0); | |
} | |
void gtk_item_factory_create_item(GtkItemFactory *ifactory, | |
GtkItemFactoryEntry *entry, | |
- gpointer callback_data,guint callback_type) { | |
- GtkItemFactoryChild *new_child,*parent=NULL; | |
- GString *menu_title; | |
- GtkWidget *menu_item,*menu; | |
- ACCEL accel; | |
- gboolean haveaccel; | |
- | |
- new_child=g_new0(GtkItemFactoryChild,1); | |
- new_child->path=g_strdup(entry->path); | |
- | |
- menu_title = g_string_new(""); | |
- | |
- gtk_item_factory_parse_path(ifactory,new_child->path,&parent,menu_title); | |
- haveaccel = gtk_item_factory_parse_accel(ifactory,entry->accelerator, | |
- menu_title,&accel); | |
- | |
- menu_item=gtk_menu_item_new_with_label(menu_title->str); | |
- new_child->widget=menu_item; | |
- if (entry->callback) { | |
- gtk_signal_connect(GTK_OBJECT(menu_item),"activate", | |
- entry->callback,callback_data); | |
- } | |
- | |
- if (parent) { | |
- menu=GTK_WIDGET(GTK_MENU_ITEM(parent->widget)->submenu); | |
- if (!menu) { | |
- menu=gtk_menu_new(); | |
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(parent->widget),menu); | |
- } | |
- gtk_menu_append(GTK_MENU(menu),menu_item); | |
- } else { | |
- gtk_menu_bar_append(GTK_MENU_BAR(ifactory->top_widget),menu_item); | |
- } | |
- | |
- if (haveaccel && ifactory->accel_group) { | |
- GTK_MENU_ITEM(menu_item)->accelind= | |
- gtk_accel_group_add(ifactory->accel_group,&accel); | |
- } | |
- | |
- g_string_free(menu_title,TRUE); | |
- | |
- ifactory->children=g_slist_append(ifactory->children,new_child); | |
-} | |
- | |
-void gtk_item_factory_create_items(GtkItemFactory *ifactory,guint n_entries, | |
+ gpointer callback_data, | |
+ guint callback_type) | |
+{ | |
+ GtkItemFactoryChild *new_child, *parent = NULL; | |
+ GString *menu_title; | |
+ GtkWidget *menu_item, *menu; | |
+ ACCEL accel; | |
+ gboolean haveaccel; | |
+ | |
+ new_child = g_new0(GtkItemFactoryChild, 1); | |
+ | |
+ new_child->path = g_strdup(entry->path); | |
+ | |
+ menu_title = g_string_new(""); | |
+ | |
+ gtk_item_factory_parse_path(ifactory, new_child->path, &parent, | |
+ menu_title); | |
+ haveaccel = | |
+ gtk_item_factory_parse_accel(ifactory, entry->accelerator, | |
+ menu_title, &accel); | |
+ | |
+ menu_item = gtk_menu_item_new_with_label(menu_title->str); | |
+ new_child->widget = menu_item; | |
+ if (entry->callback) { | |
+ gtk_signal_connect(GTK_OBJECT(menu_item), "activate", | |
+ entry->callback, callback_data); | |
+ } | |
+ | |
+ if (parent) { | |
+ menu = GTK_WIDGET(GTK_MENU_ITEM(parent->widget)->submenu); | |
+ if (!menu) { | |
+ menu = gtk_menu_new(); | |
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(parent->widget), menu); | |
+ } | |
+ gtk_menu_append(GTK_MENU(menu), menu_item); | |
+ } else { | |
+ gtk_menu_bar_append(GTK_MENU_BAR(ifactory->top_widget), menu_item); | |
+ } | |
+ | |
+ if (haveaccel && ifactory->accel_group) { | |
+ GTK_MENU_ITEM(menu_item)->accelind = | |
+ gtk_accel_group_add(ifactory->accel_group, &accel); | |
+ } | |
+ | |
+ g_string_free(menu_title, TRUE); | |
+ | |
+ ifactory->children = g_slist_append(ifactory->children, new_child); | |
+} | |
+ | |
+void gtk_item_factory_create_items(GtkItemFactory *ifactory, | |
+ guint n_entries, | |
GtkItemFactoryEntry *entries, | |
- gpointer callback_data) { | |
- gint i; | |
- for (i=0;i<n_entries;i++) { | |
- gtk_item_factory_create_item(ifactory,&entries[i],callback_data,0); | |
- } | |
+ gpointer callback_data) | |
+{ | |
+ gint i; | |
+ | |
+ for (i = 0; i < n_entries; i++) { | |
+ gtk_item_factory_create_item(ifactory, &entries[i], callback_data, 0); | |
+ } | |
} | |
GtkWidget *gtk_item_factory_get_widget(GtkItemFactory *ifactory, | |
- const gchar *path) { | |
- gint root_len; | |
- GSList *list; | |
- GtkItemFactoryChild *child; | |
+ const gchar *path) | |
+{ | |
+ gint root_len; | |
+ GSList *list; | |
+ GtkItemFactoryChild *child; | |
- root_len=strlen(ifactory->path); | |
- if (!path || strlen(path)<root_len) return NULL; | |
+ root_len = strlen(ifactory->path); | |
+ if (!path || strlen(path) < root_len) | |
+ return NULL; | |
- if (strncmp(ifactory->path,path,root_len)!=0) return NULL; | |
- if (strlen(path)==root_len) return ifactory->top_widget; | |
+ if (strncmp(ifactory->path, path, root_len) != 0) | |
+ return NULL; | |
+ if (strlen(path) == root_len) | |
+ return ifactory->top_widget; | |
- for (list=ifactory->children;list;list=g_slist_next(list)) { | |
- child=(GtkItemFactoryChild *)list->data; | |
- if (PathCmp(child->path,&path[root_len])==1) return child->widget; | |
- } | |
- return NULL; | |
+ for (list = ifactory->children; list; list = g_slist_next(list)) { | |
+ child = (GtkItemFactoryChild *)list->data; | |
+ if (PathCmp(child->path, &path[root_len]) == 1) | |
+ return child->widget; | |
+ } | |
+ return NULL; | |
} | |
-void gtk_menu_shell_insert(GtkMenuShell *menu_shell,GtkWidget *child, | |
- gint position) { | |
- menu_shell->children=g_slist_insert(menu_shell->children,(gpointer)child, | |
- position); | |
- child->parent=GTK_WIDGET(menu_shell); | |
+void gtk_menu_shell_insert(GtkMenuShell *menu_shell, GtkWidget *child, | |
+ gint position) | |
+{ | |
+ menu_shell->children = | |
+ g_slist_insert(menu_shell->children, (gpointer)child, position); | |
+ child->parent = GTK_WIDGET(menu_shell); | |
} | |
-void gtk_menu_shell_append(GtkMenuShell *menu_shell,GtkWidget *child) { | |
- gtk_menu_shell_insert(menu_shell,child,-1); | |
+void gtk_menu_shell_append(GtkMenuShell *menu_shell, GtkWidget *child) | |
+{ | |
+ gtk_menu_shell_insert(menu_shell, child, -1); | |
} | |
-void gtk_menu_shell_prepend(GtkMenuShell *menu_shell,GtkWidget *child) { | |
- gtk_menu_shell_insert(menu_shell,child,0); | |
+void gtk_menu_shell_prepend(GtkMenuShell *menu_shell, GtkWidget *child) | |
+{ | |
+ gtk_menu_shell_insert(menu_shell, child, 0); | |
} | |
-GtkWidget *gtk_menu_bar_new() { | |
- GtkMenuBar *menu_bar; | |
- menu_bar=GTK_MENU_BAR(GtkNewObject(&GtkMenuBarClass)); | |
- return GTK_WIDGET(menu_bar); | |
+GtkWidget *gtk_menu_bar_new() | |
+{ | |
+ GtkMenuBar *menu_bar; | |
+ | |
+ menu_bar = GTK_MENU_BAR(GtkNewObject(&GtkMenuBarClass)); | |
+ return GTK_WIDGET(menu_bar); | |
} | |
-void gtk_menu_bar_insert(GtkMenuBar *menu_bar,GtkWidget *child,gint position) { | |
- gtk_menu_shell_insert(GTK_MENU_SHELL(menu_bar),child,position); | |
+void gtk_menu_bar_insert(GtkMenuBar *menu_bar, GtkWidget *child, | |
+ gint position) | |
+{ | |
+ gtk_menu_shell_insert(GTK_MENU_SHELL(menu_bar), child, position); | |
} | |
-void gtk_menu_bar_append(GtkMenuBar *menu_bar,GtkWidget *child) { | |
- gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar),child); | |
+void gtk_menu_bar_append(GtkMenuBar *menu_bar, GtkWidget *child) | |
+{ | |
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), child); | |
} | |
-void gtk_menu_bar_prepend(GtkMenuBar *menu_bar,GtkWidget *child) { | |
- gtk_menu_shell_prepend(GTK_MENU_SHELL(menu_bar),child); | |
+void gtk_menu_bar_prepend(GtkMenuBar *menu_bar, GtkWidget *child) | |
+{ | |
+ gtk_menu_shell_prepend(GTK_MENU_SHELL(menu_bar), child); | |
} | |
-GtkWidget *gtk_menu_new() { | |
- GtkMenu *menu; | |
- menu=GTK_MENU(GtkNewObject(&GtkMenuClass)); | |
- return GTK_WIDGET(menu); | |
+GtkWidget *gtk_menu_new() | |
+{ | |
+ GtkMenu *menu; | |
+ | |
+ menu = GTK_MENU(GtkNewObject(&GtkMenuClass)); | |
+ return GTK_WIDGET(menu); | |
} | |
-void gtk_menu_insert(GtkMenu *menu,GtkWidget *child,gint position) { | |
- gtk_menu_shell_insert(GTK_MENU_SHELL(menu),child,position); | |
+void gtk_menu_insert(GtkMenu *menu, GtkWidget *child, gint position) | |
+{ | |
+ gtk_menu_shell_insert(GTK_MENU_SHELL(menu), child, position); | |
} | |
-void gtk_menu_append(GtkMenu *menu,GtkWidget *child) { | |
- gtk_menu_shell_append(GTK_MENU_SHELL(menu),child); | |
+void gtk_menu_append(GtkMenu *menu, GtkWidget *child) | |
+{ | |
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), child); | |
} | |
-void gtk_menu_prepend(GtkMenu *menu,GtkWidget *child) { | |
- gtk_menu_shell_prepend(GTK_MENU_SHELL(menu),child); | |
+void gtk_menu_prepend(GtkMenu *menu, GtkWidget *child) | |
+{ | |
+ gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), child); | |
} | |
-GtkWidget *gtk_menu_item_new_with_label(const gchar *label) { | |
- GtkMenuItem *menu_item; | |
- gint i; | |
+GtkWidget *gtk_menu_item_new_with_label(const gchar *label) | |
+{ | |
+ GtkMenuItem *menu_item; | |
+ gint i; | |
+ | |
+ menu_item = GTK_MENU_ITEM(GtkNewObject(&GtkMenuItemClass)); | |
+ menu_item->accelind = -1; | |
+ menu_item->text = g_strdup(label); | |
+ for (i = 0; i < strlen(menu_item->text); i++) { | |
+ if (menu_item->text[i] == '_') | |
+ menu_item->text[i] = '&'; | |
+ } | |
+ return GTK_WIDGET(menu_item); | |
+} | |
- menu_item=GTK_MENU_ITEM(GtkNewObject(&GtkMenuItemClass)); | |
- menu_item->accelind=-1; | |
- menu_item->text=g_strdup(label); | |
- for (i=0;i<strlen(menu_item->text);i++) { | |
- if (menu_item->text[i]=='_') menu_item->text[i]='&'; | |
- } | |
- return GTK_WIDGET(menu_item); | |
+void gtk_menu_item_set_submenu(GtkMenuItem *menu_item, GtkWidget *submenu) | |
+{ | |
+ menu_item->submenu = GTK_MENU(submenu); | |
+ submenu->parent = GTK_WIDGET(menu_item); | |
} | |
-void gtk_menu_item_set_submenu(GtkMenuItem *menu_item,GtkWidget *submenu) { | |
- menu_item->submenu=GTK_MENU(submenu); | |
- submenu->parent=GTK_WIDGET(menu_item); | |
+static GtkWidget *gtk_menu_item_get_menu_ID(GtkMenuItem *menu_item, | |
+ gint ID) | |
+{ | |
+ if (menu_item->ID == ID) { | |
+ return GTK_WIDGET(menu_item); | |
+ } else if (menu_item->submenu) { | |
+ return gtk_menu_shell_get_menu_ID(GTK_MENU_SHELL(menu_item->submenu), | |
+ ID); | |
+ } else | |
+ return NULL; | |
} | |
-static GtkWidget *gtk_menu_item_get_menu_ID(GtkMenuItem *menu_item,gint ID) { | |
- if (menu_item->ID==ID) { | |
- return GTK_WIDGET(menu_item); | |
- } else if (menu_item->submenu) { | |
- return gtk_menu_shell_get_menu_ID(GTK_MENU_SHELL(menu_item->submenu),ID); | |
- } else return NULL; | |
+GtkWidget *gtk_menu_shell_get_menu_ID(GtkMenuShell *menu_shell, gint ID) | |
+{ | |
+ GSList *list; | |
+ GtkWidget *menu_item; | |
+ | |
+ for (list = menu_shell->children; list; list = list->next) { | |
+ menu_item = gtk_menu_item_get_menu_ID(GTK_MENU_ITEM(list->data), ID); | |
+ if (menu_item) | |
+ return menu_item; | |
+ } | |
+ return NULL; | |
} | |
-GtkWidget *gtk_menu_shell_get_menu_ID(GtkMenuShell *menu_shell,gint ID) { | |
- GSList *list; | |
- GtkWidget *menu_item; | |
- for (list=menu_shell->children;list;list=list->next) { | |
- menu_item=gtk_menu_item_get_menu_ID(GTK_MENU_ITEM(list->data),ID); | |
- if (menu_item) return menu_item; | |
- } | |
- return NULL; | |
+GtkWidget *gtk_window_get_menu_ID(GtkWindow *window, gint ID) | |
+{ | |
+ if (window->menu_bar) { | |
+ return gtk_menu_shell_get_menu_ID(GTK_MENU_SHELL(window->menu_bar), | |
+ ID); | |
+ } else | |
+ return NULL; | |
} | |
-GtkWidget *gtk_window_get_menu_ID(GtkWindow *window,gint ID) { | |
- if (window->menu_bar) { | |
- return gtk_menu_shell_get_menu_ID(GTK_MENU_SHELL(window->menu_bar),ID); | |
- } else return NULL; | |
+void gtk_menu_bar_realize(GtkWidget *widget) | |
+{ | |
+ GtkMenuBar *menu_bar = GTK_MENU_BAR(widget); | |
+ GtkWidget *window; | |
+ HMENU hMenu; | |
+ | |
+ hMenu = GTK_MENU_SHELL(widget)->menu = CreateMenu(); | |
+ menu_bar->LastID = 1000; | |
+ | |
+ gtk_menu_shell_realize(widget); | |
+ | |
+ window = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ gtk_window_set_menu(GTK_WINDOW(window), menu_bar); | |
} | |
-void gtk_menu_bar_realize(GtkWidget *widget) { | |
- GtkMenuBar *menu_bar=GTK_MENU_BAR(widget); | |
- GtkWidget *window; | |
- HMENU hMenu; | |
+void gtk_menu_item_realize(GtkWidget *widget) | |
+{ | |
+ GtkMenuItem *menu_item = GTK_MENU_ITEM(widget); | |
+ MENUITEMINFO mii; | |
+ GtkWidget *menu_bar, *window; | |
+ HMENU parent_menu; | |
+ gint pos; | |
+ | |
+ menu_bar = gtk_widget_get_ancestor(widget, GTK_TYPE_MENU_BAR); | |
+ if (menu_bar) | |
+ menu_item->ID = GTK_MENU_BAR(menu_bar)->LastID++; | |
+ | |
+ if (menu_item->accelind >= 0) { | |
+ window = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ if (window && GTK_WINDOW(window)->accel_group) { | |
+ gtk_accel_group_set_id(GTK_WINDOW(window)->accel_group, | |
+ menu_item->accelind, menu_item->ID); | |
+ } | |
+ } | |
+ | |
+ if (menu_item->submenu) | |
+ gtk_widget_realize(GTK_WIDGET(menu_item->submenu)); | |
- hMenu=GTK_MENU_SHELL(widget)->menu=CreateMenu(); | |
- menu_bar->LastID=1000; | |
+ parent_menu = GTK_MENU_SHELL(widget->parent)->menu; | |
+ pos = g_slist_index(GTK_MENU_SHELL(widget->parent)->children, widget); | |
- gtk_menu_shell_realize(widget); | |
+ mii.cbSize = sizeof(MENUITEMINFO); | |
+ mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; | |
+ if (menu_item->submenu) { | |
+ mii.fMask |= MIIM_SUBMENU; | |
+ mii.hSubMenu = GTK_MENU_SHELL(menu_item->submenu)->menu; | |
+ } | |
+ mii.fType = MFT_STRING; | |
+ if (GTK_WIDGET_SENSITIVE(widget)) | |
+ mii.fState = MFS_ENABLED; | |
+ else | |
+ mii.fState = MFS_GRAYED; | |
+ mii.wID = menu_item->ID; | |
+ mii.dwTypeData = (LPTSTR)menu_item->text; | |
+ mii.cch = strlen(menu_item->text); | |
+ InsertMenuItem(parent_menu, pos, TRUE, &mii); | |
+} | |
+ | |
+void gtk_menu_realize(GtkWidget *widget) | |
+{ | |
+ GTK_MENU_SHELL(widget)->menu = CreatePopupMenu(); | |
+ gtk_menu_shell_realize(widget); | |
+} | |
- window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- gtk_window_set_menu(GTK_WINDOW(window),menu_bar); | |
+void gtk_menu_set_active(GtkMenu *menu, guint index) | |
+{ | |
+ menu->active = index; | |
} | |
-void gtk_menu_item_realize(GtkWidget *widget) { | |
- GtkMenuItem *menu_item=GTK_MENU_ITEM(widget); | |
- MENUITEMINFO mii; | |
- GtkWidget *menu_bar,*window; | |
- HMENU parent_menu; | |
- gint pos; | |
+void gtk_menu_shell_realize(GtkWidget *widget) | |
+{ | |
+ GSList *children; | |
+ GtkMenuShell *menu = GTK_MENU_SHELL(widget); | |
+ | |
+ for (children = menu->children; children; | |
+ children = g_slist_next(children)) { | |
+ gtk_widget_realize(GTK_WIDGET(children->data)); | |
+ } | |
+} | |
- menu_bar=gtk_widget_get_ancestor(widget,GTK_TYPE_MENU_BAR); | |
- if (menu_bar) menu_item->ID=GTK_MENU_BAR(menu_bar)->LastID++; | |
+void gtk_menu_item_enable(GtkWidget *widget) | |
+{ | |
+ GtkWidget *parent; | |
+ HMENU hMenu; | |
+ HWND hWnd; | |
+ | |
+ parent = widget->parent; | |
+ if (!parent) | |
+ return; | |
+ hMenu = GTK_MENU_SHELL(parent)->menu; | |
+ if (hMenu) | |
+ EnableMenuItem(hMenu, GTK_MENU_ITEM(widget)->ID, | |
+ MF_BYCOMMAND | MF_ENABLED); | |
+ hWnd = gtk_get_parent_hwnd(widget); | |
+ if (hWnd) | |
+ DrawMenuBar(hWnd); | |
+} | |
+ | |
+void gtk_menu_item_disable(GtkWidget *widget) | |
+{ | |
+ GtkWidget *parent; | |
+ HMENU hMenu; | |
+ HWND hWnd; | |
+ | |
+ parent = widget->parent; | |
+ if (!parent) | |
+ return; | |
+ hMenu = GTK_MENU_SHELL(parent)->menu; | |
+ if (hMenu) | |
+ EnableMenuItem(hMenu, GTK_MENU_ITEM(widget)->ID, | |
+ MF_BYCOMMAND | MF_GRAYED); | |
+ hWnd = gtk_get_parent_hwnd(widget); | |
+ if (hWnd) | |
+ DrawMenuBar(hWnd); | |
+} | |
+ | |
+GtkWidget *gtk_notebook_new() | |
+{ | |
+ GtkNotebook *notebook; | |
- if (menu_item->accelind>=0) { | |
- window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- if (window && GTK_WINDOW(window)->accel_group) { | |
- gtk_accel_group_set_id(GTK_WINDOW(window)->accel_group, | |
- menu_item->accelind,menu_item->ID); | |
- } | |
- } | |
+ notebook = GTK_NOTEBOOK(GtkNewObject(&GtkNotebookClass)); | |
+ return GTK_WIDGET(notebook); | |
+} | |
- if (menu_item->submenu) gtk_widget_realize(GTK_WIDGET(menu_item->submenu)); | |
+void gtk_notebook_append_page(GtkNotebook *notebook, GtkWidget *child, | |
+ GtkWidget *tab_label) | |
+{ | |
+ gtk_notebook_insert_page(notebook, child, tab_label, -1); | |
+} | |
- parent_menu=GTK_MENU_SHELL(widget->parent)->menu; | |
- pos=g_slist_index(GTK_MENU_SHELL(widget->parent)->children,widget); | |
+void gtk_notebook_insert_page(GtkNotebook *notebook, GtkWidget *child, | |
+ GtkWidget *tab_label, gint position) | |
+{ | |
+ GtkNotebookChild *note_child; | |
+ note_child = g_new0(GtkNotebookChild, 1); | |
- mii.cbSize=sizeof(MENUITEMINFO); | |
- mii.fMask=MIIM_TYPE|MIIM_ID|MIIM_STATE; | |
- if (menu_item->submenu) { | |
- mii.fMask|=MIIM_SUBMENU; | |
- mii.hSubMenu=GTK_MENU_SHELL(menu_item->submenu)->menu; | |
- } | |
- mii.fType=MFT_STRING; | |
- if (GTK_WIDGET_SENSITIVE(widget)) mii.fState=MFS_ENABLED; | |
- else mii.fState=MFS_GRAYED; | |
- mii.wID=menu_item->ID; | |
- mii.dwTypeData=(LPTSTR)menu_item->text; | |
- mii.cch=strlen(menu_item->text); | |
- InsertMenuItem(parent_menu,pos,TRUE,&mii); | |
+ note_child->child = child; | |
+ note_child->tab_label = tab_label; | |
+ notebook->children = | |
+ g_slist_insert(notebook->children, note_child, position); | |
+ child->parent = GTK_WIDGET(notebook); | |
} | |
-void gtk_menu_realize(GtkWidget *widget) { | |
- GTK_MENU_SHELL(widget)->menu=CreatePopupMenu(); | |
- gtk_menu_shell_realize(widget); | |
-} | |
- | |
-void gtk_menu_set_active(GtkMenu *menu,guint index) { | |
- menu->active=index; | |
-} | |
- | |
-void gtk_menu_shell_realize(GtkWidget *widget) { | |
- GSList *children; | |
- GtkMenuShell *menu=GTK_MENU_SHELL(widget); | |
- for (children=menu->children;children;children=g_slist_next(children)) { | |
- gtk_widget_realize(GTK_WIDGET(children->data)); | |
- } | |
-} | |
- | |
-void gtk_menu_item_enable(GtkWidget *widget) { | |
- GtkWidget *parent; | |
- HMENU hMenu; | |
- HWND hWnd; | |
- parent=widget->parent; | |
- if (!parent) return; | |
- hMenu=GTK_MENU_SHELL(parent)->menu; | |
- if (hMenu) EnableMenuItem(hMenu,GTK_MENU_ITEM(widget)->ID, | |
- MF_BYCOMMAND|MF_ENABLED); | |
- hWnd=gtk_get_parent_hwnd(widget); | |
- if (hWnd) DrawMenuBar(hWnd); | |
-} | |
- | |
-void gtk_menu_item_disable(GtkWidget *widget) { | |
- GtkWidget *parent; | |
- HMENU hMenu; | |
- HWND hWnd; | |
- parent=widget->parent; | |
- if (!parent) return; | |
- hMenu=GTK_MENU_SHELL(parent)->menu; | |
- if (hMenu) EnableMenuItem(hMenu,GTK_MENU_ITEM(widget)->ID, | |
- MF_BYCOMMAND|MF_GRAYED); | |
- hWnd=gtk_get_parent_hwnd(widget); | |
- if (hWnd) DrawMenuBar(hWnd); | |
-} | |
- | |
-GtkWidget *gtk_notebook_new() { | |
- GtkNotebook *notebook; | |
- | |
- notebook=GTK_NOTEBOOK(GtkNewObject(&GtkNotebookClass)); | |
- return GTK_WIDGET(notebook); | |
-} | |
- | |
-void gtk_notebook_append_page(GtkNotebook *notebook,GtkWidget *child, | |
- GtkWidget *tab_label) { | |
- gtk_notebook_insert_page(notebook,child,tab_label,-1); | |
-} | |
- | |
-void gtk_notebook_insert_page(GtkNotebook *notebook,GtkWidget *child, | |
- GtkWidget *tab_label,gint position) { | |
- GtkNotebookChild *note_child; | |
- note_child=g_new0(GtkNotebookChild,1); | |
- note_child->child=child; | |
- note_child->tab_label=tab_label; | |
- notebook->children=g_slist_insert(notebook->children,note_child,position); | |
- child->parent=GTK_WIDGET(notebook); | |
-} | |
- | |
-void gtk_notebook_set_page(GtkNotebook *notebook,gint page_num) { | |
- GSList *children; | |
- GtkNotebookChild *note_child; | |
- GtkWidget *widget=GTK_WIDGET(notebook); | |
- gint pos=0; | |
- | |
- if (page_num<0) page_num=g_slist_length(notebook->children)-1; | |
- notebook->selection=page_num; | |
- | |
- if (GTK_WIDGET_REALIZED(widget)) { | |
- if (widget->hWnd) TabCtrl_SetCurSel(widget->hWnd,page_num); | |
- for (children=notebook->children;children; | |
- children=g_slist_next(children)) { | |
- note_child=(GtkNotebookChild *)(children->data); | |
- if (note_child && note_child->child) { | |
- if (pos==page_num) gtk_widget_show_all_full(note_child->child,TRUE… | |
- else gtk_widget_hide_all_full(note_child->child,TRUE); | |
- pos++; | |
- } | |
- } | |
- } | |
-} | |
- | |
-void gtk_notebook_realize(GtkWidget *widget) { | |
- GSList *children; | |
- GtkNotebookChild *note_child; | |
- HWND Parent; | |
- gint tab_pos=0; | |
- TC_ITEM tie; | |
- | |
- Parent=gtk_get_parent_hwnd(widget); | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- widget->hWnd = CreateWindow(WC_TABCONTROL,"", | |
- WS_CHILD|WS_TABSTOP,0,0,0,0, | |
- Parent,NULL,hInst,NULL); | |
- if (widget->hWnd==NULL) g_print("Error creating window!\n"); | |
- gtk_set_default_font(widget->hWnd); | |
- | |
- tie.mask = TCIF_TEXT | TCIF_IMAGE; | |
- tie.iImage = -1; | |
- | |
- for (children=GTK_NOTEBOOK(widget)->children;children; | |
- children=g_slist_next(children)) { | |
- note_child=(GtkNotebookChild *)(children->data); | |
- if (note_child) { | |
- if (note_child->tab_label) | |
- tie.pszText=GTK_LABEL(note_child->tab_label)->text; | |
- else tie.pszText="No label"; | |
- TabCtrl_InsertItem(widget->hWnd,tab_pos++,&tie); | |
- if (note_child->child) { | |
- gtk_widget_realize(note_child->child); | |
- } | |
+void gtk_notebook_set_page(GtkNotebook *notebook, gint page_num) | |
+{ | |
+ GSList *children; | |
+ GtkNotebookChild *note_child; | |
+ GtkWidget *widget = GTK_WIDGET(notebook); | |
+ gint pos = 0; | |
+ | |
+ if (page_num < 0) | |
+ page_num = g_slist_length(notebook->children) - 1; | |
+ notebook->selection = page_num; | |
+ | |
+ if (GTK_WIDGET_REALIZED(widget)) { | |
+ if (widget->hWnd) | |
+ TabCtrl_SetCurSel(widget->hWnd, page_num); | |
+ for (children = notebook->children; children; | |
+ children = g_slist_next(children)) { | |
+ note_child = (GtkNotebookChild *)(children->data); | |
+ if (note_child && note_child->child) { | |
+ if (pos == page_num) | |
+ gtk_widget_show_all_full(note_child->child, TRUE); | |
+ else | |
+ gtk_widget_hide_all_full(note_child->child, TRUE); | |
+ pos++; | |
} | |
- } | |
- gtk_notebook_set_page(GTK_NOTEBOOK(widget),GTK_NOTEBOOK(widget)->selection); | |
+ } | |
+ } | |
} | |
-void gtk_notebook_show_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GSList *children; | |
- GtkNotebookChild *note_child; | |
+void gtk_notebook_realize(GtkWidget *widget) | |
+{ | |
+ GSList *children; | |
+ GtkNotebookChild *note_child; | |
+ HWND Parent; | |
+ gint tab_pos = 0; | |
+ TC_ITEM tie; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ widget->hWnd = CreateWindow(WC_TABCONTROL, "", | |
+ WS_CHILD | WS_TABSTOP, 0, 0, 0, 0, | |
+ Parent, NULL, hInst, NULL); | |
+ if (widget->hWnd == NULL) | |
+ g_print("Error creating window!\n"); | |
+ gtk_set_default_font(widget->hWnd); | |
+ | |
+ tie.mask = TCIF_TEXT | TCIF_IMAGE; | |
+ tie.iImage = -1; | |
+ | |
+ for (children = GTK_NOTEBOOK(widget)->children; children; | |
+ children = g_slist_next(children)) { | |
+ note_child = (GtkNotebookChild *)(children->data); | |
+ if (note_child) { | |
+ if (note_child->tab_label) | |
+ tie.pszText = GTK_LABEL(note_child->tab_label)->text; | |
+ else | |
+ tie.pszText = "No label"; | |
+ TabCtrl_InsertItem(widget->hWnd, tab_pos++, &tie); | |
+ if (note_child->child) { | |
+ gtk_widget_realize(note_child->child); | |
+ } | |
+ } | |
+ } | |
+ gtk_notebook_set_page(GTK_NOTEBOOK(widget), | |
+ GTK_NOTEBOOK(widget)->selection); | |
+} | |
- if (!hWndOnly) for (children=GTK_NOTEBOOK(widget)->children;children; | |
- children=g_slist_next(children)) { | |
- note_child=(GtkNotebookChild *)(children->data); | |
- if (note_child && note_child->child) | |
- gtk_widget_show_all_full(note_child->child,hWndOnly); | |
- } | |
- gtk_notebook_set_page(GTK_NOTEBOOK(widget),GTK_NOTEBOOK(widget)->selection); | |
+void gtk_notebook_show_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GSList *children; | |
+ GtkNotebookChild *note_child; | |
+ | |
+ if (!hWndOnly) | |
+ for (children = GTK_NOTEBOOK(widget)->children; children; | |
+ children = g_slist_next(children)) { | |
+ note_child = (GtkNotebookChild *)(children->data); | |
+ if (note_child && note_child->child) | |
+ gtk_widget_show_all_full(note_child->child, hWndOnly); | |
+ } | |
+ gtk_notebook_set_page(GTK_NOTEBOOK(widget), | |
+ GTK_NOTEBOOK(widget)->selection); | |
} | |
-void gtk_notebook_hide_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GSList *children; | |
- GtkNotebookChild *note_child; | |
+void gtk_notebook_hide_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GSList *children; | |
+ GtkNotebookChild *note_child; | |
+ | |
+ for (children = GTK_NOTEBOOK(widget)->children; children; | |
+ children = g_slist_next(children)) { | |
+ note_child = (GtkNotebookChild *)(children->data); | |
+ if (note_child && note_child->child) | |
+ gtk_widget_hide_all_full(note_child->child, hWndOnly); | |
+ } | |
+} | |
- for (children=GTK_NOTEBOOK(widget)->children;children; | |
- children=g_slist_next(children)) { | |
- note_child=(GtkNotebookChild *)(children->data); | |
- if (note_child && note_child->child) | |
- gtk_widget_hide_all_full(note_child->child,hWndOnly); | |
- } | |
+void gtk_notebook_destroy(GtkWidget *widget) | |
+{ | |
+ GSList *children; | |
+ GtkNotebookChild *note_child; | |
+ | |
+ for (children = GTK_NOTEBOOK(widget)->children; children; | |
+ children = g_slist_next(children)) { | |
+ note_child = (GtkNotebookChild *)(children->data); | |
+ if (note_child) { | |
+ gtk_widget_destroy(note_child->child); | |
+ gtk_widget_destroy(note_child->tab_label); | |
+ } | |
+ g_free(note_child); | |
+ } | |
+ g_slist_free(GTK_NOTEBOOK(widget)->children); | |
} | |
-void gtk_notebook_destroy(GtkWidget *widget) { | |
- GSList *children; | |
- GtkNotebookChild *note_child; | |
- | |
- for (children=GTK_NOTEBOOK(widget)->children;children; | |
- children=g_slist_next(children)) { | |
- note_child=(GtkNotebookChild *)(children->data); | |
- if (note_child) { | |
- gtk_widget_destroy(note_child->child); | |
- gtk_widget_destroy(note_child->tab_label); | |
- } | |
- g_free(note_child); | |
- } | |
- g_slist_free(GTK_NOTEBOOK(widget)->children); | |
-} | |
- | |
-void gtk_notebook_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GSList *children; | |
- GtkNotebookChild *note_child; | |
- RECT rect; | |
- GtkAllocation child_alloc; | |
- | |
- gtk_container_set_size(widget,allocation); | |
- rect.left=allocation->x; | |
- rect.top=allocation->y; | |
- rect.right=allocation->x+allocation->width; | |
- rect.bottom=allocation->y+allocation->height; | |
- TabCtrl_AdjustRect(widget->hWnd,FALSE,&rect); | |
- child_alloc.x=rect.left+GTK_CONTAINER(widget)->border_width; | |
- child_alloc.y=rect.top+GTK_CONTAINER(widget)->border_width; | |
- child_alloc.width=rect.right-rect.left | |
- -2*GTK_CONTAINER(widget)->border_width; | |
- child_alloc.height=rect.bottom-rect.top | |
- -2*GTK_CONTAINER(widget)->border_width; | |
- | |
- for (children=GTK_NOTEBOOK(widget)->children;children; | |
- children=g_slist_next(children)) { | |
- note_child=(GtkNotebookChild *)(children->data); | |
- if (note_child && note_child->child) { | |
- gtk_widget_set_size(note_child->child,&child_alloc); | |
- } | |
- } | |
-} | |
- | |
-void gtk_notebook_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- GSList *children; | |
- GtkNotebookChild *note_child; | |
- GtkRequisition *child_req; | |
- RECT rect; | |
- | |
- requisition->width=requisition->height=0; | |
- for (children=GTK_NOTEBOOK(widget)->children;children; | |
- children=g_slist_next(children)) { | |
- note_child=(GtkNotebookChild *)(children->data); | |
- if (note_child && note_child->child && | |
- GTK_WIDGET_VISIBLE(note_child->child)) { | |
- child_req=¬e_child->child->requisition; | |
- if (child_req->width > requisition->width) | |
- requisition->width=child_req->width; | |
- if (child_req->height > requisition->height) | |
- requisition->height=child_req->height; | |
- } | |
- } | |
- requisition->width+=GTK_CONTAINER(widget)->border_width*2; | |
- requisition->height+=GTK_CONTAINER(widget)->border_width*2; | |
- rect.left=rect.top=0; | |
- rect.right=requisition->width; | |
- rect.bottom=requisition->height; | |
- TabCtrl_AdjustRect(widget->hWnd,TRUE,&rect); | |
- requisition->width=rect.right-rect.left; | |
- requisition->height=rect.bottom-rect.top; | |
+void gtk_notebook_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GSList *children; | |
+ GtkNotebookChild *note_child; | |
+ RECT rect; | |
+ GtkAllocation child_alloc; | |
+ | |
+ gtk_container_set_size(widget, allocation); | |
+ rect.left = allocation->x; | |
+ rect.top = allocation->y; | |
+ rect.right = allocation->x + allocation->width; | |
+ rect.bottom = allocation->y + allocation->height; | |
+ TabCtrl_AdjustRect(widget->hWnd, FALSE, &rect); | |
+ child_alloc.x = rect.left + GTK_CONTAINER(widget)->border_width; | |
+ child_alloc.y = rect.top + GTK_CONTAINER(widget)->border_width; | |
+ child_alloc.width = rect.right - rect.left | |
+ - 2 * GTK_CONTAINER(widget)->border_width; | |
+ child_alloc.height = rect.bottom - rect.top | |
+ - 2 * GTK_CONTAINER(widget)->border_width; | |
+ | |
+ for (children = GTK_NOTEBOOK(widget)->children; children; | |
+ children = g_slist_next(children)) { | |
+ note_child = (GtkNotebookChild *)(children->data); | |
+ if (note_child && note_child->child) { | |
+ gtk_widget_set_size(note_child->child, &child_alloc); | |
+ } | |
+ } | |
} | |
-GtkObject *gtk_adjustment_new(gfloat value,gfloat lower,gfloat upper, | |
- gfloat step_increment,gfloat page_increment, | |
- gfloat page_size) { | |
- GtkAdjustment *adj; | |
+void gtk_notebook_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition) | |
+{ | |
+ GSList *children; | |
+ GtkNotebookChild *note_child; | |
+ GtkRequisition *child_req; | |
+ RECT rect; | |
+ | |
+ requisition->width = requisition->height = 0; | |
+ for (children = GTK_NOTEBOOK(widget)->children; children; | |
+ children = g_slist_next(children)) { | |
+ note_child = (GtkNotebookChild *)(children->data); | |
+ if (note_child && note_child->child && | |
+ GTK_WIDGET_VISIBLE(note_child->child)) { | |
+ child_req = ¬e_child->child->requisition; | |
+ if (child_req->width > requisition->width) | |
+ requisition->width = child_req->width; | |
+ if (child_req->height > requisition->height) | |
+ requisition->height = child_req->height; | |
+ } | |
+ } | |
+ requisition->width += GTK_CONTAINER(widget)->border_width * 2; | |
+ requisition->height += GTK_CONTAINER(widget)->border_width * 2; | |
+ rect.left = rect.top = 0; | |
+ rect.right = requisition->width; | |
+ rect.bottom = requisition->height; | |
+ TabCtrl_AdjustRect(widget->hWnd, TRUE, &rect); | |
+ requisition->width = rect.right - rect.left; | |
+ requisition->height = rect.bottom - rect.top; | |
+} | |
+ | |
+GtkObject *gtk_adjustment_new(gfloat value, gfloat lower, gfloat upper, | |
+ gfloat step_increment, gfloat page_increment, | |
+ gfloat page_size) | |
+{ | |
+ GtkAdjustment *adj; | |
- adj=(GtkAdjustment *)(GtkNewObject(&GtkAdjustmentClass)); | |
+ adj = (GtkAdjustment *)(GtkNewObject(&GtkAdjustmentClass)); | |
- adj->value=value; | |
- adj->lower=lower; | |
- adj->upper=upper; | |
- adj->step_increment=step_increment; | |
- adj->page_increment=page_increment; | |
- adj->page_size=page_size; | |
+ adj->value = value; | |
+ adj->lower = lower; | |
+ adj->upper = upper; | |
+ adj->step_increment = step_increment; | |
+ adj->page_increment = page_increment; | |
+ adj->page_size = page_size; | |
- return GTK_OBJECT(adj); | |
+ return GTK_OBJECT(adj); | |
} | |
-GtkWidget *gtk_spin_button_new(GtkAdjustment *adjustment,gfloat climb_rate, | |
- guint digits) { | |
- GtkSpinButton *spin; | |
+GtkWidget *gtk_spin_button_new(GtkAdjustment *adjustment, | |
+ gfloat climb_rate, guint digits) | |
+{ | |
+ GtkSpinButton *spin; | |
- spin=GTK_SPIN_BUTTON(GtkNewObject(&GtkSpinButtonClass)); | |
- GTK_ENTRY(spin)->is_visible = TRUE; | |
+ spin = GTK_SPIN_BUTTON(GtkNewObject(&GtkSpinButtonClass)); | |
+ GTK_ENTRY(spin)->is_visible = TRUE; | |
- gtk_spin_button_set_adjustment(spin,adjustment); | |
+ gtk_spin_button_set_adjustment(spin, adjustment); | |
- return GTK_WIDGET(spin); | |
+ return GTK_WIDGET(spin); | |
} | |
void gtk_spin_button_size_request(GtkWidget *widget, | |
- GtkRequisition *requisition) { | |
- gtk_entry_size_request(widget,requisition); | |
-// requisition->width += GetSystemMetrics(SM_CXVSCROLL); | |
+ GtkRequisition *requisition) | |
+{ | |
+ gtk_entry_size_request(widget, requisition); | |
} | |
-void gtk_spin_button_set_size(GtkWidget *widget, | |
- GtkAllocation *allocation) { | |
- int width=allocation->width,udwidth; | |
- HWND updown; | |
+void gtk_spin_button_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ int width = allocation->width, udwidth; | |
+ HWND updown; | |
+ | |
+ udwidth = GetSystemMetrics(SM_CXVSCROLL); | |
+ width = allocation->width; | |
+ allocation->width -= udwidth; | |
+ | |
+ updown = GTK_SPIN_BUTTON(widget)->updown; | |
+ if (updown) { | |
+ SetWindowPos(updown, HWND_TOP, | |
+ allocation->x + allocation->width, allocation->y, | |
+ udwidth, allocation->height, SWP_NOZORDER); | |
+ } | |
+} | |
- udwidth=GetSystemMetrics(SM_CXVSCROLL); | |
- width=allocation->width; | |
- allocation->width-=udwidth; | |
+gint gtk_spin_button_get_value_as_int(GtkSpinButton *spin_button) | |
+{ | |
+ HWND hWnd; | |
+ LRESULT lres; | |
- updown=GTK_SPIN_BUTTON(widget)->updown; | |
- if (updown) { | |
- SetWindowPos(updown,HWND_TOP, | |
- allocation->x+allocation->width,allocation->y, | |
- udwidth,allocation->height, | |
- SWP_NOZORDER); | |
- } | |
+ hWnd = spin_button->updown; | |
+ if (hWnd) { | |
+ lres = SendMessage(hWnd, UDM_GETPOS, 0, 0); | |
+ if (HIWORD(lres) != 0) | |
+ return 0; | |
+ else | |
+ return (gint)LOWORD(lres); | |
+ } else | |
+ return (gint)spin_button->adj->value; | |
} | |
-gint gtk_spin_button_get_value_as_int(GtkSpinButton *spin_button) { | |
- HWND hWnd; | |
- LRESULT lres; | |
- hWnd=spin_button->updown; | |
- if (hWnd) { | |
- lres=SendMessage(hWnd,UDM_GETPOS,0,0); | |
- if (HIWORD(lres) != 0) return 0; | |
- else return (gint)LOWORD(lres); | |
- } else return (gint)spin_button->adj->value; | |
-} | |
+void gtk_spin_button_set_value(GtkSpinButton *spin_button, gfloat value) | |
+{ | |
+ HWND hWnd; | |
-void gtk_spin_button_set_value(GtkSpinButton *spin_button,gfloat value) { | |
- HWND hWnd; | |
- spin_button->adj->value=value; | |
- hWnd=spin_button->updown; | |
- if (hWnd) SendMessage(hWnd,UDM_SETPOS,0,(LPARAM)MAKELONG((short)value,0)); | |
+ spin_button->adj->value = value; | |
+ hWnd = spin_button->updown; | |
+ if (hWnd) | |
+ SendMessage(hWnd, UDM_SETPOS, 0, (LPARAM)MAKELONG((short)value, 0)); | |
} | |
void gtk_spin_button_set_adjustment(GtkSpinButton *spin_button, | |
- GtkAdjustment *adjustment) { | |
- HWND hWnd; | |
- spin_button->adj=adjustment; | |
- hWnd=spin_button->updown; | |
- if (hWnd) { | |
- SendMessage(hWnd,UDM_SETRANGE,0, | |
- (LPARAM)MAKELONG((short)adjustment->upper,(short)adjustment->lower)); | |
- SendMessage(hWnd,UDM_SETPOS,0, | |
- (LPARAM)MAKELONG((short)adjustment->value,0)); | |
- } | |
+ GtkAdjustment *adjustment) | |
+{ | |
+ HWND hWnd; | |
+ | |
+ spin_button->adj = adjustment; | |
+ hWnd = spin_button->updown; | |
+ if (hWnd) { | |
+ SendMessage(hWnd, UDM_SETRANGE, 0, | |
+ (LPARAM)MAKELONG((short)adjustment->upper, | |
+ (short)adjustment->lower)); | |
+ SendMessage(hWnd, UDM_SETPOS, 0, | |
+ (LPARAM)MAKELONG((short)adjustment->value, 0)); | |
+ } | |
} | |
-void gtk_spin_button_realize(GtkWidget *widget) { | |
- GtkSpinButton *spin=GTK_SPIN_BUTTON(widget); | |
- HWND Parent; | |
+void gtk_spin_button_realize(GtkWidget *widget) | |
+{ | |
+ GtkSpinButton *spin = GTK_SPIN_BUTTON(widget); | |
+ HWND Parent; | |
- gtk_entry_realize(widget); | |
+ gtk_entry_realize(widget); | |
- Parent=gtk_get_parent_hwnd(widget->parent); | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- spin->updown=CreateUpDownControl(WS_CHILD|WS_BORDER|WS_TABSTOP| | |
- UDS_SETBUDDYINT|UDS_NOTHOUSANDS|UDS_ARROWKEYS, | |
- 0,0,0,0,Parent,0,hInst,widget->hWnd,20,10,15); | |
- gtk_set_default_font(spin->updown); | |
- gtk_spin_button_set_adjustment(spin,spin->adj); | |
+ Parent = gtk_get_parent_hwnd(widget->parent); | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ spin->updown = CreateUpDownControl(WS_CHILD | WS_BORDER | WS_TABSTOP | | |
+ UDS_SETBUDDYINT | UDS_NOTHOUSANDS | | |
+ UDS_ARROWKEYS, 0, 0, 0, 0, Parent, 0, | |
+ hInst, widget->hWnd, 20, 10, 15); | |
+ gtk_set_default_font(spin->updown); | |
+ gtk_spin_button_set_adjustment(spin, spin->adj); | |
} | |
-void gtk_spin_button_destroy(GtkWidget *widget) { | |
- g_free(GTK_SPIN_BUTTON(widget)->adj); | |
+void gtk_spin_button_destroy(GtkWidget *widget) | |
+{ | |
+ g_free(GTK_SPIN_BUTTON(widget)->adj); | |
} | |
-void gtk_spin_button_show(GtkWidget *widget) { | |
- HWND updown; | |
- updown=GTK_SPIN_BUTTON(widget)->updown; | |
- if (updown) ShowWindow(updown,SW_SHOWNORMAL); | |
-} | |
+void gtk_spin_button_show(GtkWidget *widget) | |
+{ | |
+ HWND updown; | |
-void gtk_spin_button_hide(GtkWidget *widget) { | |
- HWND updown; | |
- updown=GTK_SPIN_BUTTON(widget)->updown; | |
- if (updown) ShowWindow(updown,SW_HIDE); | |
+ updown = GTK_SPIN_BUTTON(widget)->updown; | |
+ if (updown) | |
+ ShowWindow(updown, SW_SHOWNORMAL); | |
} | |
-void gtk_spin_button_update(GtkSpinButton *spin_button) { | |
+void gtk_spin_button_hide(GtkWidget *widget) | |
+{ | |
+ HWND updown; | |
+ | |
+ updown = GTK_SPIN_BUTTON(widget)->updown; | |
+ if (updown) | |
+ ShowWindow(updown, SW_HIDE); | |
} | |
-void gdk_input_remove(gint tag) { | |
- GSList *list; | |
- GdkInput *input; | |
- for (list=GdkInputs;list;list=g_slist_next(list)) { | |
- input=(GdkInput *)list->data; | |
- if (input->source==tag) { | |
- WSAAsyncSelect(input->source,TopLevel,0,0); | |
- GdkInputs=g_slist_remove(GdkInputs,input); | |
- g_free(input); | |
- break; | |
- } | |
- } | |
+void gtk_spin_button_update(GtkSpinButton *spin_button) | |
+{ | |
} | |
-gint gdk_input_add(gint source,GdkInputCondition condition, | |
- GdkInputFunction function,gpointer data) { | |
- GdkInput *input; | |
- int rc; | |
- input=g_new(GdkInput,1); | |
- input->source=source; | |
- input->condition=condition; | |
- input->function=function; | |
- input->data=data; | |
- rc=WSAAsyncSelect(source,TopLevel,MYWM_SOCKETDATA, | |
- (condition&GDK_INPUT_READ ? FD_READ|FD_CLOSE|FD_ACCEPT:0) | | |
- (condition&GDK_INPUT_WRITE ? FD_WRITE|FD_CONNECT:0)); | |
- GdkInputs=g_slist_append(GdkInputs,input); | |
- return source; | |
+void gdk_input_remove(gint tag) | |
+{ | |
+ GSList *list; | |
+ GdkInput *input; | |
+ | |
+ for (list = GdkInputs; list; list = g_slist_next(list)) { | |
+ input = (GdkInput *)list->data; | |
+ if (input->source == tag) { | |
+ WSAAsyncSelect(input->source, TopLevel, 0, 0); | |
+ GdkInputs = g_slist_remove(GdkInputs, input); | |
+ g_free(input); | |
+ break; | |
+ } | |
+ } | |
} | |
-GtkWidget *gtk_hseparator_new() { | |
- return GTK_WIDGET(GtkNewObject(&GtkHSeparatorClass)); | |
+gint gdk_input_add(gint source, GdkInputCondition condition, | |
+ GdkInputFunction function, gpointer data) | |
+{ | |
+ GdkInput *input; | |
+ int rc; | |
+ | |
+ input = g_new(GdkInput, 1); | |
+ input->source = source; | |
+ input->condition = condition; | |
+ input->function = function; | |
+ input->data = data; | |
+ rc = WSAAsyncSelect(source, TopLevel, MYWM_SOCKETDATA, | |
+ (condition & GDK_INPUT_READ ? FD_READ | FD_CLOSE | | |
+ FD_ACCEPT : 0) | (condition & GDK_INPUT_WRITE ? | |
+ FD_WRITE | FD_CONNECT : 0)); | |
+ GdkInputs = g_slist_append(GdkInputs, input); | |
+ return source; | |
+} | |
+ | |
+GtkWidget *gtk_hseparator_new() | |
+{ | |
+ return GTK_WIDGET(GtkNewObject(&GtkHSeparatorClass)); | |
} | |
-GtkWidget *gtk_vseparator_new() { | |
- return GTK_WIDGET(GtkNewObject(&GtkVSeparatorClass)); | |
+GtkWidget *gtk_vseparator_new() | |
+{ | |
+ return GTK_WIDGET(GtkNewObject(&GtkVSeparatorClass)); | |
} | |
void gtk_separator_size_request(GtkWidget *widget, | |
- GtkRequisition *requisition) { | |
- requisition->height=requisition->width=2; | |
+ GtkRequisition *requisition) | |
+{ | |
+ requisition->height = requisition->width = 2; | |
} | |
-void gtk_separator_realize(GtkWidget *widget) { | |
- HWND Parent; | |
- Parent=gtk_get_parent_hwnd(widget); | |
- widget->hWnd = CreateWindow(WC_GTKSEP,"",WS_CHILD, | |
- 0,0,0,0,Parent,NULL,hInst,NULL); | |
+void gtk_separator_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent; | |
+ | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ widget->hWnd = CreateWindow(WC_GTKSEP, "", WS_CHILD, | |
+ 0, 0, 0, 0, Parent, NULL, hInst, NULL); | |
} | |
-void gtk_object_set_data(GtkObject *object,const gchar *key,gpointer data) { | |
- g_datalist_set_data(&object->object_data,key,data); | |
+void gtk_object_set_data(GtkObject *object, const gchar *key, | |
+ gpointer data) | |
+{ | |
+ g_datalist_set_data(&object->object_data, key, data); | |
} | |
-gpointer gtk_object_get_data(GtkObject *object,const gchar *key) { | |
- return g_datalist_get_data(&object->object_data,key); | |
+gpointer gtk_object_get_data(GtkObject *object, const gchar *key) | |
+{ | |
+ return g_datalist_get_data(&object->object_data, key); | |
} | |
-GtkAccelGroup *gtk_accel_group_new() { | |
- GtkAccelGroup *new_accel; | |
- new_accel=g_new0(GtkAccelGroup,1); | |
- new_accel->accel = NULL; | |
- new_accel->numaccel = 0; | |
- return new_accel; | |
+GtkAccelGroup *gtk_accel_group_new() | |
+{ | |
+ GtkAccelGroup *new_accel; | |
+ | |
+ new_accel = g_new0(GtkAccelGroup, 1); | |
+ new_accel->accel = NULL; | |
+ new_accel->numaccel = 0; | |
+ return new_accel; | |
} | |
-gint gtk_accel_group_add(GtkAccelGroup *accel_group,ACCEL *newaccel) { | |
+gint gtk_accel_group_add(GtkAccelGroup *accel_group, ACCEL *newaccel) | |
+{ | |
accel_group->numaccel++; | |
accel_group->accel = g_realloc(accel_group->accel, | |
- accel_group->numaccel*sizeof(ACCEL)); | |
- memcpy(&accel_group->accel[accel_group->numaccel-1],newaccel,sizeof(ACCEL)); | |
- return (accel_group->numaccel-1); | |
+ accel_group->numaccel * sizeof(ACCEL)); | |
+ memcpy(&accel_group->accel[accel_group->numaccel - 1], newaccel, | |
+ sizeof(ACCEL)); | |
+ return (accel_group->numaccel - 1); | |
} | |
-void gtk_accel_group_set_id(GtkAccelGroup *accel_group,gint ind,gint ID) { | |
- if (ind < accel_group->numaccel) accel_group->accel[ind].cmd = ID; | |
+void gtk_accel_group_set_id(GtkAccelGroup *accel_group, gint ind, gint ID) | |
+{ | |
+ if (ind < accel_group->numaccel) | |
+ accel_group->accel[ind].cmd = ID; | |
} | |
-void gtk_accel_group_destroy(GtkAccelGroup *accel_group) { | |
+void gtk_accel_group_destroy(GtkAccelGroup *accel_group) | |
+{ | |
g_free(accel_group->accel); | |
g_free(accel_group); | |
} | |
t@@ -4069,551 +4603,672 @@ void gtk_accel_group_destroy(GtkAccelGroup *accel_gr… | |
void gtk_item_factory_set_translate_func(GtkItemFactory *ifactory, | |
GtkTranslateFunc func, | |
gpointer data, | |
- GtkDestroyNotify notify) { | |
+ GtkDestroyNotify notify) | |
+{ | |
ifactory->translate_func = func; | |
ifactory->translate_data = data; | |
} | |
-void gtk_widget_grab_default(GtkWidget *widget) { | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_IS_DEFAULT); | |
+void gtk_widget_grab_default(GtkWidget *widget) | |
+{ | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_IS_DEFAULT); | |
} | |
-void gtk_widget_grab_focus(GtkWidget *widget) { | |
- if (widget->hWnd && GTK_WIDGET_CAN_FOCUS(widget)) { | |
- SetFocus(widget->hWnd); | |
- } | |
+void gtk_widget_grab_focus(GtkWidget *widget) | |
+{ | |
+ if (widget->hWnd && GTK_WIDGET_CAN_FOCUS(widget)) { | |
+ SetFocus(widget->hWnd); | |
+ } | |
} | |
-void gtk_window_set_modal(GtkWindow *window,gboolean modal) { | |
- window->modal=modal; | |
+void gtk_window_set_modal(GtkWindow *window, gboolean modal) | |
+{ | |
+ window->modal = modal; | |
} | |
-void gtk_window_add_accel_group(GtkWindow *window,GtkAccelGroup *accel_group) { | |
- window->accel_group=accel_group; | |
+void gtk_window_add_accel_group(GtkWindow *window, | |
+ GtkAccelGroup *accel_group) | |
+{ | |
+ window->accel_group = accel_group; | |
} | |
-void gtk_entry_set_text(GtkEntry *entry,const gchar *text) { | |
- int pos=0; | |
- gtk_editable_insert_text(GTK_EDITABLE(entry),text,strlen(text),&pos); | |
+void gtk_entry_set_text(GtkEntry *entry, const gchar *text) | |
+{ | |
+ int pos = 0; | |
+ | |
+ gtk_editable_insert_text(GTK_EDITABLE(entry), text, strlen(text), &pos); | |
} | |
-void gtk_entry_set_visibility(GtkEntry *entry,gboolean visible) { | |
- HWND hWnd; | |
- entry->is_visible = visible; | |
- hWnd=GTK_WIDGET(entry)->hWnd; | |
- if (hWnd) SendMessage(hWnd,EM_SETPASSWORDCHAR,visible ? 0 : (WPARAM)'*',0); | |
+void gtk_entry_set_visibility(GtkEntry *entry, gboolean visible) | |
+{ | |
+ HWND hWnd; | |
+ | |
+ entry->is_visible = visible; | |
+ hWnd = GTK_WIDGET(entry)->hWnd; | |
+ if (hWnd) | |
+ SendMessage(hWnd, EM_SETPASSWORDCHAR, visible ? 0 : (WPARAM)'*', 0); | |
} | |
-guint SetAccelerator(GtkWidget *labelparent,gchar *Text, | |
- GtkWidget *sendto,gchar *signal, | |
- GtkAccelGroup *accel_group) { | |
- gtk_signal_emit(GTK_OBJECT(labelparent),"set_text",Text); | |
- return 0; | |
+guint SetAccelerator(GtkWidget *labelparent, gchar *Text, | |
+ GtkWidget *sendto, gchar *signal, | |
+ GtkAccelGroup *accel_group) | |
+{ | |
+ gtk_signal_emit(GTK_OBJECT(labelparent), "set_text", Text); | |
+ return 0; | |
} | |
void gtk_widget_add_accelerator(GtkWidget *widget, | |
const gchar *accel_signal, | |
GtkAccelGroup *accel_group, | |
- guint accel_key,guint accel_mods, | |
- GtkAccelFlags accel_flags) { | |
+ guint accel_key, guint accel_mods, | |
+ GtkAccelFlags accel_flags) | |
+{ | |
} | |
void gtk_widget_remove_accelerator(GtkWidget *widget, | |
GtkAccelGroup *accel_group, | |
- guint accel_key,guint accel_mods) { | |
+ guint accel_key, guint accel_mods) | |
+{ | |
} | |
-GtkWidget *gtk_vpaned_new() { | |
- GtkVPaned *vpaned; | |
- vpaned=GTK_VPANED(GtkNewObject(&GtkVPanedClass)); | |
- GTK_PANED(vpaned)->handle_size=5; | |
- GTK_PANED(vpaned)->handle_pos=PANED_STARTPOS; | |
- return GTK_WIDGET(vpaned); | |
+GtkWidget *gtk_vpaned_new() | |
+{ | |
+ GtkVPaned *vpaned; | |
+ | |
+ vpaned = GTK_VPANED(GtkNewObject(&GtkVPanedClass)); | |
+ GTK_PANED(vpaned)->handle_size = 5; | |
+ GTK_PANED(vpaned)->handle_pos = PANED_STARTPOS; | |
+ return GTK_WIDGET(vpaned); | |
} | |
-GtkWidget *gtk_hpaned_new() { | |
- GtkHPaned *hpaned; | |
- hpaned=GTK_HPANED(GtkNewObject(&GtkHPanedClass)); | |
- GTK_PANED(hpaned)->handle_size=5; | |
- GTK_PANED(hpaned)->handle_pos=PANED_STARTPOS; | |
- return GTK_WIDGET(hpaned); | |
+GtkWidget *gtk_hpaned_new() | |
+{ | |
+ GtkHPaned *hpaned; | |
+ | |
+ hpaned = GTK_HPANED(GtkNewObject(&GtkHPanedClass)); | |
+ GTK_PANED(hpaned)->handle_size = 5; | |
+ GTK_PANED(hpaned)->handle_pos = PANED_STARTPOS; | |
+ return GTK_WIDGET(hpaned); | |
} | |
-static void gtk_paned_pack(GtkPaned *paned,gint pos,GtkWidget *child, | |
- gboolean resize,gboolean shrink) { | |
- paned->children[pos].widget=child; | |
- paned->children[pos].resize=resize; | |
- paned->children[pos].shrink=shrink; | |
- child->parent=GTK_WIDGET(paned); | |
+static void gtk_paned_pack(GtkPaned *paned, gint pos, GtkWidget *child, | |
+ gboolean resize, gboolean shrink) | |
+{ | |
+ paned->children[pos].widget = child; | |
+ paned->children[pos].resize = resize; | |
+ paned->children[pos].shrink = shrink; | |
+ child->parent = GTK_WIDGET(paned); | |
} | |
-void gtk_paned_pack1(GtkPaned *paned,GtkWidget *child,gboolean resize, | |
- gboolean shrink) { | |
- gtk_paned_pack(paned,0,child,resize,shrink); | |
+void gtk_paned_pack1(GtkPaned *paned, GtkWidget *child, gboolean resize, | |
+ gboolean shrink) | |
+{ | |
+ gtk_paned_pack(paned, 0, child, resize, shrink); | |
} | |
-void gtk_paned_pack2(GtkPaned *paned,GtkWidget *child,gboolean resize, | |
- gboolean shrink) { | |
- gtk_paned_pack(paned,1,child,resize,shrink); | |
+void gtk_paned_pack2(GtkPaned *paned, GtkWidget *child, gboolean resize, | |
+ gboolean shrink) | |
+{ | |
+ gtk_paned_pack(paned, 1, child, resize, shrink); | |
} | |
-void gtk_paned_add1(GtkPaned *paned,GtkWidget *child) { | |
- gtk_paned_pack1(paned,child,FALSE,TRUE); | |
+void gtk_paned_add1(GtkPaned *paned, GtkWidget *child) | |
+{ | |
+ gtk_paned_pack1(paned, child, FALSE, TRUE); | |
} | |
-void gtk_paned_add2(GtkPaned *paned,GtkWidget *child) { | |
- gtk_paned_pack2(paned,child,FALSE,TRUE); | |
+void gtk_paned_add2(GtkPaned *paned, GtkWidget *child) | |
+{ | |
+ gtk_paned_pack2(paned, child, FALSE, TRUE); | |
} | |
-void gtk_paned_show_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GtkPaned *paned=GTK_PANED(widget); | |
- gint i; | |
- for (i=0;i<2;i++) if (paned->children[i].widget) { | |
- gtk_widget_show_all_full(paned->children[i].widget,hWndOnly); | |
- } | |
+void gtk_paned_show_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GtkPaned *paned = GTK_PANED(widget); | |
+ gint i; | |
+ | |
+ for (i = 0; i < 2; i++) | |
+ if (paned->children[i].widget) { | |
+ gtk_widget_show_all_full(paned->children[i].widget, hWndOnly); | |
+ } | |
} | |
-void gtk_paned_hide_all(GtkWidget *widget,gboolean hWndOnly) { | |
- GtkPaned *paned=GTK_PANED(widget); | |
- gint i; | |
- for (i=0;i<2;i++) if (paned->children[i].widget) | |
- gtk_widget_hide_all_full(paned->children[i].widget,hWndOnly); | |
+void gtk_paned_hide_all(GtkWidget *widget, gboolean hWndOnly) | |
+{ | |
+ GtkPaned *paned = GTK_PANED(widget); | |
+ gint i; | |
+ | |
+ for (i = 0; i < 2; i++) | |
+ if (paned->children[i].widget) | |
+ gtk_widget_hide_all_full(paned->children[i].widget, hWndOnly); | |
} | |
-void gtk_paned_realize(GtkWidget *widget) { | |
- GtkPaned *paned=GTK_PANED(widget); | |
- gint i; | |
- for (i=0;i<2;i++) if (paned->children[i].widget) { | |
+void gtk_paned_realize(GtkWidget *widget) | |
+{ | |
+ GtkPaned *paned = GTK_PANED(widget); | |
+ gint i; | |
+ | |
+ for (i = 0; i < 2; i++) | |
+ if (paned->children[i].widget) { | |
gtk_widget_realize(paned->children[i].widget); | |
- } | |
+ } | |
} | |
-void gtk_vpaned_realize(GtkWidget *widget) { | |
- HWND Parent; | |
- gtk_paned_realize(widget); | |
- Parent=gtk_get_parent_hwnd(widget); | |
- widget->hWnd = CreateWindow(WC_GTKVPANED,"",WS_CHILD, | |
- 0,0,0,0,Parent,NULL,hInst,NULL); | |
+void gtk_vpaned_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent; | |
+ | |
+ gtk_paned_realize(widget); | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ widget->hWnd = CreateWindow(WC_GTKVPANED, "", WS_CHILD, | |
+ 0, 0, 0, 0, Parent, NULL, hInst, NULL); | |
} | |
-void gtk_hpaned_realize(GtkWidget *widget) { | |
- HWND Parent; | |
- gtk_paned_realize(widget); | |
- Parent=gtk_get_parent_hwnd(widget); | |
- widget->hWnd = CreateWindow(WC_GTKHPANED,"",WS_CHILD, | |
- 0,0,0,0,Parent,NULL,hInst,NULL); | |
+void gtk_hpaned_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent; | |
+ | |
+ gtk_paned_realize(widget); | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ widget->hWnd = CreateWindow(WC_GTKHPANED, "", WS_CHILD, | |
+ 0, 0, 0, 0, Parent, NULL, hInst, NULL); | |
} | |
-static void gtk_paned_set_handle_percent(GtkPaned *paned,gint16 req[2]) { | |
- if (req[0]+req[1]) paned->handle_pos=req[0]*100/(req[0]+req[1]); | |
- else paned->handle_pos=0; | |
+static void gtk_paned_set_handle_percent(GtkPaned *paned, gint16 req[2]) | |
+{ | |
+ if (req[0] + req[1]) | |
+ paned->handle_pos = req[0] * 100 / (req[0] + req[1]); | |
+ else | |
+ paned->handle_pos = 0; | |
} | |
-void gtk_vpaned_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- GtkPaned *paned=GTK_PANED(widget); | |
- gint i; | |
- gint16 req[2] = { 0,0 }; | |
- requisition->width=requisition->height=0; | |
- for (i=0;i<2;i++) if (paned->children[i].widget) { | |
- if (paned->children[i].widget->requisition.width > requisition->width) | |
- requisition->width = paned->children[i].widget->requisition.width; | |
- req[i]=paned->children[i].widget->requisition.height; | |
+void gtk_vpaned_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition) | |
+{ | |
+ GtkPaned *paned = GTK_PANED(widget); | |
+ gint i; | |
+ gint16 req[2] = { 0, 0 }; | |
+ | |
+ requisition->width = requisition->height = 0; | |
+ for (i = 0; i < 2; i++) | |
+ if (paned->children[i].widget) { | |
+ if (paned->children[i].widget->requisition.width > | |
+ requisition->width) | |
+ requisition->width = paned->children[i].widget->requisition.width; | |
+ req[i] = paned->children[i].widget->requisition.height; | |
requisition->height += req[i]; | |
- } | |
- requisition->height += paned->handle_size; | |
- gtk_paned_set_handle_percent(paned,req); | |
-} | |
- | |
-void gtk_hpaned_size_request(GtkWidget *widget,GtkRequisition *requisition) { | |
- GtkPaned *paned=GTK_PANED(widget); | |
- gint i; | |
- gint16 req[2] = { 0,0 }; | |
- requisition->width=requisition->height=0; | |
- for (i=0;i<2;i++) if (paned->children[i].widget) { | |
- if (paned->children[i].widget->requisition.height > requisition->height) | |
- requisition->height = paned->children[i].widget->requisition.height; | |
- req[i]=paned->children[i].widget->requisition.width; | |
- requisition->width += req[i]; | |
- } | |
- requisition->width += paned->handle_size; | |
- gtk_paned_set_handle_percent(paned,req); | |
+ } | |
+ requisition->height += paned->handle_size; | |
+ gtk_paned_set_handle_percent(paned, req); | |
} | |
-void gtk_vpaned_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkPaned *paned=GTK_PANED(widget); | |
- GtkWidget *child; | |
- gint16 alloc; | |
- GtkAllocation child_alloc; | |
- | |
- memcpy(&paned->true_alloc,allocation,sizeof(GtkAllocation)); | |
- | |
- alloc=allocation->height-paned->handle_size; | |
+void gtk_hpaned_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition) | |
+{ | |
+ GtkPaned *paned = GTK_PANED(widget); | |
+ gint i; | |
+ gint16 req[2] = { 0, 0 }; | |
+ | |
+ requisition->width = requisition->height = 0; | |
+ for (i = 0; i < 2; i++) | |
+ if (paned->children[i].widget) { | |
+ if (paned->children[i].widget->requisition.height > | |
+ requisition->height) | |
+ requisition->height = | |
+ paned->children[i].widget->requisition.height; | |
+ req[i] = paned->children[i].widget->requisition.width; | |
+ requisition->width += req[i]; | |
+ } | |
+ requisition->width += paned->handle_size; | |
+ gtk_paned_set_handle_percent(paned, req); | |
+} | |
- child=paned->children[0].widget; | |
- if (child) { | |
- child_alloc.x=allocation->x; | |
- child_alloc.y=allocation->y; | |
- child_alloc.width=allocation->width; | |
- child_alloc.height=alloc*paned->handle_pos/100; | |
- gtk_widget_set_size(child,&child_alloc); | |
- } | |
+void gtk_vpaned_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkPaned *paned = GTK_PANED(widget); | |
+ GtkWidget *child; | |
+ gint16 alloc; | |
+ GtkAllocation child_alloc; | |
+ | |
+ memcpy(&paned->true_alloc, allocation, sizeof(GtkAllocation)); | |
+ | |
+ alloc = allocation->height - paned->handle_size; | |
+ | |
+ child = paned->children[0].widget; | |
+ if (child) { | |
+ child_alloc.x = allocation->x; | |
+ child_alloc.y = allocation->y; | |
+ child_alloc.width = allocation->width; | |
+ child_alloc.height = alloc * paned->handle_pos / 100; | |
+ gtk_widget_set_size(child, &child_alloc); | |
+ } | |
- child=paned->children[1].widget; | |
- if (child) { | |
- child_alloc.x=allocation->x; | |
- child_alloc.width=allocation->width; | |
- child_alloc.height=alloc*(100-paned->handle_pos)/100; | |
- child_alloc.y=allocation->y+allocation->height-child_alloc.height; | |
- gtk_widget_set_size(child,&child_alloc); | |
- } | |
+ child = paned->children[1].widget; | |
+ if (child) { | |
+ child_alloc.x = allocation->x; | |
+ child_alloc.width = allocation->width; | |
+ child_alloc.height = alloc * (100 - paned->handle_pos) / 100; | |
+ child_alloc.y = | |
+ allocation->y + allocation->height - child_alloc.height; | |
+ gtk_widget_set_size(child, &child_alloc); | |
+ } | |
- allocation->y += alloc*paned->handle_pos/100; | |
- allocation->height = paned->handle_size; | |
+ allocation->y += alloc * paned->handle_pos / 100; | |
+ allocation->height = paned->handle_size; | |
} | |
-void gtk_hpaned_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- GtkPaned *paned=GTK_PANED(widget); | |
- GtkWidget *child; | |
- gint16 alloc; | |
- GtkAllocation child_alloc; | |
- | |
- memcpy(&paned->true_alloc,allocation,sizeof(GtkAllocation)); | |
- alloc=allocation->width-paned->handle_size; | |
- | |
- child=paned->children[0].widget; | |
- if (child) { | |
- child_alloc.x=allocation->x; | |
- child_alloc.y=allocation->y; | |
- child_alloc.height=allocation->height; | |
- child_alloc.width=alloc*paned->handle_pos/100; | |
- gtk_widget_set_size(child,&child_alloc); | |
- } | |
+void gtk_hpaned_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ GtkPaned *paned = GTK_PANED(widget); | |
+ GtkWidget *child; | |
+ gint16 alloc; | |
+ GtkAllocation child_alloc; | |
+ | |
+ memcpy(&paned->true_alloc, allocation, sizeof(GtkAllocation)); | |
+ alloc = allocation->width - paned->handle_size; | |
+ | |
+ child = paned->children[0].widget; | |
+ if (child) { | |
+ child_alloc.x = allocation->x; | |
+ child_alloc.y = allocation->y; | |
+ child_alloc.height = allocation->height; | |
+ child_alloc.width = alloc * paned->handle_pos / 100; | |
+ gtk_widget_set_size(child, &child_alloc); | |
+ } | |
- child=paned->children[1].widget; | |
- if (child) { | |
- child_alloc.x=allocation->x; | |
- child_alloc.height=allocation->height; | |
- child_alloc.width=alloc*(100-paned->handle_pos)/100; | |
- child_alloc.x=allocation->x+allocation->width-child_alloc.width; | |
- gtk_widget_set_size(child,&child_alloc); | |
- } | |
+ child = paned->children[1].widget; | |
+ if (child) { | |
+ child_alloc.x = allocation->x; | |
+ child_alloc.height = allocation->height; | |
+ child_alloc.width = alloc * (100 - paned->handle_pos) / 100; | |
+ child_alloc.x = allocation->x + allocation->width - child_alloc.width; | |
+ gtk_widget_set_size(child, &child_alloc); | |
+ } | |
- allocation->x += alloc*paned->handle_pos/100; | |
- allocation->width = paned->handle_size; | |
+ allocation->x += alloc * paned->handle_pos / 100; | |
+ allocation->width = paned->handle_size; | |
} | |
-void gtk_text_set_editable(GtkText *text,gboolean is_editable) { | |
- gtk_editable_set_editable(GTK_EDITABLE(text),is_editable); | |
+void gtk_text_set_editable(GtkText *text, gboolean is_editable) | |
+{ | |
+ gtk_editable_set_editable(GTK_EDITABLE(text), is_editable); | |
} | |
-void gtk_text_set_word_wrap(GtkText *text,gboolean word_wrap) { | |
- text->word_wrap=word_wrap; | |
+void gtk_text_set_word_wrap(GtkText *text, gboolean word_wrap) | |
+{ | |
+ text->word_wrap = word_wrap; | |
} | |
-void gtk_text_freeze(GtkText *text) { | |
+void gtk_text_freeze(GtkText *text) | |
+{ | |
} | |
-void gtk_text_thaw(GtkText *text) { | |
+void gtk_text_thaw(GtkText *text) | |
+{ | |
} | |
static GtkCList *sorting_clist; | |
-static gint gtk_clist_sort_func(gconstpointer a,gconstpointer b) { | |
- return (*sorting_clist->cmp_func)(sorting_clist,a,b); | |
-} | |
- | |
-void gtk_clist_sort(GtkCList *clist) { | |
- HWND hWnd; | |
- gint rowind; | |
- GList *sel; | |
- GSList *rowpt; | |
- | |
- sorting_clist=clist; | |
- if (clist && clist->cmp_func && clist->rows) { | |
-/* Since the order of the list may change, we need to change the selection | |
- as well. Do this by converting the row indices into GSList pointers (which | |
- are invariant to the sort) and then convert back afterwards */ | |
- for (sel=clist->selection;sel;sel=g_list_next(sel)) { | |
- rowind=GPOINTER_TO_INT(sel->data); | |
- sel->data=(gpointer)g_slist_nth(clist->rows,rowind); | |
- } | |
- clist->rows=g_slist_sort(clist->rows,gtk_clist_sort_func); | |
- for (sel=clist->selection;sel;sel=g_list_next(sel)) { | |
- rowpt=(GSList *)(sel->data); | |
- sel->data=GINT_TO_POINTER(g_slist_position(clist->rows,rowpt)); | |
- } | |
- if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) { | |
- hWnd=GTK_WIDGET(clist)->hWnd; | |
- if (clist->mode==GTK_SELECTION_SINGLE) { | |
- sel=clist->selection; | |
- if (sel) rowind=GPOINTER_TO_INT(sel->data); | |
- else rowind=-1; | |
- SendMessage(hWnd,LB_SETCURSEL,(WPARAM)rowind,0); | |
- } else { | |
- for (rowind=0;rowind<g_slist_length(clist->rows);rowind++) { | |
- SendMessage(hWnd,LB_SETSEL,(WPARAM)FALSE,(LPARAM)rowind); | |
- } | |
- for (sel=clist->selection;sel;sel=g_list_next(sel)) { | |
- rowind=GPOINTER_TO_INT(sel->data); | |
- SendMessage(hWnd,LB_SETSEL,(WPARAM)TRUE,(LPARAM)rowind); | |
- } | |
- } | |
- InvalidateRect(hWnd,NULL,FALSE); | |
- UpdateWindow(hWnd); | |
+static gint gtk_clist_sort_func(gconstpointer a, gconstpointer b) | |
+{ | |
+ return (*sorting_clist->cmp_func) (sorting_clist, a, b); | |
+} | |
+ | |
+void gtk_clist_sort(GtkCList *clist) | |
+{ | |
+ HWND hWnd; | |
+ gint rowind; | |
+ GList *sel; | |
+ GSList *rowpt; | |
+ | |
+ sorting_clist = clist; | |
+ if (clist && clist->cmp_func && clist->rows) { | |
+ /* Since the order of the list may change, we need to change the | |
+ * selection as well. Do this by converting the row indices into | |
+ * GSList pointers (which are invariant to the sort) and then convert | |
+ * back afterwards */ | |
+ for (sel = clist->selection; sel; sel = g_list_next(sel)) { | |
+ rowind = GPOINTER_TO_INT(sel->data); | |
+ sel->data = (gpointer)g_slist_nth(clist->rows, rowind); | |
+ } | |
+ clist->rows = g_slist_sort(clist->rows, gtk_clist_sort_func); | |
+ for (sel = clist->selection; sel; sel = g_list_next(sel)) { | |
+ rowpt = (GSList *)(sel->data); | |
+ sel->data = GINT_TO_POINTER(g_slist_position(clist->rows, rowpt)); | |
+ } | |
+ if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) { | |
+ hWnd = GTK_WIDGET(clist)->hWnd; | |
+ if (clist->mode == GTK_SELECTION_SINGLE) { | |
+ sel = clist->selection; | |
+ if (sel) | |
+ rowind = GPOINTER_TO_INT(sel->data); | |
+ else | |
+ rowind = -1; | |
+ SendMessage(hWnd, LB_SETCURSEL, (WPARAM)rowind, 0); | |
+ } else { | |
+ for (rowind = 0; rowind < g_slist_length(clist->rows); rowind++) { | |
+ SendMessage(hWnd, LB_SETSEL, (WPARAM)FALSE, (LPARAM)rowind); | |
+ } | |
+ for (sel = clist->selection; sel; sel = g_list_next(sel)) { | |
+ rowind = GPOINTER_TO_INT(sel->data); | |
+ SendMessage(hWnd, LB_SETSEL, (WPARAM)TRUE, (LPARAM)rowind); | |
+ } | |
} | |
- } | |
+ InvalidateRect(hWnd, NULL, FALSE); | |
+ UpdateWindow(hWnd); | |
+ } | |
+ } | |
} | |
-void gtk_clist_freeze(GtkCList *clist) { | |
+void gtk_clist_freeze(GtkCList *clist) | |
+{ | |
} | |
-void gtk_clist_thaw(GtkCList *clist) { | |
+void gtk_clist_thaw(GtkCList *clist) | |
+{ | |
} | |
-void gtk_clist_clear(GtkCList *clist) { | |
- GtkCListRow *row; | |
- GSList *list; | |
- gint i; | |
- HWND hWnd; | |
+void gtk_clist_clear(GtkCList *clist) | |
+{ | |
+ GtkCListRow *row; | |
+ GSList *list; | |
+ gint i; | |
+ HWND hWnd; | |
- for (list=clist->rows;list;list=g_slist_next(list)) { | |
- row=(GtkCListRow *)list->data; | |
- for (i=0;i<clist->ncols;i++) { | |
- g_free(row->text[i]); | |
- } | |
- g_free(row); | |
- } | |
- g_slist_free(clist->rows); | |
- clist->rows=NULL; | |
+ for (list = clist->rows; list; list = g_slist_next(list)) { | |
+ row = (GtkCListRow *)list->data; | |
+ for (i = 0; i < clist->ncols; i++) { | |
+ g_free(row->text[i]); | |
+ } | |
+ g_free(row); | |
+ } | |
+ g_slist_free(clist->rows); | |
+ clist->rows = NULL; | |
- gtk_clist_update_all_widths(clist); | |
- hWnd=GTK_WIDGET(clist)->hWnd; | |
- if (hWnd) { | |
- SendMessage(hWnd,LB_RESETCONTENT,0,0); | |
- } | |
+ gtk_clist_update_all_widths(clist); | |
+ hWnd = GTK_WIDGET(clist)->hWnd; | |
+ if (hWnd) { | |
+ SendMessage(hWnd, LB_RESETCONTENT, 0, 0); | |
+ } | |
} | |
-GtkWidget *gtk_option_menu_new() { | |
- GtkOptionMenu *option_menu; | |
- option_menu=GTK_OPTION_MENU(GtkNewObject(&GtkOptionMenuClass)); | |
- return GTK_WIDGET(option_menu); | |
-} | |
+GtkWidget *gtk_option_menu_new() | |
+{ | |
+ GtkOptionMenu *option_menu; | |
-GtkWidget *gtk_option_menu_get_menu(GtkOptionMenu *option_menu) { | |
- return option_menu->menu; | |
+ option_menu = GTK_OPTION_MENU(GtkNewObject(&GtkOptionMenuClass)); | |
+ return GTK_WIDGET(option_menu); | |
} | |
-void gtk_option_menu_set_menu(GtkOptionMenu *option_menu,GtkWidget *menu) { | |
- GSList *list; | |
- GtkMenuItem *menu_item; | |
- HWND hWnd; | |
- | |
- if (!menu) return; | |
- option_menu->menu=menu; | |
- hWnd=GTK_WIDGET(option_menu)->hWnd; | |
+GtkWidget *gtk_option_menu_get_menu(GtkOptionMenu *option_menu) | |
+{ | |
+ return option_menu->menu; | |
+} | |
- if (hWnd) { | |
- SendMessage(hWnd,CB_RESETCONTENT,0,0); | |
- for (list=GTK_MENU_SHELL(menu)->children;list;list=g_slist_next(list)) { | |
- menu_item=GTK_MENU_ITEM(list->data); | |
- if (menu_item && menu_item->text) | |
- SendMessage(hWnd,CB_ADDSTRING,0,(LPARAM)menu_item->text); | |
- } | |
- SendMessage(hWnd,CB_SETCURSEL,(WPARAM)GTK_MENU(menu)->active,0); | |
- } | |
+void gtk_option_menu_set_menu(GtkOptionMenu *option_menu, GtkWidget *menu) | |
+{ | |
+ GSList *list; | |
+ GtkMenuItem *menu_item; | |
+ HWND hWnd; | |
+ | |
+ if (!menu) | |
+ return; | |
+ option_menu->menu = menu; | |
+ hWnd = GTK_WIDGET(option_menu)->hWnd; | |
+ | |
+ if (hWnd) { | |
+ SendMessage(hWnd, CB_RESETCONTENT, 0, 0); | |
+ for (list = GTK_MENU_SHELL(menu)->children; list; | |
+ list = g_slist_next(list)) { | |
+ menu_item = GTK_MENU_ITEM(list->data); | |
+ if (menu_item && menu_item->text) | |
+ SendMessage(hWnd, CB_ADDSTRING, 0, (LPARAM)menu_item->text); | |
+ } | |
+ SendMessage(hWnd, CB_SETCURSEL, (WPARAM)GTK_MENU(menu)->active, 0); | |
+ } | |
} | |
-void gtk_option_menu_set_history(GtkOptionMenu *option_menu,guint index) { | |
- GtkWidget *menu; | |
- menu=gtk_option_menu_get_menu(option_menu); | |
- if (menu) gtk_menu_set_active(GTK_MENU(menu),index); | |
+void gtk_option_menu_set_history(GtkOptionMenu *option_menu, guint index) | |
+{ | |
+ GtkWidget *menu; | |
+ | |
+ menu = gtk_option_menu_get_menu(option_menu); | |
+ if (menu) | |
+ gtk_menu_set_active(GTK_MENU(menu), index); | |
} | |
void gtk_option_menu_size_request(GtkWidget *widget, | |
- GtkRequisition *requisition) { | |
- SIZE size; | |
+ GtkRequisition *requisition) | |
+{ | |
+ SIZE size; | |
- if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) { | |
- requisition->width = size.cx+40; | |
- requisition->height = size.cy+4; | |
- } | |
+ if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) { | |
+ requisition->width = size.cx + 40; | |
+ requisition->height = size.cy + 4; | |
+ } | |
} | |
-void gtk_option_menu_set_size(GtkWidget *widget,GtkAllocation *allocation) { | |
- allocation->height *= 6; | |
+void gtk_option_menu_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
+{ | |
+ allocation->height *= 6; | |
} | |
-void gtk_option_menu_realize(GtkWidget *widget) { | |
- HWND Parent; | |
- GtkOptionMenu *option_menu=GTK_OPTION_MENU(widget); | |
+void gtk_option_menu_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent; | |
+ GtkOptionMenu *option_menu = GTK_OPTION_MENU(widget); | |
- Parent=gtk_get_parent_hwnd(widget); | |
- GTK_WIDGET_SET_FLAGS(widget,GTK_CAN_FOCUS); | |
- widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"COMBOBOX","", | |
- WS_CHILD|WS_TABSTOP|WS_VSCROLL| | |
- CBS_HASSTRINGS|CBS_DROPDOWNLIST, | |
- 0,0,0,0,Parent,NULL,hInst,NULL); | |
- gtk_set_default_font(widget->hWnd); | |
- gtk_option_menu_set_menu(option_menu,option_menu->menu); | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS); | |
+ widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "COMBOBOX", "", | |
+ WS_CHILD | WS_TABSTOP | WS_VSCROLL | | |
+ CBS_HASSTRINGS | CBS_DROPDOWNLIST, | |
+ 0, 0, 0, 0, Parent, NULL, hInst, NULL); | |
+ gtk_set_default_font(widget->hWnd); | |
+ gtk_option_menu_set_menu(option_menu, option_menu->menu); | |
} | |
-void gtk_label_set_text(GtkLabel *label,const gchar *str) { | |
- gint i; | |
- HWND hWnd; | |
- g_free(label->text); | |
- label->text = g_strdup(str ? str : ""); | |
- for (i=0;i<strlen(label->text);i++) { | |
- if (label->text[i]=='_') label->text[i]='&'; | |
- } | |
- hWnd=GTK_WIDGET(label)->hWnd; | |
- if (hWnd) { | |
- gtk_widget_update(GTK_WIDGET(label),FALSE); | |
- SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)label->text); | |
- } | |
+void gtk_label_set_text(GtkLabel *label, const gchar *str) | |
+{ | |
+ gint i; | |
+ HWND hWnd; | |
+ | |
+ g_free(label->text); | |
+ label->text = g_strdup(str ? str : ""); | |
+ for (i = 0; i < strlen(label->text); i++) { | |
+ if (label->text[i] == '_') | |
+ label->text[i] = '&'; | |
+ } | |
+ hWnd = GTK_WIDGET(label)->hWnd; | |
+ if (hWnd) { | |
+ gtk_widget_update(GTK_WIDGET(label), FALSE); | |
+ SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)label->text); | |
+ } | |
} | |
-void gtk_button_set_text(GtkButton *button,gchar *text) { | |
- gint i; | |
- HWND hWnd; | |
- g_free(button->text); | |
- button->text = g_strdup(text ? text : ""); | |
- for (i=0;i<strlen(button->text);i++) { | |
- if (button->text[i]=='_') button->text[i]='&'; | |
- } | |
- hWnd=GTK_WIDGET(button)->hWnd; | |
- if (hWnd) { | |
- gtk_widget_update(GTK_WIDGET(button),FALSE); | |
- SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)button->text); | |
- } | |
+void gtk_button_set_text(GtkButton *button, gchar *text) | |
+{ | |
+ gint i; | |
+ HWND hWnd; | |
+ | |
+ g_free(button->text); | |
+ button->text = g_strdup(text ? text : ""); | |
+ for (i = 0; i < strlen(button->text); i++) { | |
+ if (button->text[i] == '_') | |
+ button->text[i] = '&'; | |
+ } | |
+ hWnd = GTK_WIDGET(button)->hWnd; | |
+ if (hWnd) { | |
+ gtk_widget_update(GTK_WIDGET(button), FALSE); | |
+ SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)button->text); | |
+ } | |
} | |
-static void gtk_menu_item_set_text(GtkMenuItem *menuitem,gchar *text) { | |
- gint i; | |
- g_free(menuitem->text); | |
- menuitem->text = g_strdup(text ? text : ""); | |
- for (i=0;i<strlen(menuitem->text);i++) { | |
- if (menuitem->text[i]=='_') menuitem->text[i]='&'; | |
- } | |
-} | |
+static void gtk_menu_item_set_text(GtkMenuItem *menuitem, gchar *text) | |
+{ | |
+ gint i; | |
-guint gtk_label_parse_uline(GtkLabel *label,const gchar *str) { | |
- gint i; | |
- gtk_label_set_text(label,str); | |
- if (str) for (i=0;i<strlen(str);i++) { | |
- if (str[i]=='_') return str[i+1]; | |
- } | |
- return 0; | |
+ g_free(menuitem->text); | |
+ menuitem->text = g_strdup(text ? text : ""); | |
+ for (i = 0; i < strlen(menuitem->text); i++) { | |
+ if (menuitem->text[i] == '_') | |
+ menuitem->text[i] = '&'; | |
+ } | |
} | |
-void gtk_label_get(GtkLabel *label,gchar **str) { | |
- *str = label->text; | |
+guint gtk_label_parse_uline(GtkLabel *label, const gchar *str) | |
+{ | |
+ gint i; | |
+ | |
+ gtk_label_set_text(label, str); | |
+ if (str) | |
+ for (i = 0; i < strlen(str); i++) { | |
+ if (str[i] == '_') | |
+ return str[i + 1]; | |
+ } | |
+ return 0; | |
} | |
-void gtk_clist_set_row_data(GtkCList *clist,gint row,gpointer data) { | |
- GtkCListRow *list_row; | |
- if (row>=0 && row<g_slist_length(clist->rows)) { | |
- list_row=(GtkCListRow *)g_slist_nth_data(clist->rows,row); | |
- if (list_row) list_row->data=data; | |
- } | |
+void gtk_label_get(GtkLabel *label, gchar **str) | |
+{ | |
+ *str = label->text; | |
} | |
-gpointer gtk_clist_get_row_data(GtkCList *clist,gint row) { | |
- GtkCListRow *list_row; | |
- if (row>=0 && row<g_slist_length(clist->rows)) { | |
- list_row=(GtkCListRow *)g_slist_nth_data(clist->rows,row); | |
- if (list_row) return list_row->data; | |
- } | |
- return NULL; | |
+void gtk_clist_set_row_data(GtkCList *clist, gint row, gpointer data) | |
+{ | |
+ GtkCListRow *list_row; | |
+ | |
+ if (row >= 0 && row < g_slist_length(clist->rows)) { | |
+ list_row = (GtkCListRow *)g_slist_nth_data(clist->rows, row); | |
+ if (list_row) | |
+ list_row->data = data; | |
+ } | |
} | |
-void gtk_clist_set_auto_sort(GtkCList *clist,gboolean auto_sort) { | |
- clist->auto_sort=auto_sort; | |
+gpointer gtk_clist_get_row_data(GtkCList *clist, gint row) | |
+{ | |
+ GtkCListRow *list_row; | |
+ | |
+ if (row >= 0 && row < g_slist_length(clist->rows)) { | |
+ list_row = (GtkCListRow *)g_slist_nth_data(clist->rows, row); | |
+ if (list_row) | |
+ return list_row->data; | |
+ } | |
+ return NULL; | |
} | |
-void gtk_clist_columns_autosize(GtkCList *clist) { | |
+void gtk_clist_set_auto_sort(GtkCList *clist, gboolean auto_sort) | |
+{ | |
+ clist->auto_sort = auto_sort; | |
} | |
-void gtk_text_set_point(GtkText *text,guint index) { | |
- gtk_editable_set_position(GTK_EDITABLE(text),index); | |
+void gtk_clist_columns_autosize(GtkCList *clist) | |
+{ | |
} | |
-void gtk_widget_set_usize(GtkWidget *widget,gint width,gint height) { | |
- widget->usize.width = width; | |
- widget->usize.height = height; | |
+void gtk_text_set_point(GtkText *text, guint index) | |
+{ | |
+ gtk_editable_set_position(GTK_EDITABLE(text), index); | |
} | |
-void gtk_clist_select_row(GtkCList *clist,gint row,gint column) { | |
- HWND hWnd; | |
- hWnd=GTK_WIDGET(clist)->hWnd; | |
- if (hWnd) { | |
- if (clist->mode==GTK_SELECTION_SINGLE) { | |
- SendMessage(hWnd,LB_SETCURSEL,(WPARAM)row,0); | |
- } else { | |
- SendMessage(hWnd,LB_SETSEL,(WPARAM)TRUE,(LPARAM)row); | |
- } | |
- gtk_clist_update_selection(GTK_WIDGET(clist)); | |
- } | |
+void gtk_widget_set_usize(GtkWidget *widget, gint width, gint height) | |
+{ | |
+ widget->usize.width = width; | |
+ widget->usize.height = height; | |
} | |
-GtkVisibility gtk_clist_row_is_visible(GtkCList *clist,gint row) { | |
- return GTK_VISIBILITY_FULL; | |
+void gtk_clist_select_row(GtkCList *clist, gint row, gint column) | |
+{ | |
+ HWND hWnd; | |
+ | |
+ hWnd = GTK_WIDGET(clist)->hWnd; | |
+ if (hWnd) { | |
+ if (clist->mode == GTK_SELECTION_SINGLE) { | |
+ SendMessage(hWnd, LB_SETCURSEL, (WPARAM)row, 0); | |
+ } else { | |
+ SendMessage(hWnd, LB_SETSEL, (WPARAM)TRUE, (LPARAM)row); | |
+ } | |
+ gtk_clist_update_selection(GTK_WIDGET(clist)); | |
+ } | |
} | |
-void gtk_clist_moveto(GtkCList *clist,gint row,gint column, | |
- gfloat row_align,gfloat col_align) { | |
+GtkVisibility gtk_clist_row_is_visible(GtkCList *clist, gint row) | |
+{ | |
+ return GTK_VISIBILITY_FULL; | |
} | |
-void gtk_clist_set_compare_func(GtkCList *clist,GtkCListCompareFunc cmp_func) { | |
- if (clist) clist->cmp_func = cmp_func; | |
+void gtk_clist_moveto(GtkCList *clist, gint row, gint column, | |
+ gfloat row_align, gfloat col_align) | |
+{ | |
} | |
-void gtk_clist_set_column_auto_resize(GtkCList *clist,gint column, | |
- gboolean auto_resize) { | |
- if (clist && column>=0 && column<clist->ncols) { | |
- clist->cols[column].auto_resize=auto_resize; | |
- } | |
+void gtk_clist_set_compare_func(GtkCList *clist, | |
+ GtkCListCompareFunc cmp_func) | |
+{ | |
+ if (clist) | |
+ clist->cmp_func = cmp_func; | |
} | |
-void gtk_clist_update_selection(GtkWidget *widget) { | |
- GtkCList *clist=GTK_CLIST(widget); | |
- gint i; | |
- g_list_free(clist->selection); | |
- clist->selection=NULL; | |
- if (widget->hWnd==NULL) return; | |
- for (i=0;i<g_slist_length(clist->rows);i++) { | |
- if (SendMessage(widget->hWnd,LB_GETSEL,(WPARAM)i,0) > 0) { | |
- clist->selection=g_list_append(clist->selection,GINT_TO_POINTER(i)); | |
- } | |
- } | |
+void gtk_clist_set_column_auto_resize(GtkCList *clist, gint column, | |
+ gboolean auto_resize) | |
+{ | |
+ if (clist && column >= 0 && column < clist->ncols) { | |
+ clist->cols[column].auto_resize = auto_resize; | |
+ } | |
} | |
-void gtk_editable_create(GtkWidget *widget) { | |
- GtkEditable *editable=GTK_EDITABLE(widget); | |
- gtk_widget_create(widget); | |
- editable->is_editable=TRUE; | |
- editable->text=g_string_new(""); | |
+void gtk_clist_update_selection(GtkWidget *widget) | |
+{ | |
+ GtkCList *clist = GTK_CLIST(widget); | |
+ gint i; | |
+ | |
+ g_list_free(clist->selection); | |
+ clist->selection = NULL; | |
+ if (widget->hWnd == NULL) | |
+ return; | |
+ for (i = 0; i < g_slist_length(clist->rows); i++) { | |
+ if (SendMessage(widget->hWnd, LB_GETSEL, (WPARAM)i, 0) > 0) { | |
+ clist->selection = | |
+ g_list_append(clist->selection, GINT_TO_POINTER(i)); | |
+ } | |
+ } | |
} | |
-void gtk_option_menu_update_selection(GtkWidget *widget) { | |
- LRESULT lres; | |
- GtkMenuShell *menu; | |
- GtkWidget *menu_item; | |
+void gtk_editable_create(GtkWidget *widget) | |
+{ | |
+ GtkEditable *editable = GTK_EDITABLE(widget); | |
- if (widget->hWnd==NULL) return; | |
- lres=SendMessage(widget->hWnd,CB_GETCURSEL,0,0); | |
- if (lres==CB_ERR) return; | |
+ gtk_widget_create(widget); | |
+ editable->is_editable = TRUE; | |
+ editable->text = g_string_new(""); | |
+} | |
- menu=GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(widget))); | |
- if (menu) { | |
- menu_item=GTK_WIDGET(g_slist_nth_data(menu->children,lres)); | |
- if (menu_item) gtk_signal_emit(GTK_OBJECT(menu_item),"activate"); | |
- } | |
+void gtk_option_menu_update_selection(GtkWidget *widget) | |
+{ | |
+ LRESULT lres; | |
+ GtkMenuShell *menu; | |
+ GtkWidget *menu_item; | |
+ | |
+ if (widget->hWnd == NULL) | |
+ return; | |
+ lres = SendMessage(widget->hWnd, CB_GETCURSEL, 0, 0); | |
+ if (lres == CB_ERR) | |
+ return; | |
+ | |
+ menu = GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(widget))); | |
+ if (menu) { | |
+ menu_item = GTK_WIDGET(g_slist_nth_data(menu->children, lres)); | |
+ if (menu_item) | |
+ gtk_signal_emit(GTK_OBJECT(menu_item), "activate"); | |
+ } | |
} | |
void gtk_window_handle_user_size(GtkWindow *window, | |
- GtkAllocation *allocation) { | |
+ GtkAllocation *allocation) | |
+{ | |
} | |
-void gtk_window_handle_minmax_size(GtkWindow *window,LPMINMAXINFO minmax) { | |
+void gtk_window_handle_minmax_size(GtkWindow *window, LPMINMAXINFO minmax) | |
+{ | |
GtkRequisition *req; | |
req = >K_WIDGET(window)->requisition; | |
t@@ -4628,268 +5283,311 @@ void gtk_window_handle_minmax_size(GtkWindow *window… | |
} | |
void gtk_window_set_initial_position(GtkWindow *window, | |
- GtkAllocation *allocation) { | |
- RECT rect; | |
- GtkWidget *widget=GTK_WIDGET(window); | |
- GetWindowRect(GetDesktopWindow(),&rect); | |
- | |
- if (widget->parent) { | |
- allocation->x = rect.left+(rect.right-rect.left-allocation->width)/2; | |
- allocation->y = rect.top+(rect.bottom-rect.top-allocation->height)/2; | |
- if (allocation->x < 0) allocation->x = 0; | |
- if (allocation->y < 0) allocation->y = 0; | |
- if (widget->hWnd) SetWindowPos(widget->hWnd,HWND_TOP,allocation->x, | |
- allocation->y,0,0,SWP_NOSIZE|SWP_NOZORDER… | |
- } | |
+ GtkAllocation *allocation) | |
+{ | |
+ RECT rect; | |
+ GtkWidget *widget = GTK_WIDGET(window); | |
+ | |
+ GetWindowRect(GetDesktopWindow(), &rect); | |
+ | |
+ if (widget->parent) { | |
+ allocation->x = | |
+ rect.left + (rect.right - rect.left - allocation->width) / 2; | |
+ allocation->y = | |
+ rect.top + (rect.bottom - rect.top - allocation->height) / 2; | |
+ if (allocation->x < 0) | |
+ allocation->x = 0; | |
+ if (allocation->y < 0) | |
+ allocation->y = 0; | |
+ if (widget->hWnd) | |
+ SetWindowPos(widget->hWnd, HWND_TOP, allocation->x, | |
+ allocation->y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); | |
+ } | |
} | |
void gtk_window_handle_auto_size(GtkWindow *window, | |
- GtkAllocation *allocation) { | |
- GtkWidget *widget=GTK_WIDGET(window); | |
- if (allocation->width < window->default_width) { | |
- allocation->width=window->default_width; | |
- } | |
- if (allocation->height < window->default_height) { | |
- allocation->height=window->default_height; | |
- } | |
- if (allocation->width < widget->allocation.width) { | |
- allocation->width=widget->allocation.width; | |
- } | |
- if (allocation->height < widget->allocation.height) { | |
- allocation->height=widget->allocation.height; | |
- } | |
+ GtkAllocation *allocation) | |
+{ | |
+ GtkWidget *widget = GTK_WIDGET(window); | |
+ | |
+ if (allocation->width < window->default_width) { | |
+ allocation->width = window->default_width; | |
+ } | |
+ if (allocation->height < window->default_height) { | |
+ allocation->height = window->default_height; | |
+ } | |
+ if (allocation->width < widget->allocation.width) { | |
+ allocation->width = widget->allocation.width; | |
+ } | |
+ if (allocation->height < widget->allocation.height) { | |
+ allocation->height = widget->allocation.height; | |
+ } | |
} | |
-void gtk_paned_set_position(GtkPaned *paned,gint position) { | |
- GtkAllocation allocation; | |
- if (position<0) position=0; | |
- if (position>100) position=100; | |
- paned->handle_pos=position; | |
- memcpy(&allocation,&paned->true_alloc,sizeof(GtkAllocation)); | |
- gtk_widget_set_size(GTK_WIDGET(paned),&allocation); | |
+void gtk_paned_set_position(GtkPaned *paned, gint position) | |
+{ | |
+ GtkAllocation allocation; | |
+ | |
+ if (position < 0) | |
+ position = 0; | |
+ if (position > 100) | |
+ position = 100; | |
+ paned->handle_pos = position; | |
+ memcpy(&allocation, &paned->true_alloc, sizeof(GtkAllocation)); | |
+ gtk_widget_set_size(GTK_WIDGET(paned), &allocation); | |
} | |
-void gtk_misc_set_alignment(GtkMisc *misc,gfloat xalign,gfloat yalign) { | |
+void gtk_misc_set_alignment(GtkMisc *misc, gfloat xalign, gfloat yalign) | |
+{ | |
} | |
-GtkWidget *gtk_progress_bar_new() { | |
- GtkProgressBar *prog; | |
+GtkWidget *gtk_progress_bar_new() | |
+{ | |
+ GtkProgressBar *prog; | |
- prog=GTK_PROGRESS_BAR(GtkNewObject(&GtkProgressBarClass)); | |
- prog->orient=GTK_PROGRESS_LEFT_TO_RIGHT; | |
- prog->position=0; | |
+ prog = GTK_PROGRESS_BAR(GtkNewObject(&GtkProgressBarClass)); | |
+ prog->orient = GTK_PROGRESS_LEFT_TO_RIGHT; | |
+ prog->position = 0; | |
- return GTK_WIDGET(prog); | |
+ return GTK_WIDGET(prog); | |
} | |
void gtk_progress_bar_set_orientation(GtkProgressBar *pbar, | |
- GtkProgressBarOrientation orientation) { | |
- pbar->orient=orientation; | |
+ GtkProgressBarOrientation orientation) | |
+{ | |
+ pbar->orient = orientation; | |
} | |
-void gtk_progress_bar_update(GtkProgressBar *pbar,gfloat percentage) { | |
- GtkWidget *widget; | |
+void gtk_progress_bar_update(GtkProgressBar *pbar, gfloat percentage) | |
+{ | |
+ GtkWidget *widget; | |
- widget=GTK_WIDGET(pbar); | |
- pbar->position = percentage; | |
- if (GTK_WIDGET_REALIZED(widget)) { | |
- SendMessage(widget->hWnd,PBM_SETPOS,(WPARAM)(10000.0*pbar->position),0); | |
- } | |
+ widget = GTK_WIDGET(pbar); | |
+ pbar->position = percentage; | |
+ if (GTK_WIDGET_REALIZED(widget)) { | |
+ SendMessage(widget->hWnd, PBM_SETPOS, | |
+ (WPARAM)(10000.0 * pbar->position), 0); | |
+ } | |
} | |
void gtk_progress_bar_size_request(GtkWidget *widget, | |
- GtkRequisition *requisition) { | |
- SIZE size; | |
+ GtkRequisition *requisition) | |
+{ | |
+ SIZE size; | |
- if (GetTextSize(widget->hWnd, "Sample", &size, defFont)) { | |
- requisition->width = size.cx; | |
- requisition->height = size.cy; | |
- } | |
+ if (GetTextSize(widget->hWnd, "Sample", &size, defFont)) { | |
+ requisition->width = size.cx; | |
+ requisition->height = size.cy; | |
+ } | |
} | |
-void gtk_progress_bar_realize(GtkWidget *widget) { | |
- HWND Parent; | |
- GtkProgressBar *prog; | |
+void gtk_progress_bar_realize(GtkWidget *widget) | |
+{ | |
+ HWND Parent; | |
+ GtkProgressBar *prog; | |
+ | |
+ prog = GTK_PROGRESS_BAR(widget); | |
+ Parent = gtk_get_parent_hwnd(widget); | |
+ widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, PROGRESS_CLASS, "", | |
+ WS_CHILD, | |
+ widget->allocation.x, widget->allocation.y, | |
+ widget->allocation.width, | |
+ widget->allocation.height, Parent, NULL, | |
+ hInst, NULL); | |
+ gtk_set_default_font(widget->hWnd); | |
+ SendMessage(widget->hWnd, PBM_SETRANGE, 0, MAKELPARAM(0, 10000)); | |
+ SendMessage(widget->hWnd, PBM_SETPOS, (WPARAM)(10000.0 * prog->position), 0); | |
+} | |
+ | |
+gint GtkMessageBox(GtkWidget *parent, const gchar *Text, | |
+ const gchar *Title, gint Options) | |
+{ | |
+ gint retval; | |
+ | |
+ RecurseLevel++; | |
+ retval = MessageBox(parent && parent->hWnd ? parent->hWnd : NULL, | |
+ Text, Title, Options); | |
+ RecurseLevel--; | |
- prog=GTK_PROGRESS_BAR(widget); | |
- Parent=gtk_get_parent_hwnd(widget); | |
- widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,PROGRESS_CLASS,"", | |
- WS_CHILD, | |
- widget->allocation.x,widget->allocation.y, | |
- widget->allocation.width,widget->allocation.height, | |
- Parent,NULL,hInst,NULL); | |
- gtk_set_default_font(widget->hWnd); | |
- SendMessage(widget->hWnd,PBM_SETRANGE,0,MAKELPARAM(0,10000)); | |
- SendMessage(widget->hWnd,PBM_SETPOS,(WPARAM)(10000.0*prog->position),0); | |
+ return retval; | |
} | |
-gint GtkMessageBox(GtkWidget *parent,const gchar *Text, | |
- const gchar *Title,gint Options) { | |
- gint retval; | |
+guint gtk_timeout_add(guint32 interval, GtkFunction function, | |
+ gpointer data) | |
+{ | |
+ GtkTimeout *timeout; | |
+ GSList *list; | |
+ guint id = 1; | |
+ | |
+ /* Get an unused ID */ | |
+ list = GtkTimeouts; | |
+ while (list) { | |
+ timeout = (GtkTimeout *)list->data; | |
+ if (timeout->id == id) { | |
+ id++; | |
+ list = GtkTimeouts; | |
+ } else { | |
+ list = g_slist_next(list); | |
+ } | |
+ } | |
+ | |
+ timeout = g_new(GtkTimeout, 1); | |
+ timeout->interval = interval; | |
+ timeout->function = function; | |
+ timeout->data = data; | |
- RecurseLevel++; | |
- retval = MessageBox(parent && parent->hWnd ? parent->hWnd : NULL, | |
- Text,Title,Options); | |
- RecurseLevel--; | |
+ timeout->id = SetTimer(TopLevel, id, interval, NULL); | |
+ if (timeout->id == 0) { | |
+ g_warning("Failed to create timer!"); | |
+ } | |
- return retval; | |
+ GtkTimeouts = g_slist_append(GtkTimeouts, timeout); | |
+ return timeout->id; | |
} | |
-guint gtk_timeout_add(guint32 interval,GtkFunction function,gpointer data) { | |
- GtkTimeout *timeout; | |
- GSList *list; | |
- guint id=1; | |
+void gtk_timeout_remove(guint timeout_handler_id) | |
+{ | |
+ GSList *list; | |
+ GtkTimeout *timeout; | |
-/* Get an unused ID */ | |
- list=GtkTimeouts; | |
- while (list) { | |
- timeout=(GtkTimeout *)list->data; | |
- if (timeout->id == id) { | |
- id++; list=GtkTimeouts; | |
- } else { | |
- list=g_slist_next(list); | |
- } | |
- } | |
- | |
- timeout=g_new(GtkTimeout,1); | |
- timeout->interval = interval; | |
- timeout->function = function; | |
- timeout->data = data; | |
- | |
- timeout->id=SetTimer(TopLevel,id,interval,NULL); | |
- if (timeout->id==0) { | |
- g_warning("Failed to create timer!"); | |
- } | |
- | |
- GtkTimeouts = g_slist_append(GtkTimeouts,timeout); | |
- return timeout->id; | |
-} | |
- | |
-void gtk_timeout_remove(guint timeout_handler_id) { | |
- GSList *list; | |
- GtkTimeout *timeout; | |
- for (list=GtkTimeouts;list;list=g_slist_next(list)) { | |
- timeout=(GtkTimeout *)list->data; | |
- if (timeout->id == timeout_handler_id) { | |
- if (KillTimer(TopLevel,timeout->id)==0) { | |
- g_warning("Failed to kill timer!"); | |
- } | |
- GtkTimeouts=g_slist_remove(GtkTimeouts,timeout); | |
- g_free(timeout); | |
- break; | |
+ for (list = GtkTimeouts; list; list = g_slist_next(list)) { | |
+ timeout = (GtkTimeout *)list->data; | |
+ if (timeout->id == timeout_handler_id) { | |
+ if (KillTimer(TopLevel, timeout->id) == 0) { | |
+ g_warning("Failed to kill timer!"); | |
} | |
- } | |
-} | |
- | |
-#else /* CYGWIN */ | |
-guint SetAccelerator(GtkWidget *labelparent,gchar *Text, | |
- GtkWidget *sendto,gchar *signal, | |
- GtkAccelGroup *accel_group) { | |
- guint AccelKey; | |
- AccelKey=gtk_label_parse_uline(GTK_LABEL(GTK_BIN(labelparent)->child),Text); | |
- if (sendto && AccelKey) { | |
- gtk_widget_add_accelerator(sendto,signal,accel_group,AccelKey,0, | |
- GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE); | |
- } | |
- return AccelKey; | |
-} | |
- | |
-GtkWidget *gtk_scrolled_text_new(GtkAdjustment *hadj,GtkAdjustment *vadj, | |
- GtkWidget **pack_widg) { | |
- GtkWidget *hbox,*text,*vscroll; | |
- GtkAdjustment *adj; | |
- hbox=gtk_hbox_new(FALSE,0); | |
- adj=(GtkAdjustment *)gtk_adjustment_new(0.0,0.0,100.0,1.0,10.0,10.0); | |
- text=gtk_text_new(NULL,adj); | |
- gtk_box_pack_start(GTK_BOX(hbox),text,TRUE,TRUE,0); | |
- vscroll=gtk_vscrollbar_new(adj); | |
- gtk_box_pack_start(GTK_BOX(hbox),vscroll,FALSE,FALSE,0); | |
- *pack_widg=hbox; | |
- return text; | |
+ GtkTimeouts = g_slist_remove(GtkTimeouts, timeout); | |
+ g_free(timeout); | |
+ break; | |
+ } | |
+ } | |
+} | |
+ | |
+#else /* CYGWIN */ | |
+guint SetAccelerator(GtkWidget *labelparent, gchar *Text, | |
+ GtkWidget *sendto, gchar *signal, | |
+ GtkAccelGroup *accel_group) | |
+{ | |
+ guint AccelKey; | |
+ | |
+ AccelKey = | |
+ gtk_label_parse_uline(GTK_LABEL(GTK_BIN(labelparent)->child), Text); | |
+ if (sendto && AccelKey) { | |
+ gtk_widget_add_accelerator(sendto, signal, accel_group, AccelKey, 0, | |
+ GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE); | |
+ } | |
+ return AccelKey; | |
+} | |
+ | |
+GtkWidget *gtk_scrolled_text_new(GtkAdjustment *hadj, GtkAdjustment *vadj, | |
+ GtkWidget **pack_widg) | |
+{ | |
+ GtkWidget *hbox, *text, *vscroll; | |
+ GtkAdjustment *adj; | |
+ | |
+ hbox = gtk_hbox_new(FALSE, 0); | |
+ adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 10.0, 10.0); | |
+ text = gtk_text_new(NULL, adj); | |
+ gtk_box_pack_start(GTK_BOX(hbox), text, TRUE, TRUE, 0); | |
+ vscroll = gtk_vscrollbar_new(adj); | |
+ gtk_box_pack_start(GTK_BOX(hbox), vscroll, FALSE, FALSE, 0); | |
+ *pack_widg = hbox; | |
+ return text; | |
} | |
GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns, | |
gchar *titles[], | |
- GtkWidget **pack_widg) { | |
- GtkWidget *scrollwin,*clist; | |
- clist=gtk_clist_new_with_titles(columns,titles); | |
- scrollwin=gtk_scrolled_window_new(NULL,NULL); | |
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), | |
- GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); | |
- gtk_container_add(GTK_CONTAINER(scrollwin),clist); | |
- *pack_widg=scrollwin; | |
- return clist; | |
-} | |
- | |
-static void DestroyGtkMessageBox(GtkWidget *widget,gpointer data) { | |
- gtk_main_quit(); | |
-} | |
- | |
-static void GtkMessageBoxCallback(GtkWidget *widget,gpointer data) { | |
- gint *retval; | |
- GtkWidget *dialog; | |
- dialog=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); | |
- retval=(gint *)gtk_object_get_data(GTK_OBJECT(widget),"retval"); | |
- if (retval) *retval=GPOINTER_TO_INT(data); | |
- gtk_widget_destroy(dialog); | |
-} | |
- | |
-gint GtkMessageBox(GtkWidget *parent,const gchar *Text, | |
- const gchar *Title,gint Options) { | |
- GtkWidget *dialog,*button,*label,*vbox,*hbbox,*hsep; | |
- GtkAccelGroup *accel_group; | |
- gint i; | |
- static gint retval; | |
- gboolean imm_return; | |
- gchar *ButtonData[MB_MAX] = { N_("OK"), N_("Cancel"), | |
- N_("_Yes"), N_("_No") }; | |
- | |
- imm_return = Options & MB_IMMRETURN; | |
- dialog=gtk_window_new(GTK_WINDOW_DIALOG); | |
- accel_group=gtk_accel_group_new(); | |
- gtk_window_add_accel_group(GTK_WINDOW(dialog),accel_group); | |
- gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | |
- gtk_container_set_border_width(GTK_CONTAINER(dialog),7); | |
- if (parent) gtk_window_set_transient_for(GTK_WINDOW(dialog), | |
- GTK_WINDOW(parent)); | |
- if (!imm_return) { | |
- gtk_signal_connect(GTK_OBJECT(dialog),"destroy", | |
- GTK_SIGNAL_FUNC(DestroyGtkMessageBox),NULL); | |
- } | |
- if (Title) gtk_window_set_title(GTK_WINDOW(dialog),Title); | |
- | |
- vbox=gtk_vbox_new(FALSE,7); | |
- | |
- if (Text) { | |
- label=gtk_label_new(Text); | |
- gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); | |
- } | |
- | |
- hsep=gtk_hseparator_new(); | |
- gtk_box_pack_start(GTK_BOX(vbox),hsep,FALSE,FALSE,0); | |
- | |
- retval=MB_CANCEL; | |
- | |
- hbbox=gtk_hbutton_box_new(); | |
- for (i=0;i<MB_MAX;i++) { | |
- if (Options & (1<<i)) { | |
- button=gtk_button_new_with_label(""); | |
- SetAccelerator(button,_(ButtonData[i]),button, | |
- "clicked",accel_group); | |
- if (!imm_return) { | |
- gtk_object_set_data(GTK_OBJECT(button),"retval",&retval); | |
- } | |
- gtk_signal_connect(GTK_OBJECT(button),"clicked", | |
- GTK_SIGNAL_FUNC(GtkMessageBoxCallback), | |
- GINT_TO_POINTER(1<<i)); | |
- gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); | |
+ GtkWidget **pack_widg) | |
+{ | |
+ GtkWidget *scrollwin, *clist; | |
+ | |
+ clist = gtk_clist_new_with_titles(columns, titles); | |
+ scrollwin = gtk_scrolled_window_new(NULL, NULL); | |
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), | |
+ GTK_POLICY_AUTOMATIC, | |
+ GTK_POLICY_AUTOMATIC); | |
+ gtk_container_add(GTK_CONTAINER(scrollwin), clist); | |
+ *pack_widg = scrollwin; | |
+ return clist; | |
+} | |
+ | |
+static void DestroyGtkMessageBox(GtkWidget *widget, gpointer data) | |
+{ | |
+ gtk_main_quit(); | |
+} | |
+ | |
+static void GtkMessageBoxCallback(GtkWidget *widget, gpointer data) | |
+{ | |
+ gint *retval; | |
+ GtkWidget *dialog; | |
+ | |
+ dialog = gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW); | |
+ retval = (gint *)gtk_object_get_data(GTK_OBJECT(widget), "retval"); | |
+ if (retval) | |
+ *retval = GPOINTER_TO_INT(data); | |
+ gtk_widget_destroy(dialog); | |
+} | |
+ | |
+gint GtkMessageBox(GtkWidget *parent, const gchar *Text, | |
+ const gchar *Title, gint Options) | |
+{ | |
+ GtkWidget *dialog, *button, *label, *vbox, *hbbox, *hsep; | |
+ GtkAccelGroup *accel_group; | |
+ gint i; | |
+ static gint retval; | |
+ gboolean imm_return; | |
+ gchar *ButtonData[MB_MAX] = { | |
+ N_("OK"), N_("Cancel"), N_("_Yes"), N_("_No") | |
+ }; | |
+ | |
+ imm_return = Options & MB_IMMRETURN; | |
+ dialog = gtk_window_new(GTK_WINDOW_DIALOG); | |
+ accel_group = gtk_accel_group_new(); | |
+ gtk_window_add_accel_group(GTK_WINDOW(dialog), accel_group); | |
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | |
+ gtk_container_set_border_width(GTK_CONTAINER(dialog), 7); | |
+ if (parent) | |
+ gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); | |
+ if (!imm_return) { | |
+ gtk_signal_connect(GTK_OBJECT(dialog), "destroy", | |
+ GTK_SIGNAL_FUNC(DestroyGtkMessageBox), NULL); | |
+ } | |
+ if (Title) | |
+ gtk_window_set_title(GTK_WINDOW(dialog), Title); | |
+ | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ | |
+ if (Text) { | |
+ label = gtk_label_new(Text); | |
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
+ } | |
+ | |
+ hsep = gtk_hseparator_new(); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hsep, FALSE, FALSE, 0); | |
+ | |
+ retval = MB_CANCEL; | |
+ | |
+ hbbox = gtk_hbutton_box_new(); | |
+ for (i = 0; i < MB_MAX; i++) { | |
+ if (Options & (1 << i)) { | |
+ button = gtk_button_new_with_label(""); | |
+ SetAccelerator(button, _(ButtonData[i]), button, | |
+ "clicked", accel_group); | |
+ if (!imm_return) { | |
+ gtk_object_set_data(GTK_OBJECT(button), "retval", &retval); | |
} | |
- } | |
- gtk_box_pack_start(GTK_BOX(vbox),hbbox,TRUE,TRUE,0); | |
- gtk_container_add(GTK_CONTAINER(dialog),vbox); | |
- gtk_widget_show_all(dialog); | |
- if (!imm_return) gtk_main(); | |
- return retval; | |
+ gtk_signal_connect(GTK_OBJECT(button), "clicked", | |
+ GTK_SIGNAL_FUNC(GtkMessageBoxCallback), | |
+ GINT_TO_POINTER(1 << i)); | |
+ 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(dialog), vbox); | |
+ gtk_widget_show_all(dialog); | |
+ if (!imm_return) | |
+ gtk_main(); | |
+ return retval; | |
} | |
static void gtk_url_set_cursor(GtkWidget *widget, GtkWidget *label) | |
t@@ -4922,7 +5620,6 @@ static gboolean gtk_url_triggered(GtkWidget *widget, Gdk… | |
_exit(1); | |
} | |
} | |
- | |
#endif | |
return TRUE; | |
} | |
t@@ -4952,15 +5649,16 @@ GtkWidget *gtk_url_new(const gchar *text, const gchar … | |
/* Make the text underlined */ | |
len = strlen(text); | |
- pattern = g_new(gchar, len+1); | |
- for (i = 0; i < len; i++) pattern[i] = '_'; | |
+ pattern = g_new(gchar, len + 1); | |
+ | |
+ for (i = 0; i < len; i++) | |
+ pattern[i] = '_'; | |
pattern[len] = '\0'; | |
gtk_label_set_pattern(GTK_LABEL(label), pattern); | |
g_free(pattern); | |
- /* We cannot set the cursor until the widget is realized, so | |
- * set up a handler to do this later | |
- */ | |
+ /* We cannot set the cursor until the widget is realized, so set up a | |
+ * handler to do this later */ | |
gtk_signal_connect(GTK_OBJECT(label), "realize", | |
GTK_SIGNAL_FUNC(gtk_url_set_cursor), label); | |
t@@ -4977,4 +5675,4 @@ GtkWidget *gtk_url_new(const gchar *text, const gchar *t… | |
return eventbox; | |
} | |
-#endif /* CYGWIN */ | |
+#endif /* CYGWIN */ | |
diff --git a/src/gtkport.h b/src/gtkport.h | |
t@@ -1,22 +1,24 @@ | |
-/* gtkport.h Portable "almost-GTK+" for Unix/Win32 */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * gtkport.h Portable "almost-GTK+" for Unix/Win32 * | |
+ * 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 __GTKPORT_H__ | |
#define __GTKPORT_H__ | |
t@@ -42,44 +44,44 @@ | |
extern HICON mainIcon; | |
typedef enum { | |
- GTK_WINDOW_TOPLEVEL, GTK_WINDOW_DIALOG, GTK_WINDOW_POPUP | |
+ GTK_WINDOW_TOPLEVEL, GTK_WINDOW_DIALOG, GTK_WINDOW_POPUP | |
} GtkWindowType; | |
typedef enum { | |
- GTK_ACCEL_VISIBLE = 1 << 0, | |
- GTK_ACCEL_SIGNAL_VISIBLE = 1 << 1 | |
+ GTK_ACCEL_VISIBLE = 1 << 0, | |
+ GTK_ACCEL_SIGNAL_VISIBLE = 1 << 1 | |
} GtkAccelFlags; | |
typedef enum { | |
- GTK_VISIBILITY_NONE, | |
- GTK_VISIBILITY_PARTIAL, | |
- GTK_VISIBILITY_FULL | |
+ GTK_VISIBILITY_NONE, | |
+ GTK_VISIBILITY_PARTIAL, | |
+ GTK_VISIBILITY_FULL | |
} GtkVisibility; | |
typedef enum { | |
- GTK_PROGRESS_LEFT_TO_RIGHT, | |
- GTK_PROGRESS_RIGHT_TO_LEFT, | |
- GTK_PROGRESS_BOTTOM_TO_TOP, | |
- GTK_PROGRESS_TOP_TO_BOTTOM | |
+ GTK_PROGRESS_LEFT_TO_RIGHT, | |
+ GTK_PROGRESS_RIGHT_TO_LEFT, | |
+ GTK_PROGRESS_BOTTOM_TO_TOP, | |
+ GTK_PROGRESS_TOP_TO_BOTTOM | |
} GtkProgressBarOrientation; | |
typedef enum { | |
- GTK_EXPAND = 1 << 0, | |
- GTK_SHRINK = 1 << 1, | |
- GTK_FILL = 1 << 2 | |
+ GTK_EXPAND = 1 << 0, | |
+ GTK_SHRINK = 1 << 1, | |
+ GTK_FILL = 1 << 2 | |
} GtkAttachOptions; | |
typedef enum { | |
- GTK_SELECTION_SINGLE, | |
- GTK_SELECTION_BROWSE, | |
- GTK_SELECTION_MULTIPLE, | |
- GTK_SELECTION_EXTENDED | |
+ GTK_SELECTION_SINGLE, | |
+ GTK_SELECTION_BROWSE, | |
+ GTK_SELECTION_MULTIPLE, | |
+ GTK_SELECTION_EXTENDED | |
} GtkSelectionMode; | |
typedef enum { | |
- GDK_INPUT_READ = 1 << 0, | |
- GDK_INPUT_WRITE = 1 << 1, | |
- GDK_INPUT_EXCEPTION = 1 << 2 | |
+ GDK_INPUT_READ = 1 << 0, | |
+ GDK_INPUT_WRITE = 1 << 1, | |
+ GDK_INPUT_EXCEPTION = 1 << 2 | |
} GdkInputCondition; | |
#define GDK_KP_0 0xFFB0 | |
t@@ -93,20 +95,20 @@ typedef enum { | |
#define GDK_KP_8 0xFFB8 | |
#define GDK_KP_9 0xFFB9 | |
-typedef gint (*GtkFunction)(gpointer data); | |
-typedef void (*GdkInputFunction)(gpointer data,gint source, | |
- GdkInputCondition condition); | |
-typedef gchar* (*GtkTranslateFunc)(const gchar *path,gpointer func_data); | |
-typedef void (*GtkDestroyNotify)(gpointer data); | |
+typedef gint (*GtkFunction) (gpointer data); | |
+typedef void (*GdkInputFunction) (gpointer data, gint source, | |
+ GdkInputCondition condition); | |
+typedef gchar *(*GtkTranslateFunc) (const gchar *path, gpointer func_data); | |
+typedef void (*GtkDestroyNotify) (gpointer data); | |
typedef enum { | |
- GTK_REALIZED = 1 << 6, | |
- GTK_VISIBLE = 1 << 8, | |
- GTK_SENSITIVE = 1 << 10, | |
- GTK_CAN_FOCUS = 1 << 11, | |
- GTK_HAS_FOCUS = 1 << 12, | |
- GTK_CAN_DEFAULT = 1 << 13, | |
- GTK_IS_DEFAULT = 1 << 14 | |
+ GTK_REALIZED = 1 << 6, | |
+ GTK_VISIBLE = 1 << 8, | |
+ GTK_SENSITIVE = 1 << 10, | |
+ GTK_CAN_FOCUS = 1 << 11, | |
+ GTK_HAS_FOCUS = 1 << 12, | |
+ GTK_CAN_DEFAULT = 1 << 13, | |
+ GTK_IS_DEFAULT = 1 << 14 | |
} GtkWidgetFlags; | |
#define GTK_VISIBLE 1 | |
t@@ -121,9 +123,9 @@ typedef struct _GtkSignalType GtkSignalType; | |
typedef void (*GtkSignalFunc) (); | |
typedef void (*GtkItemFactoryCallback) (); | |
-typedef void (*GtkSignalMarshaller)(GtkObject *object,GSList *actions, | |
- GtkSignalFunc default_action, | |
- va_list args); | |
+typedef void (*GtkSignalMarshaller) (GtkObject *object, GSList *actions, | |
+ GtkSignalFunc default_action, | |
+ va_list args); | |
typedef struct _GtkMenuShell GtkMenuShell; | |
typedef struct _GtkMenuBar GtkMenuBar; | |
typedef struct _GtkMenuItem GtkMenuItem; | |
t@@ -142,99 +144,99 @@ typedef struct _GtkHPaned GtkHPaned; | |
typedef struct _GtkOptionMenu GtkOptionMenu; | |
struct _GtkAccelGroup { | |
- ACCEL *accel; /* list of ACCEL structures */ | |
- gint numaccel; | |
+ ACCEL *accel; /* list of ACCEL structures */ | |
+ gint numaccel; | |
}; | |
struct _GtkSignalType { | |
- gchar *name; | |
- GtkSignalMarshaller marshaller; | |
- GtkSignalFunc default_action; | |
+ gchar *name; | |
+ GtkSignalMarshaller marshaller; | |
+ GtkSignalFunc default_action; | |
}; | |
struct _GtkClass { | |
- gchar *Name; | |
- GtkClass *parent; | |
- gint Size; | |
- GtkSignalType *signals; | |
+ gchar *Name; | |
+ GtkClass *parent; | |
+ gint Size; | |
+ GtkSignalType *signals; | |
}; | |
typedef GtkClass *GtkType; | |
struct _GtkObject { | |
- GtkClass *klass; | |
- GData *object_data; | |
- GData *signals; | |
- guint32 flags; | |
+ GtkClass *klass; | |
+ GData *object_data; | |
+ GData *signals; | |
+ guint32 flags; | |
}; | |
struct _GtkAdjustment { | |
- GtkObject object; | |
- gfloat value,lower,upper; | |
- gfloat step_increment,page_increment,page_size; | |
+ GtkObject object; | |
+ gfloat value, lower, upper; | |
+ gfloat step_increment, page_increment, page_size; | |
}; | |
struct _GtkRequisition { | |
- gint16 width, height; | |
+ gint16 width, height; | |
}; | |
struct _GtkAllocation { | |
- gint16 x,y,width,height; | |
+ gint16 x, y, width, height; | |
}; | |
struct _GtkWidget { | |
- GtkObject object; | |
- HWND hWnd; | |
- GtkRequisition requisition; | |
- GtkAllocation allocation; | |
- GtkRequisition usize; | |
- GtkWidget *parent; | |
+ GtkObject object; | |
+ HWND hWnd; | |
+ GtkRequisition requisition; | |
+ GtkAllocation allocation; | |
+ GtkRequisition usize; | |
+ GtkWidget *parent; | |
}; | |
struct _GtkMisc { | |
- GtkWidget widget; | |
+ GtkWidget widget; | |
}; | |
struct _GtkProgressBar { | |
- GtkWidget widget; | |
- GtkProgressBarOrientation orient; | |
- gfloat position; | |
+ GtkWidget widget; | |
+ GtkProgressBarOrientation orient; | |
+ gfloat position; | |
}; | |
struct _GtkSeparator { | |
- GtkWidget widget; | |
+ GtkWidget widget; | |
}; | |
struct _GtkHSeparator { | |
- GtkSeparator separator; | |
+ GtkSeparator separator; | |
}; | |
struct _GtkVSeparator { | |
- GtkSeparator separator; | |
+ GtkSeparator separator; | |
}; | |
struct _GtkMenuItem { | |
- GtkWidget widget; | |
- GtkMenu *submenu; | |
- gint ID; | |
- gint accelind; | |
- gchar *text; | |
+ GtkWidget widget; | |
+ GtkMenu *submenu; | |
+ gint ID; | |
+ gint accelind; | |
+ gchar *text; | |
}; | |
struct _GtkMenuShell { | |
- GtkWidget widget; | |
- HMENU menu; | |
- GSList *children; | |
+ GtkWidget widget; | |
+ HMENU menu; | |
+ GSList *children; | |
}; | |
struct _GtkMenu { | |
- GtkMenuShell menushell; | |
- guint active; | |
+ GtkMenuShell menushell; | |
+ guint active; | |
}; | |
struct _GtkMenuBar { | |
- GtkMenuShell menushell; | |
- gint LastID; | |
+ GtkMenuShell menushell; | |
+ gint LastID; | |
}; | |
typedef struct _GtkEditable GtkEditable; | |
t@@ -243,32 +245,32 @@ typedef struct _GtkText GtkText; | |
typedef struct _GtkSpinButton GtkSpinButton; | |
struct _GtkEditable { | |
- GtkWidget widget; | |
- GString *text; | |
- gint is_editable : 1; | |
+ GtkWidget widget; | |
+ GString *text; | |
+ gint is_editable:1; | |
}; | |
struct _GtkEntry { | |
- GtkEditable editable; | |
- gint is_visible : 1; | |
+ GtkEditable editable; | |
+ gint is_visible:1; | |
}; | |
struct _GtkSpinButton { | |
- GtkEntry entry; | |
- GtkAdjustment *adj; | |
- HWND updown; | |
+ GtkEntry entry; | |
+ GtkAdjustment *adj; | |
+ HWND updown; | |
}; | |
struct _GtkText { | |
- GtkEditable editable; | |
- gint word_wrap : 1; | |
+ GtkEditable editable; | |
+ gint word_wrap:1; | |
}; | |
typedef struct _GtkLabel GtkLabel; | |
struct _GtkLabel { | |
- GtkWidget widget; | |
- gchar *text; | |
+ GtkWidget widget; | |
+ gchar *text; | |
}; | |
typedef struct _GtkUrl GtkUrl; | |
t@@ -281,32 +283,32 @@ struct _GtkUrl { | |
typedef struct _GtkContainer GtkContainer; | |
struct _GtkContainer { | |
- GtkWidget widget; | |
- GtkWidget *child; | |
- guint border_width : 16; | |
+ GtkWidget widget; | |
+ GtkWidget *child; | |
+ guint border_width:16; | |
}; | |
struct _GtkPanedChild { | |
- GtkWidget *widget; | |
- gint resize : 1; | |
- gint shrink : 1; | |
+ GtkWidget *widget; | |
+ gint resize:1; | |
+ gint shrink:1; | |
}; | |
struct _GtkPaned { | |
- GtkContainer container; | |
- GtkPanedChild children[2]; | |
- GtkAllocation true_alloc; | |
- gint handle_size,gutter_size; | |
- gint handle_pos; | |
- gint Tracking : 1; | |
+ GtkContainer container; | |
+ GtkPanedChild children[2]; | |
+ GtkAllocation true_alloc; | |
+ gint handle_size, gutter_size; | |
+ gint handle_pos; | |
+ gint Tracking:1; | |
}; | |
struct _GtkVPaned { | |
- GtkPaned paned; | |
+ GtkPaned paned; | |
}; | |
struct _GtkHPaned { | |
- GtkPaned paned; | |
+ GtkPaned paned; | |
}; | |
typedef struct _GtkBox GtkBox; | |
t@@ -321,91 +323,91 @@ typedef struct _GtkCListColumn GtkCListColumn; | |
typedef struct _GtkItemFactoryEntry GtkItemFactoryEntry; | |
typedef struct _GtkItemFactory GtkItemFactory; | |
-typedef gint (*GtkCListCompareFunc)(GtkCList *clist,gconstpointer ptr1, | |
- gconstpointer ptr2); | |
+typedef gint (*GtkCListCompareFunc) (GtkCList *clist, gconstpointer ptr1, | |
+ gconstpointer ptr2); | |
struct _GtkItemFactoryEntry { | |
- gchar *path; | |
- gchar *accelerator; | |
- GtkItemFactoryCallback callback; | |
- guint callback_action; | |
- gchar *item_type; | |
+ gchar *path; | |
+ gchar *accelerator; | |
+ GtkItemFactoryCallback callback; | |
+ guint callback_action; | |
+ gchar *item_type; | |
}; | |
struct _GtkItemFactory { | |
- GtkObject object; | |
- GSList *children; | |
- gchar *path; | |
- GtkAccelGroup *accel_group; | |
- GtkWidget *top_widget; | |
- GtkTranslateFunc translate_func; | |
- gpointer translate_data; | |
+ GtkObject object; | |
+ GSList *children; | |
+ gchar *path; | |
+ GtkAccelGroup *accel_group; | |
+ GtkWidget *top_widget; | |
+ GtkTranslateFunc translate_func; | |
+ gpointer translate_data; | |
}; | |
struct _GtkBoxChild { | |
- GtkWidget *widget; | |
- guint expand : 1; | |
- guint fill : 1; | |
+ GtkWidget *widget; | |
+ guint expand:1; | |
+ guint fill:1; | |
}; | |
struct _GtkBox { | |
- GtkContainer container; | |
- GList *children; | |
- guint16 spacing; | |
- gint maxreq; | |
- guint homogeneous : 1; | |
+ GtkContainer container; | |
+ GList *children; | |
+ guint16 spacing; | |
+ gint maxreq; | |
+ guint homogeneous:1; | |
}; | |
struct _GtkHBox { | |
- GtkBox box; | |
+ GtkBox box; | |
}; | |
struct _GtkVBox { | |
- GtkBox box; | |
+ GtkBox box; | |
}; | |
struct _GtkNotebookChild { | |
- GtkWidget *child,*tab_label; | |
+ GtkWidget *child, *tab_label; | |
}; | |
struct _GtkNotebook { | |
- GtkContainer container; | |
- GSList *children; | |
- gint selection; | |
+ GtkContainer container; | |
+ GSList *children; | |
+ gint selection; | |
}; | |
struct _GtkCListColumn { | |
- gchar *title; | |
- gint width; | |
- guint visible : 1; | |
- guint resizeable : 1; | |
- guint auto_resize : 1; | |
- guint button_passive : 1; | |
+ gchar *title; | |
+ gint width; | |
+ guint visible:1; | |
+ guint resizeable:1; | |
+ guint auto_resize:1; | |
+ guint button_passive:1; | |
}; | |
struct _GtkCListRow { | |
- gpointer data; | |
- gchar **text; | |
+ gpointer data; | |
+ gchar **text; | |
}; | |
struct _GtkCList { | |
- GtkContainer container; | |
- gint ncols; | |
- HWND header; | |
- gint16 header_size; | |
- GSList *rows; | |
- GtkCListColumn *cols; | |
- GList *selection; | |
- GtkSelectionMode mode; | |
- GtkCListCompareFunc cmp_func; | |
- gint auto_sort : 1; | |
+ GtkContainer container; | |
+ gint ncols; | |
+ HWND header; | |
+ gint16 header_size; | |
+ GSList *rows; | |
+ GtkCListColumn *cols; | |
+ GList *selection; | |
+ GtkSelectionMode mode; | |
+ GtkCListCompareFunc cmp_func; | |
+ gint auto_sort:1; | |
}; | |
typedef struct _GtkBin GtkBin; | |
struct _GtkBin { | |
- GtkContainer container; | |
- GtkWidget *child; | |
+ GtkContainer container; | |
+ GtkWidget *child; | |
}; | |
typedef struct _GtkFrame GtkFrame; | |
t@@ -415,51 +417,51 @@ typedef struct _GtkCheckButton GtkCheckButton; | |
typedef struct _GtkRadioButton GtkRadioButton; | |
struct _GtkFrame { | |
- GtkBin bin; | |
- gchar *text; | |
- GtkRequisition label_req; | |
+ GtkBin bin; | |
+ gchar *text; | |
+ GtkRequisition label_req; | |
}; | |
struct _GtkButton { | |
- GtkWidget widget; | |
- gchar *text; | |
+ GtkWidget widget; | |
+ gchar *text; | |
}; | |
struct _GtkOptionMenu { | |
- GtkButton button; | |
- GtkWidget *menu; | |
- guint selection; | |
+ GtkButton button; | |
+ GtkWidget *menu; | |
+ guint selection; | |
}; | |
struct _GtkToggleButton { | |
- GtkButton button; | |
- gboolean toggled; | |
+ GtkButton button; | |
+ gboolean toggled; | |
}; | |
struct _GtkCheckButton { | |
- GtkToggleButton toggle; | |
+ GtkToggleButton toggle; | |
}; | |
struct _GtkRadioButton { | |
- GtkCheckButton check; | |
- GSList *group; | |
+ GtkCheckButton check; | |
+ GSList *group; | |
}; | |
typedef struct _GtkWindow GtkWindow; | |
struct _GtkWindow { | |
- GtkBin bin; | |
- GtkWindowType type; | |
- gchar *title; | |
- gint default_width,default_height; | |
- GtkMenuBar *menu_bar; | |
- GtkAccelGroup *accel_group; | |
- GtkWidget *focus; | |
- HACCEL hAccel; | |
- guint modal : 1; | |
- guint allow_shrink : 1; | |
- guint allow_grow : 1; | |
- guint auto_shrink : 1; | |
+ GtkBin bin; | |
+ GtkWindowType type; | |
+ gchar *title; | |
+ gint default_width, default_height; | |
+ GtkMenuBar *menu_bar; | |
+ GtkAccelGroup *accel_group; | |
+ GtkWidget *focus; | |
+ HACCEL hAccel; | |
+ guint modal:1; | |
+ guint allow_shrink:1; | |
+ guint allow_grow:1; | |
+ guint auto_shrink:1; | |
}; | |
typedef struct _GtkTable GtkTable; | |
t@@ -467,23 +469,23 @@ typedef struct _GtkTableChild GtkTableChild; | |
typedef struct _GtkTableRowCol GtkTableRowCol; | |
struct _GtkTable { | |
- GtkContainer container; | |
- GList *children; | |
- GtkTableRowCol *rows,*cols; | |
- guint16 nrows,ncols; | |
- guint16 column_spacing,row_spacing; | |
- guint homogeneous : 1; | |
+ GtkContainer container; | |
+ GList *children; | |
+ GtkTableRowCol *rows, *cols; | |
+ guint16 nrows, ncols; | |
+ guint16 column_spacing, row_spacing; | |
+ guint homogeneous:1; | |
}; | |
struct _GtkTableChild { | |
- GtkWidget *widget; | |
- guint16 left_attach,right_attach,top_attach,bottom_attach; | |
+ GtkWidget *widget; | |
+ guint16 left_attach, right_attach, top_attach, bottom_attach; | |
}; | |
struct _GtkTableRowCol { | |
- guint16 requisition; | |
- guint16 allocation; | |
- gint16 spacing; | |
+ guint16 requisition; | |
+ guint16 allocation; | |
+ gint16 spacing; | |
}; | |
#define GTK_OBJECT(obj) ((GtkObject *)(obj)) | |
t@@ -538,133 +540,146 @@ void gtk_widget_hide_all(GtkWidget *widget); | |
void gtk_widget_hide(GtkWidget *widget); | |
void gtk_widget_destroy(GtkWidget *widget); | |
void gtk_widget_realize(GtkWidget *widget); | |
-void gtk_widget_set_sensitive(GtkWidget *widget,gboolean sensitive); | |
-void gtk_widget_size_request(GtkWidget *widget,GtkRequisition *requisition); | |
-void gtk_widget_set_size(GtkWidget *widget,GtkAllocation *allocation); | |
-GtkWidget *gtk_widget_get_ancestor(GtkWidget *widget,GtkType type); | |
+void gtk_widget_set_sensitive(GtkWidget *widget, gboolean sensitive); | |
+void gtk_widget_size_request(GtkWidget *widget, | |
+ GtkRequisition *requisition); | |
+void gtk_widget_set_size(GtkWidget *widget, GtkAllocation *allocation); | |
+GtkWidget *gtk_widget_get_ancestor(GtkWidget *widget, GtkType type); | |
GtkWidget *gtk_window_new(GtkWindowType type); | |
-void gtk_window_set_title(GtkWindow *window,const gchar *title); | |
-void gtk_window_set_default_size(GtkWindow *window,gint width,gint height); | |
-void gtk_window_set_transient_for(GtkWindow *window,GtkWindow *parent); | |
-void gtk_window_set_policy(GtkWindow *window,gint allow_shrink, | |
- gint allow_grow,gint auto_shrink); | |
-void gtk_container_add(GtkContainer *container,GtkWidget *widget); | |
-void gtk_container_set_border_width(GtkContainer *container,guint border_width… | |
+void gtk_window_set_title(GtkWindow *window, const gchar *title); | |
+void gtk_window_set_default_size(GtkWindow *window, gint width, | |
+ gint height); | |
+void gtk_window_set_transient_for(GtkWindow *window, GtkWindow *parent); | |
+void gtk_window_set_policy(GtkWindow *window, gint allow_shrink, | |
+ gint allow_grow, gint auto_shrink); | |
+void gtk_container_add(GtkContainer *container, GtkWidget *widget); | |
+void gtk_container_set_border_width(GtkContainer *container, | |
+ guint border_width); | |
GtkWidget *gtk_button_new_with_label(const gchar *label); | |
GtkWidget *gtk_label_new(const gchar *text); | |
-GtkWidget *gtk_hbox_new(gboolean homogeneous,gint spacing); | |
-GtkWidget *gtk_vbox_new(gboolean homogeneous,gint spacing); | |
+GtkWidget *gtk_hbox_new(gboolean homogeneous, gint spacing); | |
+GtkWidget *gtk_vbox_new(gboolean homogeneous, gint spacing); | |
GtkWidget *gtk_check_button_new_with_label(const gchar *label); | |
-GtkWidget *gtk_radio_button_new_with_label(GSList *group,const gchar *label); | |
+GtkWidget *gtk_radio_button_new_with_label(GSList *group, | |
+ const gchar *label); | |
GtkWidget *gtk_radio_button_new_with_label_from_widget(GtkRadioButton *group, | |
const gchar *label); | |
GtkWidget *gtk_frame_new(const gchar *text); | |
-GtkWidget *gtk_text_new(GtkAdjustment *hadj,GtkAdjustment *vadj); | |
+GtkWidget *gtk_text_new(GtkAdjustment *hadj, GtkAdjustment *vadj); | |
GtkWidget *gtk_entry_new(); | |
-void gtk_entry_set_visibility(GtkEntry *entry,gboolean visible); | |
-GtkWidget *gtk_table_new(guint rows,guint cols,gboolean homogeneous); | |
-void gtk_table_resize(GtkTable *table,guint rows,guint cols); | |
+void gtk_entry_set_visibility(GtkEntry *entry, gboolean visible); | |
+GtkWidget *gtk_table_new(guint rows, guint cols, gboolean homogeneous); | |
+void gtk_table_resize(GtkTable *table, guint rows, guint cols); | |
GtkItemFactory *gtk_item_factory_new(GtkType container_type, | |
const gchar *path, | |
GtkAccelGroup *accel_group); | |
void gtk_item_factory_create_item(GtkItemFactory *ifactory, | |
GtkItemFactoryEntry *entry, | |
- gpointer callback_data,guint callback_type); | |
-void gtk_item_factory_create_items(GtkItemFactory *ifactory,guint n_entries, | |
+ gpointer callback_data, | |
+ guint callback_type); | |
+void gtk_item_factory_create_items(GtkItemFactory *ifactory, | |
+ guint n_entries, | |
GtkItemFactoryEntry *entries, | |
gpointer callback_data); | |
GtkWidget *gtk_item_factory_get_widget(GtkItemFactory *ifactory, | |
const gchar *path); | |
GtkWidget *gtk_clist_new(gint columns); | |
-GtkWidget *gtk_clist_new_with_titles(gint columns,gchar *titles[]); | |
-gint gtk_clist_append(GtkCList *clist,gchar *text[]); | |
-void gtk_clist_set_column_title(GtkCList *clist,gint column,const gchar *title… | |
-gint gtk_clist_insert(GtkCList *clist,gint row,gchar *text[]); | |
-void gtk_clist_set_column_width(GtkCList *clist,gint column,gint width); | |
-void gtk_clist_column_title_passive(GtkCList *clist,gint column); | |
+GtkWidget *gtk_clist_new_with_titles(gint columns, gchar *titles[]); | |
+gint gtk_clist_append(GtkCList *clist, gchar *text[]); | |
+void gtk_clist_set_column_title(GtkCList *clist, gint column, | |
+ const gchar *title); | |
+gint gtk_clist_insert(GtkCList *clist, gint row, gchar *text[]); | |
+void gtk_clist_set_column_width(GtkCList *clist, gint column, gint width); | |
+void gtk_clist_column_title_passive(GtkCList *clist, gint column); | |
void gtk_clist_column_titles_passive(GtkCList *clist); | |
-void gtk_clist_column_title_active(GtkCList *clist,gint column); | |
+void gtk_clist_column_title_active(GtkCList *clist, gint column); | |
void gtk_clist_column_titles_active(GtkCList *clist); | |
-void gtk_clist_set_selection_mode(GtkCList *clist,GtkSelectionMode mode); | |
+void gtk_clist_set_selection_mode(GtkCList *clist, GtkSelectionMode mode); | |
void gtk_clist_sort(GtkCList *clist); | |
void gtk_clist_freeze(GtkCList *clist); | |
void gtk_clist_thaw(GtkCList *clist); | |
void gtk_clist_clear(GtkCList *clist); | |
GSList *gtk_radio_button_group(GtkRadioButton *radio_button); | |
-void gtk_editable_insert_text(GtkEditable *editable,const gchar *new_text, | |
- gint new_text_length,gint *position); | |
+void gtk_editable_insert_text(GtkEditable *editable, const gchar *new_text, | |
+ gint new_text_length, gint *position); | |
void gtk_editable_delete_text(GtkEditable *editable, | |
- gint start_pos,gint end_pos); | |
+ gint start_pos, gint end_pos); | |
gchar *gtk_editable_get_chars(GtkEditable *editable, | |
- gint start_pos,gint end_pos); | |
-void gtk_editable_set_editable(GtkEditable *editable,gboolean is_editable); | |
-void gtk_editable_set_position(GtkEditable *editable,gint position); | |
+ gint start_pos, gint end_pos); | |
+void gtk_editable_set_editable(GtkEditable *editable, | |
+ gboolean is_editable); | |
+void gtk_editable_set_position(GtkEditable *editable, gint position); | |
gint gtk_editable_get_position(GtkEditable *editable); | |
guint gtk_text_get_length(GtkText *text); | |
-void gtk_text_set_editable(GtkText *text,gboolean is_editable); | |
-void gtk_text_set_word_wrap(GtkText *text,gboolean word_wrap); | |
+void gtk_text_set_editable(GtkText *text, gboolean is_editable); | |
+void gtk_text_set_word_wrap(GtkText *text, gboolean word_wrap); | |
void gtk_text_freeze(GtkText *text); | |
void gtk_text_thaw(GtkText *text); | |
-void gtk_table_attach(GtkTable *table,GtkWidget *widget, | |
- guint left_attach,guint right_attach, | |
- guint top_attach,guint bottom_attach, | |
- GtkAttachOptions xoptions,GtkAttachOptions yoptions, | |
- guint xpadding,guint ypadding); | |
-void gtk_table_attach_defaults(GtkTable *table,GtkWidget *widget, | |
- guint left_attach,guint right_attach, | |
- guint top_attach,guint bottom_attach); | |
-void gtk_table_set_row_spacing(GtkTable *table,guint row,guint spacing); | |
-void gtk_table_set_col_spacing(GtkTable *table,guint column,guint spacing); | |
-void gtk_table_set_row_spacings(GtkTable *table,guint spacing); | |
-void gtk_table_set_col_spacings(GtkTable *table,guint spacing); | |
-void gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean Expand, | |
- gboolean Fill,gint Padding); | |
+void gtk_table_attach(GtkTable *table, GtkWidget *widget, | |
+ guint left_attach, guint right_attach, | |
+ guint top_attach, guint bottom_attach, | |
+ GtkAttachOptions xoptions, GtkAttachOptions yoptions, | |
+ guint xpadding, guint ypadding); | |
+void gtk_table_attach_defaults(GtkTable *table, GtkWidget *widget, | |
+ guint left_attach, guint right_attach, | |
+ guint top_attach, guint bottom_attach); | |
+void gtk_table_set_row_spacing(GtkTable *table, guint row, guint spacing); | |
+void gtk_table_set_col_spacing(GtkTable *table, guint column, | |
+ guint spacing); | |
+void gtk_table_set_row_spacings(GtkTable *table, guint spacing); | |
+void gtk_table_set_col_spacings(GtkTable *table, guint spacing); | |
+void gtk_box_pack_start(GtkBox *box, GtkWidget *child, gboolean Expand, | |
+ gboolean Fill, gint Padding); | |
void gtk_toggle_button_toggled(GtkToggleButton *toggle_button); | |
gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button); | |
void gtk_toggle_button_set_active(GtkToggleButton *toggle_button, | |
gboolean is_active); | |
void gtk_main_quit(); | |
void gtk_main(); | |
-guint gtk_signal_connect(GtkObject *object,const gchar *name, | |
- GtkSignalFunc func,gpointer func_data); | |
-guint gtk_signal_connect_object(GtkObject *object,const gchar *name, | |
- GtkSignalFunc func,GtkObject *slot_object); | |
-void gtk_signal_emit(GtkObject *object,const gchar *name, ...); | |
+guint gtk_signal_connect(GtkObject *object, const gchar *name, | |
+ GtkSignalFunc func, gpointer func_data); | |
+guint gtk_signal_connect_object(GtkObject *object, const gchar *name, | |
+ GtkSignalFunc func, | |
+ GtkObject *slot_object); | |
+void gtk_signal_emit(GtkObject *object, const gchar *name, ...); | |
void SetCustomWndProc(WNDPROC wndproc); | |
-void win32_init(HINSTANCE hInstance,HINSTANCE hPrevInstance,char *MainIcon); | |
-void gtk_menu_shell_insert(GtkMenuShell *menu_shell,GtkWidget *child, | |
+void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInstance, | |
+ char *MainIcon); | |
+void gtk_menu_shell_insert(GtkMenuShell *menu_shell, GtkWidget *child, | |
gint position); | |
-void gtk_menu_shell_append(GtkMenuShell *menu_shell,GtkWidget *child); | |
-void gtk_menu_shell_prepend(GtkMenuShell *menu_shell,GtkWidget *child); | |
+void gtk_menu_shell_append(GtkMenuShell *menu_shell, GtkWidget *child); | |
+void gtk_menu_shell_prepend(GtkMenuShell *menu_shell, GtkWidget *child); | |
GtkWidget *gtk_menu_bar_new(); | |
-void gtk_menu_bar_insert(GtkMenuBar *menu_bar,GtkWidget *child,gint position); | |
-void gtk_menu_bar_append(GtkMenuBar *menu_bar,GtkWidget *child); | |
-void gtk_menu_bar_prepend(GtkMenuBar *menu_bar,GtkWidget *child); | |
+void gtk_menu_bar_insert(GtkMenuBar *menu_bar, GtkWidget *child, | |
+ gint position); | |
+void gtk_menu_bar_append(GtkMenuBar *menu_bar, GtkWidget *child); | |
+void gtk_menu_bar_prepend(GtkMenuBar *menu_bar, GtkWidget *child); | |
GtkWidget *gtk_menu_new(); | |
-void gtk_menu_insert(GtkMenu *menu,GtkWidget *child,gint position); | |
-void gtk_menu_append(GtkMenu *menu,GtkWidget *child); | |
-void gtk_menu_prepend(GtkMenu *menu,GtkWidget *child); | |
+void gtk_menu_insert(GtkMenu *menu, GtkWidget *child, gint position); | |
+void gtk_menu_append(GtkMenu *menu, GtkWidget *child); | |
+void gtk_menu_prepend(GtkMenu *menu, GtkWidget *child); | |
GtkWidget *gtk_menu_item_new_with_label(const gchar *label); | |
-void gtk_menu_item_set_submenu(GtkMenuItem *menu_item,GtkWidget *submenu); | |
-void gtk_menu_set_active(GtkMenu *menu,guint index); | |
+void gtk_menu_item_set_submenu(GtkMenuItem *menu_item, GtkWidget *submenu); | |
+void gtk_menu_set_active(GtkMenu *menu, guint index); | |
GtkWidget *gtk_notebook_new(); | |
-void gtk_notebook_append_page(GtkNotebook *notebook,GtkWidget *child, | |
+void gtk_notebook_append_page(GtkNotebook *notebook, GtkWidget *child, | |
GtkWidget *tab_label); | |
-void gtk_notebook_insert_page(GtkNotebook *notebook,GtkWidget *child, | |
- GtkWidget *tab_label,gint position); | |
-void gtk_notebook_set_page(GtkNotebook *notebook,gint page_num); | |
-GtkObject *gtk_adjustment_new(gfloat value,gfloat lower,gfloat upper, | |
- gfloat step_increment,gfloat page_increment, | |
+void gtk_notebook_insert_page(GtkNotebook *notebook, GtkWidget *child, | |
+ GtkWidget *tab_label, gint position); | |
+void gtk_notebook_set_page(GtkNotebook *notebook, gint page_num); | |
+GtkObject *gtk_adjustment_new(gfloat value, gfloat lower, gfloat upper, | |
+ gfloat step_increment, gfloat page_increment, | |
gfloat page_size); | |
-GtkWidget *gtk_spin_button_new(GtkAdjustment *adjustment,gfloat climb_rate, | |
- guint digits); | |
+GtkWidget *gtk_spin_button_new(GtkAdjustment *adjustment, | |
+ gfloat climb_rate, guint digits); | |
void gdk_input_remove(gint tag); | |
-gint gdk_input_add(gint source,GdkInputCondition condition, | |
- GdkInputFunction function,gpointer data); | |
+gint gdk_input_add(gint source, GdkInputCondition condition, | |
+ GdkInputFunction function, gpointer data); | |
GtkWidget *gtk_hseparator_new(); | |
GtkWidget *gtk_vseparator_new(); | |
-void gtk_object_set_data(GtkObject *object,const gchar *key,gpointer data); | |
-gpointer gtk_object_get_data(GtkObject *object,const gchar *key); | |
+void gtk_object_set_data(GtkObject *object, const gchar *key, | |
+ gpointer data); | |
+gpointer gtk_object_get_data(GtkObject *object, const gchar *key); | |
GtkAccelGroup *gtk_accel_group_new(); | |
void gtk_accel_group_destroy(GtkAccelGroup *accel_group); | |
void gtk_item_factory_set_translate_func(GtkItemFactory *ifactory, | |
t@@ -673,66 +688,69 @@ void gtk_item_factory_set_translate_func(GtkItemFactory … | |
GtkDestroyNotify notify); | |
void gtk_widget_grab_default(GtkWidget *widget); | |
void gtk_widget_grab_focus(GtkWidget *widget); | |
-void gtk_window_set_modal(GtkWindow *window,gboolean modal); | |
-void gtk_window_add_accel_group(GtkWindow *window,GtkAccelGroup *accel_group); | |
-void gtk_entry_set_text(GtkEntry *entry,const gchar *text); | |
+void gtk_window_set_modal(GtkWindow *window, gboolean modal); | |
+void gtk_window_add_accel_group(GtkWindow *window, | |
+ GtkAccelGroup *accel_group); | |
+void gtk_entry_set_text(GtkEntry *entry, const gchar *text); | |
void gtk_widget_add_accelerator(GtkWidget *widget, | |
const gchar *accel_signal, | |
GtkAccelGroup *accel_group, | |
- guint accel_key,guint accel_mods, | |
+ guint accel_key, guint accel_mods, | |
GtkAccelFlags accel_flags); | |
void gtk_widget_remove_accelerator(GtkWidget *widget, | |
GtkAccelGroup *accel_group, | |
- guint accel_key,guint accel_mods); | |
-extern const GtkType GTK_TYPE_WINDOW,GTK_TYPE_MENU_BAR; | |
+ guint accel_key, guint accel_mods); | |
+extern const GtkType GTK_TYPE_WINDOW, GTK_TYPE_MENU_BAR; | |
GtkWidget *gtk_vpaned_new(); | |
GtkWidget *gtk_hpaned_new(); | |
-void gtk_paned_add1(GtkPaned *paned,GtkWidget *child); | |
-void gtk_paned_add2(GtkPaned *paned,GtkWidget *child); | |
-void gtk_paned_pack1(GtkPaned *paned,GtkWidget *child,gboolean resize, | |
+void gtk_paned_add1(GtkPaned *paned, GtkWidget *child); | |
+void gtk_paned_add2(GtkPaned *paned, GtkWidget *child); | |
+void gtk_paned_pack1(GtkPaned *paned, GtkWidget *child, gboolean resize, | |
gboolean shrink); | |
-void gtk_paned_pack2(GtkPaned *paned,GtkWidget *child,gboolean resize, | |
+void gtk_paned_pack2(GtkPaned *paned, GtkWidget *child, gboolean resize, | |
gboolean shrink); | |
-void gtk_paned_set_position(GtkPaned *paned,gint position); | |
+void gtk_paned_set_position(GtkPaned *paned, gint position); | |
#define gtk_container_border_width gtk_container_set_border_width | |
-#define gtk_hbutton_box_new() gtk_hbox_new(TRUE,5) | |
-#define gtk_vbutton_box_new() gtk_vbox_new(TRUE,5) | |
+#define gtk_hbutton_box_new() gtk_hbox_new(TRUE, 5) | |
+#define gtk_vbutton_box_new() gtk_vbox_new(TRUE, 5) | |
GtkWidget *gtk_option_menu_new(); | |
GtkWidget *gtk_option_menu_get_menu(GtkOptionMenu *option_menu); | |
-void gtk_option_menu_set_menu(GtkOptionMenu *option_menu,GtkWidget *menu); | |
-void gtk_option_menu_set_history(GtkOptionMenu *option_menu,guint index); | |
-void gtk_label_set_text(GtkLabel *label,const gchar *str); | |
-guint gtk_label_parse_uline(GtkLabel *label,const gchar *str); | |
-void gtk_label_get(GtkLabel *label,gchar **str); | |
-void gtk_clist_set_row_data(GtkCList *clist,gint row,gpointer data); | |
-gpointer gtk_clist_get_row_data(GtkCList *clist,gint row); | |
-void gtk_clist_set_auto_sort(GtkCList *clist,gboolean auto_sort); | |
+void gtk_option_menu_set_menu(GtkOptionMenu *option_menu, GtkWidget *menu); | |
+void gtk_option_menu_set_history(GtkOptionMenu *option_menu, guint index); | |
+void gtk_label_set_text(GtkLabel *label, const gchar *str); | |
+guint gtk_label_parse_uline(GtkLabel *label, const gchar *str); | |
+void gtk_label_get(GtkLabel *label, gchar **str); | |
+void gtk_clist_set_row_data(GtkCList *clist, gint row, gpointer data); | |
+gpointer gtk_clist_get_row_data(GtkCList *clist, gint row); | |
+void gtk_clist_set_auto_sort(GtkCList *clist, gboolean auto_sort); | |
void gtk_clist_columns_autosize(GtkCList *clist); | |
-void gtk_text_set_point(GtkText *text,guint index); | |
-void gtk_widget_set_usize(GtkWidget *widget,gint width,gint height); | |
-void gtk_clist_select_row(GtkCList *clist,gint row,gint column); | |
-GtkVisibility gtk_clist_row_is_visible(GtkCList *clist,gint row); | |
-void gtk_clist_moveto(GtkCList *clist,gint row,gint column, | |
- gfloat row_align,gfloat col_align); | |
-void gtk_clist_set_compare_func(GtkCList *clist,GtkCListCompareFunc cmp_func); | |
-void gtk_clist_set_column_auto_resize(GtkCList *clist,gint column, | |
+void gtk_text_set_point(GtkText *text, guint index); | |
+void gtk_widget_set_usize(GtkWidget *widget, gint width, gint height); | |
+void gtk_clist_select_row(GtkCList *clist, gint row, gint column); | |
+GtkVisibility gtk_clist_row_is_visible(GtkCList *clist, gint row); | |
+void gtk_clist_moveto(GtkCList *clist, gint row, gint column, | |
+ gfloat row_align, gfloat col_align); | |
+void gtk_clist_set_compare_func(GtkCList *clist, | |
+ GtkCListCompareFunc cmp_func); | |
+void gtk_clist_set_column_auto_resize(GtkCList *clist, gint column, | |
gboolean auto_resize); | |
gint gtk_spin_button_get_value_as_int(GtkSpinButton *spin_button); | |
-void gtk_spin_button_set_value(GtkSpinButton *spin_button,gfloat value); | |
+void gtk_spin_button_set_value(GtkSpinButton *spin_button, gfloat value); | |
void gtk_spin_button_set_adjustment(GtkSpinButton *spin_button, | |
GtkAdjustment *adjustment); | |
void gtk_spin_button_update(GtkSpinButton *spin_button); | |
-void gtk_misc_set_alignment(GtkMisc *misc,gfloat xalign,gfloat yalign); | |
+void gtk_misc_set_alignment(GtkMisc *misc, gfloat xalign, gfloat yalign); | |
GtkWidget *gtk_progress_bar_new(); | |
void gtk_progress_bar_set_orientation(GtkProgressBar *pbar, | |
GtkProgressBarOrientation orientation); | |
-void gtk_progress_bar_update(GtkProgressBar *pbar,gfloat percentage); | |
-guint gtk_timeout_add(guint32 interval,GtkFunction function,gpointer data); | |
+void gtk_progress_bar_update(GtkProgressBar *pbar, gfloat percentage); | |
+guint gtk_timeout_add(guint32 interval, GtkFunction function, | |
+ gpointer data); | |
void gtk_timeout_remove(guint timeout_handler_id); | |
guint gtk_main_level(void); | |
-#else /* CYGWIN */ | |
+#else /* CYGWIN */ | |
/* Include standard GTK+ headers on Unix systems */ | |
#include <gtk/gtk.h> | |
t@@ -760,17 +778,18 @@ struct _GtkUrl { | |
gchar *target, *bin; | |
}; | |
-#endif /* CYGWIN */ | |
+#endif /* CYGWIN */ | |
/* Global functions */ | |
-gint GtkMessageBox(GtkWidget *parent,const gchar *Text, | |
- const gchar *Title,gint Options); | |
-GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns,gchar *titles[], | |
+gint GtkMessageBox(GtkWidget *parent, const gchar *Text, | |
+ const gchar *Title, gint Options); | |
+GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns, | |
+ gchar *titles[], | |
GtkWidget **pack_widg); | |
-guint SetAccelerator(GtkWidget *labelparent,gchar *Text, | |
- GtkWidget *sendto,gchar *signal, | |
+guint SetAccelerator(GtkWidget *labelparent, gchar *Text, | |
+ GtkWidget *sendto, gchar *signal, | |
GtkAccelGroup *accel_group); | |
-GtkWidget *gtk_scrolled_text_new(GtkAdjustment *hadj,GtkAdjustment *vadj, | |
+GtkWidget *gtk_scrolled_text_new(GtkAdjustment *hadj, GtkAdjustment *vadj, | |
GtkWidget **pack_widg); | |
GtkWidget *gtk_url_new(const gchar *text, const gchar *target, | |
const gchar *bin); | |
diff --git a/src/message.c b/src/message.c | |
t@@ -1,22 +1,24 @@ | |
-/* message.c Message-handling routines for dopewars */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * message.c Message-handling routines for dopewars * | |
+ * 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> | |
t@@ -43,10 +45,11 @@ | |
#include "tstring.h" | |
/* Maximum sizes (in bytes) of read and write buffers - connections should | |
- be dropped if either buffer is filled */ | |
+ * be dropped if either buffer is filled */ | |
#define MAXREADBUF (32768) | |
#define MAXWRITEBUF (65536) | |
+/* *INDENT-OFF* */ | |
/* dopewars is built around a client-server model. Each client handles the | |
user interface, but all the important calculation and processing is | |
handled by the server. All communication is conducted via. TCP by means | |
t@@ -92,215 +95,280 @@ | |
When the network is down, a server is simulated locally. Messages from | |
the client are passed directly to the server message handling routine, | |
and vice versa. */ | |
+/* *INDENT-ON* */ | |
GSList *FirstClient; | |
-void (*ClientMessageHandlerPt) (char *,Player *) = NULL; | |
+void (*ClientMessageHandlerPt)(char *, Player *) = NULL; | |
-void SendClientMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data) { | |
-/* Sends a message from player "From" to player "To" via. the server. */ | |
-/* AI, Code and Data define the message. */ | |
- DoSendClientMessage(From,AI,Code,To,Data,From); | |
+/* | |
+ * Sends a message from player "From" to player "To" via. the server. | |
+ * AI, Code and Data define the message. | |
+ */ | |
+void SendClientMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data) | |
+{ | |
+ DoSendClientMessage(From, AI, Code, To, Data, From); | |
} | |
-void SendNullClientMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data) { | |
-/* Sends a message from player "From" to player "To" via. the server, */ | |
-/* sending a blank name for "From" (this is required with the old message */ | |
-/* format, up to and including the first successful C_NAME message, but */ | |
-/* has no effect with the new format. AI, Code and Data define the */ | |
-/* message. */ | |
- DoSendClientMessage(NULL,AI,Code,To,Data,From); | |
+/* | |
+ * Sends a message from player "From" to player "To" via. the server, | |
+ * sending a blank name for "From" (this is required with the old message | |
+ * format, up to and including the first successful C_NAME message, but has | |
+ * no effect with the new format. AI, Code and Data define the message. | |
+ */ | |
+void SendNullClientMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data) | |
+{ | |
+ DoSendClientMessage(NULL, AI, Code, To, Data, From); | |
} | |
-void DoSendClientMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data,Player *BufOwn) { | |
-/* Send a message from client player "From" with computer code "AI", */ | |
-/* human-readable code "Code" and data "Data". The message is sent to the */ | |
-/* server, identifying itself as for "To". "BufOwn" identifies the player */ | |
-/* which owns the buffers used for the actual wire connection. With the */ | |
-/* new message format, "From" is ignored. From, To, or Data may be NULL. */ | |
- GString *text; | |
- Player *ServerFrom; | |
- g_assert(BufOwn!=NULL); | |
- text=g_string_new(NULL); | |
- if (HaveAbility(BufOwn,A_PLAYERID)) { | |
- if (To) g_string_sprintfa(text,"%d",To->ID); | |
- g_string_sprintfa(text,"^%c%c%s",AI,Code,Data ? Data : ""); | |
- } else { | |
- g_string_sprintf(text,"%s^%s^%c%c%s",From ? GetPlayerName(From) : "", | |
- To ? GetPlayerName(To) : "",AI,Code, | |
- Data ? Data : ""); | |
- } | |
+/* | |
+ * Send a message from client player "From" with computer code "AI", | |
+ * human-readable code "Code" and data "Data". The message is sent to the | |
+ * server, identifying itself as for "To". "BufOwn" identifies the player | |
+ * which owns the buffers used for the actual wire connection. With the | |
+ * new message format, "From" is ignored. From, To, or Data may be NULL. | |
+ */ | |
+void DoSendClientMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data, Player *BufOwn) | |
+{ | |
+ GString *text; | |
+ Player *ServerFrom; | |
+ | |
+ g_assert(BufOwn != NULL); | |
+ text = g_string_new(NULL); | |
+ if (HaveAbility(BufOwn, A_PLAYERID)) { | |
+ if (To) | |
+ g_string_sprintfa(text, "%d", To->ID); | |
+ g_string_sprintfa(text, "^%c%c%s", AI, Code, Data ? Data : ""); | |
+ } else { | |
+ g_string_sprintf(text, "%s^%s^%c%c%s", From ? GetPlayerName(From) : "", | |
+ To ? GetPlayerName(To) : "", AI, Code, | |
+ Data ? Data : ""); | |
+ } | |
#if NETWORKING | |
- if (!Network) { | |
+ if (!Network) { | |
#endif | |
- if (From) ServerFrom=GetPlayerByName(GetPlayerName(From),FirstServer); | |
- else if (FirstServer) ServerFrom=(Player *)(FirstServer->data); | |
- else { | |
- ServerFrom=g_new(Player,1); | |
- FirstServer=AddPlayer(0,ServerFrom,FirstServer); | |
- } | |
- HandleServerMessage(text->str,ServerFrom); | |
+ if (From) | |
+ ServerFrom = GetPlayerByName(GetPlayerName(From), FirstServer); | |
+ else if (FirstServer) | |
+ ServerFrom = (Player *)(FirstServer->data); | |
+ else { | |
+ ServerFrom = g_new(Player, 1); | |
+ FirstServer = AddPlayer(0, ServerFrom, FirstServer); | |
+ } | |
+ HandleServerMessage(text->str, ServerFrom); | |
#if NETWORKING | |
- } else { | |
- QueuePlayerMessageForSend(BufOwn,text->str); | |
- } | |
+ } else { | |
+ QueuePlayerMessageForSend(BufOwn, text->str); | |
+ } | |
#endif /* NETWORKING */ | |
- g_string_free(text,TRUE); | |
+ g_string_free(text, TRUE); | |
} | |
-void SendPrintMessage(Player *From,AICode AI,Player *To,char *Data) { | |
-/* Shorthand for the server sending a "printmessage"; instructs the */ | |
-/* client "To" to display "Data" */ | |
- SendServerMessage(From,AI,C_PRINTMESSAGE,To,Data); | |
+/* | |
+ * Shorthand for the server sending a "printmessage"; instructs the | |
+ * client "To" to display "Data". | |
+ */ | |
+void SendPrintMessage(Player *From, AICode AI, Player *To, char *Data) | |
+{ | |
+ SendServerMessage(From, AI, C_PRINTMESSAGE, To, Data); | |
} | |
-void SendQuestion(Player *From,AICode AI,Player *To,char *Data) { | |
-/* Shorthand for the server sending a "question"; instructs the client */ | |
-/* "To" to display the second word of Data and accept any letter within */ | |
-/* the first word of Data as suitable reply */ | |
- SendServerMessage(From,AI,C_QUESTION,To,Data); | |
+/* | |
+ * Shorthand for the server sending a "question"; instructs the client | |
+ * "To" to display the second word of Data and accept any letter within | |
+ * the first word of Data as suitable reply. | |
+ */ | |
+void SendQuestion(Player *From, AICode AI, Player *To, char *Data) | |
+{ | |
+ SendServerMessage(From, AI, C_QUESTION, To, Data); | |
} | |
-void SendServerMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data) { | |
-/* Sends a message from the server to client player "To" with computer */ | |
-/* code "AI", human-readable code "Code" and data "Data", claiming */ | |
-/* to be from player "From" */ | |
- GString *text; | |
- if (IsCop(To)) return; | |
- text=g_string_new(NULL); | |
- if (HaveAbility(To,A_PLAYERID)) { | |
- if (From) g_string_sprintfa(text,"%d",From->ID); | |
- g_string_sprintfa(text,"^%c%c%s",AI,Code,Data ? Data : ""); | |
- } else { | |
- g_string_sprintf(text,"%s^%s^%c%c%s",From ? GetPlayerName(From) : "", | |
- To ? GetPlayerName(To) : "",AI,Code, | |
- Data ? Data : ""); | |
- } | |
+/* | |
+ * Sends a message from the server to client player "To" with computer | |
+ * code "AI", human-readable code "Code" and data "Data", claiming | |
+ * to be from player "From". | |
+ */ | |
+void SendServerMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data) | |
+{ | |
+ GString *text; | |
+ | |
+ if (IsCop(To)) | |
+ return; | |
+ text = g_string_new(NULL); | |
+ if (HaveAbility(To, A_PLAYERID)) { | |
+ if (From) | |
+ g_string_sprintfa(text, "%d", From->ID); | |
+ g_string_sprintfa(text, "^%c%c%s", AI, Code, Data ? Data : ""); | |
+ } else { | |
+ g_string_sprintf(text, "%s^%s^%c%c%s", From ? GetPlayerName(From) : "", | |
+ To ? GetPlayerName(To) : "", AI, Code, | |
+ Data ? Data : ""); | |
+ } | |
#if NETWORKING | |
- if (!Network) { | |
+ if (!Network) { | |
#endif | |
- if (ClientMessageHandlerPt) { | |
- (*ClientMessageHandlerPt)(text->str,(Player *)(FirstClient->data)); | |
- } | |
+ if (ClientMessageHandlerPt) | |
+ (*ClientMessageHandlerPt)(text->str, (Player *)(FirstClient->data)); | |
#if NETWORKING | |
- } else { | |
- QueuePlayerMessageForSend(To,text->str); | |
- } | |
+ } else { | |
+ QueuePlayerMessageForSend(To, text->str); | |
+ } | |
#endif | |
- g_string_free(text,TRUE); | |
+ g_string_free(text, TRUE); | |
} | |
-void InitAbilities(Player *Play) { | |
-/* Sets up the "abilities" of player "Play". Abilities are used to extend */ | |
-/* the protocol; if both the client and server share an ability, then the */ | |
-/* protocol extension can be used. */ | |
- int i; | |
-/* Clear all abilities */ | |
- for (i=0;i<A_NUM;i++) { | |
- Play->Abil.Local[i]= FALSE; | |
- Play->Abil.Remote[i]=FALSE; | |
- Play->Abil.Shared[i]=FALSE; | |
- } | |
-/* Set local abilities; abilities that are client-dependent | |
- (e.g. A_NEWFIGHT) can be overridden by individual clients if required, | |
- by calling SetAbility, prior to calling SendAbilities */ | |
- | |
- Play->Abil.Local[A_PLAYERID]=TRUE; | |
- Play->Abil.Local[A_NEWFIGHT]=TRUE; | |
- Play->Abil.Local[A_DRUGVALUE]=(DrugValue ? TRUE : FALSE); | |
- Play->Abil.Local[A_TSTRING]=TRUE; | |
- | |
- if (!Network) for (i=0;i<A_NUM;i++) { | |
- Play->Abil.Remote[i]=Play->Abil.Shared[i]=Play->Abil.Local[i]; | |
- } | |
+/* | |
+ * Sets up the "abilities" of player "Play". Abilities are used to extend | |
+ * the protocol; if both the client and server share an ability, then the | |
+ * protocol extension can be used. | |
+ */ | |
+void InitAbilities(Player *Play) | |
+{ | |
+ int i; | |
+ | |
+ /* Clear all abilities */ | |
+ for (i = 0; i < A_NUM; i++) { | |
+ Play->Abil.Local[i] = FALSE; | |
+ Play->Abil.Remote[i] = FALSE; | |
+ Play->Abil.Shared[i] = FALSE; | |
+ } | |
+ | |
+ /* Set local abilities; abilities that are client-dependent (e.g. | |
+ * A_NEWFIGHT) can be overridden by individual clients if required, by | |
+ * calling SetAbility, prior to calling SendAbilities */ | |
+ Play->Abil.Local[A_PLAYERID] = TRUE; | |
+ Play->Abil.Local[A_NEWFIGHT] = TRUE; | |
+ Play->Abil.Local[A_DRUGVALUE] = (DrugValue ? TRUE : FALSE); | |
+ Play->Abil.Local[A_TSTRING] = TRUE; | |
+ | |
+ if (!Network) | |
+ for (i = 0; i < A_NUM; i++) { | |
+ Play->Abil.Remote[i] = Play->Abil.Shared[i] = Play->Abil.Local[i]; | |
+ } | |
} | |
-void SendAbilities(Player *Play) { | |
-/* Sends abilities of player "Play" to the other end of the client-server */ | |
-/* connection. */ | |
- int i; | |
- gchar Data[A_NUM+1]; | |
- if (!Network) return; | |
- for (i=0;i<A_NUM;i++) Data[i]= (Play->Abil.Local[i] ? '1' : '0'); | |
- Data[A_NUM]='\0'; | |
- if (Server) SendServerMessage(NULL,C_NONE,C_ABILITIES,Play,Data); | |
- else SendClientMessage(Play,C_NONE,C_ABILITIES,NULL,Data); | |
+/* | |
+ * Sends abilities of player "Play" to the other end of the client-server | |
+ * connection. | |
+ */ | |
+void SendAbilities(Player *Play) | |
+{ | |
+ int i; | |
+ gchar Data[A_NUM + 1]; | |
+ | |
+ if (!Network) | |
+ return; | |
+ for (i = 0; i < A_NUM; i++) | |
+ Data[i] = (Play->Abil.Local[i] ? '1' : '0'); | |
+ Data[A_NUM] = '\0'; | |
+ if (Server) | |
+ SendServerMessage(NULL, C_NONE, C_ABILITIES, Play, Data); | |
+ else | |
+ SendClientMessage(Play, C_NONE, C_ABILITIES, NULL, Data); | |
} | |
-void ReceiveAbilities(Player *Play,gchar *Data) { | |
-/* Fills in the "remote" abilities of player "Play" using the message data */ | |
-/* in "Data". These are the abilities of the server/client at the other */ | |
-/* end of the connection. */ | |
- int i,Length; | |
- InitAbilities(Play); | |
- if (!Network) return; | |
- Length=MIN(strlen(Data),A_NUM); | |
- for (i=0;i<Length;i++) { | |
- Play->Abil.Remote[i]= (Data[i]=='1' ? TRUE : FALSE); | |
- } | |
+/* | |
+ * Fills in the "remote" abilities of player "Play" using the message data | |
+ * in "Data". These are the abilities of the server/client at the other | |
+ * end of the connection. | |
+ */ | |
+void ReceiveAbilities(Player *Play, gchar *Data) | |
+{ | |
+ int i, Length; | |
+ | |
+ InitAbilities(Play); | |
+ if (!Network) | |
+ return; | |
+ Length = MIN(strlen(Data), A_NUM); | |
+ for (i = 0; i < Length; i++) { | |
+ Play->Abil.Remote[i] = (Data[i] == '1' ? TRUE : FALSE); | |
+ } | |
} | |
-void CombineAbilities(Player *Play) { | |
-/* Combines the local and remote abilities of player "Play". The resulting */ | |
-/* shared abilities are used to determine when protocol extensions can be */ | |
-/* used. */ | |
- int i; | |
- for (i=0;i<A_NUM;i++) { | |
- Play->Abil.Shared[i]= (Play->Abil.Remote[i] && Play->Abil.Local[i]); | |
- } | |
+/* | |
+ * Combines the local and remote abilities of player "Play". The resulting | |
+ * shared abilities are used to determine when protocol extensions can be | |
+ * used. | |
+ */ | |
+void CombineAbilities(Player *Play) | |
+{ | |
+ int i; | |
+ | |
+ for (i = 0; i < A_NUM; i++) { | |
+ Play->Abil.Shared[i] = (Play->Abil.Remote[i] && Play->Abil.Local[i]); | |
+ } | |
} | |
-void SetAbility(Player *Play,gint Type,gboolean Set) { | |
-/* Sets ability "Type" of player "Play", and also sets shared abilities if */ | |
-/* networking is not active (the local server should support all abilities */ | |
-/* that the client uses). Call this function prior to calling SendAbilities */ | |
-/* so that the ability is recognised properly when networking _is_ active */ | |
- if (Type<0 || Type>=A_NUM) return; | |
- Play->Abil.Local[Type]=Set; | |
- if (!Network) { | |
- Play->Abil.Remote[Type]=Play->Abil.Shared[Type]=Play->Abil.Local[Type]; | |
- } | |
+/* | |
+ * Sets ability "Type" of player "Play", and also sets shared abilities if | |
+ * networking is not active (the local server should support all abilities | |
+ * that the client uses). Call this function prior to calling SendAbilities | |
+ * so that the ability is recognised properly when networking _is_ active | |
+ */ | |
+void SetAbility(Player *Play, gint Type, gboolean Set) | |
+{ | |
+ if (Type < 0 || Type >= A_NUM) | |
+ return; | |
+ Play->Abil.Local[Type] = Set; | |
+ if (!Network) { | |
+ Play->Abil.Remote[Type] = Play->Abil.Shared[Type] = | |
+ Play->Abil.Local[Type]; | |
+ } | |
} | |
-gboolean HaveAbility(Player *Play,gint Type) { | |
-/* Returns TRUE if ability "Type" is one of player "Play"'s shared abilities */ | |
- if (Type<0 || Type>=A_NUM) return FALSE; | |
- else return (Play->Abil.Shared[Type]); | |
+/* | |
+ * Returns TRUE if ability "Type" is one of player "Play"'s shared abilities | |
+ */ | |
+gboolean HaveAbility(Player *Play, gint Type) | |
+{ | |
+ if (Type < 0 || Type >= A_NUM) | |
+ return FALSE; | |
+ else | |
+ return (Play->Abil.Shared[Type]); | |
} | |
#if NETWORKING | |
-gboolean PlayerHandleNetwork(Player *Play,gboolean ReadReady, | |
- gboolean WriteReady,gboolean *DoneOK) { | |
-/* Reads and writes player data from/to the network if it is ready. */ | |
-/* If any data were read, TRUE is returned. "DoneOK" is set TRUE */ | |
-/* unless a fatal error (i.e. the connection was broken) occurred. */ | |
- gboolean DataWaiting=FALSE; | |
- | |
- *DoneOK=TRUE; | |
- if (!Play) return DataWaiting; | |
- DataWaiting=NetBufHandleNetwork(&Play->NetBuf,ReadReady,WriteReady,DoneOK); | |
- | |
- return DataWaiting; | |
+/* | |
+ * Reads and writes player data from/to the network if it is ready. | |
+ * If any data were read, TRUE is returned. "DoneOK" is set TRUE | |
+ * unless a fatal error (i.e. the connection was broken) occurred. | |
+ */ | |
+gboolean PlayerHandleNetwork(Player *Play, gboolean ReadReady, | |
+ gboolean WriteReady, gboolean *DoneOK) | |
+{ | |
+ gboolean DataWaiting = FALSE; | |
+ | |
+ *DoneOK = TRUE; | |
+ if (!Play) | |
+ return DataWaiting; | |
+ DataWaiting = | |
+ NetBufHandleNetwork(&Play->NetBuf, ReadReady, WriteReady, DoneOK); | |
+ | |
+ return DataWaiting; | |
} | |
-gchar *GetWaitingPlayerMessage(Player *Play) { | |
- return GetWaitingMessage(&Play->NetBuf); | |
+gchar *GetWaitingPlayerMessage(Player *Play) | |
+{ | |
+ return GetWaitingMessage(&Play->NetBuf); | |
} | |
-gboolean ReadPlayerDataFromWire(Player *Play) { | |
+gboolean ReadPlayerDataFromWire(Player *Play) | |
+{ | |
return ReadDataFromWire(&Play->NetBuf); | |
} | |
-void QueuePlayerMessageForSend(Player *Play,gchar *data) { | |
- QueueMessageForSend(&Play->NetBuf,data); | |
+void QueuePlayerMessageForSend(Player *Play, gchar *data) | |
+{ | |
+ QueueMessageForSend(&Play->NetBuf, data); | |
} | |
-gboolean WritePlayerDataToWire(Player *Play) { | |
- return WriteDataToWire(&Play->NetBuf); | |
+gboolean WritePlayerDataToWire(Player *Play) | |
+{ | |
+ return WriteDataToWire(&Play->NetBuf); | |
} | |
typedef enum { | |
t@@ -308,845 +376,1012 @@ typedef enum { | |
MEC_BADREPLY | |
} MetaErrorCode; | |
-static void MetaAppendError(GString *str,LastError *error) { | |
+static void MetaAppendError(GString *str, LastError *error) | |
+{ | |
switch (error->code) { | |
- case MEC_INTERNAL: | |
- g_string_sprintfa(str,_("Internal metaserver error \"%s\""), | |
- (gchar *)error->data); | |
- break; | |
- case MEC_BADREPLY: | |
- g_string_sprintfa(str,_("Bad metaserver reply \"%s\""), | |
- (gchar *)error->data); | |
- break; | |
- default: | |
- g_string_sprintfa(str,_("Unknown metaserver error code %d"),error->code); | |
- break; | |
+ case MEC_INTERNAL: | |
+ g_string_sprintfa(str, _("Internal metaserver error \"%s\""), | |
+ (gchar *)error->data); | |
+ break; | |
+ case MEC_BADREPLY: | |
+ g_string_sprintfa(str, _("Bad metaserver reply \"%s\""), | |
+ (gchar *)error->data); | |
+ break; | |
+ default: | |
+ g_string_sprintfa(str, _("Unknown metaserver error code %d"), | |
+ error->code); | |
+ break; | |
} | |
} | |
static ErrorType ETMeta = { MetaAppendError, NULL }; | |
-gboolean OpenMetaHttpConnection(HttpConnection **conn) { | |
- gchar *query; | |
- gboolean retval; | |
- | |
- query = g_strdup_printf("%s?output=text&getlist=%d", | |
- MetaServer.Path,METAVERSION); | |
- retval = OpenHttpConnection(conn,MetaServer.Name,MetaServer.Port, | |
- MetaServer.ProxyName,MetaServer.ProxyPort, | |
- UseSocks && MetaServer.UseSocks ? &Socks : NULL, | |
- "GET",query,NULL,NULL); | |
- g_free(query); | |
- return retval; | |
+gboolean OpenMetaHttpConnection(HttpConnection **conn) | |
+{ | |
+ gchar *query; | |
+ gboolean retval; | |
+ | |
+ query = g_strdup_printf("%s?output=text&getlist=%d", | |
+ MetaServer.Path, METAVERSION); | |
+ retval = OpenHttpConnection(conn, MetaServer.Name, MetaServer.Port, | |
+ MetaServer.ProxyName, MetaServer.ProxyPort, | |
+ UseSocks | |
+ && MetaServer.UseSocks ? &Socks : NULL, | |
+ "GET", query, NULL, NULL); | |
+ g_free(query); | |
+ return retval; | |
} | |
-gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt, | |
- gboolean *doneOK) { | |
- gchar *msg; | |
- ServerData *NewServer; | |
- g_assert(conn && listpt && doneOK); | |
- | |
-/* If we're done reading the headers, only read if the data for a whole | |
- server is available (8 lines) N.B. "Status" is from the _last_ read */ | |
- if (conn->Status==HS_READBODY && conn->StatusCode==200) { | |
- if (CountWaitingMessages(&conn->NetBuf)<8) return FALSE; | |
- | |
- NewServer=g_new0(ServerData,1); | |
- NewServer->Name=ReadHttpResponse(conn,doneOK); | |
- msg=ReadHttpResponse(conn,doneOK); | |
- NewServer->Port=atoi(msg); g_free(msg); | |
- NewServer->Version=ReadHttpResponse(conn,doneOK); | |
- msg=ReadHttpResponse(conn,doneOK); | |
- if (msg[0]) NewServer->CurPlayers=atoi(msg); | |
- else NewServer->CurPlayers=-1; | |
- g_free(msg); | |
- msg=ReadHttpResponse(conn,doneOK); | |
- NewServer->MaxPlayers=atoi(msg); g_free(msg); | |
- NewServer->Update=ReadHttpResponse(conn,doneOK); | |
- NewServer->Comment=ReadHttpResponse(conn,doneOK); | |
- NewServer->UpSince=ReadHttpResponse(conn,doneOK); | |
- *listpt=g_slist_append(*listpt,NewServer); | |
- } else if (conn->Status==HS_READSEPARATOR && conn->StatusCode==200) { | |
- /* This should be the first line of the body, the "MetaServer:" line */ | |
- msg=ReadHttpResponse(conn,doneOK); | |
- if (!msg) return FALSE; | |
- if (strlen(msg)>=14 && strncmp(msg,"FATAL ERROR:",12)==0) { | |
- SetError(&conn->NetBuf.error,&ETMeta,MEC_INTERNAL,g_strdup(&msg[13])); | |
- *doneOK=FALSE; | |
- return FALSE; | |
- } else if (strncmp(msg,"MetaServer:",11)!=0) { | |
- SetError(&conn->NetBuf.error,&ETMeta,MEC_BADREPLY,g_strdup(msg)); | |
- g_free(msg); | |
- *doneOK=FALSE; | |
- return FALSE; | |
- } | |
+gboolean HandleWaitingMetaServerData(HttpConnection *conn, | |
+ GSList **listpt, gboolean *doneOK) | |
+{ | |
+ gchar *msg; | |
+ ServerData *NewServer; | |
+ | |
+ g_assert(conn && listpt && doneOK); | |
+ | |
+ /* If we're done reading the headers, only read if the data for a whole | |
+ * server is available (8 lines) N.B. "Status" is from the _last_ read */ | |
+ if (conn->Status == HS_READBODY && conn->StatusCode == 200) { | |
+ if (CountWaitingMessages(&conn->NetBuf) < 8) | |
+ return FALSE; | |
+ | |
+ NewServer = g_new0(ServerData, 1); | |
+ NewServer->Name = ReadHttpResponse(conn, doneOK); | |
+ msg = ReadHttpResponse(conn, doneOK); | |
+ NewServer->Port = atoi(msg); | |
+ g_free(msg); | |
+ NewServer->Version = ReadHttpResponse(conn, doneOK); | |
+ msg = ReadHttpResponse(conn, doneOK); | |
+ if (msg[0]) | |
+ NewServer->CurPlayers = atoi(msg); | |
+ else | |
+ NewServer->CurPlayers = -1; | |
+ g_free(msg); | |
+ msg = ReadHttpResponse(conn, doneOK); | |
+ NewServer->MaxPlayers = atoi(msg); | |
+ g_free(msg); | |
+ NewServer->Update = ReadHttpResponse(conn, doneOK); | |
+ NewServer->Comment = ReadHttpResponse(conn, doneOK); | |
+ NewServer->UpSince = ReadHttpResponse(conn, doneOK); | |
+ *listpt = g_slist_append(*listpt, NewServer); | |
+ } else if (conn->Status == HS_READSEPARATOR && conn->StatusCode == 200) { | |
+ /* This should be the first line of the body, the "MetaServer:" line */ | |
+ msg = ReadHttpResponse(conn, doneOK); | |
+ if (!msg) | |
+ return FALSE; | |
+ if (strlen(msg) >= 14 && strncmp(msg, "FATAL ERROR:", 12) == 0) { | |
+ SetError(&conn->NetBuf.error, &ETMeta, MEC_INTERNAL, | |
+ g_strdup(&msg[13])); | |
+ *doneOK = FALSE; | |
+ return FALSE; | |
+ } else if (strncmp(msg, "MetaServer:", 11) != 0) { | |
+ SetError(&conn->NetBuf.error, &ETMeta, MEC_BADREPLY, g_strdup(msg)); | |
g_free(msg); | |
- } else { | |
- msg=ReadHttpResponse(conn,doneOK); | |
- if (!msg) return FALSE; | |
- g_free(msg); | |
- } | |
- return TRUE; | |
+ *doneOK = FALSE; | |
+ return FALSE; | |
+ } | |
+ g_free(msg); | |
+ } else { | |
+ msg = ReadHttpResponse(conn, doneOK); | |
+ if (!msg) | |
+ return FALSE; | |
+ g_free(msg); | |
+ } | |
+ return TRUE; | |
} | |
-void ClearServerList(GSList **listpt) { | |
- ServerData *ThisServer; | |
- while (*listpt) { | |
- ThisServer=(ServerData *)((*listpt)->data); | |
- g_free(ThisServer->Name); g_free(ThisServer->Comment); | |
- g_free(ThisServer->Version); g_free(ThisServer->Update); | |
- g_free(ThisServer->UpSince); g_free(ThisServer); | |
- *listpt=g_slist_remove(*listpt,ThisServer); | |
- } | |
+void ClearServerList(GSList **listpt) | |
+{ | |
+ ServerData *ThisServer; | |
+ | |
+ while (*listpt) { | |
+ ThisServer = (ServerData *)((*listpt)->data); | |
+ g_free(ThisServer->Name); | |
+ g_free(ThisServer->Comment); | |
+ g_free(ThisServer->Version); | |
+ g_free(ThisServer->Update); | |
+ g_free(ThisServer->UpSince); | |
+ g_free(ThisServer); | |
+ *listpt = g_slist_remove(*listpt, ThisServer); | |
+ } | |
} | |
#endif /* NETWORKING */ | |
-void chomp(char *str) { | |
-/* Removes a terminating newline from "str", if one is present. */ | |
- int len=strlen(str); | |
- if (str[len-1]=='\n') str[len-1]=0; | |
+/* | |
+ * Removes a terminating newline from "str", if one is present. | |
+ */ | |
+void chomp(char *str) | |
+{ | |
+ int len = strlen(str); | |
+ | |
+ if (str[len - 1] == '\n') | |
+ str[len - 1] = 0; | |
} | |
-void AddURLEnc(GString *str,gchar *unenc) { | |
-/* Adds the plain text string "unenc" to the end of the GString "str", */ | |
-/* replacing "special" characters in the same way as the */ | |
-/* application/x-www-form-urlencoded media type, suitable for sending */ | |
-/* to CGI scripts etc. */ | |
- guint i; | |
- if (!unenc || !str) return; | |
- for (i=0;i<strlen(unenc);i++) { | |
- if ((unenc[i]>='a' && unenc[i]<='z') || | |
- (unenc[i]>='A' && unenc[i]<='Z') || | |
- (unenc[i]>='0' && unenc[i]<='9') || | |
- unenc[i]=='-' || unenc[i]=='_' || unenc[i]=='.') { | |
- g_string_append_c(str,unenc[i]); | |
- } else if (unenc[i]==' ') { | |
- g_string_append_c(str,'+'); | |
- } else { | |
- g_string_sprintfa(str,"%%%02X",unenc[i]); | |
- } | |
- } | |
+/* | |
+ * Adds the plain text string "unenc" to the end of the GString "str", | |
+ * replacing "special" characters in the same way as the | |
+ * application/x-www-form-urlencoded media type, suitable for sending | |
+ * to CGI scripts etc. | |
+ */ | |
+void AddURLEnc(GString *str, gchar *unenc) | |
+{ | |
+ guint i; | |
+ | |
+ if (!unenc || !str) | |
+ return; | |
+ for (i = 0; i < strlen(unenc); i++) { | |
+ if ((unenc[i] >= 'a' && unenc[i] <= 'z') || | |
+ (unenc[i] >= 'A' && unenc[i] <= 'Z') || | |
+ (unenc[i] >= '0' && unenc[i] <= '9') || | |
+ unenc[i] == '-' || unenc[i] == '_' || unenc[i] == '.') { | |
+ g_string_append_c(str, unenc[i]); | |
+ } else if (unenc[i] == ' ') { | |
+ g_string_append_c(str, '+'); | |
+ } else { | |
+ g_string_sprintfa(str, "%%%02X", unenc[i]); | |
+ } | |
+ } | |
} | |
-void BroadcastToClients(AICode AI,MsgCode Code,char *Data, | |
- Player *From,Player *Except) { | |
-/* Sends the message made up of AI,Code and Data to all players except */ | |
-/* "Except" (if non-NULL). It will be sent by the server, and on behalf of */ | |
-/* player "From" */ | |
+/* | |
+ * Sends the message made up of AI,Code and Data to all players except | |
+ * "Except" (if non-NULL). It will be sent by the server, and on behalf of | |
+ * player "From". | |
+ */ | |
+void BroadcastToClients(AICode AI, MsgCode Code, char *Data, | |
+ Player *From, Player *Except) | |
+{ | |
Player *tmp; | |
GSList *list; | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- if (IsConnectedPlayer(tmp) && tmp!=Except) { | |
- SendServerMessage(From,AI,Code,tmp,Data); | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ if (IsConnectedPlayer(tmp) && tmp != Except) { | |
+ SendServerMessage(From, AI, Code, tmp, Data); | |
} | |
} | |
} | |
-void SendInventory(Player *From,AICode AI,MsgCode Code, | |
- Player *To,Inventory *Guns,Inventory *Drugs) { | |
-/* Encodes an Inventory structure into a string, and sends it as the data */ | |
-/* with a server message constructed from the other arguments. */ | |
- int i; | |
- GString *text; | |
- text=g_string_new(NULL); | |
- for (i=0;i<NumGun;i++) { | |
- g_string_sprintfa(text,"%d:",Guns ? Guns[i].Carried : 0); | |
- } | |
- for (i=0;i<NumDrug;i++) { | |
- g_string_sprintfa(text,"%d:",Drugs ? Drugs[i].Carried : 0); | |
- } | |
- SendServerMessage(From,AI,Code,To,text->str); | |
- g_string_free(text,TRUE); | |
+/* | |
+ * Encodes an Inventory structure into a string, and sends it as the data | |
+ * with a server message constructed from the other arguments. | |
+ */ | |
+void SendInventory(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, Inventory *Guns, Inventory *Drugs) | |
+{ | |
+ int i; | |
+ GString *text; | |
+ | |
+ text = g_string_new(NULL); | |
+ for (i = 0; i < NumGun; i++) { | |
+ g_string_sprintfa(text, "%d:", Guns ? Guns[i].Carried : 0); | |
+ } | |
+ for (i = 0; i < NumDrug; i++) { | |
+ g_string_sprintfa(text, "%d:", Drugs ? Drugs[i].Carried : 0); | |
+ } | |
+ SendServerMessage(From, AI, Code, To, text->str); | |
+ g_string_free(text, TRUE); | |
} | |
-void ReceiveInventory(char *Data,Inventory *Guns,Inventory *Drugs) { | |
-/* Decodes a string representation (in "Data") to its original Inventory */ | |
-/* contents, and stores it in "Guns" and "Drugs" if non-NULL */ | |
- int i,val; | |
- char *pt; | |
- pt=Data; | |
- for (i=0;i<NumGun;i++) { | |
- val=GetNextInt(&pt,0); | |
- if (Guns) Guns[i].Carried=val; | |
- } | |
- for (i=0;i<NumDrug;i++) { | |
- val=GetNextInt(&pt,0); | |
- if (Drugs) Drugs[i].Carried=val; | |
- } | |
+/* | |
+ * Decodes a string representation (in "Data") to its original Inventory | |
+ * contents, and stores it in "Guns" and "Drugs" if non-NULL. | |
+ */ | |
+void ReceiveInventory(char *Data, Inventory *Guns, Inventory *Drugs) | |
+{ | |
+ int i, val; | |
+ char *pt; | |
+ | |
+ pt = Data; | |
+ for (i = 0; i < NumGun; i++) { | |
+ val = GetNextInt(&pt, 0); | |
+ if (Guns) | |
+ Guns[i].Carried = val; | |
+ } | |
+ for (i = 0; i < NumDrug; i++) { | |
+ val = GetNextInt(&pt, 0); | |
+ if (Drugs) | |
+ Drugs[i].Carried = val; | |
+ } | |
} | |
-void SendPlayerData(Player *To) { | |
-/* Sends all pertinent data about player "To" from the server to player "To" */ | |
- SendSpyReport(To,To); | |
+/* | |
+ * Sends all pertinent data about player "To" from the server | |
+ * to player "To". | |
+ */ | |
+void SendPlayerData(Player *To) | |
+{ | |
+ SendSpyReport(To, To); | |
} | |
-void SendSpyReport(Player *To,Player *SpiedOn) { | |
-/* Sends pertinent data about player "SpiedOn" from the server to player "To" … | |
- gchar *cashstr,*debtstr,*bankstr; | |
- GString *text; | |
- int i; | |
- text=g_string_new(NULL); | |
- g_string_sprintf(text,"%s^%s^%s^%d^%d^%d^%d^%d^", | |
- (cashstr=pricetostr(SpiedOn->Cash)), | |
- (debtstr=pricetostr(SpiedOn->Debt)), | |
- (bankstr=pricetostr(SpiedOn->Bank)), | |
- SpiedOn->Health,SpiedOn->CoatSize, | |
- SpiedOn->IsAt,SpiedOn->Turn,SpiedOn->Flags); | |
- g_free(cashstr); g_free(debtstr); g_free(bankstr); | |
- for (i=0;i<NumGun;i++) { | |
- g_string_sprintfa(text,"%d^",SpiedOn->Guns[i].Carried); | |
- } | |
- for (i=0;i<NumDrug;i++) { | |
- g_string_sprintfa(text,"%d^",SpiedOn->Drugs[i].Carried); | |
- } | |
- if (HaveAbility(To,A_DRUGVALUE)) for (i=0;i<NumDrug;i++) { | |
- g_string_sprintfa(text,"%s^", | |
- (cashstr=pricetostr(SpiedOn->Drugs[i].TotalValue))); | |
+/* | |
+ * Sends pertinent data about player "SpiedOn" from the server | |
+ * to player "To". | |
+ */ | |
+void SendSpyReport(Player *To, Player *SpiedOn) | |
+{ | |
+ gchar *cashstr, *debtstr, *bankstr; | |
+ GString *text; | |
+ int i; | |
+ | |
+ text = g_string_new(NULL); | |
+ g_string_sprintf(text, "%s^%s^%s^%d^%d^%d^%d^%d^", | |
+ (cashstr = pricetostr(SpiedOn->Cash)), | |
+ (debtstr = pricetostr(SpiedOn->Debt)), | |
+ (bankstr = pricetostr(SpiedOn->Bank)), | |
+ SpiedOn->Health, SpiedOn->CoatSize, | |
+ SpiedOn->IsAt, SpiedOn->Turn, SpiedOn->Flags); | |
+ g_free(cashstr); | |
+ g_free(debtstr); | |
+ g_free(bankstr); | |
+ for (i = 0; i < NumGun; i++) { | |
+ g_string_sprintfa(text, "%d^", SpiedOn->Guns[i].Carried); | |
+ } | |
+ for (i = 0; i < NumDrug; i++) { | |
+ g_string_sprintfa(text, "%d^", SpiedOn->Drugs[i].Carried); | |
+ } | |
+ if (HaveAbility(To, A_DRUGVALUE)) | |
+ for (i = 0; i < NumDrug; i++) { | |
+ g_string_sprintfa(text, "%s^", | |
+ (cashstr = | |
+ pricetostr(SpiedOn->Drugs[i].TotalValue))); | |
g_free(cashstr); | |
- } | |
- g_string_sprintfa(text,"%d",SpiedOn->Bitches.Carried); | |
- if (To!=SpiedOn) SendServerMessage(SpiedOn,C_NONE,C_UPDATE,To,text->str); | |
- else SendServerMessage(NULL,C_NONE,C_UPDATE,To,text->str); | |
- g_string_free(text,TRUE); | |
+ } | |
+ g_string_sprintfa(text, "%d", SpiedOn->Bitches.Carried); | |
+ if (To != SpiedOn) | |
+ SendServerMessage(SpiedOn, C_NONE, C_UPDATE, To, text->str); | |
+ else | |
+ SendServerMessage(NULL, C_NONE, C_UPDATE, To, text->str); | |
+ g_string_free(text, TRUE); | |
} | |
#define NUMNAMES 12 | |
-void SendInitialData(Player *To) { | |
- gchar *LocalNames[NUMNAMES] = { Names.Bitch,Names.Bitches,Names.Gun, | |
- Names.Guns,Names.Drug,Names.Drugs, | |
- Names.Month,Names.Year,Names.LoanSharkName, | |
- Names.BankName,Names.GunShopName, | |
- Names.RoughPubName }; | |
+void SendInitialData(Player *To) | |
+{ | |
+ gchar *LocalNames[NUMNAMES] = { Names.Bitch, Names.Bitches, Names.Gun, | |
+ Names.Guns, Names.Drug, Names.Drugs, | |
+ Names.Month, Names.Year, Names.LoanSharkName, | |
+ Names.BankName, Names.GunShopName, | |
+ Names.RoughPubName | |
+ }; | |
gint i; | |
GString *text; | |
- if (!Network) return; | |
- if (!HaveAbility(To,A_TSTRING)) for (i=0;i<NUMNAMES;i++) { | |
- LocalNames[i] = GetDefaultTString(LocalNames[i]); | |
- } | |
- text=g_string_new(""); | |
- g_string_sprintf(text,"%s^%d^%d^%d^",VERSION,NumLocation,NumGun,NumDrug); | |
- for (i=0;i<8;i++) { | |
- g_string_append(text,LocalNames[i]); | |
- g_string_append_c(text,'^'); | |
+ if (!Network) | |
+ return; | |
+ if (!HaveAbility(To, A_TSTRING)) | |
+ for (i = 0; i < NUMNAMES; i++) { | |
+ LocalNames[i] = GetDefaultTString(LocalNames[i]); | |
+ } | |
+ text = g_string_new(""); | |
+ g_string_sprintf(text, "%s^%d^%d^%d^", VERSION, NumLocation, NumGun, | |
+ NumDrug); | |
+ for (i = 0; i < 8; i++) { | |
+ g_string_append(text, LocalNames[i]); | |
+ g_string_append_c(text, '^'); | |
} | |
- if (HaveAbility(To,A_PLAYERID)) g_string_sprintfa(text,"%d^",To->ID); | |
+ if (HaveAbility(To, A_PLAYERID)) | |
+ g_string_sprintfa(text, "%d^", To->ID); | |
-/* Player ID is expected after the first 8 names, so send the rest now */ | |
- for (i=8;i<NUMNAMES;i++) { | |
- g_string_append(text,LocalNames[i]); | |
- g_string_append_c(text,'^'); | |
+ /* Player ID is expected after the first 8 names, so send the rest now */ | |
+ for (i = 8; i < NUMNAMES; i++) { | |
+ g_string_append(text, LocalNames[i]); | |
+ g_string_append_c(text, '^'); | |
} | |
- if (!HaveAbility(To,A_TSTRING)) for (i=0;i<NUMNAMES;i++) { | |
- g_free(LocalNames[i]); | |
- } | |
+ if (!HaveAbility(To, A_TSTRING)) | |
+ for (i = 0; i < NUMNAMES; i++) { | |
+ g_free(LocalNames[i]); | |
+ } | |
- g_string_sprintfa(text,"%c%s^",Currency.Prefix ? '1' : '0',Currency.Symbol); | |
- SendServerMessage(NULL,C_NONE,C_INIT,To,text->str); | |
- g_string_free(text,TRUE); | |
+ g_string_sprintfa(text, "%c%s^", Currency.Prefix ? '1' : '0', | |
+ Currency.Symbol); | |
+ SendServerMessage(NULL, C_NONE, C_INIT, To, text->str); | |
+ g_string_free(text, TRUE); | |
} | |
-void ReceiveInitialData(Player *Play,char *Data) { | |
- char *pt,*ServerVersion,*curr; | |
+void ReceiveInitialData(Player *Play, char *Data) | |
+{ | |
+ char *pt, *ServerVersion, *curr; | |
GSList *list; | |
- pt=Data; | |
- ServerVersion=GetNextWord(&pt,"(unknown)"); | |
- ResizeLocations(GetNextInt(&pt,NumLocation)); | |
- ResizeGuns(GetNextInt(&pt,NumGun)); | |
- ResizeDrugs(GetNextInt(&pt,NumDrug)); | |
- for (list=FirstClient;list;list=g_slist_next(list)) { | |
- UpdatePlayer((Player*)list->data); | |
+ | |
+ pt = Data; | |
+ ServerVersion = GetNextWord(&pt, "(unknown)"); | |
+ ResizeLocations(GetNextInt(&pt, NumLocation)); | |
+ ResizeGuns(GetNextInt(&pt, NumGun)); | |
+ ResizeDrugs(GetNextInt(&pt, NumDrug)); | |
+ for (list = FirstClient; list; list = g_slist_next(list)) { | |
+ UpdatePlayer((Player *)list->data); | |
} | |
- AssignName(&Names.Bitch,GetNextWord(&pt,"")); | |
- AssignName(&Names.Bitches,GetNextWord(&pt,"")); | |
- AssignName(&Names.Gun,GetNextWord(&pt,"")); | |
- AssignName(&Names.Guns,GetNextWord(&pt,"")); | |
- AssignName(&Names.Drug,GetNextWord(&pt,"")); | |
- AssignName(&Names.Drugs,GetNextWord(&pt,"")); | |
- AssignName(&Names.Month,GetNextWord(&pt,"")); | |
- AssignName(&Names.Year,GetNextWord(&pt,"")); | |
- if (HaveAbility(Play,A_PLAYERID)) Play->ID=GetNextInt(&pt,0); | |
- | |
-/* Servers up to version 1.4.8 don't send the following names, so | |
- default to the existing values if they haven't been sent */ | |
- AssignName(&Names.LoanSharkName,GetNextWord(&pt,Names.LoanSharkName)); | |
- AssignName(&Names.BankName,GetNextWord(&pt,Names.BankName)); | |
- AssignName(&Names.GunShopName,GetNextWord(&pt,Names.GunShopName)); | |
- AssignName(&Names.RoughPubName,GetNextWord(&pt,Names.RoughPubName)); | |
- | |
-/* Currency data are only sent by versions >= 1.5.3 */ | |
- curr = GetNextWord(&pt,NULL); | |
- if (curr && strlen(curr)>=1) { | |
- Currency.Prefix = (curr[0]=='1'); | |
- AssignName(&Currency.Symbol,&curr[1]); | |
+ AssignName(&Names.Bitch, GetNextWord(&pt, "")); | |
+ AssignName(&Names.Bitches, GetNextWord(&pt, "")); | |
+ AssignName(&Names.Gun, GetNextWord(&pt, "")); | |
+ AssignName(&Names.Guns, GetNextWord(&pt, "")); | |
+ AssignName(&Names.Drug, GetNextWord(&pt, "")); | |
+ AssignName(&Names.Drugs, GetNextWord(&pt, "")); | |
+ AssignName(&Names.Month, GetNextWord(&pt, "")); | |
+ AssignName(&Names.Year, GetNextWord(&pt, "")); | |
+ if (HaveAbility(Play, A_PLAYERID)) | |
+ Play->ID = GetNextInt(&pt, 0); | |
+ | |
+ /* Servers up to version 1.4.8 don't send the following names, so | |
+ * default to the existing values if they haven't been sent */ | |
+ AssignName(&Names.LoanSharkName, GetNextWord(&pt, Names.LoanSharkName)); | |
+ AssignName(&Names.BankName, GetNextWord(&pt, Names.BankName)); | |
+ AssignName(&Names.GunShopName, GetNextWord(&pt, Names.GunShopName)); | |
+ AssignName(&Names.RoughPubName, GetNextWord(&pt, Names.RoughPubName)); | |
+ | |
+ /* Currency data are only sent by versions >= 1.5.3 */ | |
+ curr = GetNextWord(&pt, NULL); | |
+ if (curr && strlen(curr) >= 1) { | |
+ Currency.Prefix = (curr[0] == '1'); | |
+ AssignName(&Currency.Symbol, &curr[1]); | |
} | |
- if (strcmp(VERSION,ServerVersion)!=0) { | |
+ if (strcmp(VERSION, ServerVersion) != 0) { | |
g_message(_("This server is version %s, while your client is " | |
-"version %s.\nBe warned that different versions may not be fully compatible!\n" | |
-"Refer to the website at http://dopewars.sourceforge.net/\n" | |
-"for the latest version."),ServerVersion,VERSION); | |
+ "version %s.\nBe warned that different versions may not " | |
+ "be fully compatible!\nRefer to the website at " | |
+ "http://dopewars.sourceforge.net/\nfor the latest version."), | |
+ ServerVersion, VERSION); | |
} | |
} | |
-void SendMiscData(Player *To) { | |
- gchar *text,*prstr[2],*LocalName; | |
- int i; | |
- gboolean HaveTString; | |
- if (!Network) return; | |
- HaveTString=HaveAbility(To,A_TSTRING); | |
- text=g_strdup_printf("0^%c%s^%s^",DT_PRICES, | |
- (prstr[0]=pricetostr(Prices.Spy)), | |
- (prstr[1]=pricetostr(Prices.Tipoff))); | |
- SendServerMessage(NULL,C_NONE,C_DATA,To,text); | |
- g_free(prstr[0]); g_free(prstr[1]); g_free(text); | |
- for (i=0;i<NumGun;i++) { | |
- if (HaveTString) LocalName=Gun[i].Name; | |
- else LocalName=GetDefaultTString(Gun[i].Name); | |
- text=g_strdup_printf("%d^%c%s^%s^%d^%d^",i,DT_GUN,LocalName, | |
- (prstr[0]=pricetostr(Gun[i].Price)), | |
- Gun[i].Space,Gun[i].Damage); | |
- if (!HaveTString) g_free(LocalName); | |
- SendServerMessage(NULL,C_NONE,C_DATA,To,text); | |
- g_free(prstr[0]); g_free(text); | |
- } | |
- for (i=0;i<NumDrug;i++) { | |
- if (HaveTString) LocalName=Drug[i].Name; | |
- else LocalName=GetDefaultTString(Drug[i].Name); | |
- text=g_strdup_printf("%d^%c%s^%s^%s^",i,DT_DRUG,LocalName, | |
- (prstr[0]=pricetostr(Drug[i].MinPrice)), | |
- (prstr[1]=pricetostr(Drug[i].MaxPrice))); | |
- if (!HaveTString) g_free(LocalName); | |
- SendServerMessage(NULL,C_NONE,C_DATA,To,text); | |
- g_free(prstr[0]); g_free(prstr[1]); g_free(text); | |
- } | |
- for (i=0;i<NumLocation;i++) { | |
- if (HaveTString) LocalName=Location[i].Name; | |
- else LocalName=GetDefaultTString(Location[i].Name); | |
- text=g_strdup_printf("%d^%c%s^",i,DT_LOCATION,LocalName); | |
- if (!HaveTString) g_free(LocalName); | |
- SendServerMessage(NULL,C_NONE,C_DATA,To,text); | |
- g_free(text); | |
- } | |
+void SendMiscData(Player *To) | |
+{ | |
+ gchar *text, *prstr[2], *LocalName; | |
+ int i; | |
+ gboolean HaveTString; | |
+ | |
+ if (!Network) | |
+ return; | |
+ HaveTString = HaveAbility(To, A_TSTRING); | |
+ text = g_strdup_printf("0^%c%s^%s^", DT_PRICES, | |
+ (prstr[0] = pricetostr(Prices.Spy)), | |
+ (prstr[1] = pricetostr(Prices.Tipoff))); | |
+ SendServerMessage(NULL, C_NONE, C_DATA, To, text); | |
+ g_free(prstr[0]); | |
+ g_free(prstr[1]); | |
+ g_free(text); | |
+ for (i = 0; i < NumGun; i++) { | |
+ if (HaveTString) | |
+ LocalName = Gun[i].Name; | |
+ else | |
+ LocalName = GetDefaultTString(Gun[i].Name); | |
+ text = g_strdup_printf("%d^%c%s^%s^%d^%d^", i, DT_GUN, LocalName, | |
+ (prstr[0] = pricetostr(Gun[i].Price)), | |
+ Gun[i].Space, Gun[i].Damage); | |
+ if (!HaveTString) | |
+ g_free(LocalName); | |
+ SendServerMessage(NULL, C_NONE, C_DATA, To, text); | |
+ g_free(prstr[0]); | |
+ g_free(text); | |
+ } | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if (HaveTString) | |
+ LocalName = Drug[i].Name; | |
+ else | |
+ LocalName = GetDefaultTString(Drug[i].Name); | |
+ text = g_strdup_printf("%d^%c%s^%s^%s^", i, DT_DRUG, LocalName, | |
+ (prstr[0] = pricetostr(Drug[i].MinPrice)), | |
+ (prstr[1] = pricetostr(Drug[i].MaxPrice))); | |
+ if (!HaveTString) | |
+ g_free(LocalName); | |
+ SendServerMessage(NULL, C_NONE, C_DATA, To, text); | |
+ g_free(prstr[0]); | |
+ g_free(prstr[1]); | |
+ g_free(text); | |
+ } | |
+ for (i = 0; i < NumLocation; i++) { | |
+ if (HaveTString) | |
+ LocalName = Location[i].Name; | |
+ else | |
+ LocalName = GetDefaultTString(Location[i].Name); | |
+ text = g_strdup_printf("%d^%c%s^", i, DT_LOCATION, LocalName); | |
+ if (!HaveTString) | |
+ g_free(LocalName); | |
+ SendServerMessage(NULL, C_NONE, C_DATA, To, text); | |
+ g_free(text); | |
+ } | |
} | |
-void ReceiveMiscData(char *Data) { | |
-/* Decodes information about locations, drugs, prices, etc. in "Data" */ | |
- char *pt,*Name,Type; | |
- int i; | |
- pt=Data; | |
- i=GetNextInt(&pt,0); | |
- Name=GetNextWord(&pt,""); | |
- Type=Name[0]; | |
- if (strlen(Name)>1) switch(Type) { | |
- case DT_LOCATION: | |
- if (i>=0 && i<NumLocation) { | |
- AssignName(&Location[i].Name,&Name[1]); | |
- Location[i].PolicePresence=10; | |
- Location[i].MinDrug=NumDrug/2+1; | |
- Location[i].MaxDrug=NumDrug; | |
- } | |
- break; | |
- case DT_GUN: | |
- if (i>=0 && i<NumGun) { | |
- AssignName(&Gun[i].Name,&Name[1]); | |
- Gun[i].Price=GetNextPrice(&pt,(price_t)0); | |
- Gun[i].Space=GetNextInt(&pt,0); | |
- Gun[i].Damage=GetNextInt(&pt,0); | |
- } | |
- break; | |
- case DT_DRUG: | |
- if (i>=0 && i<NumDrug) { | |
- AssignName(&Drug[i].Name,&Name[1]); | |
- Drug[i].MinPrice=GetNextPrice(&pt,(price_t)0); | |
- Drug[i].MaxPrice=GetNextPrice(&pt,(price_t)0); | |
- } | |
- break; | |
- case DT_PRICES: | |
- Prices.Spy=strtoprice(&Name[1]); | |
- Prices.Tipoff=GetNextPrice(&pt,(price_t)0); | |
- break; | |
- } | |
+/* | |
+ * Decodes information about locations, drugs, prices, etc. in "Data" | |
+ */ | |
+void ReceiveMiscData(char *Data) | |
+{ | |
+ char *pt, *Name, Type; | |
+ int i; | |
+ | |
+ pt = Data; | |
+ i = GetNextInt(&pt, 0); | |
+ Name = GetNextWord(&pt, ""); | |
+ Type = Name[0]; | |
+ if (strlen(Name) > 1) { | |
+ switch (Type) { | |
+ case DT_LOCATION: | |
+ if (i >= 0 && i < NumLocation) { | |
+ AssignName(&Location[i].Name, &Name[1]); | |
+ Location[i].PolicePresence = 10; | |
+ Location[i].MinDrug = NumDrug / 2 + 1; | |
+ Location[i].MaxDrug = NumDrug; | |
+ } | |
+ break; | |
+ case DT_GUN: | |
+ if (i >= 0 && i < NumGun) { | |
+ AssignName(&Gun[i].Name, &Name[1]); | |
+ Gun[i].Price = GetNextPrice(&pt, (price_t)0); | |
+ Gun[i].Space = GetNextInt(&pt, 0); | |
+ Gun[i].Damage = GetNextInt(&pt, 0); | |
+ } | |
+ break; | |
+ case DT_DRUG: | |
+ if (i >= 0 && i < NumDrug) { | |
+ AssignName(&Drug[i].Name, &Name[1]); | |
+ Drug[i].MinPrice = GetNextPrice(&pt, (price_t)0); | |
+ Drug[i].MaxPrice = GetNextPrice(&pt, (price_t)0); | |
+ } | |
+ break; | |
+ case DT_PRICES: | |
+ Prices.Spy = strtoprice(&Name[1]); | |
+ Prices.Tipoff = GetNextPrice(&pt, (price_t)0); | |
+ break; | |
+ } | |
+ } | |
} | |
-void ReceivePlayerData(Player *Play,char *text,Player *From) { | |
-/* Decode player data from the string "text" into player "From"; "Play" */ | |
-/* specifies the player that owns the network connection. */ | |
- char *cp; | |
- int i; | |
- cp=text; | |
- From->Cash=GetNextPrice(&cp,(price_t)0); | |
- From->Debt=GetNextPrice(&cp,(price_t)0); | |
- From->Bank=GetNextPrice(&cp,(price_t)0); | |
- From->Health=GetNextInt(&cp,100); | |
- From->CoatSize=GetNextInt(&cp,0); | |
- From->IsAt=GetNextInt(&cp,0); | |
- From->Turn=GetNextInt(&cp,0); | |
- From->Flags=GetNextInt(&cp,0); | |
- for (i=0;i<NumGun;i++) { | |
- From->Guns[i].Carried=GetNextInt(&cp,0); | |
- } | |
- for (i=0;i<NumDrug;i++) { | |
- From->Drugs[i].Carried=GetNextInt(&cp,0); | |
- } | |
- if (HaveAbility(Play,A_DRUGVALUE)) for (i=0;i<NumDrug;i++) { | |
- From->Drugs[i].TotalValue=GetNextPrice(&cp,(price_t)0); | |
- } | |
- From->Bitches.Carried=GetNextInt(&cp,0); | |
+/* | |
+ * Decode player data from the string "text" into player "From"; "Play" | |
+ * specifies the player that owns the network connection. | |
+ */ | |
+void ReceivePlayerData(Player *Play, char *text, Player *From) | |
+{ | |
+ char *cp; | |
+ int i; | |
+ | |
+ cp = text; | |
+ From->Cash = GetNextPrice(&cp, (price_t)0); | |
+ From->Debt = GetNextPrice(&cp, (price_t)0); | |
+ From->Bank = GetNextPrice(&cp, (price_t)0); | |
+ From->Health = GetNextInt(&cp, 100); | |
+ From->CoatSize = GetNextInt(&cp, 0); | |
+ From->IsAt = GetNextInt(&cp, 0); | |
+ From->Turn = GetNextInt(&cp, 0); | |
+ From->Flags = GetNextInt(&cp, 0); | |
+ for (i = 0; i < NumGun; i++) { | |
+ From->Guns[i].Carried = GetNextInt(&cp, 0); | |
+ } | |
+ for (i = 0; i < NumDrug; i++) { | |
+ From->Drugs[i].Carried = GetNextInt(&cp, 0); | |
+ } | |
+ if (HaveAbility(Play, A_DRUGVALUE)) { | |
+ for (i = 0; i < NumDrug; i++) { | |
+ From->Drugs[i].TotalValue = GetNextPrice(&cp, (price_t)0); | |
+ } | |
+ } | |
+ From->Bitches.Carried = GetNextInt(&cp, 0); | |
} | |
-gchar *GetNextWord(gchar **Data,gchar *Default) { | |
- gchar *Word; | |
- if (*Data==NULL || **Data=='\0') return Default; | |
- Word=*Data; | |
- while (**Data!='\0' && **Data!='^') (*Data)++; | |
- if (**Data!='\0') { | |
- **Data='\0'; (*Data)++; | |
- } | |
- return Word; | |
+gchar *GetNextWord(gchar **Data, gchar *Default) | |
+{ | |
+ gchar *Word; | |
+ | |
+ if (*Data == NULL || **Data == '\0') | |
+ return Default; | |
+ Word = *Data; | |
+ while (**Data != '\0' && **Data != '^') | |
+ (*Data)++; | |
+ if (**Data != '\0') { | |
+ **Data = '\0'; | |
+ (*Data)++; | |
+ } | |
+ return Word; | |
} | |
-void AssignNextWord(gchar **Data,gchar **Dest) { | |
- if (!Dest) return; | |
- g_free(*Dest); | |
- *Dest=g_strdup(GetNextWord(Data,"")); | |
+void AssignNextWord(gchar **Data, gchar **Dest) | |
+{ | |
+ if (!Dest) | |
+ return; | |
+ g_free(*Dest); | |
+ *Dest = g_strdup(GetNextWord(Data, "")); | |
} | |
-int GetNextInt(gchar **Data,int Default) { | |
- gchar *Word=GetNextWord(Data,NULL); | |
- if (Word) return atoi(Word); else return Default; | |
+int GetNextInt(gchar **Data, int Default) | |
+{ | |
+ gchar *Word = GetNextWord(Data, NULL); | |
+ | |
+ if (Word) | |
+ return atoi(Word); | |
+ else | |
+ return Default; | |
} | |
-price_t GetNextPrice(gchar **Data,price_t Default) { | |
- gchar *Word=GetNextWord(Data,NULL); | |
- if (Word) return strtoprice(Word); else return Default; | |
+price_t GetNextPrice(gchar **Data, price_t Default) | |
+{ | |
+ gchar *Word = GetNextWord(Data, NULL); | |
+ | |
+ if (Word) | |
+ return strtoprice(Word); | |
+ else | |
+ return Default; | |
} | |
-void SwitchToSinglePlayer(Player *Play) { | |
-/* Called when the client is pushed off the server, or the server */ | |
-/* terminates. Using the client information, starts a local server */ | |
-/* to reproduce the current game situation as best as possible so */ | |
-/* that the game can be continued in single player mode */ | |
- Player *NewPlayer; | |
- if (!Network || !Client || !FirstClient) return; | |
- ShutdownNetwork(Play); | |
- CleanUpServer(); | |
- Network=Server=Client=FALSE; | |
- InitAbilities(Play); | |
- NewPlayer=g_new(Player,1); | |
- FirstServer=AddPlayer(0,NewPlayer,FirstServer); | |
- CopyPlayer(NewPlayer,Play); | |
- NewPlayer->Flags=0; | |
- NewPlayer->EventNum=E_ARRIVE; | |
- SendEvent(NewPlayer); | |
+/* | |
+ * Called when the client is pushed off the server, or the server | |
+ * terminates. Using the client information, starts a local server | |
+ * to reproduce the current game situation as best as possible so | |
+ * that the game can be continued in single player mode. | |
+ */ | |
+void SwitchToSinglePlayer(Player *Play) | |
+{ | |
+ if (Network && Client && FirstClient) { | |
+ Player *NewPlayer; | |
+ | |
+ ShutdownNetwork(Play); | |
+ CleanUpServer(); | |
+ Network = Server = Client = FALSE; | |
+ InitAbilities(Play); | |
+ NewPlayer = g_new(Player, 1); | |
+ FirstServer = AddPlayer(0, NewPlayer, FirstServer); | |
+ CopyPlayer(NewPlayer, Play); | |
+ NewPlayer->Flags = 0; | |
+ NewPlayer->EventNum = E_ARRIVE; | |
+ SendEvent(NewPlayer); | |
+ } | |
} | |
-void ShutdownNetwork(Player *Play) { | |
-/* Closes down the client side of the network connection. Clears the list */ | |
-/* of client players (with the exception of "you", the player "Play"), */ | |
-/* and closes the network socket. */ | |
- if (Play!=FirstClient->data) { | |
- g_error("Oops! FirstClient should be player!"); | |
- } | |
- while (g_slist_next(FirstClient)) { | |
- FirstClient=RemovePlayer((Player *)g_slist_next(FirstClient)->data, | |
+/* | |
+ * Closes down the client side of the network connection. Clears the list | |
+ * of client players (with the exception of "you", the player "Play"), | |
+ * and closes the network socket. | |
+ */ | |
+void ShutdownNetwork(Player *Play) | |
+{ | |
+ if (Play != FirstClient->data) { | |
+ g_error("Oops! FirstClient should be player!"); | |
+ } | |
+ while (g_slist_next(FirstClient)) { | |
+ FirstClient = RemovePlayer((Player *)g_slist_next(FirstClient)->data, | |
FirstClient); | |
- } | |
+ } | |
#ifdef NETWORKING | |
- ShutdownNetworkBuffer(&Play->NetBuf); | |
+ ShutdownNetworkBuffer(&Play->NetBuf); | |
#endif | |
- Client=Network=Server=FALSE; | |
+ Client = Network = Server = FALSE; | |
} | |
-int ProcessMessage(char *Msg,Player *Play,Player **Other,AICode *AI, | |
- MsgCode *Code,char **Data,GSList *First) { | |
-/* Given a "raw" message in "Msg" and a pointer to the start of the linked */ | |
-/* list of known players in "First", sets the other arguments to the message */ | |
-/* fields. Data is returned as a pointer into the message "Msg", and should */ | |
-/* therefore NOT be g_free'd. "Play" is a pointer to the player which is */ | |
-/* receiving the message. "Other" is the player that is identified by the */ | |
-/* message; for messages to clients, this will be the player "From" which */ | |
-/* the message claims to be, while for messages to servers, this will be */ | |
-/* the player "To" which to send messages. Returns 0 on success, -1 on */ | |
-/* failure. */ | |
- gchar *pt,*buf; | |
- guint ID; | |
- | |
- if (!First || !Play) return -1; | |
- | |
- *AI=C_NONE; | |
- *Code=C_PRINTMESSAGE; | |
- *Other=&Noone; | |
- pt=Msg; | |
- if (HaveAbility(Play,A_PLAYERID)) { | |
- buf=GetNextWord(&pt,NULL); | |
- if (buf[0]) { | |
- ID=atoi(buf); | |
- *Other=GetPlayerByID(ID,First); | |
- } | |
- } else { | |
- buf=GetNextWord(&pt,NULL); | |
- if (Client) *Other=GetPlayerByName(buf,First); | |
- buf=GetNextWord(&pt,NULL); | |
- if (Server) *Other=GetPlayerByName(buf,First); | |
- } | |
- if (!(*Other)) return -1; | |
- | |
- if (strlen(pt)>=2) { | |
- *AI=pt[0]; | |
- *Code=pt[1]; | |
- *Data=&pt[2]; | |
- return 0; | |
- } | |
- return -1; | |
+/* | |
+ * Given a "raw" message in "Msg" and a pointer to the start of the linked | |
+ * list of known players in "First", sets the other arguments to the message | |
+ * fields. Data is returned as a pointer into the message "Msg", and should | |
+ * therefore NOT be g_free'd. "Play" is a pointer to the player which is | |
+ * receiving the message. "Other" is the player that is identified by the | |
+ * message; for messages to clients, this will be the player "From" which | |
+ * the message claims to be, while for messages to servers, this will be | |
+ * the player "To" which to send messages. Returns 0 on success, -1 on failure. | |
+ */ | |
+int ProcessMessage(char *Msg, Player *Play, Player **Other, AICode *AI, | |
+ MsgCode *Code, char **Data, GSList *First) | |
+{ | |
+ gchar *pt, *buf; | |
+ guint ID; | |
+ | |
+ if (!First || !Play) | |
+ return -1; | |
+ | |
+ *AI = C_NONE; | |
+ *Code = C_PRINTMESSAGE; | |
+ *Other = &Noone; | |
+ pt = Msg; | |
+ if (HaveAbility(Play, A_PLAYERID)) { | |
+ buf = GetNextWord(&pt, NULL); | |
+ if (buf[0]) { | |
+ ID = atoi(buf); | |
+ *Other = GetPlayerByID(ID, First); | |
+ } | |
+ } else { | |
+ buf = GetNextWord(&pt, NULL); | |
+ if (Client) | |
+ *Other = GetPlayerByName(buf, First); | |
+ buf = GetNextWord(&pt, NULL); | |
+ if (Server) | |
+ *Other = GetPlayerByName(buf, First); | |
+ } | |
+ if (!(*Other)) | |
+ return -1; | |
+ | |
+ if (strlen(pt) >= 2) { | |
+ *AI = pt[0]; | |
+ *Code = pt[1]; | |
+ *Data = &pt[2]; | |
+ return 0; | |
+ } | |
+ return -1; | |
} | |
-void ReceiveDrugsHere(char *text,Player *To) { | |
-/* Decodes the message data "text" into a list of drug prices for */ | |
-/* player "To" */ | |
- char *cp; | |
- int i; | |
- | |
- To->EventNum=E_ARRIVE; | |
- cp=text; | |
- for (i=0;i<NumDrug;i++) { | |
- To->Drugs[i].Price=GetNextPrice(&cp,(price_t)0); | |
- } | |
+/* | |
+ * Decodes the message data "text" into a list of drug prices for | |
+ * player "To" | |
+ */ | |
+void ReceiveDrugsHere(char *text, Player *To) | |
+{ | |
+ char *cp; | |
+ int i; | |
+ | |
+ To->EventNum = E_ARRIVE; | |
+ cp = text; | |
+ for (i = 0; i < NumDrug; i++) { | |
+ To->Drugs[i].Price = GetNextPrice(&cp, (price_t)0); | |
+ } | |
} | |
-gboolean HandleGenericClientMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data, | |
- DispMode *DisplayMode) { | |
-/* Handles messages that both human clients and AI players deal with in the */ | |
-/* same way. */ | |
- Player *tmp; | |
- gchar *pt; | |
- switch(Code) { | |
- case C_LIST: case C_JOIN: | |
- tmp=g_new(Player,1); | |
- FirstClient=AddPlayer(0,tmp,FirstClient); | |
- pt=Data; | |
- SetPlayerName(tmp,GetNextWord(&pt,NULL)); | |
- if (HaveAbility(To,A_PLAYERID)) tmp->ID=GetNextInt(&pt,0); | |
- break; | |
- case C_DATA: | |
- ReceiveMiscData(Data); break; | |
- case C_INIT: | |
- ReceiveInitialData(To,Data); break; | |
- case C_ABILITIES: | |
- ReceiveAbilities(To,Data); CombineAbilities(To); | |
- break; | |
- case C_LEAVE: | |
- if (From!=&Noone) FirstClient=RemovePlayer(From,FirstClient); | |
- break; | |
- case C_TRADE: | |
- if (DisplayMode) *DisplayMode=DM_DEAL; | |
- break; | |
- case C_DRUGHERE: | |
- ReceiveDrugsHere(Data,To); | |
- if (DisplayMode) *DisplayMode=DM_STREET; | |
- break; | |
- case C_FIGHTPRINT: | |
- if (From!=&Noone) { | |
- From->Flags |= FIGHTING; | |
- To->Flags |= CANSHOOT; | |
- } | |
- if (DisplayMode) *DisplayMode=DM_FIGHT; | |
- break; | |
- case C_CHANGEDISP: | |
- if (DisplayMode) { | |
- if (Data[0]=='N' && *DisplayMode==DM_STREET) *DisplayMode=DM_NONE; | |
- if (Data[0]=='Y' && *DisplayMode==DM_NONE) *DisplayMode=DM_STREET; | |
- } | |
- break; | |
- default: | |
- return FALSE; break; | |
- } | |
- return TRUE; | |
+/* | |
+ * Handles messages that both human clients and AI players deal with | |
+ * in the same way. | |
+ */ | |
+gboolean HandleGenericClientMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data, | |
+ DispMode *DisplayMode) | |
+{ | |
+ Player *tmp; | |
+ gchar *pt; | |
+ | |
+ switch (Code) { | |
+ case C_LIST: | |
+ case C_JOIN: | |
+ tmp = g_new(Player, 1); | |
+ | |
+ FirstClient = AddPlayer(0, tmp, FirstClient); | |
+ pt = Data; | |
+ SetPlayerName(tmp, GetNextWord(&pt, NULL)); | |
+ if (HaveAbility(To, A_PLAYERID)) | |
+ tmp->ID = GetNextInt(&pt, 0); | |
+ break; | |
+ case C_DATA: | |
+ ReceiveMiscData(Data); | |
+ break; | |
+ case C_INIT: | |
+ ReceiveInitialData(To, Data); | |
+ break; | |
+ case C_ABILITIES: | |
+ ReceiveAbilities(To, Data); | |
+ CombineAbilities(To); | |
+ break; | |
+ case C_LEAVE: | |
+ if (From != &Noone) | |
+ FirstClient = RemovePlayer(From, FirstClient); | |
+ break; | |
+ case C_TRADE: | |
+ if (DisplayMode) | |
+ *DisplayMode = DM_DEAL; | |
+ break; | |
+ case C_DRUGHERE: | |
+ ReceiveDrugsHere(Data, To); | |
+ if (DisplayMode) | |
+ *DisplayMode = DM_STREET; | |
+ break; | |
+ case C_FIGHTPRINT: | |
+ if (From != &Noone) { | |
+ From->Flags |= FIGHTING; | |
+ To->Flags |= CANSHOOT; | |
+ } | |
+ if (DisplayMode) | |
+ *DisplayMode = DM_FIGHT; | |
+ break; | |
+ case C_CHANGEDISP: | |
+ if (DisplayMode) { | |
+ if (Data[0] == 'N' && *DisplayMode == DM_STREET) | |
+ *DisplayMode = DM_NONE; | |
+ if (Data[0] == 'Y' && *DisplayMode == DM_NONE) | |
+ *DisplayMode = DM_STREET; | |
+ } | |
+ break; | |
+ default: | |
+ return FALSE; | |
+ break; | |
+ } | |
+ return TRUE; | |
} | |
-void SendFightReload(Player *To) { | |
- SendFightMessage(To,NULL,0,F_RELOAD,(price_t)0,FALSE,NULL); | |
+void SendFightReload(Player *To) | |
+{ | |
+ SendFightMessage(To, NULL, 0, F_RELOAD, (price_t)0, FALSE, NULL); | |
} | |
-void SendOldCanFireMessage(Player *To,GString *text) { | |
- if (To->EventNum==E_FIGHT) { | |
- To->EventNum=E_FIGHTASK; | |
- if (CanRunHere(To) && To->Health>0 && !HaveAbility(To,A_NEWFIGHT)) { | |
- if (text->len>0) g_string_append_c(text,'^'); | |
- if (TotalGunsCarried(To)==0) { | |
- g_string_prepend(text,"YN^"); | |
- g_string_append(text,_("Do you run?")); | |
- } else { | |
- g_string_prepend(text,"RF^"); | |
- g_string_append(text,_("Do you run, or fight?")); | |
- } | |
- SendQuestion(NULL,C_NONE,To,text->str); | |
+void SendOldCanFireMessage(Player *To, GString *text) | |
+{ | |
+ if (To->EventNum == E_FIGHT) { | |
+ To->EventNum = E_FIGHTASK; | |
+ if (CanRunHere(To) && To->Health > 0 && !HaveAbility(To, A_NEWFIGHT)) { | |
+ if (text->len > 0) | |
+ g_string_append_c(text, '^'); | |
+ if (TotalGunsCarried(To) == 0) { | |
+ g_string_prepend(text, "YN^"); | |
+ g_string_append(text, _("Do you run?")); | |
} else { | |
- SendOldFightPrint(To,text,FALSE); | |
+ g_string_prepend(text, "RF^"); | |
+ g_string_append(text, _("Do you run, or fight?")); | |
} | |
- } | |
+ SendQuestion(NULL, C_NONE, To, text->str); | |
+ } else { | |
+ SendOldFightPrint(To, text, FALSE); | |
+ } | |
+ } | |
} | |
-void SendOldFightPrint(Player *To,GString *text,gboolean FightOver) { | |
- gboolean Fighting,CanShoot; | |
+void SendOldFightPrint(Player *To, GString *text, gboolean FightOver) | |
+{ | |
+ gboolean Fighting, CanShoot; | |
+ | |
+ Fighting = !FightOver; | |
+ CanShoot = CanPlayerFire(To); | |
- Fighting=!FightOver; | |
- CanShoot=CanPlayerFire(To); | |
+ To->Flags &= ~(CANSHOOT + FIGHTING); | |
+ if (Fighting) | |
+ To->Flags |= FIGHTING; | |
+ if (Fighting && CanShoot) | |
+ To->Flags |= CANSHOOT; | |
+ SendPlayerData(To); | |
+ To->Flags &= ~(CANSHOOT + FIGHTING); | |
- To->Flags &= ~(CANSHOOT+FIGHTING); | |
- if (Fighting) To->Flags |= FIGHTING; | |
- if (Fighting && CanShoot) To->Flags |= CANSHOOT; | |
- SendPlayerData(To); | |
- To->Flags &= ~(CANSHOOT+FIGHTING); | |
+ SendServerMessage(NULL, C_NONE, C_FIGHTPRINT, To, text->str); | |
+} | |
- SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,To,text->str); | |
+void SendFightLeave(Player *Play, gboolean FightOver) | |
+{ | |
+ SendFightMessage(Play, NULL, 0, FightOver ? F_LASTLEAVE : F_LEAVE, | |
+ (price_t)0, TRUE, NULL); | |
} | |
-void SendFightLeave(Player *Play,gboolean FightOver) { | |
- SendFightMessage(Play,NULL,0,FightOver ? F_LASTLEAVE : F_LEAVE, | |
- (price_t)0,TRUE,NULL); | |
+void ReceiveFightMessage(gchar *Data, gchar **AttackName, | |
+ gchar **DefendName, int *DefendHealth, | |
+ int *DefendBitches, gchar **BitchName, | |
+ int *BitchesKilled, int *ArmPercent, | |
+ FightPoint *fp, gboolean *CanRunHere, | |
+ gboolean *Loot, gboolean *CanFire, | |
+ gchar **Message) | |
+{ | |
+ gchar *pt, *Flags; | |
+ | |
+ pt = Data; | |
+ *AttackName = GetNextWord(&pt, ""); | |
+ *DefendName = GetNextWord(&pt, ""); | |
+ *DefendHealth = GetNextInt(&pt, 0); | |
+ *DefendBitches = GetNextInt(&pt, 0); | |
+ *BitchName = GetNextWord(&pt, ""); | |
+ *BitchesKilled = GetNextInt(&pt, 0); | |
+ *ArmPercent = GetNextInt(&pt, 0); | |
+ | |
+ Flags = GetNextWord(&pt, NULL); | |
+ if (Flags && strlen(Flags) >= 4) { | |
+ *fp = Flags[0]; | |
+ *CanRunHere = (Flags[1] == '1'); | |
+ *Loot = (Flags[2] == '1'); | |
+ *CanFire = (Flags[3] == '1'); | |
+ } else { | |
+ *fp = F_MSG; | |
+ *CanRunHere = *Loot = *CanFire = FALSE; | |
+ } | |
+ *Message = pt; | |
} | |
-void ReceiveFightMessage(gchar *Data,gchar **AttackName,gchar **DefendName, | |
- int *DefendHealth,int *DefendBitches, | |
- gchar **BitchName, | |
- int *BitchesKilled,int *ArmPercent, | |
- FightPoint *fp,gboolean *CanRunHere, | |
- gboolean *Loot,gboolean *CanFire,gchar **Message) { | |
- gchar *pt,*Flags; | |
- | |
- pt=Data; | |
- *AttackName=GetNextWord(&pt,""); | |
- *DefendName=GetNextWord(&pt,""); | |
- *DefendHealth=GetNextInt(&pt,0); | |
- *DefendBitches=GetNextInt(&pt,0); | |
- *BitchName=GetNextWord(&pt,""); | |
- *BitchesKilled=GetNextInt(&pt,0); | |
- *ArmPercent=GetNextInt(&pt,0); | |
- | |
- Flags=GetNextWord(&pt,NULL); | |
- if (Flags && strlen(Flags)>=4) { | |
- *fp=Flags[0]; | |
- *CanRunHere=(Flags[1]=='1'); | |
- *Loot=(Flags[2]=='1'); | |
- *CanFire=(Flags[3]=='1'); | |
- } else { | |
- *fp=F_MSG; | |
- *CanRunHere=*Loot=*CanFire=FALSE; | |
- } | |
- *Message=pt; | |
+void SendFightMessage(Player *Attacker, Player *Defender, | |
+ int BitchesKilled, FightPoint fp, | |
+ price_t Loot, gboolean Broadcast, gchar *Msg) | |
+{ | |
+ guint ArrayInd; | |
+ int ArmPercent, Damage, MaxDamage, i; | |
+ Player *To; | |
+ GString *text; | |
+ gchar *BitchName; | |
+ | |
+ if (!Attacker->FightArray) | |
+ return; | |
+ | |
+ MaxDamage = Damage = 0; | |
+ for (i = 0; i < NumGun; i++) { | |
+ if (Gun[i].Damage > MaxDamage) | |
+ MaxDamage = Gun[i].Damage; | |
+ Damage += Gun[i].Damage * Attacker->Guns[i].Carried; | |
+ } | |
+ MaxDamage *= (Attacker->Bitches.Carried + 2); | |
+ ArmPercent = Damage * 100 / MaxDamage; | |
+ | |
+ text = g_string_new(""); | |
+ | |
+ for (ArrayInd = 0; ArrayInd < Attacker->FightArray->len; ArrayInd++) { | |
+ To = (Player *)g_ptr_array_index(Attacker->FightArray, ArrayInd); | |
+ if (!Broadcast && To != Attacker) | |
+ continue; | |
+ g_string_truncate(text, 0); | |
+ if (HaveAbility(To, A_NEWFIGHT)) { | |
+ if (Defender) { | |
+ if (IsCop(Defender)) { | |
+ if (Defender->Bitches.Carried == 1) { | |
+ BitchName = Cop[Defender->CopIndex - 1].DeputyName; | |
+ } else { | |
+ BitchName = Cop[Defender->CopIndex - 1].DeputiesName; | |
+ } | |
+ } else { | |
+ if (Defender->Bitches.Carried == 1) { | |
+ BitchName = Names.Bitch; | |
+ } else { | |
+ BitchName = Names.Bitches; | |
+ } | |
+ } | |
+ } else | |
+ BitchName = ""; | |
+ g_string_sprintf(text, "%s^%s^%d^%d^%s^%d^%d^%c%c%c%c^", | |
+ Attacker == To ? "" : GetPlayerName(Attacker), | |
+ (Defender == To || Defender == NULL) | |
+ ? "" : GetPlayerName(Defender), | |
+ Defender ? Defender->Health : 0, | |
+ Defender ? Defender->Bitches.Carried : 0, | |
+ BitchName, | |
+ BitchesKilled, ArmPercent, | |
+ fp, CanRunHere(To) ? '1' : '0', | |
+ Loot ? '1' : '0', | |
+ fp != F_ARRIVED && fp != F_LASTLEAVE && | |
+ CanPlayerFire(To) ? '1' : '0'); | |
+ } | |
+ if (Msg) { | |
+ g_string_append(text, Msg); | |
+ } else { | |
+ FormatFightMessage(To, text, Attacker, Defender, BitchesKilled, | |
+ ArmPercent, fp, Loot); | |
+ } | |
+ if (HaveAbility(To, A_NEWFIGHT)) { | |
+ SendServerMessage(NULL, C_NONE, C_FIGHTPRINT, To, text->str); | |
+ } else if (CanRunHere(To)) { | |
+ if (fp != F_ARRIVED && fp != F_MSG && | |
+ fp != F_LASTLEAVE && | |
+ (fp != F_LEAVE || Attacker != To) && | |
+ CanPlayerFire(To) && To->EventNum == E_FIGHT) { | |
+ SendOldCanFireMessage(To, text); | |
+ } else if (text->len > 0) | |
+ SendPrintMessage(NULL, C_NONE, To, text->str); | |
+ } else { | |
+ SendOldFightPrint(To, text, fp == F_LASTLEAVE); | |
+ } | |
+ } | |
+ g_string_free(text, TRUE); | |
} | |
-void SendFightMessage(Player *Attacker,Player *Defender, | |
- int BitchesKilled,FightPoint fp, | |
- price_t Loot,gboolean Broadcast,gchar *Msg) { | |
- guint ArrayInd; | |
- int ArmPercent,Damage,MaxDamage,i; | |
- Player *To; | |
- GString *text; | |
- gchar *BitchName; | |
- | |
- if (!Attacker->FightArray) return; | |
- | |
- MaxDamage=Damage=0; | |
- for (i=0;i<NumGun;i++) { | |
- if (Gun[i].Damage>MaxDamage) MaxDamage=Gun[i].Damage; | |
- Damage+=Gun[i].Damage*Attacker->Guns[i].Carried; | |
- } | |
- MaxDamage *= (Attacker->Bitches.Carried+2); | |
- ArmPercent = Damage*100/MaxDamage; | |
- | |
- text=g_string_new(""); | |
- | |
- for (ArrayInd=0;ArrayInd<Attacker->FightArray->len;ArrayInd++) { | |
- To=(Player *)g_ptr_array_index(Attacker->FightArray,ArrayInd); | |
- if (!Broadcast && To!=Attacker) continue; | |
- g_string_truncate(text,0); | |
- if (HaveAbility(To,A_NEWFIGHT)) { | |
- if (Defender) { | |
- if (IsCop(Defender)) { | |
- if (Defender->Bitches.Carried==1) { | |
- BitchName=Cop[Defender->CopIndex-1].DeputyName; | |
- } else { | |
- BitchName=Cop[Defender->CopIndex-1].DeputiesName; | |
- } | |
- } else { | |
- if (Defender->Bitches.Carried==1) { | |
- BitchName=Names.Bitch; | |
- } else { | |
- BitchName=Names.Bitches; | |
- } | |
- } | |
- } else BitchName=""; | |
- g_string_sprintf(text,"%s^%s^%d^%d^%s^%d^%d^%c%c%c%c^", | |
- Attacker==To ? "" : GetPlayerName(Attacker), | |
- (Defender==To || Defender==NULL) | |
- ? "" : GetPlayerName(Defender), | |
- Defender ? Defender->Health : 0, | |
- Defender ? Defender->Bitches.Carried : 0, | |
- BitchName, | |
- BitchesKilled,ArmPercent, | |
- fp,CanRunHere(To) ? '1' : '0', | |
- Loot ? '1' : '0', | |
- fp!=F_ARRIVED && fp!=F_LASTLEAVE && | |
- CanPlayerFire(To) ? '1' : '0'); | |
+void FormatFightMessage(Player *To, GString *text, Player *Attacker, | |
+ Player *Defender, int BitchesKilled, | |
+ int ArmPercent, FightPoint fp, price_t Loot) | |
+{ | |
+ gchar *Armament, *DefendName, *AttackName; | |
+ int Health, Bitches; | |
+ gchar *BitchName, *BitchesName; | |
+ | |
+ if (Defender && IsCop(Defender)) { | |
+ BitchName = Cop[Defender->CopIndex - 1].DeputyName; | |
+ BitchesName = Cop[Defender->CopIndex - 1].DeputiesName; | |
+ } else { | |
+ BitchName = Names.Bitch; | |
+ BitchesName = Names.Bitches; | |
+ } | |
+ | |
+ AttackName = (!Attacker | |
+ || Attacker == To ? "" : GetPlayerName(Attacker)); | |
+ DefendName = (!Defender | |
+ || Defender == To ? "" : GetPlayerName(Defender)); | |
+ Health = Defender ? Defender->Health : 0; | |
+ Bitches = Defender ? Defender->Bitches.Carried : 0; | |
+ | |
+ switch (fp) { | |
+ case F_ARRIVED: | |
+ Armament = ArmPercent < 10 ? _("pitifully armed") : | |
+ ArmPercent < 25 ? _("lightly armed") : | |
+ ArmPercent < 60 ? _("moderately well armed") : | |
+ ArmPercent < 80 ? _("heavily armed") : _("armed to the teeth"); | |
+ if (DefendName[0]) { | |
+ if (IsCop(Defender) && !AttackName[0]) { | |
+ if (Bitches == 0) { | |
+ dpg_string_sprintfa(text, _("%s - %s - is chasing you, man!"), | |
+ DefendName, Armament); | |
+ } else { | |
+ dpg_string_sprintfa(text, | |
+ _("%s and %d %tde - %s - are chasing you, man!"), | |
+ DefendName, Bitches, BitchesName, Armament); | |
+ } | |
+ } else { | |
+ dpg_string_sprintfa(text, _("%s arrives with %d %tde, %s!"), | |
+ DefendName, Bitches, BitchesName, Armament); | |
} | |
- if (Msg) { | |
- g_string_append(text,Msg); | |
+ } | |
+ break; | |
+ case F_STAND: | |
+ if (AttackName[0]) { | |
+ g_string_sprintfa(text, _("%s stands and takes it"), AttackName); | |
+ } else { | |
+ g_string_append(text, _("You stand there like a dummy.")); | |
+ } | |
+ break; | |
+ case F_FAILFLEE: | |
+ if (AttackName[0]) { | |
+ g_string_sprintfa(text, _("%s tries to get away, but fails."), | |
+ AttackName); | |
+ } else { | |
+ g_string_append(text, _("Panic! You can't get away!")); | |
+ } | |
+ break; | |
+ case F_LEAVE: | |
+ case F_LASTLEAVE: | |
+ if (Attacker->Health > 0) { | |
+ if (AttackName[0]) { | |
+ if (!IsCop(Attacker) && brandom(0, 100) < 70 | |
+ && Attacker->IsAt >= 0) { | |
+ g_string_sprintfa(text, _("%s has got away to %s!"), AttackName, | |
+ Location[(int)Attacker->IsAt].Name); | |
+ } else { | |
+ g_string_sprintfa(text, _("%s has got away!"), AttackName); | |
+ } | |
} else { | |
- FormatFightMessage(To,text,Attacker,Defender,BitchesKilled, | |
- ArmPercent,fp,Loot); | |
+ g_string_sprintfa(text, _("You got away!")); | |
} | |
- if (HaveAbility(To,A_NEWFIGHT)) { | |
- SendServerMessage(NULL,C_NONE,C_FIGHTPRINT,To,text->str); | |
- } else if (CanRunHere(To)) { | |
- if (fp!=F_ARRIVED && fp!=F_MSG && | |
- fp!=F_LASTLEAVE && | |
- (fp!=F_LEAVE || Attacker!=To) && | |
- CanPlayerFire(To) && To->EventNum==E_FIGHT) { | |
- SendOldCanFireMessage(To,text); | |
- } else if (text->len>0) SendPrintMessage(NULL,C_NONE,To,text->str); | |
+ } | |
+ break; | |
+ case F_RELOAD: | |
+ if (!AttackName[0]) { | |
+ g_string_append(text, _("Guns reloaded...")); | |
+ } | |
+ break; | |
+ case F_MISS: | |
+ if (AttackName[0] && DefendName[0]) { | |
+ g_string_sprintfa(text, _("%s shoots at %s... and misses!"), | |
+ AttackName, DefendName); | |
+ } else if (AttackName[0]) { | |
+ g_string_sprintfa(text, _("%s shoots at you... and misses!"), | |
+ AttackName); | |
+ } else if (DefendName[0]) { | |
+ g_string_sprintfa(text, _("You missed %s!"), DefendName); | |
+ } | |
+ break; | |
+ case F_HIT: | |
+ if (AttackName[0] && DefendName[0]) { | |
+ if (Health == 0 && Bitches == 0) { | |
+ g_string_sprintfa(text, _("%s shoots %s dead."), | |
+ AttackName, DefendName); | |
+ } else if (BitchesKilled) { | |
+ dpg_string_sprintfa(text, _("%s shoots at %s and kills a %tde!"), | |
+ AttackName, DefendName, BitchName); | |
} else { | |
- SendOldFightPrint(To,text,fp==F_LASTLEAVE); | |
+ g_string_sprintfa(text, _("%s shoots at %s."), | |
+ AttackName, DefendName); | |
} | |
- } | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-void FormatFightMessage(Player *To,GString *text,Player *Attacker, | |
- Player *Defender,int BitchesKilled,int ArmPercent, | |
- FightPoint fp,price_t Loot) { | |
- gchar *Armament,*DefendName,*AttackName; | |
- int Health,Bitches; | |
- gchar *BitchName,*BitchesName; | |
- | |
- if (Defender && IsCop(Defender)) { | |
- BitchName=Cop[Defender->CopIndex-1].DeputyName; | |
- BitchesName=Cop[Defender->CopIndex-1].DeputiesName; | |
- } else { | |
- BitchName=Names.Bitch; | |
- BitchesName=Names.Bitches; | |
- } | |
- | |
- AttackName = (!Attacker || Attacker==To ? "" : GetPlayerName(Attacker)); | |
- DefendName = (!Defender || Defender==To ? "" : GetPlayerName(Defender)); | |
- Health = Defender ? Defender->Health : 0; | |
- Bitches = Defender ? Defender->Bitches.Carried : 0; | |
- | |
- switch(fp) { | |
- case F_ARRIVED: | |
- Armament= ArmPercent<10 ? _("pitifully armed") : | |
- ArmPercent<25 ? _("lightly armed") : | |
- ArmPercent<60 ? _("moderately well armed") : | |
- ArmPercent<80 ? _("heavily armed") : | |
- _("armed to the teeth"); | |
- if (DefendName[0]) { | |
- if (IsCop(Defender) && !AttackName[0]) { | |
- if (Bitches==0) { | |
- dpg_string_sprintfa(text,_("%s - %s - is chasing you, man!"), | |
- DefendName,Armament); | |
- } else { | |
- dpg_string_sprintfa(text, | |
- _("%s and %d %tde - %s - are chasing you, man!"), | |
- DefendName,Bitches,BitchesName,Armament); | |
- } | |
- } else { | |
- dpg_string_sprintfa(text,_("%s arrives with %d %tde, %s!"), | |
- DefendName,Bitches,BitchesName,Armament); | |
- } | |
- } | |
- break; | |
- case F_STAND: | |
- if (AttackName[0]) { | |
- g_string_sprintfa(text,_("%s stands and takes it"),AttackName); | |
- } else { | |
- g_string_append(text,_("You stand there like a dummy.")); | |
- } | |
- break; | |
- case F_FAILFLEE: | |
- if (AttackName[0]) { | |
- g_string_sprintfa(text,_("%s tries to get away, but fails."), | |
- AttackName); | |
- } else { | |
- g_string_append(text,_("Panic! You can't get away!")); | |
- } | |
- break; | |
- case F_LEAVE: case F_LASTLEAVE: | |
- if (Attacker->Health>0) { | |
- if (AttackName[0]) { | |
- if (!IsCop(Attacker) && brandom(0,100)<70 && Attacker->IsAt>=0)… | |
- g_string_sprintfa(text,_("%s has got away to %s!"),AttackNam… | |
- Location[(int)Attacker->IsAt].Name); | |
- } else { | |
- g_string_sprintfa(text,_("%s has got away!"),AttackName); | |
- } | |
- } else { | |
- g_string_sprintfa(text,_("You got away!")); | |
- } | |
- } | |
- break; | |
- case F_RELOAD: | |
- if (!AttackName[0]) { | |
- g_string_append(text,_("Guns reloaded...")); | |
- } | |
- break; | |
- case F_MISS: | |
- if (AttackName[0] && DefendName[0]) { | |
- g_string_sprintfa(text,_("%s shoots at %s... and misses!"), | |
- AttackName,DefendName); | |
- } else if (AttackName[0]) { | |
- g_string_sprintfa(text,_("%s shoots at you... and misses!"), | |
- AttackName); | |
- } else if (DefendName[0]) { | |
- g_string_sprintfa(text,_("You missed %s!"),DefendName); | |
- } | |
- break; | |
- case F_HIT: | |
- if (AttackName[0] && DefendName[0]) { | |
- if (Health==0 && Bitches==0) { | |
- g_string_sprintfa(text,_("%s shoots %s dead."), | |
- AttackName,DefendName); | |
- } else if (BitchesKilled) { | |
- dpg_string_sprintfa(text,_("%s shoots at %s and kills a %tde!"), | |
- AttackName,DefendName,BitchName); | |
- } else { | |
- g_string_sprintfa(text,_("%s shoots at %s."), | |
- AttackName,DefendName); | |
- } | |
- } else if (AttackName[0]) { | |
- if (Health==0 && Bitches==0) { | |
- g_string_sprintfa(text,_("%s wasted you, man! What a drag!"), | |
- AttackName); | |
- } else if (BitchesKilled) { | |
- dpg_string_sprintfa(text, | |
- _("%s shoots at you... and kills a %tde!"), | |
- AttackName,BitchName); | |
- } else { | |
- g_string_sprintfa(text,_("%s hits you, man!"),AttackName); | |
- } | |
- } else if (DefendName[0]) { | |
- if (Health==0 && Bitches==0) { | |
- g_string_sprintfa(text,_("You killed %s!"),DefendName); | |
- } else if (BitchesKilled) { | |
- dpg_string_sprintfa(text,_("You hit %s, and killed a %tde!"), | |
- DefendName,BitchName); | |
- } else { | |
- g_string_sprintfa(text,_("You hit %s!"),DefendName); | |
- } | |
- if (Loot>0) { | |
- dpg_string_sprintfa(text,_(" You find %P on the body!"),Loot); | |
- } else if (Loot<0) { | |
- g_string_append(text,_(" You loot the body!")); | |
- } | |
- } | |
-/* if (Health>0) g_string_sprintfa(text,_(" (Health: %d)"),Health);*/ | |
- break; | |
- case F_MSG: | |
- break; | |
- } | |
+ } else if (AttackName[0]) { | |
+ if (Health == 0 && Bitches == 0) { | |
+ g_string_sprintfa(text, _("%s wasted you, man! What a drag!"), | |
+ AttackName); | |
+ } else if (BitchesKilled) { | |
+ dpg_string_sprintfa(text, | |
+ _("%s shoots at you... and kills a %tde!"), | |
+ AttackName, BitchName); | |
+ } else { | |
+ g_string_sprintfa(text, _("%s hits you, man!"), AttackName); | |
+ } | |
+ } else if (DefendName[0]) { | |
+ if (Health == 0 && Bitches == 0) { | |
+ g_string_sprintfa(text, _("You killed %s!"), DefendName); | |
+ } else if (BitchesKilled) { | |
+ dpg_string_sprintfa(text, _("You hit %s, and killed a %tde!"), | |
+ DefendName, BitchName); | |
+ } else { | |
+ g_string_sprintfa(text, _("You hit %s!"), DefendName); | |
+ } | |
+ if (Loot > 0) { | |
+ dpg_string_sprintfa(text, _(" You find %P on the body!"), Loot); | |
+ } else if (Loot < 0) { | |
+ g_string_append(text, _(" You loot the body!")); | |
+ } | |
+ } | |
+ break; | |
+ case F_MSG: | |
+ break; | |
+ } | |
} | |
diff --git a/src/message.h b/src/message.h | |
t@@ -1,23 +1,24 @@ | |
-/* message.h Header file for dopewars message-handling routines */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * message.h Header file for dopewars message-handling routines * | |
+ * 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 __MESSAGE_H__ | |
#define __MESSAGE_H__ | |
t@@ -32,23 +33,23 @@ | |
#include "network.h" | |
typedef enum { | |
- C_PRINTMESSAGE = 'A', | |
- C_LIST, C_ENDLIST, C_NEWNAME, C_MSG, C_MSGTO, C_JOIN, C_LEAVE, | |
- C_SUBWAYFLASH, C_UPDATE, C_DRUGHERE, C_GUNSHOP, C_LOANSHARK, | |
- C_BANK, C_QUESTION, C_UNUSED, C_HISCORE, C_STARTHISCORE, C_ENDHISCORE, | |
- C_BUYOBJECT, C_DONE, C_REQUESTJET, C_PAYLOAN, C_ANSWER, C_DEPOSIT, C_PUSH, | |
- C_QUIT = 'a', | |
- C_RENAME, C_NAME, C_SACKBITCH, C_TIPOFF, C_SPYON, C_WANTQUIT, | |
- C_CONTACTSPY, C_KILL, C_REQUESTSCORE, C_INIT, C_DATA, | |
- C_FIGHTPRINT, C_FIGHTACT, C_TRADE, C_CHANGEDISP, | |
- C_NETMESSAGE, C_ABILITIES | |
+ C_PRINTMESSAGE = 'A', | |
+ C_LIST, C_ENDLIST, C_NEWNAME, C_MSG, C_MSGTO, C_JOIN, C_LEAVE, | |
+ C_SUBWAYFLASH, C_UPDATE, C_DRUGHERE, C_GUNSHOP, C_LOANSHARK, | |
+ C_BANK, C_QUESTION, C_UNUSED, C_HISCORE, C_STARTHISCORE, C_ENDHISCORE, | |
+ C_BUYOBJECT, C_DONE, C_REQUESTJET, C_PAYLOAN, C_ANSWER, C_DEPOSIT, C_PUSH, | |
+ C_QUIT = 'a', | |
+ C_RENAME, C_NAME, C_SACKBITCH, C_TIPOFF, C_SPYON, C_WANTQUIT, | |
+ C_CONTACTSPY, C_KILL, C_REQUESTSCORE, C_INIT, C_DATA, | |
+ C_FIGHTPRINT, C_FIGHTACT, C_TRADE, C_CHANGEDISP, | |
+ C_NETMESSAGE, C_ABILITIES | |
} MsgCode; | |
typedef enum { | |
- C_NONE = 'A', | |
- C_ASKLOAN, C_COPSMESG, C_ASKBITCH, C_ASKGUN, C_ASKGUNSHOP, | |
- C_ASKPUB, C_ASKBANK, C_ASKRUN, C_ASKRUNFIGHT, C_ASKSEW, | |
- C_MEETPLAYER, C_FIGHT, C_FIGHTDONE | |
+ C_NONE = 'A', | |
+ C_ASKLOAN, C_COPSMESG, C_ASKBITCH, C_ASKGUN, C_ASKGUNSHOP, | |
+ C_ASKPUB, C_ASKBANK, C_ASKRUN, C_ASKRUNFIGHT, C_ASKSEW, | |
+ C_MEETPLAYER, C_FIGHT, C_FIGHTDONE | |
} AICode; | |
#define DT_LOCATION 'A' | |
t@@ -57,86 +58,88 @@ typedef enum { | |
#define DT_PRICES 'D' | |
typedef enum { | |
- F_ARRIVED = 'A', F_STAND = 'S', F_HIT = 'H', | |
- F_MISS = 'M', F_RELOAD = 'R', F_LEAVE = 'L', | |
- F_LASTLEAVE = 'D', F_FAILFLEE = 'F', F_MSG = 'G' | |
+ F_ARRIVED = 'A', F_STAND = 'S', F_HIT = 'H', | |
+ F_MISS = 'M', F_RELOAD = 'R', F_LEAVE = 'L', | |
+ F_LASTLEAVE = 'D', F_FAILFLEE = 'F', F_MSG = 'G' | |
} FightPoint; | |
-void SendClientMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data); | |
-void SendNullClientMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data); | |
-void DoSendClientMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data,Player *BufOwn); | |
-void SendServerMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data); | |
-void SendPrintMessage(Player *From,AICode AI,Player *To,char *Data); | |
-void SendQuestion(Player *From,AICode AI,Player *To,char *Data); | |
+void SendClientMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data); | |
+void SendNullClientMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data); | |
+void DoSendClientMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data, Player *BufOwn); | |
+void SendServerMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data); | |
+void SendPrintMessage(Player *From, AICode AI, Player *To, char *Data); | |
+void SendQuestion(Player *From, AICode AI, Player *To, char *Data); | |
#if NETWORKING | |
-gboolean PlayerHandleNetwork(Player *Play,gboolean ReadReady, | |
- gboolean WriteReady,gboolean *DoneOK); | |
+gboolean PlayerHandleNetwork(Player *Play, gboolean ReadReady, | |
+ gboolean WriteReady, gboolean *DoneOK); | |
gboolean ReadPlayerDataFromWire(Player *Play); | |
-void QueuePlayerMessageForSend(Player *Play,gchar *data); | |
+void QueuePlayerMessageForSend(Player *Play, gchar *data); | |
gboolean WritePlayerDataToWire(Player *Play); | |
gchar *GetWaitingPlayerMessage(Player *Play); | |
gboolean OpenMetaHttpConnection(HttpConnection **conn); | |
-gboolean HandleWaitingMetaServerData(HttpConnection *conn,GSList **listpt, | |
+gboolean HandleWaitingMetaServerData(HttpConnection *conn, GSList **listpt, | |
gboolean *doneOK); | |
void ClearServerList(GSList **listpt); | |
#endif /* NETWORKING */ | |
extern GSList *FirstClient; | |
-extern void (*ClientMessageHandlerPt) (char *,Player *); | |
+extern void (*ClientMessageHandlerPt) (char *, Player *); | |
-void AddURLEnc(GString *str,gchar *unenc); | |
+void AddURLEnc(GString *str, gchar *unenc); | |
void chomp(char *str); | |
-void BroadcastToClients(AICode AI,MsgCode Code,char *Data,Player *From, | |
+void BroadcastToClients(AICode AI, MsgCode Code, char *Data, Player *From, | |
Player *Except); | |
-void SendInventory(Player *From,AICode AI,MsgCode Code,Player *To, | |
- Inventory *Guns,Inventory *Drugs); | |
-void ReceiveInventory(char *Data,Inventory *Guns,Inventory *Drugs); | |
+void SendInventory(Player *From, AICode AI, MsgCode Code, Player *To, | |
+ Inventory *Guns, Inventory *Drugs); | |
+void ReceiveInventory(char *Data, Inventory *Guns, Inventory *Drugs); | |
void SendPlayerData(Player *To); | |
-void SendSpyReport(Player *To,Player *SpiedOn); | |
-void ReceivePlayerData(Player *Play,char *text,Player *From); | |
+void SendSpyReport(Player *To, Player *SpiedOn); | |
+void ReceivePlayerData(Player *Play, char *text, Player *From); | |
void SendInitialData(Player *To); | |
-void ReceiveInitialData(Player *Play,char *data); | |
+void ReceiveInitialData(Player *Play, char *data); | |
void SendMiscData(Player *To); | |
void ReceiveMiscData(char *Data); | |
-gchar *GetNextWord(gchar **Data,gchar *Default); | |
-void AssignNextWord(gchar **Data,gchar **Dest); | |
-int GetNextInt(gchar **Data,int Default); | |
-price_t GetNextPrice(gchar **Data,price_t Default); | |
+gchar *GetNextWord(gchar **Data, gchar *Default); | |
+void AssignNextWord(gchar **Data, gchar **Dest); | |
+int GetNextInt(gchar **Data, int Default); | |
+price_t GetNextPrice(gchar **Data, price_t Default); | |
void ShutdownNetwork(Player *Play); | |
void SwitchToSinglePlayer(Player *Play); | |
-int ProcessMessage(char *Msg,Player *Play,Player **Other,AICode *AI, | |
- MsgCode *Code,char **Data,GSList *First); | |
-void ReceiveDrugsHere(char *text,Player *To); | |
-gboolean HandleGenericClientMessage(Player *From,AICode AI,MsgCode Code, | |
- Player *To,char *Data,DispMode *DisplayMode); | |
+int ProcessMessage(char *Msg, Player *Play, Player **Other, AICode *AI, | |
+ MsgCode *Code, char **Data, GSList *First); | |
+void ReceiveDrugsHere(char *text, Player *To); | |
+gboolean HandleGenericClientMessage(Player *From, AICode AI, MsgCode Code, | |
+ Player *To, char *Data, | |
+ DispMode *DisplayMode); | |
void InitAbilities(Player *Play); | |
void SendAbilities(Player *Play); | |
-void ReceiveAbilities(Player *Play,gchar *Data); | |
+void ReceiveAbilities(Player *Play, gchar *Data); | |
void CombineAbilities(Player *Play); | |
-void SetAbility(Player *Play,gint Type,gboolean Set); | |
-gboolean HaveAbility(Player *Play,gint Type); | |
+void SetAbility(Player *Play, gint Type, gboolean Set); | |
+gboolean HaveAbility(Player *Play, gint Type); | |
void SendFightReload(Player *To); | |
-void SendOldCanFireMessage(Player *To,GString *text); | |
-void SendOldFightPrint(Player *To,GString *text,gboolean FightOver); | |
-void SendFightLeave(Player *Play,gboolean FightOver); | |
-void ReceiveFightMessage(gchar *Data,gchar **AttackName,gchar **DefendName, | |
- int *DefendHealth,int *DefendBitches, | |
- gchar **BitchName, | |
- int *BitchesKilled,int *ArmPercent, | |
- FightPoint *fp,gboolean *CanRunHere, | |
- gboolean *Loot,gboolean *CanFire,gchar **Message); | |
-void SendFightMessage(Player *Attacker,Player *Defender, | |
- int BitchesKilled,FightPoint fp, | |
- price_t Loot,gboolean Broadcast,gchar *Msg); | |
-void FormatFightMessage(Player *To,GString *text,Player *Attacker, | |
- Player *Defender,int BitchesKilled,int ArmPercent, | |
- FightPoint fp,price_t Loot); | |
+void SendOldCanFireMessage(Player *To, GString *text); | |
+void SendOldFightPrint(Player *To, GString *text, gboolean FightOver); | |
+void SendFightLeave(Player *Play, gboolean FightOver); | |
+void ReceiveFightMessage(gchar *Data, gchar **AttackName, | |
+ gchar **DefendName, int *DefendHealth, | |
+ int *DefendBitches, gchar **BitchName, | |
+ int *BitchesKilled, int *ArmPercent, | |
+ FightPoint *fp, gboolean *CanRunHere, | |
+ gboolean *Loot, gboolean *CanFire, | |
+ gchar **Message); | |
+void SendFightMessage(Player *Attacker, Player *Defender, | |
+ int BitchesKilled, FightPoint fp, price_t Loot, | |
+ gboolean Broadcast, gchar *Msg); | |
+void FormatFightMessage(Player *To, GString *text, Player *Attacker, | |
+ Player *Defender, int BitchesKilled, | |
+ int ArmPercent, FightPoint fp, price_t Loot); | |
#endif /* __MESSAGE_H__ */ | |
diff --git a/src/network.c b/src/network.c | |
t@@ -1,22 +1,24 @@ | |
-/* network.c Low-level networking routines */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * network.c Low-level networking routines * | |
+ * 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> | |
t@@ -25,189 +27,227 @@ | |
#ifdef NETWORKING | |
#ifdef CYGWIN | |
-#include <windows.h> /* For datatypes such as BOOL */ | |
-#include <winsock.h> /* For network functions */ | |
+#include <windows.h> /* For datatypes such as BOOL */ | |
+#include <winsock.h> /* For network functions */ | |
#else | |
-#include <sys/types.h> /* For size_t etc. */ | |
-#include <sys/socket.h> /* For struct sockaddr etc. */ | |
-#include <netinet/in.h> /* For struct sockaddr_in etc. */ | |
-#include <arpa/inet.h> /* For socklen_t */ | |
-#include <pwd.h> /* For getpwuid */ | |
-#include <string.h> /* For memcpy, strlen etc. */ | |
+#include <sys/types.h> /* For size_t etc. */ | |
+#include <sys/socket.h> /* For struct sockaddr etc. */ | |
+#include <netinet/in.h> /* For struct sockaddr_in etc. */ | |
+#include <arpa/inet.h> /* For socklen_t */ | |
+#include <pwd.h> /* For getpwuid */ | |
+#include <string.h> /* For memcpy, strlen etc. */ | |
#ifdef HAVE_UNISTD_H | |
-#include <unistd.h> /* For close(), various types and constants */ | |
+#include <unistd.h> /* For close(), various types and | |
+ * constants */ | |
#endif | |
#ifdef HAVE_FCNTL_H | |
-#include <fcntl.h> /* For fcntl() */ | |
+#include <fcntl.h> /* For fcntl() */ | |
#endif | |
-#include <netdb.h> /* For gethostbyname() */ | |
+#include <netdb.h> /* For gethostbyname() */ | |
#endif /* CYGWIN */ | |
#include <glib.h> | |
-#include <errno.h> /* For errno and Unix error codes */ | |
-#include <stdlib.h> /* For exit() and atoi() */ | |
-#include <stdio.h> /* For perror() */ | |
+#include <errno.h> /* For errno and Unix error codes */ | |
+#include <stdlib.h> /* For exit() and atoi() */ | |
+#include <stdio.h> /* For perror() */ | |
#include "error.h" | |
#include "network.h" | |
#include "nls.h" | |
/* Maximum sizes (in bytes) of read and write buffers - connections should | |
- be dropped if either buffer is filled */ | |
+ * be dropped if either buffer is filled */ | |
#define MAXREADBUF (32768) | |
#define MAXWRITEBUF (65536) | |
/* SOCKS5 authentication method codes */ | |
typedef enum { | |
- SM_NOAUTH = 0, /* No authentication required */ | |
- SM_GSSAPI = 1, /* GSSAPI */ | |
- SM_USERPASSWD = 2 /* Username/password authentication */ | |
+ SM_NOAUTH = 0, /* No authentication required */ | |
+ SM_GSSAPI = 1, /* GSSAPI */ | |
+ SM_USERPASSWD = 2 /* Username/password authentication */ | |
} SocksMethods; | |
-static gboolean StartSocksNegotiation(NetworkBuffer *NetBuf,gchar *RemoteHost, | |
+static gboolean StartSocksNegotiation(NetworkBuffer *NetBuf, | |
+ gchar *RemoteHost, | |
unsigned RemotePort); | |
-static gboolean StartConnect(int *fd,gchar *RemoteHost,unsigned RemotePort, | |
- gboolean *doneOK,LastError **error); | |
+static gboolean StartConnect(int *fd, gchar *RemoteHost, | |
+ unsigned RemotePort, gboolean *doneOK, | |
+ LastError **error); | |
#ifdef CYGWIN | |
-void StartNetworking() { | |
+void StartNetworking() | |
+{ | |
WSADATA wsaData; | |
LastError *error; | |
GString *errstr; | |
- if (WSAStartup(MAKEWORD(1,0),&wsaData)!=0) { | |
- error = NewError(ET_WINSOCK,WSAGetLastError(),NULL); | |
+ if (WSAStartup(MAKEWORD(1, 0), &wsaData) != 0) { | |
+ error = NewError(ET_WINSOCK, WSAGetLastError(), NULL); | |
errstr = g_string_new(""); | |
- g_string_assign_error(errstr,error); | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL,_("Cannot initialise WinSock (%s)!"), | |
+ g_string_assign_error(errstr, error); | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, _("Cannot initialise WinSock (%s)!"), | |
errstr->str); | |
- g_string_free(errstr,TRUE); | |
+ g_string_free(errstr, TRUE); | |
FreeError(error); | |
exit(1); | |
} | |
} | |
-void StopNetworking() { | |
+void StopNetworking() | |
+{ | |
WSACleanup(); | |
} | |
-void SetReuse(SOCKET sock) { | |
- BOOL i=TRUE; | |
- if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&i,sizeof(i))==-1) { | |
- perror("setsockopt"); exit(1); | |
+void SetReuse(SOCKET sock) | |
+{ | |
+ BOOL i = TRUE; | |
+ | |
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&i, | |
+ sizeof(i)) == -1) { | |
+ perror("setsockopt"); | |
+ exit(1); | |
} | |
} | |
-void SetBlocking(SOCKET sock,gboolean blocking) { | |
+void SetBlocking(SOCKET sock, gboolean blocking) | |
+{ | |
unsigned long param; | |
+ | |
param = blocking ? 0 : 1; | |
- ioctlsocket(sock,FIONBIO,¶m); | |
+ ioctlsocket(sock, FIONBIO, ¶m); | |
} | |
#else | |
-void StartNetworking() {} | |
-void StopNetworking() {} | |
+void StartNetworking() | |
+{ | |
+} | |
+ | |
+void StopNetworking() | |
+{ | |
+} | |
+ | |
+void SetReuse(int sock) | |
+{ | |
+ int i = 1; | |
-void SetReuse(int sock) { | |
- int i=1; | |
- if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i))==-1) { | |
- perror("setsockopt"); exit(1); | |
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)) == -1) { | |
+ perror("setsockopt"); | |
+ exit(1); | |
} | |
} | |
-void SetBlocking(int sock,gboolean blocking) { | |
- fcntl(sock,F_SETFL,blocking ? 0 : O_NONBLOCK); | |
+void SetBlocking(int sock, gboolean blocking) | |
+{ | |
+ fcntl(sock, F_SETFL, blocking ? 0 : O_NONBLOCK); | |
} | |
#endif /* CYGWIN */ | |
-static gboolean FinishConnect(int fd,LastError **error); | |
- | |
-static void NetBufCallBack(NetworkBuffer *NetBuf,gboolean CallNow) { | |
- if (NetBuf && NetBuf->CallBack) { | |
- (*NetBuf->CallBack)(NetBuf,NetBuf->status!=NBS_PRECONNECT, | |
- (NetBuf->status==NBS_CONNECTED && | |
- NetBuf->WriteBuf.DataPresent) || | |
- (NetBuf->status==NBS_SOCKSCONNECT && | |
- NetBuf->negbuf.DataPresent) || | |
- NetBuf->WaitConnect,CallNow); | |
- } | |
+static gboolean FinishConnect(int fd, LastError **error); | |
+ | |
+static void NetBufCallBack(NetworkBuffer *NetBuf, gboolean CallNow) | |
+{ | |
+ if (NetBuf && NetBuf->CallBack) { | |
+ (*NetBuf->CallBack) (NetBuf, NetBuf->status != NBS_PRECONNECT, | |
+ (NetBuf->status == NBS_CONNECTED | |
+ && NetBuf->WriteBuf.DataPresent) | |
+ || (NetBuf->status == NBS_SOCKSCONNECT | |
+ && NetBuf->negbuf.DataPresent) | |
+ || NetBuf->WaitConnect, CallNow); | |
+ } | |
} | |
-static void NetBufCallBackStop(NetworkBuffer *NetBuf) { | |
- if (NetBuf && NetBuf->CallBack) { | |
- (*NetBuf->CallBack)(NetBuf,FALSE,FALSE,FALSE); | |
- } | |
+static void NetBufCallBackStop(NetworkBuffer *NetBuf) | |
+{ | |
+ if (NetBuf && NetBuf->CallBack) { | |
+ (*NetBuf->CallBack) (NetBuf, FALSE, FALSE, FALSE); | |
+ } | |
} | |
-static void InitConnBuf(ConnBuf *buf) { | |
- buf->Data=NULL; | |
- buf->Length=0; | |
- buf->DataPresent=0; | |
+static void InitConnBuf(ConnBuf *buf) | |
+{ | |
+ buf->Data = NULL; | |
+ buf->Length = 0; | |
+ buf->DataPresent = 0; | |
} | |
-static void FreeConnBuf(ConnBuf *buf) { | |
- g_free(buf->Data); | |
- InitConnBuf(buf); | |
+static void FreeConnBuf(ConnBuf *buf) | |
+{ | |
+ g_free(buf->Data); | |
+ InitConnBuf(buf); | |
} | |
-void InitNetworkBuffer(NetworkBuffer *NetBuf,char Terminator,char StripChar, | |
- SocksServer *socks) { | |
-/* Initialises the passed network buffer, ready for use. Messages sent */ | |
-/* or received on the buffered connection will be terminated by the */ | |
-/* given character, and if they end in "StripChar" it will be removed */ | |
-/* before the messages are sent or received. */ | |
- NetBuf->fd=-1; | |
- NetBuf->InputTag=0; | |
- NetBuf->CallBack=NULL; | |
- NetBuf->CallBackData=NULL; | |
- NetBuf->Terminator=Terminator; | |
- NetBuf->StripChar=StripChar; | |
- InitConnBuf(&NetBuf->ReadBuf); | |
- InitConnBuf(&NetBuf->WriteBuf); | |
- InitConnBuf(&NetBuf->negbuf); | |
- NetBuf->WaitConnect=FALSE; | |
- NetBuf->status = NBS_PRECONNECT; | |
- NetBuf->socks = socks; | |
- NetBuf->host = NULL; | |
- NetBuf->userpasswd = NULL; | |
- NetBuf->error = NULL; | |
+/* | |
+ * Initialises the passed network buffer, ready for use. Messages sent | |
+ * or received on the buffered connection will be terminated by the | |
+ * given character, and if they end in "StripChar" it will be removed | |
+ * before the messages are sent or received. | |
+ */ | |
+void InitNetworkBuffer(NetworkBuffer *NetBuf, char Terminator, | |
+ char StripChar, SocksServer *socks) | |
+{ | |
+ NetBuf->fd = -1; | |
+ NetBuf->InputTag = 0; | |
+ NetBuf->CallBack = NULL; | |
+ NetBuf->CallBackData = NULL; | |
+ NetBuf->Terminator = Terminator; | |
+ NetBuf->StripChar = StripChar; | |
+ InitConnBuf(&NetBuf->ReadBuf); | |
+ InitConnBuf(&NetBuf->WriteBuf); | |
+ InitConnBuf(&NetBuf->negbuf); | |
+ NetBuf->WaitConnect = FALSE; | |
+ NetBuf->status = NBS_PRECONNECT; | |
+ NetBuf->socks = socks; | |
+ NetBuf->host = NULL; | |
+ NetBuf->userpasswd = NULL; | |
+ NetBuf->error = NULL; | |
} | |
-void SetNetworkBufferCallBack(NetworkBuffer *NetBuf,NBCallBack CallBack, | |
- gpointer CallBackData) { | |
- NetBufCallBackStop(NetBuf); | |
- NetBuf->CallBack=CallBack; | |
- NetBuf->CallBackData=CallBackData; | |
- NetBufCallBack(NetBuf,FALSE); | |
+void SetNetworkBufferCallBack(NetworkBuffer *NetBuf, NBCallBack CallBack, | |
+ gpointer CallBackData) | |
+{ | |
+ NetBufCallBackStop(NetBuf); | |
+ NetBuf->CallBack = CallBack; | |
+ NetBuf->CallBackData = CallBackData; | |
+ NetBufCallBack(NetBuf, FALSE); | |
} | |
+/* | |
+ * Sets the function used to obtain a username and password for SOCKS5 | |
+ * username/password authentication. | |
+ */ | |
void SetNetworkBufferUserPasswdFunc(NetworkBuffer *NetBuf, | |
- NBUserPasswd userpasswd,gpointer data) { | |
-/* Sets the function used to obtain a username and password for SOCKS5 */ | |
-/* username/password authentication */ | |
- NetBuf->userpasswd=userpasswd; | |
- NetBuf->userpasswddata=data; | |
+ NBUserPasswd userpasswd, gpointer data) | |
+{ | |
+ NetBuf->userpasswd = userpasswd; | |
+ NetBuf->userpasswddata = data; | |
} | |
-void BindNetworkBufferToSocket(NetworkBuffer *NetBuf,int fd) { | |
-/* Sets up the given network buffer to handle data being sent/received */ | |
-/* through the given socket */ | |
- NetBuf->fd=fd; | |
- SetBlocking(fd,FALSE); /* We only deal with non-blocking sockets */ | |
- NetBuf->status=NBS_CONNECTED; /* Assume the socket is connected */ | |
+/* | |
+ * Sets up the given network buffer to handle data being sent/received | |
+ * through the given socket. | |
+ */ | |
+void BindNetworkBufferToSocket(NetworkBuffer *NetBuf, int fd) | |
+{ | |
+ NetBuf->fd = fd; | |
+ SetBlocking(fd, FALSE); /* We only deal with non-blocking sockets */ | |
+ NetBuf->status = NBS_CONNECTED; /* Assume the socket is connected */ | |
} | |
-gboolean IsNetworkBufferActive(NetworkBuffer *NetBuf) { | |
-/* Returns TRUE if the pointer is to a valid network buffer, and it's */ | |
-/* connected to an active socket. */ | |
- return (NetBuf && NetBuf->fd>=0); | |
+/* | |
+ * Returns TRUE if the pointer is to a valid network buffer, and it's | |
+ * connected to an active socket. | |
+ */ | |
+gboolean IsNetworkBufferActive(NetworkBuffer *NetBuf) | |
+{ | |
+ return (NetBuf && NetBuf->fd >= 0); | |
} | |
-gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf,gchar *RemoteHost, | |
- unsigned RemotePort) { | |
+gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf, | |
+ gchar *RemoteHost, unsigned RemotePort) | |
+{ | |
gchar *realhost; | |
unsigned realport; | |
gboolean doneOK; | |
t@@ -222,23 +262,25 @@ gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf… | |
realport = RemotePort; | |
} | |
- if (StartConnect(&NetBuf->fd,realhost,realport,&doneOK,&NetBuf->error)) { | |
-/* If we connected immediately, then set status, otherwise signal that we're | |
- waiting for the connect to complete */ | |
+ if (StartConnect(&NetBuf->fd, realhost, realport, &doneOK, | |
+ &NetBuf->error)) { | |
+ /* If we connected immediately, then set status, otherwise signal that | |
+ * we're waiting for the connect to complete */ | |
if (doneOK) { | |
NetBuf->status = NetBuf->socks ? NBS_SOCKSCONNECT : NBS_CONNECTED; | |
NetBuf->sockstat = NBSS_METHODS; | |
} else { | |
- NetBuf->WaitConnect=TRUE; | |
+ NetBuf->WaitConnect = TRUE; | |
} | |
- if (NetBuf->socks && !StartSocksNegotiation(NetBuf,RemoteHost,RemotePort))… | |
+ if (NetBuf->socks | |
+ && !StartSocksNegotiation(NetBuf, RemoteHost, RemotePort)) { | |
return FALSE; | |
} | |
-/* Notify the owner if necessary to check for the connection completing | |
- and/or for data to be writeable */ | |
- NetBufCallBack(NetBuf,FALSE); | |
+ /* Notify the owner if necessary to check for the connection | |
+ * completing and/or for data to be writeable */ | |
+ NetBufCallBack(NetBuf, FALSE); | |
return TRUE; | |
} else { | |
t@@ -246,896 +288,1034 @@ gboolean StartNetworkBufferConnect(NetworkBuffer *Net… | |
} | |
} | |
-void ShutdownNetworkBuffer(NetworkBuffer *NetBuf) { | |
-/* Frees the network buffer's data structures (leaving it in the */ | |
-/* 'initialised' state) and closes the accompanying socket. */ | |
- | |
- NetBufCallBackStop(NetBuf); | |
+/* | |
+ * Frees the network buffer's data structures (leaving it in the | |
+ * 'initialised' state) and closes the accompanying socket. | |
+ */ | |
+void ShutdownNetworkBuffer(NetworkBuffer *NetBuf) | |
+{ | |
+ NetBufCallBackStop(NetBuf); | |
- if (NetBuf->fd>=0) CloseSocket(NetBuf->fd); | |
+ if (NetBuf->fd >= 0) | |
+ CloseSocket(NetBuf->fd); | |
- FreeConnBuf(&NetBuf->ReadBuf); | |
- FreeConnBuf(&NetBuf->WriteBuf); | |
- FreeConnBuf(&NetBuf->negbuf); | |
+ FreeConnBuf(&NetBuf->ReadBuf); | |
+ FreeConnBuf(&NetBuf->WriteBuf); | |
+ FreeConnBuf(&NetBuf->negbuf); | |
- FreeError(NetBuf->error); NetBuf->error=NULL; | |
+ FreeError(NetBuf->error); | |
+ NetBuf->error = NULL; | |
- g_free(NetBuf->host); | |
+ g_free(NetBuf->host); | |
- InitNetworkBuffer(NetBuf,NetBuf->Terminator,NetBuf->StripChar,NetBuf->socks… | |
+ InitNetworkBuffer(NetBuf, NetBuf->Terminator, NetBuf->StripChar, | |
+ NetBuf->socks); | |
} | |
-void SetSelectForNetworkBuffer(NetworkBuffer *NetBuf,fd_set *readfds, | |
- fd_set *writefds,fd_set *errorfds,int *MaxSock)… | |
-/* Updates the sets of read and write file descriptors to monitor */ | |
-/* input to/output from the given network buffer. MaxSock is updated */ | |
-/* with the highest-numbered file descriptor (plus 1) for use in a */ | |
-/* later select() call. */ | |
- if (!NetBuf || NetBuf->fd<=0) return; | |
- FD_SET(NetBuf->fd,readfds); | |
- if (errorfds) FD_SET(NetBuf->fd,errorfds); | |
- if (NetBuf->fd >= *MaxSock) *MaxSock=NetBuf->fd+1; | |
- if ((NetBuf->status==NBS_CONNECTED && NetBuf->WriteBuf.DataPresent) || | |
- (NetBuf->status==NBS_SOCKSCONNECT && NetBuf->negbuf.DataPresent) || | |
- NetBuf->WaitConnect) { | |
- FD_SET(NetBuf->fd,writefds); | |
- } | |
+/* | |
+ * Updates the sets of read and write file descriptors to monitor | |
+ * input to/output from the given network buffer. MaxSock is updated | |
+ * with the highest-numbered file descriptor (plus 1) for use in a | |
+ * later select() call. | |
+ */ | |
+void SetSelectForNetworkBuffer(NetworkBuffer *NetBuf, fd_set *readfds, | |
+ fd_set *writefds, fd_set *errorfds, | |
+ int *MaxSock) | |
+{ | |
+ if (!NetBuf || NetBuf->fd <= 0) | |
+ return; | |
+ FD_SET(NetBuf->fd, readfds); | |
+ if (errorfds) | |
+ FD_SET(NetBuf->fd, errorfds); | |
+ if (NetBuf->fd >= *MaxSock) | |
+ *MaxSock = NetBuf->fd + 1; | |
+ if ((NetBuf->status == NBS_CONNECTED && NetBuf->WriteBuf.DataPresent) | |
+ || (NetBuf->status == NBS_SOCKSCONNECT && NetBuf->negbuf.DataPresent) | |
+ || NetBuf->WaitConnect) { | |
+ FD_SET(NetBuf->fd, writefds); | |
+ } | |
} | |
typedef enum { | |
- SEC_5FAILURE = 1, | |
- SEC_5RULESET = 2, | |
- SEC_5NETDOWN = 3, | |
- SEC_5UNREACH = 4, | |
- SEC_5CONNREF = 5, | |
- SEC_5TTLEXPIRED = 6, | |
- SEC_5COMMNOSUPP = 7, | |
- SEC_5ADDRNOSUPP = 8, | |
- | |
- SEC_REJECT = 91, | |
- SEC_NOIDENTD = 92, | |
- SEC_IDMISMATCH = 93, | |
- | |
- SEC_UNKNOWN = 200, | |
- SEC_AUTHFAILED, | |
- SEC_USERCANCEL, | |
- SEC_ADDRTYPE, | |
- SEC_REPLYVERSION, | |
- SEC_VERSION, | |
- SEC_NOMETHODS | |
+ SEC_5FAILURE = 1, | |
+ SEC_5RULESET = 2, | |
+ SEC_5NETDOWN = 3, | |
+ SEC_5UNREACH = 4, | |
+ SEC_5CONNREF = 5, | |
+ SEC_5TTLEXPIRED = 6, | |
+ SEC_5COMMNOSUPP = 7, | |
+ SEC_5ADDRNOSUPP = 8, | |
+ | |
+ SEC_REJECT = 91, | |
+ SEC_NOIDENTD = 92, | |
+ SEC_IDMISMATCH = 93, | |
+ | |
+ SEC_UNKNOWN = 200, | |
+ SEC_AUTHFAILED, | |
+ SEC_USERCANCEL, | |
+ SEC_ADDRTYPE, | |
+ SEC_REPLYVERSION, | |
+ SEC_VERSION, | |
+ SEC_NOMETHODS | |
} SocksErrorCode; | |
static ErrTable SocksErrStr[] = { | |
-/* SOCKS version 5 error messages */ | |
- { SEC_5FAILURE,N_("SOCKS server general failure") }, | |
- { SEC_5RULESET,N_("Connection denied by SOCKS ruleset") }, | |
- { SEC_5NETDOWN,N_("SOCKS: Network unreachable") }, | |
- { SEC_5UNREACH,N_("SOCKS: Host unreachable") }, | |
- { SEC_5CONNREF,N_("SOCKS: Connection refused") }, | |
- { SEC_5TTLEXPIRED,N_("SOCKS: TTL expired") }, | |
- { SEC_5COMMNOSUPP,N_("SOCKS: Command not supported") }, | |
- { SEC_5ADDRNOSUPP,N_("SOCKS: Address type not supported") }, | |
- { SEC_NOMETHODS,N_("SOCKS server rejected all offered methods") }, | |
- { SEC_ADDRTYPE,N_("Unknown SOCKS address type returned") }, | |
- { SEC_AUTHFAILED,N_("SOCKS authentication failed") }, | |
- { SEC_USERCANCEL,N_("SOCKS authentication cancelled by user") }, | |
- | |
-/* SOCKS version 4 error messages */ | |
- { SEC_REJECT,N_("SOCKS: Request rejected or failed") }, | |
- { SEC_NOIDENTD,N_("SOCKS: Rejected - unable to contact identd") }, | |
- { SEC_IDMISMATCH,N_("SOCKS: Rejected - identd reports different user-id") }, | |
- | |
-/* SOCKS errors due to protocol violations */ | |
- { SEC_UNKNOWN,N_("Unknown SOCKS reply code") }, | |
- { SEC_REPLYVERSION,N_("Unknown SOCKS reply version code") }, | |
- { SEC_VERSION,N_("Unknown SOCKS server version") }, | |
- { 0,NULL } | |
+ /* SOCKS version 5 error messages */ | |
+ {SEC_5FAILURE, N_("SOCKS server general failure")}, | |
+ {SEC_5RULESET, N_("Connection denied by SOCKS ruleset")}, | |
+ {SEC_5NETDOWN, N_("SOCKS: Network unreachable")}, | |
+ {SEC_5UNREACH, N_("SOCKS: Host unreachable")}, | |
+ {SEC_5CONNREF, N_("SOCKS: Connection refused")}, | |
+ {SEC_5TTLEXPIRED, N_("SOCKS: TTL expired")}, | |
+ {SEC_5COMMNOSUPP, N_("SOCKS: Command not supported")}, | |
+ {SEC_5ADDRNOSUPP, N_("SOCKS: Address type not supported")}, | |
+ {SEC_NOMETHODS, N_("SOCKS server rejected all offered methods")}, | |
+ {SEC_ADDRTYPE, N_("Unknown SOCKS address type returned")}, | |
+ {SEC_AUTHFAILED, N_("SOCKS authentication failed")}, | |
+ {SEC_USERCANCEL, N_("SOCKS authentication cancelled by user")}, | |
+ | |
+ /* SOCKS version 4 error messages */ | |
+ {SEC_REJECT, N_("SOCKS: Request rejected or failed")}, | |
+ {SEC_NOIDENTD, N_("SOCKS: Rejected - unable to contact identd")}, | |
+ {SEC_IDMISMATCH, | |
+ N_("SOCKS: Rejected - identd reports different user-id")}, | |
+ | |
+ /* SOCKS errors due to protocol violations */ | |
+ {SEC_UNKNOWN, N_("Unknown SOCKS reply code")}, | |
+ {SEC_REPLYVERSION, N_("Unknown SOCKS reply version code")}, | |
+ {SEC_VERSION, N_("Unknown SOCKS server version")}, | |
+ {0, NULL} | |
}; | |
-static void SocksAppendError(GString *str,LastError *error) { | |
- LookupErrorCode(str,error->code,SocksErrStr,_("SOCKS error code %d")); | |
+static void SocksAppendError(GString *str, LastError *error) | |
+{ | |
+ LookupErrorCode(str, error->code, SocksErrStr, _("SOCKS error code %d")); | |
} | |
-static ErrorType ETSocks = { SocksAppendError,NULL }; | |
+static ErrorType ETSocks = { SocksAppendError, NULL }; | |
typedef enum { | |
- HEC_TRIESEX = 1, | |
+ HEC_TRIESEX = 1, | |
HEC_BADAUTH, | |
HEC_BADREDIR, | |
HEC_BADSTATUS, | |
- HEC_OK = 200, | |
- HEC_REDIRECT = 300, | |
- HEC_MOVEPERM = 301, | |
- HEC_MOVETEMP = 302, | |
+ HEC_OK = 200, | |
+ HEC_REDIRECT = 300, | |
+ HEC_MOVEPERM = 301, | |
+ HEC_MOVETEMP = 302, | |
HEC_CLIENTERR = 400, | |
- HEC_AUTHREQ = 401, | |
+ HEC_AUTHREQ = 401, | |
HEC_PROXYAUTH = 407, | |
HEC_FORBIDDEN = 403, | |
- HEC_NOTFOUND = 404, | |
+ HEC_NOTFOUND = 404, | |
HEC_SERVERERR = 500 | |
} HTTPErrorCode; | |
-static void HTTPAppendError(GString *str,LastError *error) { | |
+static void HTTPAppendError(GString *str, LastError *error) | |
+{ | |
switch (error->code) { | |
- case HEC_TRIESEX: | |
-/* Various HTTP error messages */ | |
- g_string_append(str,_("Number of tries exceeded")); | |
- break; | |
- case HEC_BADAUTH: | |
- g_string_sprintfa(str,_("Bad auth header: %s"),(gchar *)error->data); | |
- break; | |
- case HEC_BADREDIR: | |
- g_string_sprintfa(str,_("Bad redirect: %s"),(gchar *)error->data); | |
- break; | |
- case HEC_BADSTATUS: | |
- g_string_sprintfa(str,_("Invalid HTTP status line: %s"), | |
- (gchar *)error->data); | |
- break; | |
- case HEC_FORBIDDEN: | |
- g_string_append(str,_("403: forbidden")); | |
- break; | |
- case HEC_NOTFOUND: | |
- g_string_append(str,_("404: page not found")); | |
- break; | |
- case HEC_AUTHREQ: | |
- g_string_append(str,_("401: HTTP authentication failed")); | |
- break; | |
- case HEC_PROXYAUTH: | |
- g_string_append(str,_("407: HTTP proxy authentication failed")); | |
- break; | |
- case HEC_MOVETEMP: case HEC_MOVEPERM: | |
- g_string_append(str,_("Bad redirect message from server")); | |
- break; | |
- default: | |
- if (error->code<HEC_REDIRECT || error->code>=600) { | |
- g_string_sprintfa(str,_("Unknown HTTP error %d"),error->code); | |
- } else if (error->code<HEC_CLIENTERR) { | |
- g_string_sprintfa(str,_("%d: redirect error"),error->code); | |
- } else if (error->code<HEC_SERVERERR) { | |
- g_string_sprintfa(str,_("%d: HTTP client error"),error->code); | |
- } else { | |
- g_string_sprintfa(str,_("%d: HTTP server error"),error->code); | |
- } | |
- break; | |
+ case HEC_TRIESEX: | |
+ /* Various HTTP error messages */ | |
+ g_string_append(str, _("Number of tries exceeded")); | |
+ break; | |
+ case HEC_BADAUTH: | |
+ g_string_sprintfa(str, _("Bad auth header: %s"), (gchar *)error->data); | |
+ break; | |
+ case HEC_BADREDIR: | |
+ g_string_sprintfa(str, _("Bad redirect: %s"), (gchar *)error->data); | |
+ break; | |
+ case HEC_BADSTATUS: | |
+ g_string_sprintfa(str, _("Invalid HTTP status line: %s"), | |
+ (gchar *)error->data); | |
+ break; | |
+ case HEC_FORBIDDEN: | |
+ g_string_append(str, _("403: forbidden")); | |
+ break; | |
+ case HEC_NOTFOUND: | |
+ g_string_append(str, _("404: page not found")); | |
+ break; | |
+ case HEC_AUTHREQ: | |
+ g_string_append(str, _("401: HTTP authentication failed")); | |
+ break; | |
+ case HEC_PROXYAUTH: | |
+ g_string_append(str, _("407: HTTP proxy authentication failed")); | |
+ break; | |
+ case HEC_MOVETEMP: | |
+ case HEC_MOVEPERM: | |
+ g_string_append(str, _("Bad redirect message from server")); | |
+ break; | |
+ default: | |
+ if (error->code < HEC_REDIRECT || error->code >= 600) { | |
+ g_string_sprintfa(str, _("Unknown HTTP error %d"), error->code); | |
+ } else if (error->code < HEC_CLIENTERR) { | |
+ g_string_sprintfa(str, _("%d: redirect error"), error->code); | |
+ } else if (error->code < HEC_SERVERERR) { | |
+ g_string_sprintfa(str, _("%d: HTTP client error"), error->code); | |
+ } else { | |
+ g_string_sprintfa(str, _("%d: HTTP server error"), error->code); | |
+ } | |
+ break; | |
} | |
} | |
-static ErrorType ETHTTP = { HTTPAppendError,NULL }; | |
+static ErrorType ETHTTP = { HTTPAppendError, NULL }; | |
-static gboolean Socks5UserPasswd(NetworkBuffer *NetBuf) { | |
- if (!NetBuf->userpasswd) { | |
- SetError(&NetBuf->error,&ETSocks,SEC_NOMETHODS,NULL); | |
- return FALSE; | |
- } else { | |
-/* Request a username and password (the callback function should in turn | |
- call SendSocks5UserPasswd when it's done) */ | |
- NetBuf->sockstat = NBSS_USERPASSWD; | |
- (*NetBuf->userpasswd)(NetBuf,NetBuf->userpasswddata); | |
- return TRUE; | |
- } | |
+static gboolean Socks5UserPasswd(NetworkBuffer *NetBuf) | |
+{ | |
+ if (!NetBuf->userpasswd) { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_NOMETHODS, NULL); | |
+ return FALSE; | |
+ } else { | |
+ /* Request a username and password (the callback function should in | |
+ * turn call SendSocks5UserPasswd when it's done) */ | |
+ NetBuf->sockstat = NBSS_USERPASSWD; | |
+ (*NetBuf->userpasswd) (NetBuf, NetBuf->userpasswddata); | |
+ return TRUE; | |
+ } | |
} | |
-void SendSocks5UserPasswd(NetworkBuffer *NetBuf,gchar *user,gchar *password) { | |
- gchar *addpt; | |
- guint addlen; | |
- ConnBuf *conn; | |
- | |
- if (!user || !password || !user[0] || !password[0]) { | |
- SetError(&NetBuf->error,&ETSocks,SEC_USERCANCEL,NULL); | |
- NetBufCallBack(NetBuf,TRUE); | |
- return; | |
- } | |
- conn=&NetBuf->negbuf; | |
- addlen = 3 + strlen(user) + strlen(password); | |
- addpt = ExpandWriteBuffer(conn,addlen,&NetBuf->error); | |
- if (!addpt || strlen(user)>255 || strlen(password)>255) { | |
- SetError(&NetBuf->error,ET_CUSTOM,E_FULLBUF,NULL); | |
- NetBufCallBack(NetBuf,TRUE); | |
- return; | |
- } | |
- addpt[0] = 1; /* Subnegotiation version code */ | |
- addpt[1] = strlen(user); | |
- strcpy(&addpt[2],user); | |
- addpt[2+strlen(user)] = strlen(password); | |
- strcpy(&addpt[3+strlen(user)],password); | |
- | |
- CommitWriteBuffer(NetBuf,conn,addpt,addlen); | |
-} | |
+void SendSocks5UserPasswd(NetworkBuffer *NetBuf, gchar *user, | |
+ gchar *password) | |
+{ | |
+ gchar *addpt; | |
+ guint addlen; | |
+ ConnBuf *conn; | |
+ | |
+ if (!user || !password || !user[0] || !password[0]) { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_USERCANCEL, NULL); | |
+ NetBufCallBack(NetBuf, TRUE); | |
+ return; | |
+ } | |
+ conn = &NetBuf->negbuf; | |
+ addlen = 3 + strlen(user) + strlen(password); | |
+ addpt = ExpandWriteBuffer(conn, addlen, &NetBuf->error); | |
+ if (!addpt || strlen(user) > 255 || strlen(password) > 255) { | |
+ SetError(&NetBuf->error, ET_CUSTOM, E_FULLBUF, NULL); | |
+ NetBufCallBack(NetBuf, TRUE); | |
+ return; | |
+ } | |
+ addpt[0] = 1; /* Subnegotiation version code */ | |
+ addpt[1] = strlen(user); | |
+ strcpy(&addpt[2], user); | |
+ addpt[2 + strlen(user)] = strlen(password); | |
+ strcpy(&addpt[3 + strlen(user)], password); | |
-static gboolean Socks5Connect(NetworkBuffer *NetBuf) { | |
- guchar *addpt; | |
- guint addlen,hostlen; | |
- ConnBuf *conn; | |
- unsigned short int netport; | |
+ CommitWriteBuffer(NetBuf, conn, addpt, addlen); | |
+} | |
- conn=&NetBuf->negbuf; | |
- g_assert(NetBuf->host); | |
- hostlen=strlen(NetBuf->host); | |
- if (hostlen>255) return FALSE; | |
+static gboolean Socks5Connect(NetworkBuffer *NetBuf) | |
+{ | |
+ guchar *addpt; | |
+ guint addlen, hostlen; | |
+ ConnBuf *conn; | |
+ unsigned short int netport; | |
+ | |
+ conn = &NetBuf->negbuf; | |
+ g_assert(NetBuf->host); | |
+ hostlen = strlen(NetBuf->host); | |
+ if (hostlen > 255) | |
+ return FALSE; | |
- netport = htons(NetBuf->port); | |
- g_assert(sizeof(netport)==2); | |
+ netport = htons(NetBuf->port); | |
+ g_assert(sizeof(netport) == 2); | |
- addlen = hostlen + 7; | |
- addpt = ExpandWriteBuffer(conn,addlen,&NetBuf->error); | |
- if (!addpt) return FALSE; | |
- addpt[0] = 5; /* SOCKS version 5 */ | |
- addpt[1] = 1; /* CONNECT */ | |
- addpt[2] = 0; /* reserved - must be zero */ | |
- addpt[3] = 3; /* Address type - FQDN */ | |
- addpt[4] = hostlen; /* Length of address */ | |
- strcpy(&addpt[5],NetBuf->host); | |
- memcpy(&addpt[5+hostlen],&netport,sizeof(netport)); | |
+ addlen = hostlen + 7; | |
+ addpt = ExpandWriteBuffer(conn, addlen, &NetBuf->error); | |
+ if (!addpt) | |
+ return FALSE; | |
+ addpt[0] = 5; /* SOCKS version 5 */ | |
+ addpt[1] = 1; /* CONNECT */ | |
+ addpt[2] = 0; /* reserved - must be zero */ | |
+ addpt[3] = 3; /* Address type - FQDN */ | |
+ addpt[4] = hostlen; /* Length of address */ | |
+ strcpy(&addpt[5], NetBuf->host); | |
+ memcpy(&addpt[5 + hostlen], &netport, sizeof(netport)); | |
- NetBuf->sockstat = NBSS_CONNECT; | |
+ NetBuf->sockstat = NBSS_CONNECT; | |
- CommitWriteBuffer(NetBuf,conn,addpt,addlen); | |
+ CommitWriteBuffer(NetBuf, conn, addpt, addlen); | |
- return TRUE; | |
+ return TRUE; | |
} | |
-static gboolean HandleSocksReply(NetworkBuffer *NetBuf) { | |
- guchar *data; | |
- guchar addrtype; | |
- guint replylen; | |
- gboolean retval=TRUE; | |
- if (NetBuf->socks->version==5) { | |
- if (NetBuf->sockstat == NBSS_METHODS) { | |
- data = GetWaitingData(NetBuf,2); | |
- if (data) { | |
- retval=FALSE; | |
- if (data[0]!=5) { | |
- SetError(&NetBuf->error,&ETSocks,SEC_VERSION,NULL); | |
- } else if (data[1]==SM_NOAUTH) { | |
- retval=Socks5Connect(NetBuf); | |
- } else if (data[1]==SM_USERPASSWD) { | |
- retval=Socks5UserPasswd(NetBuf); | |
- } else { | |
- SetError(&NetBuf->error,&ETSocks,SEC_NOMETHODS,NULL); | |
- } | |
- g_free(data); | |
- } | |
- } else if (NetBuf->sockstat == NBSS_USERPASSWD) { | |
- data = GetWaitingData(NetBuf,2); | |
- if (data) { | |
- retval=FALSE; | |
- if (data[1]!=0) { | |
- SetError(&NetBuf->error,&ETSocks,SEC_AUTHFAILED,NULL); | |
- } else { | |
- retval=Socks5Connect(NetBuf); | |
- } | |
- g_free(data); | |
- } | |
- } else if (NetBuf->sockstat == NBSS_CONNECT) { | |
- data = PeekWaitingData(NetBuf,5); | |
- if (data) { | |
- retval=FALSE; | |
- addrtype = data[3]; | |
- if (data[0]!=5) { | |
- SetError(&NetBuf->error,&ETSocks,SEC_VERSION,NULL); | |
- } else if (data[1]>8) { | |
- SetError(&NetBuf->error,&ETSocks,SEC_UNKNOWN,NULL); | |
- } else if (data[1]!=0) { | |
- SetError(&NetBuf->error,&ETSocks,data[1],NULL); | |
- } else if (addrtype!=1 && addrtype!=3 && addrtype!=4) { | |
- SetError(&NetBuf->error,&ETSocks,SEC_ADDRTYPE,NULL); | |
- } else { | |
- retval=TRUE; | |
- replylen = 6; | |
- if (addrtype==1) replylen+=4; /* IPv4 address */ | |
- else if (addrtype==4) replylen+=16; /* IPv6 address */ | |
- else replylen+=data[4]; /* FQDN */ | |
- data = GetWaitingData(NetBuf,replylen); | |
- if (data) { | |
-/* if (addrtype==1) g_print("IPv4 address %d.%d.%d.%d\n",data[4]… | |
- else if (addrtype==4) g_print("IPv6 address\n"); | |
- else g_print("FQDN\n");*/ | |
- NetBuf->status = NBS_CONNECTED; | |
- g_free(data); | |
- NetBufCallBack(NetBuf,FALSE); /* status has changed */ | |
- } | |
- } | |
- } | |
+static gboolean HandleSocksReply(NetworkBuffer *NetBuf) | |
+{ | |
+ guchar *data; | |
+ guchar addrtype; | |
+ guint replylen; | |
+ gboolean retval = TRUE; | |
+ | |
+ if (NetBuf->socks->version == 5) { | |
+ if (NetBuf->sockstat == NBSS_METHODS) { | |
+ data = GetWaitingData(NetBuf, 2); | |
+ if (data) { | |
+ retval = FALSE; | |
+ if (data[0] != 5) { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_VERSION, NULL); | |
+ } else if (data[1] == SM_NOAUTH) { | |
+ retval = Socks5Connect(NetBuf); | |
+ } else if (data[1] == SM_USERPASSWD) { | |
+ retval = Socks5UserPasswd(NetBuf); | |
+ } else { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_NOMETHODS, NULL); | |
+ } | |
+ g_free(data); | |
+ } | |
+ } else if (NetBuf->sockstat == NBSS_USERPASSWD) { | |
+ data = GetWaitingData(NetBuf, 2); | |
+ if (data) { | |
+ retval = FALSE; | |
+ if (data[1] != 0) { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_AUTHFAILED, NULL); | |
+ } else { | |
+ retval = Socks5Connect(NetBuf); | |
+ } | |
+ g_free(data); | |
} | |
- return retval; | |
- } else { | |
- data = GetWaitingData(NetBuf,8); | |
+ } else if (NetBuf->sockstat == NBSS_CONNECT) { | |
+ data = PeekWaitingData(NetBuf, 5); | |
if (data) { | |
- retval=FALSE; | |
- if (data[0]!=0) { | |
- SetError(&NetBuf->error,&ETSocks,SEC_REPLYVERSION,NULL); | |
- } else { | |
- if (data[1]==90) { | |
- NetBuf->status = NBS_CONNECTED; | |
- NetBufCallBack(NetBuf,FALSE); /* status has changed */ | |
- retval=TRUE; | |
- } else if (data[1]>=SEC_REJECT && data[1]<=SEC_IDMISMATCH) { | |
- SetError(&NetBuf->error,&ETSocks,data[1],NULL); | |
- } else { | |
- SetError(&NetBuf->error,&ETSocks,SEC_UNKNOWN,NULL); | |
- } | |
- } | |
- g_free(data); | |
+ retval = FALSE; | |
+ addrtype = data[3]; | |
+ if (data[0] != 5) { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_VERSION, NULL); | |
+ } else if (data[1] > 8) { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_UNKNOWN, NULL); | |
+ } else if (data[1] != 0) { | |
+ SetError(&NetBuf->error, &ETSocks, data[1], NULL); | |
+ } else if (addrtype != 1 && addrtype != 3 && addrtype != 4) { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_ADDRTYPE, NULL); | |
+ } else { | |
+ retval = TRUE; | |
+ replylen = 6; | |
+ if (addrtype == 1) | |
+ replylen += 4; /* IPv4 address */ | |
+ else if (addrtype == 4) | |
+ replylen += 16; /* IPv6 address */ | |
+ else | |
+ replylen += data[4]; /* FQDN */ | |
+ data = GetWaitingData(NetBuf, replylen); | |
+ if (data) { | |
+ NetBuf->status = NBS_CONNECTED; | |
+ g_free(data); | |
+ NetBufCallBack(NetBuf, FALSE); /* status has changed */ | |
+ } | |
+ } | |
} | |
- return retval; | |
- } | |
+ } | |
+ return retval; | |
+ } else { | |
+ data = GetWaitingData(NetBuf, 8); | |
+ if (data) { | |
+ retval = FALSE; | |
+ if (data[0] != 0) { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_REPLYVERSION, NULL); | |
+ } else { | |
+ if (data[1] == 90) { | |
+ NetBuf->status = NBS_CONNECTED; | |
+ NetBufCallBack(NetBuf, FALSE); /* status has changed */ | |
+ retval = TRUE; | |
+ } else if (data[1] >= SEC_REJECT && data[1] <= SEC_IDMISMATCH) { | |
+ SetError(&NetBuf->error, &ETSocks, data[1], NULL); | |
+ } else { | |
+ SetError(&NetBuf->error, &ETSocks, SEC_UNKNOWN, NULL); | |
+ } | |
+ } | |
+ g_free(data); | |
+ } | |
+ return retval; | |
+ } | |
} | |
-static gboolean DoNetworkBufferStuff(NetworkBuffer *NetBuf,gboolean ReadReady, | |
- gboolean WriteReady,gboolean ErrorReady, | |
- gboolean *ReadOK,gboolean *WriteOK, | |
- gboolean *ErrorOK) { | |
-/* Reads and writes data if the network connection is ready. Sets the */ | |
-/* various OK variables to TRUE if no errors occurred in the relevant */ | |
-/* operations, and returns TRUE if data was read and is waiting for */ | |
-/* processing. */ | |
- gboolean DataWaiting=FALSE,ConnectDone=FALSE; | |
- gboolean retval; | |
- *ReadOK=*WriteOK=*ErrorOK=TRUE; | |
- | |
- if (ErrorReady || NetBuf->error) *ErrorOK=FALSE; | |
- else if (NetBuf->WaitConnect) { | |
- if (WriteReady) { | |
- retval=FinishConnect(NetBuf->fd,&NetBuf->error); | |
- ConnectDone=TRUE; | |
- NetBuf->WaitConnect=FALSE; | |
- | |
- if (retval) { | |
- if (NetBuf->socks) { | |
- NetBuf->status = NBS_SOCKSCONNECT; | |
- NetBuf->sockstat = NBSS_METHODS; | |
- } else { | |
- NetBuf->status = NBS_CONNECTED; | |
- } | |
- } else { | |
- NetBuf->status = NBS_PRECONNECT; | |
- *WriteOK=FALSE; | |
- } | |
+/* | |
+ * Reads and writes data if the network connection is ready. Sets the | |
+ * various OK variables to TRUE if no errors occurred in the relevant | |
+ * operations, and returns TRUE if data was read and is waiting for | |
+ * processing. | |
+ */ | |
+static gboolean DoNetworkBufferStuff(NetworkBuffer *NetBuf, | |
+ gboolean ReadReady, | |
+ gboolean WriteReady, | |
+ gboolean ErrorReady, gboolean *ReadOK, | |
+ gboolean *WriteOK, gboolean *ErrorOK) | |
+{ | |
+ gboolean DataWaiting = FALSE, ConnectDone = FALSE; | |
+ gboolean retval; | |
+ | |
+ *ReadOK = *WriteOK = *ErrorOK = TRUE; | |
+ | |
+ if (ErrorReady || NetBuf->error) | |
+ *ErrorOK = FALSE; | |
+ else if (NetBuf->WaitConnect) { | |
+ if (WriteReady) { | |
+ retval = FinishConnect(NetBuf->fd, &NetBuf->error); | |
+ ConnectDone = TRUE; | |
+ NetBuf->WaitConnect = FALSE; | |
+ | |
+ if (retval) { | |
+ if (NetBuf->socks) { | |
+ NetBuf->status = NBS_SOCKSCONNECT; | |
+ NetBuf->sockstat = NBSS_METHODS; | |
+ } else { | |
+ NetBuf->status = NBS_CONNECTED; | |
+ } | |
+ } else { | |
+ NetBuf->status = NBS_PRECONNECT; | |
+ *WriteOK = FALSE; | |
+ } | |
+ } | |
+ } else { | |
+ if (WriteReady) | |
+ *WriteOK = WriteDataToWire(NetBuf); | |
+ | |
+ if (ReadReady) { | |
+ *ReadOK = ReadDataFromWire(NetBuf); | |
+ if (NetBuf->ReadBuf.DataPresent > 0 && | |
+ NetBuf->status == NBS_SOCKSCONNECT) { | |
+ if (!HandleSocksReply(NetBuf) | |
+ || NetBuf->error) { /* From SendSocks5UserPasswd, possibly */ | |
+ *ErrorOK = FALSE; | |
+ } | |
} | |
- } else { | |
- if (WriteReady) *WriteOK=WriteDataToWire(NetBuf); | |
- | |
- if (ReadReady) { | |
- *ReadOK=ReadDataFromWire(NetBuf); | |
- if (NetBuf->ReadBuf.DataPresent>0 && | |
- NetBuf->status==NBS_SOCKSCONNECT) { | |
- if (!HandleSocksReply(NetBuf) | |
- || NetBuf->error) { /* From SendSocks5UserPasswd, possibly */ | |
- *ErrorOK=FALSE; | |
- } | |
- } | |
- if (NetBuf->ReadBuf.DataPresent>0 && | |
- NetBuf->status!=NBS_SOCKSCONNECT) { | |
- DataWaiting=TRUE; | |
- } | |
+ if (NetBuf->ReadBuf.DataPresent > 0 && | |
+ NetBuf->status != NBS_SOCKSCONNECT) { | |
+ DataWaiting = TRUE; | |
} | |
- } | |
- | |
- if (!(*ErrorOK && *WriteOK && *ReadOK)) { | |
-/* We don't want to check the socket any more */ | |
- NetBufCallBackStop(NetBuf); | |
-/* If there were errors, then the socket is now useless - so close it */ | |
- CloseSocket(NetBuf->fd); | |
- NetBuf->fd=-1; | |
- } else if (ConnectDone) { | |
-/* If we just connected, then no need to listen for write-ready status | |
- any more */ | |
- NetBufCallBack(NetBuf,FALSE); | |
- } else if (WriteReady && | |
- ((NetBuf->status==NBS_CONNECTED && | |
- NetBuf->WriteBuf.DataPresent==0) || | |
- (NetBuf->status==NBS_SOCKSCONNECT && | |
- NetBuf->negbuf.DataPresent==0))) { | |
-/* If we wrote out everything, then tell the owner so that the socket no | |
- longer needs to be checked for write-ready status */ | |
- NetBufCallBack(NetBuf,FALSE); | |
- } | |
- | |
- return DataWaiting; | |
+ } | |
+ } | |
+ | |
+ if (!(*ErrorOK && *WriteOK && *ReadOK)) { | |
+ /* We don't want to check the socket any more */ | |
+ NetBufCallBackStop(NetBuf); | |
+ /* If there were errors, then the socket is now useless - so close it */ | |
+ CloseSocket(NetBuf->fd); | |
+ NetBuf->fd = -1; | |
+ } else if (ConnectDone) { | |
+ /* If we just connected, then no need to listen for write-ready status | |
+ * any more */ | |
+ NetBufCallBack(NetBuf, FALSE); | |
+ } else if (WriteReady | |
+ && ((NetBuf->status == NBS_CONNECTED | |
+ && NetBuf->WriteBuf.DataPresent == 0) | |
+ || (NetBuf->status == NBS_SOCKSCONNECT | |
+ && NetBuf->negbuf.DataPresent == 0))) { | |
+ /* If we wrote out everything, then tell the owner so that the socket | |
+ * no longer needs to be checked for write-ready status */ | |
+ NetBufCallBack(NetBuf, FALSE); | |
+ } | |
+ | |
+ return DataWaiting; | |
} | |
-gboolean RespondToSelect(NetworkBuffer *NetBuf,fd_set *readfds, | |
- fd_set *writefds,fd_set *errorfds, | |
- gboolean *DoneOK) { | |
-/* Responds to a select() call by reading/writing data as necessary. */ | |
-/* If any data were read, TRUE is returned. "DoneOK" is set TRUE */ | |
-/* unless a fatal error (i.e. the connection was broken) occurred. */ | |
- gboolean ReadOK,WriteOK,ErrorOK; | |
- gboolean DataWaiting=FALSE; | |
- | |
- *DoneOK=TRUE; | |
- if (!NetBuf || NetBuf->fd<=0) return DataWaiting; | |
- DataWaiting=DoNetworkBufferStuff(NetBuf,FD_ISSET(NetBuf->fd,readfds), | |
- FD_ISSET(NetBuf->fd,writefds), | |
- errorfds ? FD_ISSET(NetBuf->fd,errorfds) : FALSE, | |
- &ReadOK,&WriteOK,&ErrorOK); | |
- *DoneOK=(WriteOK && ErrorOK && ReadOK); | |
- return DataWaiting; | |
+/* | |
+ * Responds to a select() call by reading/writing data as necessary. | |
+ * If any data were read, TRUE is returned. "DoneOK" is set TRUE | |
+ * unless a fatal error (i.e. the connection was broken) occurred. | |
+ */ | |
+gboolean RespondToSelect(NetworkBuffer *NetBuf, fd_set *readfds, | |
+ fd_set *writefds, fd_set *errorfds, | |
+ gboolean *DoneOK) | |
+{ | |
+ gboolean ReadOK, WriteOK, ErrorOK; | |
+ gboolean DataWaiting = FALSE; | |
+ | |
+ *DoneOK = TRUE; | |
+ if (!NetBuf || NetBuf->fd <= 0) | |
+ return DataWaiting; | |
+ DataWaiting = DoNetworkBufferStuff(NetBuf, FD_ISSET(NetBuf->fd, readfds), | |
+ FD_ISSET(NetBuf->fd, writefds), | |
+ errorfds ? FD_ISSET(NetBuf->fd, | |
+ errorfds) : FALSE, | |
+ &ReadOK, &WriteOK, &ErrorOK); | |
+ *DoneOK = (WriteOK && ErrorOK && ReadOK); | |
+ return DataWaiting; | |
} | |
-gboolean NetBufHandleNetwork(NetworkBuffer *NetBuf,gboolean ReadReady, | |
- gboolean WriteReady,gboolean *DoneOK) { | |
- gboolean ReadOK,WriteOK,ErrorOK; | |
- gboolean DataWaiting=FALSE; | |
+gboolean NetBufHandleNetwork(NetworkBuffer *NetBuf, gboolean ReadReady, | |
+ gboolean WriteReady, gboolean *DoneOK) | |
+{ | |
+ gboolean ReadOK, WriteOK, ErrorOK; | |
+ gboolean DataWaiting = FALSE; | |
- *DoneOK=TRUE; | |
- if (!NetBuf || NetBuf->fd<=0) return DataWaiting; | |
+ *DoneOK = TRUE; | |
+ if (!NetBuf || NetBuf->fd <= 0) | |
+ return DataWaiting; | |
- DataWaiting=DoNetworkBufferStuff(NetBuf,ReadReady,WriteReady,FALSE, | |
- &ReadOK,&WriteOK,&ErrorOK); | |
+ DataWaiting = DoNetworkBufferStuff(NetBuf, ReadReady, WriteReady, FALSE, | |
+ &ReadOK, &WriteOK, &ErrorOK); | |
- *DoneOK=(WriteOK && ErrorOK && ReadOK); | |
- return DataWaiting; | |
+ *DoneOK = (WriteOK && ErrorOK && ReadOK); | |
+ return DataWaiting; | |
} | |
-gint CountWaitingMessages(NetworkBuffer *NetBuf) { | |
-/* Returns the number of complete (terminated) messages waiting in the */ | |
-/* given network buffer. This is the number of times that */ | |
-/* GetWaitingMessage() can be safely called without it returning NULL. */ | |
- ConnBuf *conn; | |
- gint i,msgs=0; | |
- | |
- if (NetBuf->status!=NBS_CONNECTED) return 0; | |
+/* | |
+ * Returns the number of complete (terminated) messages waiting in the | |
+ * given network buffer. This is the number of times that | |
+ * GetWaitingMessage() can be safely called without it returning NULL. | |
+ */ | |
+gint CountWaitingMessages(NetworkBuffer *NetBuf) | |
+{ | |
+ ConnBuf *conn; | |
+ gint i, msgs = 0; | |
+ | |
+ if (NetBuf->status != NBS_CONNECTED) | |
+ return 0; | |
+ | |
+ conn = &NetBuf->ReadBuf; | |
+ | |
+ if (conn->Data) | |
+ for (i = 0; i < conn->DataPresent; i++) { | |
+ if (conn->Data[i] == NetBuf->Terminator) | |
+ msgs++; | |
+ } | |
+ return msgs; | |
+} | |
- conn=&NetBuf->ReadBuf; | |
+gchar *PeekWaitingData(NetworkBuffer *NetBuf, int numbytes) | |
+{ | |
+ ConnBuf *conn; | |
- if (conn->Data) for (i=0;i<conn->DataPresent;i++) { | |
- if (conn->Data[i]==NetBuf->Terminator) msgs++; | |
- } | |
- return msgs; | |
+ conn = &NetBuf->ReadBuf; | |
+ if (!conn->Data || conn->DataPresent < numbytes) | |
+ return NULL; | |
+ else | |
+ return conn->Data; | |
} | |
-gchar *PeekWaitingData(NetworkBuffer *NetBuf,int numbytes) { | |
- ConnBuf *conn; | |
- conn=&NetBuf->ReadBuf; | |
- if (!conn->Data || conn->DataPresent < numbytes) return NULL; | |
- else return conn->Data; | |
-} | |
+gchar *GetWaitingData(NetworkBuffer *NetBuf, int numbytes) | |
+{ | |
+ ConnBuf *conn; | |
+ gchar *data; | |
-gchar *GetWaitingData(NetworkBuffer *NetBuf,int numbytes) { | |
- ConnBuf *conn; | |
- gchar *data; | |
- conn=&NetBuf->ReadBuf; | |
- if (!conn->Data || conn->DataPresent < numbytes) return NULL; | |
+ conn = &NetBuf->ReadBuf; | |
+ if (!conn->Data || conn->DataPresent < numbytes) | |
+ return NULL; | |
- data = g_new(gchar,numbytes); | |
- memcpy(data,conn->Data,numbytes); | |
+ data = g_new(gchar, numbytes); | |
+ memcpy(data, conn->Data, numbytes); | |
- memmove(&conn->Data[0],&conn->Data[numbytes],conn->DataPresent-numbytes); | |
- conn->DataPresent-=numbytes; | |
+ memmove(&conn->Data[0], &conn->Data[numbytes], | |
+ conn->DataPresent - numbytes); | |
+ conn->DataPresent -= numbytes; | |
- return data; | |
+ return data; | |
} | |
-gchar *GetWaitingMessage(NetworkBuffer *NetBuf) { | |
-/* Reads a complete (terminated) message from the network buffer. The */ | |
-/* message is removed from the buffer, and returned as a null-terminated */ | |
-/* string (the network terminator is removed). If no complete message is */ | |
-/* waiting, NULL is returned. The string is dynamically allocated, and */ | |
-/* so must be g_free'd by the caller. */ | |
- ConnBuf *conn; | |
- int MessageLen; | |
- char *SepPt; | |
- gchar *NewMessage; | |
- conn=&NetBuf->ReadBuf; | |
- if (!conn->Data || !conn->DataPresent || NetBuf->status!=NBS_CONNECTED) { | |
- return NULL; | |
- } | |
- SepPt=memchr(conn->Data,NetBuf->Terminator,conn->DataPresent); | |
- if (!SepPt) return NULL; | |
- *SepPt='\0'; | |
- MessageLen=SepPt-conn->Data+1; | |
- SepPt--; | |
- if (NetBuf->StripChar && *SepPt==NetBuf->StripChar) *SepPt='\0'; | |
- NewMessage=g_new(gchar,MessageLen); | |
- memcpy(NewMessage,conn->Data,MessageLen); | |
- if (MessageLen<conn->DataPresent) { | |
- memmove(&conn->Data[0],&conn->Data[MessageLen], | |
- conn->DataPresent-MessageLen); | |
- } | |
- conn->DataPresent-=MessageLen; | |
- return NewMessage; | |
+/* | |
+ * Reads a complete (terminated) message from the network buffer. The | |
+ * message is removed from the buffer, and returned as a null-terminated | |
+ * string (the network terminator is removed). If no complete message is | |
+ * waiting, NULL is returned. The string is dynamically allocated, and | |
+ * so must be g_free'd by the caller. | |
+ */ | |
+gchar *GetWaitingMessage(NetworkBuffer *NetBuf) | |
+{ | |
+ ConnBuf *conn; | |
+ int MessageLen; | |
+ char *SepPt; | |
+ gchar *NewMessage; | |
+ | |
+ conn = &NetBuf->ReadBuf; | |
+ if (!conn->Data || !conn->DataPresent || NetBuf->status != NBS_CONNECTED) { | |
+ return NULL; | |
+ } | |
+ SepPt = memchr(conn->Data, NetBuf->Terminator, conn->DataPresent); | |
+ if (!SepPt) | |
+ return NULL; | |
+ *SepPt = '\0'; | |
+ MessageLen = SepPt - conn->Data + 1; | |
+ SepPt--; | |
+ if (NetBuf->StripChar && *SepPt == NetBuf->StripChar) | |
+ *SepPt = '\0'; | |
+ NewMessage = g_new(gchar, MessageLen); | |
+ | |
+ memcpy(NewMessage, conn->Data, MessageLen); | |
+ if (MessageLen < conn->DataPresent) { | |
+ memmove(&conn->Data[0], &conn->Data[MessageLen], | |
+ conn->DataPresent - MessageLen); | |
+ } | |
+ conn->DataPresent -= MessageLen; | |
+ return NewMessage; | |
} | |
-gboolean ReadDataFromWire(NetworkBuffer *NetBuf) { | |
-/* Reads any waiting data on the given network buffer's TCP/IP connection */ | |
-/* into the read buffer. Returns FALSE if the connection was closed, or */ | |
-/* if the read buffer's maximum size was reached. */ | |
- ConnBuf *conn; | |
- int CurrentPosition,BytesRead; | |
- conn=&NetBuf->ReadBuf; | |
- CurrentPosition=conn->DataPresent; | |
- while(1) { | |
- if (CurrentPosition>=conn->Length) { | |
- if (conn->Length==MAXREADBUF) { | |
- SetError(&NetBuf->error,ET_CUSTOM,E_FULLBUF,NULL); | |
- return FALSE; /* drop connection */ | |
- } | |
- if (conn->Length==0) conn->Length=256; else conn->Length*=2; | |
- if (conn->Length>MAXREADBUF) conn->Length=MAXREADBUF; | |
- conn->Data=g_realloc(conn->Data,conn->Length); | |
+/* | |
+ * Reads any waiting data on the given network buffer's TCP/IP connection | |
+ * into the read buffer. Returns FALSE if the connection was closed, or | |
+ * if the read buffer's maximum size was reached. | |
+ */ | |
+gboolean ReadDataFromWire(NetworkBuffer *NetBuf) | |
+{ | |
+ ConnBuf *conn; | |
+ int CurrentPosition, BytesRead; | |
+ | |
+ conn = &NetBuf->ReadBuf; | |
+ CurrentPosition = conn->DataPresent; | |
+ while (1) { | |
+ if (CurrentPosition >= conn->Length) { | |
+ if (conn->Length == MAXREADBUF) { | |
+ SetError(&NetBuf->error, ET_CUSTOM, E_FULLBUF, NULL); | |
+ return FALSE; /* drop connection */ | |
} | |
- BytesRead=recv(NetBuf->fd,&conn->Data[CurrentPosition], | |
- conn->Length-CurrentPosition,0); | |
- if (BytesRead==SOCKET_ERROR) { | |
+ if (conn->Length == 0) | |
+ conn->Length = 256; | |
+ else | |
+ conn->Length *= 2; | |
+ if (conn->Length > MAXREADBUF) | |
+ conn->Length = MAXREADBUF; | |
+ conn->Data = g_realloc(conn->Data, conn->Length); | |
+ } | |
+ BytesRead = recv(NetBuf->fd, &conn->Data[CurrentPosition], | |
+ conn->Length - CurrentPosition, 0); | |
+ if (BytesRead == SOCKET_ERROR) { | |
#ifdef CYGWIN | |
- int Error = WSAGetLastError(); | |
- if (Error==WSAEWOULDBLOCK) break; | |
- else { SetError(&NetBuf->error,ET_WINSOCK,Error,NULL); return FALSE; } | |
+ int Error = WSAGetLastError(); | |
+ | |
+ if (Error == WSAEWOULDBLOCK) | |
+ break; | |
+ else { | |
+ SetError(&NetBuf->error, ET_WINSOCK, Error, NULL); | |
+ return FALSE; | |
+ } | |
#else | |
- if (errno==EAGAIN) break; | |
- else if (errno!=EINTR) { | |
- SetError(&NetBuf->error,ET_ERRNO,errno,NULL); | |
- return FALSE; | |
- } | |
-#endif | |
- } else if (BytesRead==0) { | |
- return FALSE; | |
- } else { | |
- CurrentPosition+=BytesRead; | |
- conn->DataPresent=CurrentPosition; | |
+ if (errno == EAGAIN) | |
+ break; | |
+ else if (errno != EINTR) { | |
+ SetError(&NetBuf->error, ET_ERRNO, errno, NULL); | |
+ return FALSE; | |
} | |
- } | |
- return TRUE; | |
+#endif | |
+ } else if (BytesRead == 0) { | |
+ return FALSE; | |
+ } else { | |
+ CurrentPosition += BytesRead; | |
+ conn->DataPresent = CurrentPosition; | |
+ } | |
+ } | |
+ return TRUE; | |
} | |
-gchar *ExpandWriteBuffer(ConnBuf *conn,int numbytes,LastError **error) { | |
+gchar *ExpandWriteBuffer(ConnBuf *conn, int numbytes, LastError **error) | |
+{ | |
int newlen; | |
+ | |
newlen = conn->DataPresent + numbytes; | |
if (newlen > conn->Length) { | |
- conn->Length*=2; | |
- conn->Length=MAX(conn->Length,newlen); | |
- if (conn->Length > MAXWRITEBUF) conn->Length=MAXWRITEBUF; | |
+ conn->Length *= 2; | |
+ conn->Length = MAX(conn->Length, newlen); | |
+ if (conn->Length > MAXWRITEBUF) | |
+ conn->Length = MAXWRITEBUF; | |
if (newlen > conn->Length) { | |
- if (error) SetError(error,ET_CUSTOM,E_FULLBUF,NULL); | |
+ if (error) | |
+ SetError(error, ET_CUSTOM, E_FULLBUF, NULL); | |
return NULL; | |
} | |
- conn->Data=g_realloc(conn->Data,conn->Length); | |
+ conn->Data = g_realloc(conn->Data, conn->Length); | |
} | |
return (&conn->Data[conn->DataPresent]); | |
} | |
-void CommitWriteBuffer(NetworkBuffer *NetBuf,ConnBuf *conn, | |
- gchar *addpt,guint addlen) { | |
- conn->DataPresent+=addlen; | |
+void CommitWriteBuffer(NetworkBuffer *NetBuf, ConnBuf *conn, | |
+ gchar *addpt, guint addlen) | |
+{ | |
+ conn->DataPresent += addlen; | |
-/* If the buffer was empty before, we may need to tell the owner to check | |
- the socket for write-ready status */ | |
- if (NetBuf && addpt==conn->Data) NetBufCallBack(NetBuf,FALSE); | |
+ /* If the buffer was empty before, we may need to tell the owner to | |
+ * check the socket for write-ready status */ | |
+ if (NetBuf && addpt == conn->Data) | |
+ NetBufCallBack(NetBuf, FALSE); | |
} | |
-void QueueMessageForSend(NetworkBuffer *NetBuf,gchar *data) { | |
-/* Writes the null-terminated string "data" to the network buffer, ready */ | |
-/* to be sent to the wire when the network connection becomes free. The */ | |
-/* message is automatically terminated. Fails to write the message without */ | |
-/* error if the buffer reaches its maximum size (although this error will */ | |
-/* be detected when an attempt is made to write the buffer to the wire). */ | |
- gchar *addpt; | |
- guint addlen; | |
- ConnBuf *conn; | |
- conn=&NetBuf->WriteBuf; | |
- | |
- if (!data) return; | |
- addlen = strlen(data)+1; | |
- addpt = ExpandWriteBuffer(conn,addlen,NULL); | |
- if (!addpt) return; | |
- | |
- memcpy(addpt,data,addlen); | |
- addpt[addlen-1]=NetBuf->Terminator; | |
- | |
- CommitWriteBuffer(NetBuf,conn,addpt,addlen); | |
+/* | |
+ * Writes the null-terminated string "data" to the network buffer, ready | |
+ * to be sent to the wire when the network connection becomes free. The | |
+ * message is automatically terminated. Fails to write the message without | |
+ * error if the buffer reaches its maximum size (although this error will | |
+ * be detected when an attempt is made to write the buffer to the wire). | |
+ */ | |
+void QueueMessageForSend(NetworkBuffer *NetBuf, gchar *data) | |
+{ | |
+ gchar *addpt; | |
+ guint addlen; | |
+ ConnBuf *conn; | |
+ | |
+ conn = &NetBuf->WriteBuf; | |
+ | |
+ if (!data) | |
+ return; | |
+ addlen = strlen(data) + 1; | |
+ addpt = ExpandWriteBuffer(conn, addlen, NULL); | |
+ if (!addpt) | |
+ return; | |
+ | |
+ memcpy(addpt, data, addlen); | |
+ addpt[addlen - 1] = NetBuf->Terminator; | |
+ | |
+ CommitWriteBuffer(NetBuf, conn, addpt, addlen); | |
} | |
-static struct hostent *LookupHostname(gchar *host,LastError **error) { | |
- struct hostent *he; | |
- if ((he=gethostbyname(host))==NULL) { | |
+static struct hostent *LookupHostname(gchar *host, LastError **error) | |
+{ | |
+ struct hostent *he; | |
+ | |
+ if ((he = gethostbyname(host)) == NULL) { | |
#ifdef CYGWIN | |
- if (error) SetError(error,ET_WINSOCK,WSAGetLastError(),NULL); | |
+ if (error) | |
+ SetError(error, ET_WINSOCK, WSAGetLastError(), NULL); | |
#else | |
- if (error) SetError(error,ET_HERRNO,h_errno,NULL); | |
+ if (error) | |
+ SetError(error, ET_HERRNO, h_errno, NULL); | |
#endif | |
- } | |
- return he; | |
+ } | |
+ return he; | |
} | |
-gboolean StartSocksNegotiation(NetworkBuffer *NetBuf,gchar *RemoteHost, | |
- unsigned RemotePort) { | |
- guint num_methods; | |
- ConnBuf *conn; | |
- struct hostent *he; | |
- guchar *addpt; | |
- guint addlen,i; | |
- struct in_addr *haddr; | |
- unsigned short int netport; | |
- gchar *username=NULL; | |
+gboolean StartSocksNegotiation(NetworkBuffer *NetBuf, gchar *RemoteHost, | |
+ unsigned RemotePort) | |
+{ | |
+ guint num_methods; | |
+ ConnBuf *conn; | |
+ struct hostent *he; | |
+ guchar *addpt; | |
+ guint addlen, i; | |
+ struct in_addr *haddr; | |
+ unsigned short int netport; | |
+ gchar *username = NULL; | |
+ | |
#ifdef CYGWIN | |
- DWORD bufsize; | |
+ DWORD bufsize; | |
#else | |
- struct passwd *pwd; | |
+ struct passwd *pwd; | |
#endif | |
- conn=&NetBuf->negbuf; | |
+ conn = &NetBuf->negbuf; | |
- if (NetBuf->socks->version==5) { | |
- num_methods=1; | |
- if (NetBuf->userpasswd) num_methods++; | |
- addlen=2+num_methods; | |
- addpt = ExpandWriteBuffer(conn,addlen,&NetBuf->error); | |
- if (!addpt) return FALSE; | |
- addpt[0] = 5; /* SOCKS version 5 */ | |
- addpt[1] = num_methods; | |
- i=2; | |
- addpt[i++] = SM_NOAUTH; | |
- if (NetBuf->userpasswd) addpt[i++] = SM_USERPASSWD; | |
+ if (NetBuf->socks->version == 5) { | |
+ num_methods = 1; | |
+ if (NetBuf->userpasswd) | |
+ num_methods++; | |
+ addlen = 2 + num_methods; | |
+ addpt = ExpandWriteBuffer(conn, addlen, &NetBuf->error); | |
+ if (!addpt) | |
+ return FALSE; | |
+ addpt[0] = 5; /* SOCKS version 5 */ | |
+ addpt[1] = num_methods; | |
+ i = 2; | |
+ addpt[i++] = SM_NOAUTH; | |
+ if (NetBuf->userpasswd) | |
+ addpt[i++] = SM_USERPASSWD; | |
- g_free(NetBuf->host); | |
- NetBuf->host = g_strdup(RemoteHost); | |
- NetBuf->port = RemotePort; | |
+ g_free(NetBuf->host); | |
+ NetBuf->host = g_strdup(RemoteHost); | |
+ NetBuf->port = RemotePort; | |
- CommitWriteBuffer(NetBuf,conn,addpt,addlen); | |
+ CommitWriteBuffer(NetBuf, conn, addpt, addlen); | |
- return TRUE; | |
- } | |
+ return TRUE; | |
+ } | |
- he = LookupHostname(RemoteHost,&NetBuf->error); | |
- if (!he) return FALSE; | |
+ he = LookupHostname(RemoteHost, &NetBuf->error); | |
+ if (!he) | |
+ return FALSE; | |
- if (NetBuf->socks->user && NetBuf->socks->user[0]) { | |
- username = g_strdup(NetBuf->socks->user); | |
- } else { | |
+ if (NetBuf->socks->user && NetBuf->socks->user[0]) { | |
+ username = g_strdup(NetBuf->socks->user); | |
+ } else { | |
#ifdef CYGWIN | |
- bufsize=0; | |
- WNetGetUser(NULL,username,&bufsize); | |
- if (GetLastError()!=ERROR_MORE_DATA) { | |
- SetError(&NetBuf->error,ET_WIN32,GetLastError(),NULL); | |
- return FALSE; | |
- } else { | |
- username=g_malloc(bufsize); | |
- if (WNetGetUser(NULL,username,&bufsize)!=NO_ERROR) { | |
- SetError(&NetBuf->error,ET_WIN32,GetLastError(),NULL); | |
- return FALSE; | |
- } | |
- } | |
+ bufsize = 0; | |
+ WNetGetUser(NULL, username, &bufsize); | |
+ if (GetLastError() != ERROR_MORE_DATA) { | |
+ SetError(&NetBuf->error, ET_WIN32, GetLastError(), NULL); | |
+ return FALSE; | |
+ } else { | |
+ username = g_malloc(bufsize); | |
+ if (WNetGetUser(NULL, username, &bufsize) != NO_ERROR) { | |
+ SetError(&NetBuf->error, ET_WIN32, GetLastError(), NULL); | |
+ return FALSE; | |
+ } | |
+ } | |
#else | |
- if (NetBuf->socks->numuid) { | |
- username=g_strdup_printf("%d",getuid()); | |
- } else { | |
- pwd = getpwuid(getuid()); | |
- if (!pwd || !pwd->pw_name) return FALSE; | |
- username=g_strdup(pwd->pw_name); | |
- } | |
+ if (NetBuf->socks->numuid) { | |
+ username = g_strdup_printf("%d", getuid()); | |
+ } else { | |
+ pwd = getpwuid(getuid()); | |
+ if (!pwd || !pwd->pw_name) | |
+ return FALSE; | |
+ username = g_strdup(pwd->pw_name); | |
+ } | |
#endif | |
- } | |
- addlen=9+strlen(username); | |
+ } | |
+ addlen = 9 + strlen(username); | |
- haddr = (struct in_addr *)he->h_addr; | |
- g_assert(sizeof(struct in_addr)==4); | |
+ haddr = (struct in_addr *)he->h_addr; | |
+ g_assert(sizeof(struct in_addr) == 4); | |
- netport = htons(RemotePort); | |
- g_assert(sizeof(netport)==2); | |
+ netport = htons(RemotePort); | |
+ g_assert(sizeof(netport) == 2); | |
- addpt = ExpandWriteBuffer(conn,addlen,&NetBuf->error); | |
- if (!addpt) return FALSE; | |
+ addpt = ExpandWriteBuffer(conn, addlen, &NetBuf->error); | |
+ if (!addpt) | |
+ return FALSE; | |
- addpt[0] = 4; /* SOCKS version */ | |
- addpt[1] = 1; /* CONNECT */ | |
- memcpy(&addpt[2],&netport,sizeof(netport)); | |
- memcpy(&addpt[4],haddr,sizeof(struct in_addr)); | |
- strcpy(&addpt[8],username); | |
- g_free(username); | |
- addpt[addlen-1] = '\0'; | |
+ addpt[0] = 4; /* SOCKS version */ | |
+ addpt[1] = 1; /* CONNECT */ | |
+ memcpy(&addpt[2], &netport, sizeof(netport)); | |
+ memcpy(&addpt[4], haddr, sizeof(struct in_addr)); | |
+ strcpy(&addpt[8], username); | |
+ g_free(username); | |
+ addpt[addlen - 1] = '\0'; | |
- CommitWriteBuffer(NetBuf,conn,addpt,addlen); | |
+ CommitWriteBuffer(NetBuf, conn, addpt, addlen); | |
- return TRUE; | |
+ return TRUE; | |
} | |
-static gboolean WriteBufToWire(NetworkBuffer *NetBuf,ConnBuf *conn) { | |
- int CurrentPosition,BytesSent; | |
- if (!conn->Data || !conn->DataPresent) return TRUE; | |
- if (conn->Length==MAXWRITEBUF) { | |
- SetError(&NetBuf->error,ET_CUSTOM,E_FULLBUF,NULL); | |
- return FALSE; | |
- } | |
- CurrentPosition=0; | |
- while (CurrentPosition<conn->DataPresent) { | |
- BytesSent=send(NetBuf->fd,&conn->Data[CurrentPosition], | |
- conn->DataPresent-CurrentPosition,0); | |
- if (BytesSent==SOCKET_ERROR) { | |
+static gboolean WriteBufToWire(NetworkBuffer *NetBuf, ConnBuf *conn) | |
+{ | |
+ int CurrentPosition, BytesSent; | |
+ | |
+ if (!conn->Data || !conn->DataPresent) | |
+ return TRUE; | |
+ if (conn->Length == MAXWRITEBUF) { | |
+ SetError(&NetBuf->error, ET_CUSTOM, E_FULLBUF, NULL); | |
+ return FALSE; | |
+ } | |
+ CurrentPosition = 0; | |
+ while (CurrentPosition < conn->DataPresent) { | |
+ BytesSent = send(NetBuf->fd, &conn->Data[CurrentPosition], | |
+ conn->DataPresent - CurrentPosition, 0); | |
+ if (BytesSent == SOCKET_ERROR) { | |
#ifdef CYGWIN | |
- int Error=WSAGetLastError(); | |
- if (Error==WSAEWOULDBLOCK) break; | |
- else { SetError(&NetBuf->error,ET_WINSOCK,Error,NULL); return FALSE; } | |
+ int Error = WSAGetLastError(); | |
+ | |
+ if (Error == WSAEWOULDBLOCK) | |
+ break; | |
+ else { | |
+ SetError(&NetBuf->error, ET_WINSOCK, Error, NULL); | |
+ return FALSE; | |
+ } | |
#else | |
- if (errno==EAGAIN) break; | |
- else if (errno!=EINTR) { | |
- SetError(&NetBuf->error,ET_ERRNO,errno,NULL); | |
- return FALSE; | |
- } | |
-#endif | |
- } else { | |
- CurrentPosition+=BytesSent; | |
+ if (errno == EAGAIN) | |
+ break; | |
+ else if (errno != EINTR) { | |
+ SetError(&NetBuf->error, ET_ERRNO, errno, NULL); | |
+ return FALSE; | |
} | |
- } | |
- if (CurrentPosition>0 && CurrentPosition<conn->DataPresent) { | |
- memmove(&conn->Data[0],&conn->Data[CurrentPosition], | |
- conn->DataPresent-CurrentPosition); | |
- } | |
- conn->DataPresent-=CurrentPosition; | |
- return TRUE; | |
+#endif | |
+ } else { | |
+ CurrentPosition += BytesSent; | |
+ } | |
+ } | |
+ if (CurrentPosition > 0 && CurrentPosition < conn->DataPresent) { | |
+ memmove(&conn->Data[0], &conn->Data[CurrentPosition], | |
+ conn->DataPresent - CurrentPosition); | |
+ } | |
+ conn->DataPresent -= CurrentPosition; | |
+ return TRUE; | |
} | |
-gboolean WriteDataToWire(NetworkBuffer *NetBuf) { | |
-/* Writes any waiting data in the network buffer to the wire. Returns */ | |
-/* TRUE on success, or FALSE if the buffer's maximum length is */ | |
-/* reached, or the remote end has closed the connection. */ | |
- if (NetBuf->status==NBS_SOCKSCONNECT) { | |
- return WriteBufToWire(NetBuf,&NetBuf->negbuf); | |
- } else { | |
- return WriteBufToWire(NetBuf,&NetBuf->WriteBuf); | |
- } | |
+/* | |
+ * Writes any waiting data in the network buffer to the wire. Returns | |
+ * TRUE on success, or FALSE if the buffer's maximum length is | |
+ * reached, or the remote end has closed the connection. | |
+ */ | |
+gboolean WriteDataToWire(NetworkBuffer *NetBuf) | |
+{ | |
+ if (NetBuf->status == NBS_SOCKSCONNECT) { | |
+ return WriteBufToWire(NetBuf, &NetBuf->negbuf); | |
+ } else { | |
+ return WriteBufToWire(NetBuf, &NetBuf->WriteBuf); | |
+ } | |
} | |
-static void SendHttpRequest(HttpConnection *conn) { | |
- GString *text; | |
- char *userpasswd; | |
+static void SendHttpRequest(HttpConnection *conn) | |
+{ | |
+ GString *text; | |
+ char *userpasswd; | |
- conn->Tries++; | |
- conn->StatusCode=0; | |
- conn->Status=HS_CONNECTING; | |
+ conn->Tries++; | |
+ conn->StatusCode = 0; | |
+ conn->Status = HS_CONNECTING; | |
- text=g_string_new(""); | |
+ text = g_string_new(""); | |
- g_string_sprintf(text,"%s http://%s:%u%s HTTP/1.0", | |
- conn->Method,conn->HostName,conn->Port,conn->Query); | |
- QueueMessageForSend(&conn->NetBuf,text->str); | |
+ g_string_sprintf(text, "%s http://%s:%u%s HTTP/1.0", | |
+ conn->Method, conn->HostName, conn->Port, conn->Query); | |
+ QueueMessageForSend(&conn->NetBuf, text->str); | |
- if (conn->Headers) QueueMessageForSend(&conn->NetBuf,conn->Headers); | |
+ if (conn->Headers) | |
+ QueueMessageForSend(&conn->NetBuf, conn->Headers); | |
- if (conn->user && conn->password) { | |
- userpasswd = g_strdup_printf("%s:%s",conn->user,conn->password); | |
- g_string_assign(text,"Authorization: Basic "); | |
- AddB64Enc(text,userpasswd); | |
- g_free(userpasswd); | |
- QueueMessageForSend(&conn->NetBuf,text->str); | |
- } | |
- if (conn->proxyuser && conn->proxypassword) { | |
- userpasswd = g_strdup_printf("%s:%s",conn->proxyuser,conn->proxypassword… | |
- g_string_assign(text,"Proxy-Authenticate: Basic "); | |
- AddB64Enc(text,userpasswd); | |
- g_free(userpasswd); | |
- QueueMessageForSend(&conn->NetBuf,text->str); | |
- } | |
+ if (conn->user && conn->password) { | |
+ userpasswd = g_strdup_printf("%s:%s", conn->user, conn->password); | |
+ g_string_assign(text, "Authorization: Basic "); | |
+ AddB64Enc(text, userpasswd); | |
+ g_free(userpasswd); | |
+ QueueMessageForSend(&conn->NetBuf, text->str); | |
+ } | |
+ if (conn->proxyuser && conn->proxypassword) { | |
+ userpasswd = | |
+ g_strdup_printf("%s:%s", conn->proxyuser, conn->proxypassword); | |
+ g_string_assign(text, "Proxy-Authenticate: Basic "); | |
+ AddB64Enc(text, userpasswd); | |
+ g_free(userpasswd); | |
+ QueueMessageForSend(&conn->NetBuf, text->str); | |
+ } | |
- g_string_sprintf(text,"User-Agent: dopewars/%s",VERSION); | |
- QueueMessageForSend(&conn->NetBuf,text->str); | |
+ g_string_sprintf(text, "User-Agent: dopewars/%s", VERSION); | |
+ QueueMessageForSend(&conn->NetBuf, text->str); | |
-/* Insert a blank line between headers and body */ | |
- QueueMessageForSend(&conn->NetBuf,""); | |
+ /* Insert a blank line between headers and body */ | |
+ QueueMessageForSend(&conn->NetBuf, ""); | |
- if (conn->Body) QueueMessageForSend(&conn->NetBuf,conn->Body); | |
+ if (conn->Body) | |
+ QueueMessageForSend(&conn->NetBuf, conn->Body); | |
- g_string_free(text,TRUE); | |
+ g_string_free(text, TRUE); | |
} | |
-static gboolean StartHttpConnect(HttpConnection *conn) { | |
- gchar *ConnectHost; | |
- unsigned ConnectPort; | |
- | |
- if (conn->Proxy) { | |
- ConnectHost=conn->Proxy; ConnectPort=conn->ProxyPort; | |
- } else { | |
- ConnectHost=conn->HostName; ConnectPort=conn->Port; | |
- } | |
- | |
- if (!StartNetworkBufferConnect(&conn->NetBuf,ConnectHost,ConnectPort)) { | |
- return FALSE; | |
- } | |
- return TRUE; | |
-} | |
+static gboolean StartHttpConnect(HttpConnection *conn) | |
+{ | |
+ gchar *ConnectHost; | |
+ unsigned ConnectPort; | |
-gboolean OpenHttpConnection(HttpConnection **connpt,gchar *HostName, | |
- unsigned Port,gchar *Proxy,unsigned ProxyPort, | |
- SocksServer *socks, | |
- gchar *Method,gchar *Query, | |
- gchar *Headers,gchar *Body) { | |
- HttpConnection *conn; | |
- g_assert(HostName && Method && Query && connpt); | |
- | |
- conn=g_new0(HttpConnection,1); | |
- InitNetworkBuffer(&conn->NetBuf,'\n','\r',socks); | |
- conn->HostName=g_strdup(HostName); | |
- if (Proxy && Proxy[0]) conn->Proxy=g_strdup(Proxy); | |
- conn->Method=g_strdup(Method); | |
- conn->Query=g_strdup(Query); | |
- if (Headers && Headers[0]) conn->Headers=g_strdup(Headers); | |
- if (Body && Body[0]) conn->Body=g_strdup(Body); | |
- conn->Port = Port; | |
- conn->ProxyPort = ProxyPort; | |
- *connpt = conn; | |
- | |
- if (StartHttpConnect(conn)) { | |
- SendHttpRequest(conn); | |
- return TRUE; | |
- } else { | |
- return FALSE; | |
- } | |
-} | |
+ if (conn->Proxy) { | |
+ ConnectHost = conn->Proxy; | |
+ ConnectPort = conn->ProxyPort; | |
+ } else { | |
+ ConnectHost = conn->HostName; | |
+ ConnectPort = conn->Port; | |
+ } | |
-void CloseHttpConnection(HttpConnection *conn) { | |
- ShutdownNetworkBuffer(&conn->NetBuf); | |
- g_free(conn->HostName); | |
- g_free(conn->Proxy); | |
- g_free(conn->Method); | |
- g_free(conn->Query); | |
- g_free(conn->Headers); | |
- g_free(conn->Body); | |
- g_free(conn->RedirHost); | |
- g_free(conn->RedirQuery); | |
- g_free(conn->user); | |
- g_free(conn->password); | |
- g_free(conn->proxyuser); | |
- g_free(conn->proxypassword); | |
- g_free(conn); | |
+ if (!StartNetworkBufferConnect(&conn->NetBuf, ConnectHost, ConnectPort)) { | |
+ return FALSE; | |
+ } | |
+ return TRUE; | |
} | |
-void SetHttpAuthentication(HttpConnection *conn,gboolean proxy, | |
- gchar *user,gchar *password) { | |
- gchar **ptuser,**ptpassword; | |
- g_assert(conn); | |
- if (proxy) { | |
- ptuser=&conn->proxyuser; ptpassword=&conn->proxypassword; | |
- } else { | |
- ptuser=&conn->user; ptpassword=&conn->password; | |
- } | |
- g_free(*ptuser); g_free(*ptpassword); | |
- if (user && password && user[0] && password[0]) { | |
- *ptuser = g_strdup(user); | |
- *ptpassword = g_strdup(password); | |
- } else { | |
- *ptuser = *ptpassword = NULL; | |
- } | |
- conn->waitinput=FALSE; | |
- if (conn->Status==HS_WAITCOMPLETE) { | |
- NetBufCallBack(&conn->NetBuf,TRUE); | |
- } | |
+gboolean OpenHttpConnection(HttpConnection **connpt, gchar *HostName, | |
+ unsigned Port, gchar *Proxy, | |
+ unsigned ProxyPort, SocksServer *socks, | |
+ gchar *Method, gchar *Query, gchar *Headers, | |
+ gchar *Body) | |
+{ | |
+ HttpConnection *conn; | |
+ | |
+ g_assert(HostName && Method && Query && connpt); | |
+ | |
+ conn = g_new0(HttpConnection, 1); | |
+ | |
+ InitNetworkBuffer(&conn->NetBuf, '\n', '\r', socks); | |
+ conn->HostName = g_strdup(HostName); | |
+ if (Proxy && Proxy[0]) | |
+ conn->Proxy = g_strdup(Proxy); | |
+ conn->Method = g_strdup(Method); | |
+ conn->Query = g_strdup(Query); | |
+ if (Headers && Headers[0]) | |
+ conn->Headers = g_strdup(Headers); | |
+ if (Body && Body[0]) | |
+ conn->Body = g_strdup(Body); | |
+ conn->Port = Port; | |
+ conn->ProxyPort = ProxyPort; | |
+ *connpt = conn; | |
+ | |
+ if (StartHttpConnect(conn)) { | |
+ SendHttpRequest(conn); | |
+ return TRUE; | |
+ } else { | |
+ return FALSE; | |
+ } | |
} | |
-void SetHttpAuthFunc(HttpConnection *conn,HCAuthFunc authfunc,gpointer data) { | |
- g_assert(conn && authfunc); | |
- conn->authfunc = authfunc; | |
- conn->authdata = data; | |
+void CloseHttpConnection(HttpConnection *conn) | |
+{ | |
+ ShutdownNetworkBuffer(&conn->NetBuf); | |
+ g_free(conn->HostName); | |
+ g_free(conn->Proxy); | |
+ g_free(conn->Method); | |
+ g_free(conn->Query); | |
+ g_free(conn->Headers); | |
+ g_free(conn->Body); | |
+ g_free(conn->RedirHost); | |
+ g_free(conn->RedirQuery); | |
+ g_free(conn->user); | |
+ g_free(conn->password); | |
+ g_free(conn->proxyuser); | |
+ g_free(conn->proxypassword); | |
+ g_free(conn); | |
} | |
-static gboolean ParseHtmlLocation(gchar *uri,gchar **host,unsigned *port, | |
- gchar **query) { | |
- gchar *uris,*colon,*slash; | |
+void SetHttpAuthentication(HttpConnection *conn, gboolean proxy, | |
+ gchar *user, gchar *password) | |
+{ | |
+ gchar **ptuser, **ptpassword; | |
- uris = g_strstrip(uri); | |
- if (!uris || strlen(uris)<7 || | |
- g_strncasecmp(uris,"http://",7)!=0) return FALSE; | |
+ g_assert(conn); | |
+ if (proxy) { | |
+ ptuser = &conn->proxyuser; | |
+ ptpassword = &conn->proxypassword; | |
+ } else { | |
+ ptuser = &conn->user; | |
+ ptpassword = &conn->password; | |
+ } | |
+ g_free(*ptuser); | |
+ g_free(*ptpassword); | |
+ if (user && password && user[0] && password[0]) { | |
+ *ptuser = g_strdup(user); | |
+ *ptpassword = g_strdup(password); | |
+ } else { | |
+ *ptuser = *ptpassword = NULL; | |
+ } | |
+ conn->waitinput = FALSE; | |
+ if (conn->Status == HS_WAITCOMPLETE) { | |
+ NetBufCallBack(&conn->NetBuf, TRUE); | |
+ } | |
+} | |
- uris+=7; /* skip to hostname */ | |
+void SetHttpAuthFunc(HttpConnection *conn, HCAuthFunc authfunc, | |
+ gpointer data) | |
+{ | |
+ g_assert(conn && authfunc); | |
+ conn->authfunc = authfunc; | |
+ conn->authdata = data; | |
+} | |
-/* ':' denotes the port to connect to */ | |
- colon = strchr(uris,':'); | |
- if (colon && colon==uris) return FALSE; /* No hostname */ | |
+static gboolean ParseHtmlLocation(gchar *uri, gchar **host, unsigned *port, | |
+ gchar **query) | |
+{ | |
+ gchar *uris, *colon, *slash; | |
-/* '/' denotes the start of the path of the HTML file */ | |
- slash = strchr(uris,'/'); | |
- if (slash && slash==uris) return FALSE; /* No hostname */ | |
+ uris = g_strstrip(uri); | |
+ if (!uris || strlen(uris) < 7 || g_strncasecmp(uris, "http://", 7) != 0) | |
+ return FALSE; | |
- if (colon && (!slash || slash>colon)) { | |
- if (slash) *slash='\0'; | |
- *port = atoi(colon+1); | |
- if (slash) *slash='\\'; | |
- if (*port==0) return FALSE; /* Invalid port */ | |
- *host = g_strndup(uris,colon-uris); | |
+ uris += 7; /* skip to hostname */ | |
+ | |
+ /* ':' denotes the port to connect to */ | |
+ colon = strchr(uris, ':'); | |
+ if (colon && colon == uris) | |
+ return FALSE; /* No hostname */ | |
+ | |
+ /* '/' denotes the start of the path of the HTML file */ | |
+ slash = strchr(uris, '/'); | |
+ if (slash && slash == uris) | |
+ return FALSE; /* No hostname */ | |
+ | |
+ if (colon && (!slash || slash > colon)) { | |
+ if (slash) | |
+ *slash = '\0'; | |
+ *port = atoi(colon + 1); | |
+ if (slash) | |
+ *slash = '\\'; | |
+ if (*port == 0) | |
+ return FALSE; /* Invalid port */ | |
+ *host = g_strndup(uris, colon - uris); | |
} else { | |
- *port=80; | |
- if (slash) *host=g_strndup(uris,slash-uris); | |
- else *host=g_strdup(uris); | |
+ *port = 80; | |
+ if (slash) | |
+ *host = g_strndup(uris, slash - uris); | |
+ else | |
+ *host = g_strdup(uris); | |
} | |
if (slash) { | |
t@@ -1146,287 +1326,340 @@ static gboolean ParseHtmlLocation(gchar *uri,gchar *… | |
return TRUE; | |
} | |
-static void StartHttpAuth(HttpConnection *conn,gboolean proxy,gchar *header, | |
- gboolean *doneOK) { | |
- gchar *realm,**split; | |
+static void StartHttpAuth(HttpConnection *conn, gboolean proxy, | |
+ gchar *header, gboolean *doneOK) | |
+{ | |
+ gchar *realm, **split; | |
- if (!conn->authfunc) return; | |
+ if (!conn->authfunc) | |
+ return; | |
- split=g_strsplit(header," ",1); | |
+ split = g_strsplit(header, " ", 1); | |
- if (split[0] && split[1] && g_strcasecmp(split[0],"Basic")==0 && | |
- g_strncasecmp(split[1],"realm=",6)==0 && strlen(split[1])>6) { | |
- realm = &split[1][6]; | |
- conn->waitinput=TRUE; | |
- (*conn->authfunc)(conn,proxy,realm,conn->authdata); | |
- } else { | |
- *doneOK=FALSE; | |
- SetError(&conn->NetBuf.error,ÐTTP,HEC_BADAUTH,g_strdup(header)); | |
- } | |
+ if (split[0] && split[1] && g_strcasecmp(split[0], "Basic") == 0 && | |
+ g_strncasecmp(split[1], "realm=", 6) == 0 && strlen(split[1]) > 6) { | |
+ realm = &split[1][6]; | |
+ conn->waitinput = TRUE; | |
+ (*conn->authfunc) (conn, proxy, realm, conn->authdata); | |
+ } else { | |
+ *doneOK = FALSE; | |
+ SetError(&conn->NetBuf.error, ÐTTP, HEC_BADAUTH, g_strdup(header)); | |
+ } | |
- g_strfreev(split); | |
+ g_strfreev(split); | |
} | |
-static void ParseHtmlHeader(gchar *line,HttpConnection *conn,gboolean *doneOK)… | |
- gchar **split,*host,*query; | |
+static void ParseHtmlHeader(gchar *line, HttpConnection *conn, | |
+ gboolean *doneOK) | |
+{ | |
+ gchar **split, *host, *query; | |
unsigned port; | |
- split=g_strsplit(line," ",1); | |
+ split = g_strsplit(line, " ", 1); | |
if (split[0] && split[1]) { | |
- if (g_strcasecmp(split[0],"Location:")==0 && | |
- (conn->StatusCode==HEC_MOVETEMP || conn->StatusCode==HEC_MOVEPERM)) { | |
- if (ParseHtmlLocation(split[1],&host,&port,&query)) { | |
- g_free(conn->RedirHost); g_free(conn->RedirQuery); | |
- conn->RedirHost=host; conn->RedirQuery=query; | |
- conn->RedirPort=port; | |
+ if (g_strcasecmp(split[0], "Location:") == 0 && | |
+ (conn->StatusCode == HEC_MOVETEMP | |
+ || conn->StatusCode == HEC_MOVEPERM)) { | |
+ if (ParseHtmlLocation(split[1], &host, &port, &query)) { | |
+ g_free(conn->RedirHost); | |
+ g_free(conn->RedirQuery); | |
+ conn->RedirHost = host; | |
+ conn->RedirQuery = query; | |
+ conn->RedirPort = port; | |
} else { | |
- *doneOK=FALSE; | |
- SetError(&conn->NetBuf.error,ÐTTP,HEC_BADREDIR,g_strdup(line)); | |
+ *doneOK = FALSE; | |
+ SetError(&conn->NetBuf.error, ÐTTP, HEC_BADREDIR, | |
+ g_strdup(line)); | |
} | |
- } else if (g_strcasecmp(split[0],"WWW-Authenticate:")==0 && | |
- conn->StatusCode==HEC_AUTHREQ) { | |
- StartHttpAuth(conn,FALSE,split[1],doneOK); | |
-/* Proxy-Authenticate is, strictly speaking, an HTTP/1.1 thing, but some | |
- HTTP/1.0 proxies seem to support it anyway */ | |
- } else if (g_strcasecmp(split[0],"Proxy-Authenticate:")==0 && | |
- conn->StatusCode==HEC_PROXYAUTH) { | |
- StartHttpAuth(conn,TRUE,split[1],doneOK); | |
+ } else if (g_strcasecmp(split[0], "WWW-Authenticate:") == 0 && | |
+ conn->StatusCode == HEC_AUTHREQ) { | |
+ StartHttpAuth(conn, FALSE, split[1], doneOK); | |
+ } else if (g_strcasecmp(split[0], "Proxy-Authenticate:") == 0 && | |
+ conn->StatusCode == HEC_PROXYAUTH) { | |
+ /* Proxy-Authenticate is, strictly speaking, an HTTP/1.1 thing, but | |
+ * some HTTP/1.0 proxies seem to support it anyway */ | |
+ StartHttpAuth(conn, TRUE, split[1], doneOK); | |
} | |
} | |
g_strfreev(split); | |
} | |
-gchar *ReadHttpResponse(HttpConnection *conn,gboolean *doneOK) { | |
- gchar *msg,**split; | |
- | |
- msg=GetWaitingMessage(&conn->NetBuf); | |
- if (msg) switch(conn->Status) { | |
- case HS_CONNECTING: /* OK, we should have the HTTP status line */ | |
- conn->Status=HS_READHEADERS; | |
- split=g_strsplit(msg," ",2); | |
- if (split[0] && split[1]) { | |
- conn->StatusCode=atoi(split[1]); | |
- } else { | |
- *doneOK=FALSE; | |
- SetError(&conn->NetBuf.error,ÐTTP,HEC_BADSTATUS,g_strdup(msg)); | |
- } | |
- g_strfreev(split); | |
- break; | |
- case HS_READHEADERS: | |
- if (msg[0]==0) conn->Status=HS_READSEPARATOR; | |
- else ParseHtmlHeader(msg,conn,doneOK); | |
- break; | |
- case HS_READSEPARATOR: | |
- conn->Status=HS_READBODY; | |
- break; | |
- case HS_READBODY: /* At present, we do nothing special with the body */ | |
- break; | |
- case HS_WAITCOMPLETE: /* Well, we shouldn't be here at all... */ | |
- g_free(msg); msg=NULL; | |
- break; | |
- } | |
- return msg; | |
+gchar *ReadHttpResponse(HttpConnection *conn, gboolean *doneOK) | |
+{ | |
+ gchar *msg, **split; | |
+ | |
+ msg = GetWaitingMessage(&conn->NetBuf); | |
+ if (msg) | |
+ switch (conn->Status) { | |
+ case HS_CONNECTING: /* OK, we should have the HTTP status line */ | |
+ conn->Status = HS_READHEADERS; | |
+ split = g_strsplit(msg, " ", 2); | |
+ if (split[0] && split[1]) { | |
+ conn->StatusCode = atoi(split[1]); | |
+ } else { | |
+ *doneOK = FALSE; | |
+ SetError(&conn->NetBuf.error, ÐTTP, HEC_BADSTATUS, | |
+ g_strdup(msg)); | |
+ } | |
+ g_strfreev(split); | |
+ break; | |
+ case HS_READHEADERS: | |
+ if (msg[0] == 0) | |
+ conn->Status = HS_READSEPARATOR; | |
+ else | |
+ ParseHtmlHeader(msg, conn, doneOK); | |
+ break; | |
+ case HS_READSEPARATOR: | |
+ conn->Status = HS_READBODY; | |
+ break; | |
+ case HS_READBODY: /* At present, we do nothing special | |
+ * with the body */ | |
+ break; | |
+ case HS_WAITCOMPLETE: /* Well, we shouldn't be here at all... */ | |
+ g_free(msg); | |
+ msg = NULL; | |
+ break; | |
+ } | |
+ return msg; | |
} | |
-gboolean HandleHttpCompletion(HttpConnection *conn) { | |
- NBCallBack CallBack; | |
- gpointer CallBackData,userpasswddata; | |
- NBUserPasswd userpasswd; | |
- gboolean retry=FALSE; | |
- LastError **error; | |
+gboolean HandleHttpCompletion(HttpConnection *conn) | |
+{ | |
+ NBCallBack CallBack; | |
+ gpointer CallBackData, userpasswddata; | |
+ NBUserPasswd userpasswd; | |
+ gboolean retry = FALSE; | |
+ LastError **error; | |
+ | |
+ error = &conn->NetBuf.error; | |
+ | |
+ /* If we're still waiting for authentication etc., then signal that the | |
+ * connection shouldn't be closed yet, and go into the "WAITCOMPLETE" | |
+ * state */ | |
+ if (conn->waitinput) { | |
+ conn->Status = HS_WAITCOMPLETE; | |
+ return FALSE; | |
+ } | |
+ | |
+ if (conn->Tries >= 5) { | |
+ SetError(error, ÐTTP, HEC_TRIESEX, NULL); | |
+ return TRUE; | |
+ } | |
- error=&conn->NetBuf.error; | |
+ if (conn->RedirHost) { | |
+ g_free(conn->HostName); | |
+ g_free(conn->Query); | |
+ conn->HostName = conn->RedirHost; | |
+ conn->Query = conn->RedirQuery; | |
+ conn->Port = conn->RedirPort; | |
+ conn->RedirHost = conn->RedirQuery = NULL; | |
+ retry = TRUE; | |
+ } | |
+ if (conn->StatusCode == HEC_AUTHREQ && conn->user && conn->password) { | |
+ retry = TRUE; | |
+ } | |
+ if (conn->StatusCode == HEC_PROXYAUTH && conn->proxyuser && | |
+ conn->proxypassword) { | |
+ retry = TRUE; | |
+ } | |
-/* If we're still waiting for authentication etc., then signal that the | |
- connection shouldn't be closed yet, and go into the "WAITCOMPLETE" state */ | |
- if (conn->waitinput) { | |
- conn->Status = HS_WAITCOMPLETE; | |
+ if (retry) { | |
+ CallBack = conn->NetBuf.CallBack; | |
+ userpasswd = conn->NetBuf.userpasswd; | |
+ userpasswddata = conn->NetBuf.userpasswddata; | |
+ CallBackData = conn->NetBuf.CallBackData; | |
+ ShutdownNetworkBuffer(&conn->NetBuf); | |
+ if (StartHttpConnect(conn)) { | |
+ SendHttpRequest(conn); | |
+ SetNetworkBufferCallBack(&conn->NetBuf, CallBack, CallBackData); | |
+ SetNetworkBufferUserPasswdFunc(&conn->NetBuf, | |
+ userpasswd, userpasswddata); | |
return FALSE; | |
- } | |
- | |
- if (conn->Tries>=5) { | |
- SetError(error,ÐTTP,HEC_TRIESEX,NULL); | |
- return TRUE; | |
- } | |
- | |
- if (conn->RedirHost) { | |
- g_free(conn->HostName); g_free(conn->Query); | |
- conn->HostName = conn->RedirHost; | |
- conn->Query = conn->RedirQuery; | |
- conn->Port = conn->RedirPort; | |
- conn->RedirHost = conn->RedirQuery = NULL; | |
- retry = TRUE; | |
- } | |
- if (conn->StatusCode==HEC_AUTHREQ && conn->user && conn->password) { | |
- retry = TRUE; | |
- } | |
- if (conn->StatusCode==HEC_PROXYAUTH && conn->proxyuser && | |
- conn->proxypassword) { | |
- retry = TRUE; | |
- } | |
- | |
- if (retry) { | |
- CallBack=conn->NetBuf.CallBack; | |
- userpasswd=conn->NetBuf.userpasswd; | |
- userpasswddata=conn->NetBuf.userpasswddata; | |
- CallBackData=conn->NetBuf.CallBackData; | |
- ShutdownNetworkBuffer(&conn->NetBuf); | |
- if (StartHttpConnect(conn)) { | |
- SendHttpRequest(conn); | |
- SetNetworkBufferCallBack(&conn->NetBuf,CallBack,CallBackData); | |
- SetNetworkBufferUserPasswdFunc(&conn->NetBuf, | |
- userpasswd,userpasswddata); | |
- return FALSE; | |
- } | |
- } else if (conn->StatusCode>=300) { | |
- SetError(error,ÐTTP,conn->StatusCode,NULL); | |
- } | |
- return TRUE; | |
+ } | |
+ } else if (conn->StatusCode >= 300) { | |
+ SetError(error, ÐTTP, conn->StatusCode, NULL); | |
+ } | |
+ return TRUE; | |
} | |
-gboolean IsHttpError(HttpConnection *conn) { | |
- return (conn->NetBuf.error!=NULL); | |
+gboolean IsHttpError(HttpConnection *conn) | |
+{ | |
+ return (conn->NetBuf.error != NULL); | |
} | |
-int CreateTCPSocket(LastError **error) { | |
+int CreateTCPSocket(LastError **error) | |
+{ | |
int fd; | |
- fd=socket(AF_INET,SOCK_STREAM,0); | |
+ fd = socket(AF_INET, SOCK_STREAM, 0); | |
- if (fd==SOCKET_ERROR && error) { | |
+ if (fd == SOCKET_ERROR && error) { | |
#ifdef CYGWIN | |
- SetError(error,ET_WINSOCK,WSAGetLastError(),NULL); | |
+ SetError(error, ET_WINSOCK, WSAGetLastError(), NULL); | |
#else | |
- SetError(error,ET_ERRNO,errno,NULL); | |
+ SetError(error, ET_ERRNO, errno, NULL); | |
#endif | |
} | |
return fd; | |
} | |
- | |
-gboolean BindTCPSocket(int sock,unsigned port,LastError **error) { | |
+ | |
+gboolean BindTCPSocket(int sock, unsigned port, LastError **error) | |
+{ | |
struct sockaddr_in bindaddr; | |
int retval; | |
- bindaddr.sin_family=AF_INET; | |
- bindaddr.sin_port=htons(port); | |
- bindaddr.sin_addr.s_addr=INADDR_ANY; | |
- memset(bindaddr.sin_zero,0,sizeof(bindaddr.sin_zero)); | |
+ bindaddr.sin_family = AF_INET; | |
+ bindaddr.sin_port = htons(port); | |
+ bindaddr.sin_addr.s_addr = INADDR_ANY; | |
+ memset(bindaddr.sin_zero, 0, sizeof(bindaddr.sin_zero)); | |
- retval = bind(sock,(struct sockaddr *)&bindaddr,sizeof(struct sockaddr)); | |
+ retval = | |
+ bind(sock, (struct sockaddr *)&bindaddr, sizeof(struct sockaddr)); | |
- if (retval==SOCKET_ERROR && error) { | |
+ if (retval == SOCKET_ERROR && error) { | |
#ifdef CYGWIN | |
- SetError(error,ET_WINSOCK,WSAGetLastError(),NULL); | |
+ SetError(error, ET_WINSOCK, WSAGetLastError(), NULL); | |
#else | |
- SetError(error,ET_ERRNO,errno,NULL); | |
+ SetError(error, ET_ERRNO, errno, NULL); | |
#endif | |
} | |
- return (retval!=SOCKET_ERROR); | |
+ return (retval != SOCKET_ERROR); | |
} | |
-gboolean StartConnect(int *fd,gchar *RemoteHost,unsigned RemotePort, | |
- gboolean *doneOK,LastError **error) { | |
- struct sockaddr_in ClientAddr; | |
- struct hostent *he; | |
+gboolean StartConnect(int *fd, gchar *RemoteHost, unsigned RemotePort, | |
+ gboolean *doneOK, LastError **error) | |
+{ | |
+ struct sockaddr_in ClientAddr; | |
+ struct hostent *he; | |
- if (doneOK) *doneOK=FALSE; | |
- he = LookupHostname(RemoteHost,error); | |
- if (!he) return FALSE; | |
+ if (doneOK) | |
+ *doneOK = FALSE; | |
+ he = LookupHostname(RemoteHost, error); | |
+ if (!he) | |
+ return FALSE; | |
- *fd=CreateTCPSocket(error); | |
- if (*fd==SOCKET_ERROR) return FALSE; | |
+ *fd = CreateTCPSocket(error); | |
+ if (*fd == SOCKET_ERROR) | |
+ return FALSE; | |
- ClientAddr.sin_family=AF_INET; | |
- ClientAddr.sin_port=htons(RemotePort); | |
- ClientAddr.sin_addr=*((struct in_addr *)he->h_addr); | |
- memset(ClientAddr.sin_zero,0,sizeof(ClientAddr.sin_zero)); | |
+ ClientAddr.sin_family = AF_INET; | |
+ ClientAddr.sin_port = htons(RemotePort); | |
+ ClientAddr.sin_addr = *((struct in_addr *)he->h_addr); | |
+ memset(ClientAddr.sin_zero, 0, sizeof(ClientAddr.sin_zero)); | |
- SetBlocking(*fd,FALSE); | |
+ SetBlocking(*fd, FALSE); | |
- if (connect(*fd,(struct sockaddr *)&ClientAddr, | |
- sizeof(struct sockaddr))==SOCKET_ERROR) { | |
+ if (connect(*fd, (struct sockaddr *)&ClientAddr, | |
+ sizeof(struct sockaddr)) == SOCKET_ERROR) { | |
#ifdef CYGWIN | |
- int errcode=WSAGetLastError(); | |
- if (errcode==WSAEWOULDBLOCK) return TRUE; | |
- else if (error) SetError(error,ET_WINSOCK,errcode,NULL); | |
+ int errcode = WSAGetLastError(); | |
+ | |
+ if (errcode == WSAEWOULDBLOCK) | |
+ return TRUE; | |
+ else if (error) | |
+ SetError(error, ET_WINSOCK, errcode, NULL); | |
#else | |
- if (errno==EINPROGRESS) return TRUE; | |
- else if (error) SetError(error,ET_ERRNO,errno,NULL); | |
+ if (errno == EINPROGRESS) | |
+ return TRUE; | |
+ else if (error) | |
+ SetError(error, ET_ERRNO, errno, NULL); | |
#endif | |
- CloseSocket(*fd); *fd=-1; | |
- return FALSE; | |
- } else { | |
- if (doneOK) *doneOK=TRUE; | |
- } | |
- return TRUE; | |
+ CloseSocket(*fd); | |
+ *fd = -1; | |
+ return FALSE; | |
+ } else { | |
+ if (doneOK) | |
+ *doneOK = TRUE; | |
+ } | |
+ return TRUE; | |
} | |
-gboolean FinishConnect(int fd,LastError **error) { | |
- int errcode; | |
+gboolean FinishConnect(int fd, LastError **error) | |
+{ | |
+ int errcode; | |
+ | |
#ifdef CYGWIN | |
- errcode = WSAGetLastError(); | |
- if (errcode==0) return TRUE; | |
- else { | |
- if (error) { SetError(error,ET_WINSOCK,errcode,NULL); } | |
- return FALSE; | |
- } | |
+ errcode = WSAGetLastError(); | |
+ if (errcode == 0) | |
+ return TRUE; | |
+ else { | |
+ if (error) { | |
+ SetError(error, ET_WINSOCK, errcode, NULL); | |
+ } | |
+ return FALSE; | |
+ } | |
#else | |
#ifdef HAVE_SOCKLEN_T | |
- socklen_t optlen; | |
+ socklen_t optlen; | |
#else | |
- int optlen; | |
+ int optlen; | |
#endif | |
- optlen=sizeof(errcode); | |
- if (getsockopt(fd,SOL_SOCKET,SO_ERROR,&errcode,&optlen)==-1) { | |
- errcode = errno; | |
- } | |
- if (errcode==0) return TRUE; | |
- else { | |
- if (error) { SetError(error,ET_ERRNO,errcode,NULL); } | |
- return FALSE; | |
- } | |
+ optlen = sizeof(errcode); | |
+ if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &errcode, &optlen) == -1) { | |
+ errcode = errno; | |
+ } | |
+ if (errcode == 0) | |
+ return TRUE; | |
+ else { | |
+ if (error) { | |
+ SetError(error, ET_ERRNO, errcode, NULL); | |
+ } | |
+ return FALSE; | |
+ } | |
#endif /* CYGWIN */ | |
} | |
-static void AddB64char(GString *str,int c) { | |
- if (c<0) return; | |
- else if (c<26) g_string_append_c(str,c+'A'); | |
- else if (c<52) g_string_append_c(str,c-26+'a'); | |
- else if (c<62) g_string_append_c(str,c-52+'0'); | |
- else if (c==62) g_string_append_c(str,'+'); | |
- else g_string_append_c(str,'/'); | |
+static void AddB64char(GString *str, int c) | |
+{ | |
+ if (c < 0) | |
+ return; | |
+ else if (c < 26) | |
+ g_string_append_c(str, c + 'A'); | |
+ else if (c < 52) | |
+ g_string_append_c(str, c - 26 + 'a'); | |
+ else if (c < 62) | |
+ g_string_append_c(str, c - 52 + '0'); | |
+ else if (c == 62) | |
+ g_string_append_c(str, '+'); | |
+ else | |
+ g_string_append_c(str, '/'); | |
} | |
-void AddB64Enc(GString *str,gchar *unenc) { | |
-/* Adds the plain text string "unenc" to the end of the GString "str", */ | |
-/* using the Base64 encoding scheme. */ | |
- guint i; | |
- long value=0; | |
- if (!unenc || !str) return; | |
- for (i=0;i<strlen(unenc);i++) { | |
- value <<= 8; | |
- value |= (unsigned char)unenc[i]; | |
- if (i % 3 == 2) { | |
- AddB64char(str,(value>>18)&0x3F); | |
- AddB64char(str,(value>>12)&0x3F); | |
- AddB64char(str,(value>>6)&0x3F); | |
- AddB64char(str,value&0x3F); | |
- value=0; | |
- } | |
- } | |
- if (i % 3 == 1) { | |
- AddB64char(str,(value>>2)&0x3F); | |
- AddB64char(str,(value<<4)&0x3F); | |
- g_string_append(str,"=="); | |
- } else if (i % 3 == 2) { | |
- AddB64char(str,(value>>10)&0x3F); | |
- AddB64char(str,(value>>4)&0x3F); | |
- AddB64char(str,(value<<2)&0x3F); | |
- g_string_append_c(str,'='); | |
- } | |
+/* | |
+ * Adds the plain text string "unenc" to the end of the GString "str", | |
+ * using the Base64 encoding scheme. | |
+ */ | |
+void AddB64Enc(GString *str, gchar *unenc) | |
+{ | |
+ guint i; | |
+ long value = 0; | |
+ | |
+ if (!unenc || !str) | |
+ return; | |
+ for (i = 0; i < strlen(unenc); i++) { | |
+ value <<= 8; | |
+ value |= (unsigned char)unenc[i]; | |
+ if (i % 3 == 2) { | |
+ AddB64char(str, (value >> 18) & 0x3F); | |
+ AddB64char(str, (value >> 12) & 0x3F); | |
+ AddB64char(str, (value >> 6) & 0x3F); | |
+ AddB64char(str, value & 0x3F); | |
+ value = 0; | |
+ } | |
+ } | |
+ if (i % 3 == 1) { | |
+ AddB64char(str, (value >> 2) & 0x3F); | |
+ AddB64char(str, (value << 4) & 0x3F); | |
+ g_string_append(str, "=="); | |
+ } else if (i % 3 == 2) { | |
+ AddB64char(str, (value >> 10) & 0x3F); | |
+ AddB64char(str, (value >> 4) & 0x3F); | |
+ AddB64char(str, (value << 2) & 0x3F); | |
+ g_string_append_c(str, '='); | |
+ } | |
} | |
#endif /* NETWORKING */ | |
diff --git a/src/network.h b/src/network.h | |
t@@ -1,23 +1,24 @@ | |
-/* network.h Header file for low-level networking routines */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * network.h Header file for low-level networking routines * | |
+ * 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 __NETWORK_H__ | |
#define __NETWORK_H__ | |
t@@ -28,8 +29,8 @@ | |
/* Various includes necessary for select() calls */ | |
#include <sys/types.h> | |
-/* Be careful not to include both sys/time.h and time.h on those systems */ | |
-/* which don't like it */ | |
+/* Be careful not to include both sys/time.h and time.h on those systems | |
+ * which don't like it */ | |
#if TIME_WITH_SYS_TIME | |
#include <sys/time.h> | |
#include <time.h> | |
t@@ -56,167 +57,186 @@ | |
#endif | |
typedef struct _ConnBuf { | |
- gchar *Data; /* bytes waiting to be read/written */ | |
- gint Length; /* allocated length of the "Data" buffer */ | |
- gint DataPresent; /* number of bytes currently in "Data" */ | |
+ gchar *Data; /* bytes waiting to be read/written */ | |
+ gint Length; /* allocated length of the "Data" buffer */ | |
+ gint DataPresent; /* number of bytes currently in "Data" */ | |
} ConnBuf; | |
typedef struct _NetworkBuffer NetworkBuffer; | |
-typedef void (*NBCallBack)(NetworkBuffer *NetBuf,gboolean Read,gboolean Write, | |
- gboolean CallNow); | |
+typedef void (*NBCallBack) (NetworkBuffer *NetBuf, gboolean Read, | |
+ gboolean Write, gboolean CallNow); | |
-typedef void (*NBUserPasswd)(NetworkBuffer *NetBuf,gpointer data); | |
+typedef void (*NBUserPasswd) (NetworkBuffer *NetBuf, gpointer data); | |
/* Information about a SOCKS server */ | |
typedef struct _SocksServer { | |
- gchar *name; /* hostname */ | |
- unsigned port; /* port number */ | |
- int version; /* desired protocol version (usually 4 or 5) */ | |
- gboolean numuid; /* if TRUE, send numeric user IDs rather than names */ | |
- char *user; /* if not blank, override the username with this */ | |
- gchar *authuser; /* if set, the username for SOCKS5 auth */ | |
- gchar *authpassword; /* if set, the password for SOCKS5 auth */ | |
+ gchar *name; /* hostname */ | |
+ unsigned port; /* port number */ | |
+ int version; /* desired protocol version (usually | |
+ * 4 or 5) */ | |
+ gboolean numuid; /* if TRUE, send numeric user IDs rather | |
+ * than names */ | |
+ char *user; /* if not blank, override the username | |
+ * with this */ | |
+ gchar *authuser; /* if set, the username for SOCKS5 auth */ | |
+ gchar *authpassword; /* if set, the password for SOCKS5 auth */ | |
} SocksServer; | |
/* The status of a network buffer */ | |
typedef enum { | |
- NBS_PRECONNECT, /* Socket is not yet connected */ | |
- NBS_SOCKSCONNECT, /* A CONNECT request is being sent to a SOCKS server */ | |
- NBS_CONNECTED /* Socket is connected */ | |
+ NBS_PRECONNECT, /* Socket is not yet connected */ | |
+ NBS_SOCKSCONNECT, /* A CONNECT request is being sent to a | |
+ * SOCKS server */ | |
+ NBS_CONNECTED /* Socket is connected */ | |
} NBStatus; | |
/* Status of a SOCKS v5 negotiation */ | |
typedef enum { | |
- NBSS_METHODS, /* Negotiation of available methods */ | |
- NBSS_USERPASSWD, /* Username-password request is being sent */ | |
- NBSS_CONNECT /* CONNECT request is being sent */ | |
+ NBSS_METHODS, /* Negotiation of available methods */ | |
+ NBSS_USERPASSWD, /* Username-password request is being sent */ | |
+ NBSS_CONNECT /* CONNECT request is being sent */ | |
} NBSocksStatus; | |
/* Handles reading and writing messages from/to a network connection */ | |
struct _NetworkBuffer { | |
- int fd; /* File descriptor of the socket */ | |
- gint InputTag; /* Identifier for gdk_input routines */ | |
- NBCallBack CallBack; /* Function called when the socket status changes … | |
- gpointer CallBackData; /* Data accessible to the callback function */ | |
- char Terminator; /* Character that separates messages */ | |
- char StripChar; /* Char that should be removed from messages */ | |
- ConnBuf ReadBuf; /* New data, waiting for the application */ | |
- ConnBuf WriteBuf; /* Data waiting to be written to the wire */ | |
- ConnBuf negbuf; /* Output for protocol negotiation (e.g. SOCKS) */ | |
- gboolean WaitConnect; /* TRUE if a non-blocking connect is in progress */ | |
- NBStatus status; /* Status of the connection (if any) */ | |
- NBSocksStatus sockstat; /* Status of SOCKS negotiation (if any) */ | |
- SocksServer *socks; /* If non-NULL, a SOCKS server to use */ | |
- NBUserPasswd userpasswd; /* Function to supply username and password for | |
- SOCKS5 authentication */ | |
- gpointer userpasswddata; /* data to pass to the above function */ | |
- gchar *host; /* If non-NULL, the host to connect to */ | |
- unsigned port; /* If non-NULL, the port to connect to */ | |
- LastError *error; /* Any error from the last operation */ | |
+ int fd; /* File descriptor of the socket */ | |
+ gint InputTag; /* Identifier for gdk_input routines */ | |
+ NBCallBack CallBack; /* Function called when the socket | |
+ * status changes */ | |
+ gpointer CallBackData; /* Data accessible to the callback | |
+ * function */ | |
+ char Terminator; /* Character that separates messages */ | |
+ char StripChar; /* Char that should be removed | |
+ * from messages */ | |
+ ConnBuf ReadBuf; /* New data, waiting for the application */ | |
+ ConnBuf WriteBuf; /* Data waiting to be written to the wire */ | |
+ ConnBuf negbuf; /* Output for protocol negotiation | |
+ * (e.g. SOCKS) */ | |
+ gboolean WaitConnect; /* TRUE if a non-blocking connect is in | |
+ * progress */ | |
+ NBStatus status; /* Status of the connection (if any) */ | |
+ NBSocksStatus sockstat; /* Status of SOCKS negotiation (if any) */ | |
+ SocksServer *socks; /* If non-NULL, a SOCKS server to use */ | |
+ NBUserPasswd userpasswd; /* Function to supply username and | |
+ * password for SOCKS5 authentication */ | |
+ gpointer userpasswddata; /* data to pass to the above function */ | |
+ gchar *host; /* If non-NULL, the host to connect to */ | |
+ unsigned port; /* If non-NULL, the port to connect to */ | |
+ LastError *error; /* Any error from the last operation */ | |
}; | |
/* Keeps track of the progress of an HTTP connection */ | |
typedef enum { | |
- HS_CONNECTING, /* Waiting for connect() to complete */ | |
- HS_READHEADERS, /* Reading HTTP headers */ | |
- HS_READSEPARATOR, /* Reading the header/body separator line */ | |
- HS_READBODY, /* Reading HTTP body */ | |
- HS_WAITCOMPLETE /* Done reading, now waiting for authentication etc. | |
- before closing and/or retrying the connection */ | |
+ HS_CONNECTING, /* Waiting for connect() to complete */ | |
+ HS_READHEADERS, /* Reading HTTP headers */ | |
+ HS_READSEPARATOR, /* Reading the header/body separator line */ | |
+ HS_READBODY, /* Reading HTTP body */ | |
+ HS_WAITCOMPLETE /* Done reading, now waiting for | |
+ * authentication etc. before closing | |
+ * and/or retrying the connection */ | |
} HttpStatus; | |
typedef struct _HttpConnection HttpConnection; | |
-typedef void (*HCAuthFunc)(struct _HttpConnection *conn, | |
- gboolean proxyauth,gchar *realm,gpointer data); | |
+typedef void (*HCAuthFunc) (HttpConnection *conn, gboolean proxyauth, | |
+ gchar *realm, gpointer data); | |
/* A structure used to keep track of an HTTP connection */ | |
struct _HttpConnection { | |
- gchar *HostName; /* The machine on which the desired page resides */ | |
- unsigned Port; /* The port */ | |
- gchar *Proxy; /* If non-NULL, a web proxy to use */ | |
- unsigned ProxyPort; /* The port to use for talking to the proxy */ | |
- gchar *Method; /* e.g. GET, POST */ | |
- gchar *Query; /* e.g. the path of the desired webpage */ | |
- gchar *Headers; /* if non-NULL, e.g. Content-Type */ | |
- gchar *Body; /* if non-NULL, data to send */ | |
- gchar *RedirHost; /* if non-NULL, a hostname to redirect to */ | |
- gchar *RedirQuery; /* if non-NULL, the path to redirect to */ | |
- unsigned RedirPort; /* The port on the host to redirect to */ | |
- HCAuthFunc authfunc; /* Callback function for authentication */ | |
- gpointer authdata; /* Data to be passed to authfunc */ | |
- gboolean waitinput; /* TRUE if we're waiting for auth etc. | |
- to be supplied */ | |
- gchar *user; /* The supplied username for HTTP auth */ | |
- gchar *password; /* The supplied password for HTTP auth */ | |
- gchar *proxyuser; /* The supplied username for HTTP proxy auth */ | |
- gchar *proxypassword; /* The supplied password for HTTP proxy auth */ | |
- NetworkBuffer NetBuf; /* The actual network connection itself */ | |
- gint Tries; /* Number of requests actually sent so far */ | |
- gint StatusCode; /* 0=no status yet, otherwise an HTTP status code */ | |
- HttpStatus Status; | |
+ gchar *HostName; /* The machine on which the desired page | |
+ * resides */ | |
+ unsigned Port; /* The port */ | |
+ gchar *Proxy; /* If non-NULL, a web proxy to use */ | |
+ unsigned ProxyPort; /* The port to use for talking to | |
+ * the proxy */ | |
+ gchar *Method; /* e.g. GET, POST */ | |
+ gchar *Query; /* e.g. the path of the desired webpage */ | |
+ gchar *Headers; /* if non-NULL, e.g. Content-Type */ | |
+ gchar *Body; /* if non-NULL, data to send */ | |
+ gchar *RedirHost; /* if non-NULL, a hostname to redirect to */ | |
+ gchar *RedirQuery; /* if non-NULL, the path to redirect to */ | |
+ unsigned RedirPort; /* The port on the host to redirect to */ | |
+ HCAuthFunc authfunc; /* Callback function for authentication */ | |
+ gpointer authdata; /* Data to be passed to authfunc */ | |
+ gboolean waitinput; /* TRUE if we're waiting for auth etc. to | |
+ * be supplied */ | |
+ gchar *user; /* The supplied username for HTTP auth */ | |
+ gchar *password; /* The supplied password for HTTP auth */ | |
+ gchar *proxyuser; /* The supplied username for HTTP | |
+ * proxy auth */ | |
+ gchar *proxypassword; /* The supplied password for HTTP | |
+ * proxy auth */ | |
+ NetworkBuffer NetBuf; /* The actual network connection itself */ | |
+ gint Tries; /* Number of requests actually sent so far */ | |
+ gint StatusCode; /* 0=no status yet, otherwise an HTTP | |
+ * status code */ | |
+ HttpStatus Status; | |
}; | |
-void InitNetworkBuffer(NetworkBuffer *NetBuf,char Terminator,char StripChar, | |
- SocksServer *socks); | |
-void SetNetworkBufferCallBack(NetworkBuffer *NetBuf,NBCallBack CallBack, | |
+void InitNetworkBuffer(NetworkBuffer *NetBuf, char Terminator, | |
+ char StripChar, SocksServer *socks); | |
+void SetNetworkBufferCallBack(NetworkBuffer *NetBuf, NBCallBack CallBack, | |
gpointer CallBackData); | |
void SetNetworkBufferUserPasswdFunc(NetworkBuffer *NetBuf, | |
- NBUserPasswd userpasswd,gpointer data); | |
+ NBUserPasswd userpasswd, | |
+ gpointer data); | |
gboolean IsNetworkBufferActive(NetworkBuffer *NetBuf); | |
-void BindNetworkBufferToSocket(NetworkBuffer *NetBuf,int fd); | |
-gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf,gchar *RemoteHost, | |
- unsigned RemotePort); | |
+void BindNetworkBufferToSocket(NetworkBuffer *NetBuf, int fd); | |
+gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf, | |
+ gchar *RemoteHost, unsigned RemotePort); | |
void ShutdownNetworkBuffer(NetworkBuffer *NetBuf); | |
-void SetSelectForNetworkBuffer(NetworkBuffer *NetBuf,fd_set *readfds, | |
- fd_set *writefds,fd_set *errorfds,int *MaxSock); | |
-gboolean RespondToSelect(NetworkBuffer *NetBuf,fd_set *readfds, | |
- fd_set *writefds,fd_set *errorfds, | |
+void SetSelectForNetworkBuffer(NetworkBuffer *NetBuf, fd_set *readfds, | |
+ fd_set *writefds, fd_set *errorfds, | |
+ int *MaxSock); | |
+gboolean RespondToSelect(NetworkBuffer *NetBuf, fd_set *readfds, | |
+ fd_set *writefds, fd_set *errorfds, | |
gboolean *DoneOK); | |
-gboolean NetBufHandleNetwork(NetworkBuffer *NetBuf,gboolean ReadReady, | |
- gboolean WriteReady,gboolean *DoneOK); | |
+gboolean NetBufHandleNetwork(NetworkBuffer *NetBuf, gboolean ReadReady, | |
+ gboolean WriteReady, gboolean *DoneOK); | |
gboolean ReadDataFromWire(NetworkBuffer *NetBuf); | |
gboolean WriteDataToWire(NetworkBuffer *NetBuf); | |
-void QueueMessageForSend(NetworkBuffer *NetBuf,gchar *data); | |
+void QueueMessageForSend(NetworkBuffer *NetBuf, gchar *data); | |
gint CountWaitingMessages(NetworkBuffer *NetBuf); | |
gchar *GetWaitingMessage(NetworkBuffer *NetBuf); | |
-void SendSocks5UserPasswd(NetworkBuffer *NetBuf,gchar *user,gchar *password); | |
-gchar *GetWaitingData(NetworkBuffer *NetBuf,int numbytes); | |
-gchar *PeekWaitingData(NetworkBuffer *NetBuf,int numbytes); | |
-gchar *ExpandWriteBuffer(ConnBuf *conn,int numbytes,LastError **error); | |
-void CommitWriteBuffer(NetworkBuffer *NetBuf,ConnBuf *conn, | |
- gchar *addpt,guint addlen); | |
- | |
-gboolean OpenHttpConnection(HttpConnection **conn,gchar *HostName, | |
- unsigned Port,gchar *Proxy,unsigned ProxyPort, | |
- SocksServer *socks, | |
- gchar *Method,gchar *Query, | |
- gchar *Headers,gchar *Body); | |
+void SendSocks5UserPasswd(NetworkBuffer *NetBuf, gchar *user, | |
+ gchar *password); | |
+gchar *GetWaitingData(NetworkBuffer *NetBuf, int numbytes); | |
+gchar *PeekWaitingData(NetworkBuffer *NetBuf, int numbytes); | |
+gchar *ExpandWriteBuffer(ConnBuf *conn, int numbytes, LastError **error); | |
+void CommitWriteBuffer(NetworkBuffer *NetBuf, ConnBuf *conn, gchar *addpt, | |
+ guint addlen); | |
+ | |
+gboolean OpenHttpConnection(HttpConnection **conn, gchar *HostName, | |
+ unsigned Port, gchar *Proxy, | |
+ unsigned ProxyPort, SocksServer *socks, | |
+ gchar *Method, gchar *Query, gchar *Headers, | |
+ gchar *Body); | |
void CloseHttpConnection(HttpConnection *conn); | |
-gchar *ReadHttpResponse(HttpConnection *conn,gboolean *doneOK); | |
-void SetHttpAuthentication(HttpConnection *conn,gboolean proxy, | |
- gchar *user,gchar *password); | |
-void SetHttpAuthFunc(HttpConnection *conn,HCAuthFunc authfunc,gpointer data); | |
+gchar *ReadHttpResponse(HttpConnection *conn, gboolean *doneOK); | |
+void SetHttpAuthentication(HttpConnection *conn, gboolean proxy, | |
+ gchar *user, gchar *password); | |
+void SetHttpAuthFunc(HttpConnection *conn, HCAuthFunc authfunc, | |
+ gpointer data); | |
gboolean HandleHttpCompletion(HttpConnection *conn); | |
gboolean IsHttpError(HttpConnection *conn); | |
int CreateTCPSocket(LastError **error); | |
-gboolean BindTCPSocket(int sock,unsigned port,LastError **error); | |
+gboolean BindTCPSocket(int sock, unsigned port, LastError **error); | |
void StartNetworking(void); | |
void StopNetworking(void); | |
#ifdef CYGWIN | |
#define CloseSocket(sock) closesocket(sock) | |
void SetReuse(SOCKET sock); | |
-void SetBlocking(SOCKET sock,gboolean blocking); | |
+void SetBlocking(SOCKET sock, gboolean blocking); | |
#else | |
#define CloseSocket(sock) close(sock) | |
void SetReuse(int sock); | |
-void SetBlocking(int sock,gboolean blocking); | |
+void SetBlocking(int sock, gboolean blocking); | |
#endif | |
-void AddB64Enc(GString *str,gchar *unenc); | |
+void AddB64Enc(GString *str, gchar *unenc); | |
#endif /* NETWORKING */ | |
diff --git a/src/nls.h b/src/nls.h | |
t@@ -1,23 +1,24 @@ | |
-/* nls.h Header file for NLS (internationalization) defines */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * nls.h Header file for NLS (internationalization) defines * | |
+ * 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 __NLS_H__ | |
#define __NLS_H__ | |
diff --git a/src/serverside.c b/src/serverside.c | |
t@@ -1,23 +1,24 @@ | |
-/* serverside.c Handles the server side of dopewars */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * serverside.c Handles the server side of dopewars * | |
+ * 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> | |
t@@ -25,17 +26,17 @@ | |
#include <stdio.h> | |
#include <string.h> | |
-#include <sys/types.h> /* For size_t etc. */ | |
+#include <sys/types.h> /* For size_t etc. */ | |
#include <sys/stat.h> | |
#ifdef CYGWIN | |
-#include <windows.h> /* For datatypes such as BOOL */ | |
-#include <winsock.h> /* For network functions */ | |
+#include <windows.h> /* For datatypes such as BOOL */ | |
+#include <winsock.h> /* For network functions */ | |
#else | |
-#include <sys/socket.h> /* For struct sockaddr etc. */ | |
-#include <netinet/in.h> /* For struct sockaddr_in etc. */ | |
-#include <sys/un.h> /* For struct sockaddr_un */ | |
-#include <arpa/inet.h> /* For socklen_t */ | |
+#include <sys/socket.h> /* For struct sockaddr etc. */ | |
+#include <netinet/in.h> /* For struct sockaddr_in etc. */ | |
+#include <sys/un.h> /* For struct sockaddr_un */ | |
+#include <arpa/inet.h> /* For socklen_t */ | |
#endif /* CYGWIN */ | |
#ifdef HAVE_UNISTD_H | |
t@@ -57,2980 +58,3497 @@ | |
#include "gtkport.h" | |
#endif | |
-static const price_t MINTRENCHPRICE=200,MAXTRENCHPRICE=300; | |
+static const price_t MINTRENCHPRICE = 200, MAXTRENCHPRICE = 300; | |
#define ESCAPE 0 | |
#define DEFECT 1 | |
#define SHOT 2 | |
#define NUMDISCOVER 3 | |
char *Discover[NUMDISCOVER] = { | |
-/* Things that can "happen" to your spies - look for strings containing | |
- "The spy %s!" to see how these strings are used. */ | |
- N_("escaped"), N_("defected"), N_("was shot") | |
+ /* Things that can "happen" to your spies - look for strings containing | |
+ * "The spy %s!" to see how these strings are used. */ | |
+ N_("escaped"), N_("defected"), N_("was shot") | |
}; | |
/* The two keys that are valid answers to the Attack/Evade question. If | |
- you wish to translate them, do so in the same order as they given here. | |
- You will also need to translate the answers given by the clients. */ | |
+ * you wish to translate them, do so in the same order as they given here. | |
+ * You will also need to translate the answers given by the clients. */ | |
static char *attackquestiontr = N_("AE"); | |
/* If we haven't talked to the metaserver for 3 hours, then remind it that | |
- we still exist, so we don't get wiped from the list of active servers */ | |
+ * we still exist, so we don't get wiped from the list of active servers */ | |
#define METAUPDATETIME (10800) | |
/* Don't report players logging in/out to the metaserver more frequently | |
- than once every minute (so as not to overload the metaserver, or slow | |
- down our own server). */ | |
+ * than once every minute (so as not to overload the metaserver, or slow | |
+ * down our own server). */ | |
#define METAMINTIME (60) | |
-int TerminateRequest,ReregisterRequest,RelogRequest; | |
+int TerminateRequest, ReregisterRequest, RelogRequest; | |
int MetaUpdateTimeout; | |
int MetaMinTimeout; | |
-gboolean WantQuit=FALSE; | |
+gboolean WantQuit = FALSE; | |
#ifdef CYGWIN | |
static SERVICE_STATUS_HANDLE scHandle; | |
#endif | |
/* Do we want to update the player details on the metaserver when the | |
- timeout expires? */ | |
-gboolean MetaPlayerPending=FALSE; | |
+ * timeout expires? */ | |
+gboolean MetaPlayerPending = FALSE; | |
-GSList *FirstServer=NULL; | |
+GSList *FirstServer = NULL; | |
#ifdef NETWORKING | |
static GScanner *Scanner; | |
/* Data waiting to be sent to/read from the metaserver */ | |
-HttpConnection *MetaConn=NULL; | |
+HttpConnection *MetaConn = NULL; | |
#endif | |
/* Handle to the high score file */ | |
-static FILE *ScoreFP=NULL; | |
+static FILE *ScoreFP = NULL; | |
/* Pointer to the filename of a pid file (if non-NULL) */ | |
char *PidFile; | |
-static char HelpText[] = { | |
-/* Help on various general server commands */ | |
- N_("dopewars server version %s commands and settings\n\n" | |
- "help Displays this help screen\n" | |
- "list Lists all players logged on\n" | |
- "push <player> Politely asks the named player to leave\n" | |
- "kill <player> Abruptly breaks the connection with the " | |
- "named player\n" | |
- "msg:<mesg> Send message to all players\n" | |
- "quit Gracefully quit, after notifying all players\n" | |
- "<variable>=<value> Sets the named variable to the given value\n" | |
- "<variable> Displays the value of the named variable\n" | |
- "<list>[x].<var>=<value> Sets the named variable in the given list,\n" | |
- " index x, to the given value\n" | |
- "<list>[x].<var> Displays the value of the named list variable\… | |
- "\nValid variables are listed below:-\n\n") | |
+static char HelpText[] = { | |
+ /* Help on various general server commands */ | |
+ N_("dopewars server version %s commands and settings\n\n" | |
+ "help Displays this help screen\n" | |
+ "list Lists all players logged on\n" | |
+ "push <player> Politely asks the named player to leave\n" | |
+ "kill <player> Abruptly breaks the connection with the " | |
+ "named player\n" | |
+ "msg:<mesg> Send message to all players\n" | |
+ "quit Gracefully quit, after notifying all players\… | |
+ "<variable>=<value> Sets the named variable to the given value\n" | |
+ "<variable> Displays the value of the named variable\n" | |
+ "<list>[x].<var>=<value> Sets the named variable in the given list,\n" | |
+ " index x, to the given value\n" | |
+ "<list>[x].<var> Displays the value of the named list variable… | |
+ "\nValid variables are listed below:-\n\n") | |
}; | |
typedef enum _OfferForce { | |
- NOFORCE, FORCECOPS, FORCEBITCH | |
+ NOFORCE, FORCECOPS, FORCEBITCH | |
} OfferForce; | |
-int SendSingleHighScore(Player *Play,struct HISCORE *Score, | |
- int ind,gboolean Bold); | |
-static int SendCopOffer(Player *To,OfferForce Force); | |
-static int OfferObject(Player *To,gboolean ForceBitch); | |
-static gboolean HighScoreWrite(FILE *fp,struct HISCORE *MultiScore, | |
+int SendSingleHighScore(Player *Play, struct HISCORE *Score, | |
+ int ind, gboolean Bold); | |
+static int SendCopOffer(Player *To, OfferForce Force); | |
+static int OfferObject(Player *To, gboolean ForceBitch); | |
+static gboolean HighScoreWrite(FILE *fp, struct HISCORE *MultiScore, | |
struct HISCORE *AntiqueScore); | |
#ifdef GUI_SERVER | |
-static void GuiHandleMeta(gpointer data,gint socket, | |
+static void GuiHandleMeta(gpointer data, gint socket, | |
GdkInputCondition condition); | |
static void MetaSocketStatus(NetworkBuffer *NetBuf, | |
- gboolean Read,gboolean Write,gboolean CallNow); | |
+ gboolean Read, gboolean Write, | |
+ gboolean CallNow); | |
#endif | |
#ifdef NETWORKING | |
-static gboolean MetaConnectError(HttpConnection *conn) { | |
- GString *errstr; | |
- if (!IsHttpError(conn)) return FALSE; | |
- errstr=g_string_new(""); | |
- g_string_assign_error(errstr,MetaConn->NetBuf.error); | |
- dopelog(1,_("Failed to connect to metaserver at %s:%u (%s)"), | |
- MetaServer.Name,MetaServer.Port,errstr->str); | |
- g_string_free(errstr,TRUE); | |
- return TRUE; | |
-} | |
- | |
-static void ServerHttpAuth(HttpConnection *conn,gboolean proxyauth, | |
- gchar *realm,gpointer data) { | |
- gchar *user=NULL,*password=NULL; | |
+static gboolean MetaConnectError(HttpConnection *conn) | |
+{ | |
+ GString *errstr; | |
+ | |
+ if (!IsHttpError(conn)) | |
+ return FALSE; | |
+ errstr = g_string_new(""); | |
+ g_string_assign_error(errstr, MetaConn->NetBuf.error); | |
+ dopelog(1, _("Failed to connect to metaserver at %s:%u (%s)"), | |
+ MetaServer.Name, MetaServer.Port, errstr->str); | |
+ g_string_free(errstr, TRUE); | |
+ return TRUE; | |
+} | |
+ | |
+static void ServerHttpAuth(HttpConnection *conn, gboolean proxyauth, | |
+ gchar *realm, gpointer data) | |
+{ | |
+ gchar *user = NULL, *password = NULL; | |
+ | |
if (proxyauth) { | |
if (MetaServer.proxyuser[0] && MetaServer.proxypassword[0]) { | |
- user = MetaServer.proxyuser; password = MetaServer.proxypassword; | |
- dopelog(3,_("Using MetaServer.Proxy.User and MetaServer.Proxy.Password " | |
- "for HTTP proxy authentication")); | |
+ user = MetaServer.proxyuser; | |
+ password = MetaServer.proxypassword; | |
+ dopelog(3, | |
+ _("Using MetaServer.Proxy.User and " | |
+ "MetaServer.Proxy.Password for HTTP proxy authentication")); | |
} else { | |
- dopelog(0,_("Unable to authenticate with HTTP proxy; please set " | |
- "MetaServer.Proxy.User and MetaServer.Proxy.Password variables")… | |
+ dopelog(0, _("Unable to authenticate with HTTP proxy; please " | |
+ "set MetaServer.Proxy.User and " | |
+ "MetaServer.Proxy.Password variables")); | |
} | |
} else { | |
if (MetaServer.authuser[0] && MetaServer.authpassword[0]) { | |
- user = MetaServer.authuser; password = MetaServer.authpassword; | |
- dopelog(3,_("Using MetaServer.Auth.User and MetaServer.Auth.Password " | |
- "for HTTP authentication")); | |
+ user = MetaServer.authuser; | |
+ password = MetaServer.authpassword; | |
+ dopelog(3, | |
+ _("Using MetaServer.Auth.User and MetaServer.Auth.Password " | |
+ "for HTTP authentication")); | |
} else { | |
- dopelog(0,_("Unable to authenticate with HTTP server; please set " | |
- "MetaServer.Auth.User and MetaServer.Auth.Password variables")); | |
+ dopelog(0, _("Unable to authenticate with HTTP server; please set " | |
+ "MetaServer.Auth.User and " | |
+ "MetaServer.Auth.Password variables")); | |
} | |
} | |
- SetHttpAuthentication(conn,proxyauth,user,password); | |
+ SetHttpAuthentication(conn, proxyauth, user, password); | |
} | |
-static void ServerNetBufAuth(NetworkBuffer *netbuf,gpointer data) { | |
- dopelog(3,_("Using Socks.Auth.User and Socks.Auth.Password " | |
- "for SOCKS5 authentication")); | |
- SendSocks5UserPasswd(netbuf,Socks.authuser,Socks.authpassword); | |
+static void ServerNetBufAuth(NetworkBuffer *netbuf, gpointer data) | |
+{ | |
+ dopelog(3, _("Using Socks.Auth.User and Socks.Auth.Password " | |
+ "for SOCKS5 authentication")); | |
+ SendSocks5UserPasswd(netbuf, Socks.authuser, Socks.authpassword); | |
} | |
#endif | |
-void RegisterWithMetaServer(gboolean Up,gboolean SendData, | |
- gboolean RespectTimeout) { | |
-/* Sends server details to the metaserver, if specified. If "Up" is */ | |
-/* TRUE, informs the metaserver that the server is now accepting */ | |
-/* connections - otherwise tells the metaserver that this server is */ | |
-/* about to go down. If "SendData" is TRUE, then also sends game */ | |
-/* data (e.g. scores) to the metaserver. If "RespectTimeout" is TRUE */ | |
-/* then the update is delayed if a previous update happened too */ | |
-/* recently. If networking is disabled, this function does nothing. */ | |
+/* | |
+ * Sends server details to the metaserver, if specified. If "Up" is | |
+ * TRUE, informs the metaserver that the server is now accepting | |
+ * connections - otherwise tells the metaserver that this server is | |
+ * about to go down. If "SendData" is TRUE, then also sends game | |
+ * data (e.g. scores) to the metaserver. If "RespectTimeout" is TRUE | |
+ * then the update is delayed if a previous update happened too | |
+ * recently. If networking is disabled, this function does nothing. | |
+ */ | |
+void RegisterWithMetaServer(gboolean Up, gboolean SendData, | |
+ gboolean RespectTimeout) | |
+{ | |
#if NETWORKING | |
- struct HISCORE MultiScore[NUMHISCORE],AntiqueScore[NUMHISCORE]; | |
- GString *headers,*body; | |
- gchar *prstr; | |
- gboolean retval; | |
- int i; | |
- | |
- if (!MetaServer.Active || !NotifyMetaServer || WantQuit) return; | |
- | |
- if (MetaMinTimeout > time(NULL) && RespectTimeout) { | |
- dopelog(3,_("Attempt to connect to metaserver too frequently " | |
- "- waiting for next timeout")); | |
- MetaPlayerPending=TRUE; | |
- return; | |
- } | |
- | |
-/* If the previous connect hung for so long that it's still active, then | |
- break the connection before we start a new one */ | |
- if (MetaConn) CloseHttpConnection(MetaConn); | |
- | |
- headers=g_string_new(""); | |
- body=g_string_new(""); | |
- | |
- g_string_assign(body,"output=text&"); | |
- | |
- g_string_sprintfa(body,"up=%d&port=%d&version=",Up ? 1 : 0,Port); | |
- AddURLEnc(body,VERSION); | |
- g_string_sprintfa(body,"&players=%d&maxplay=%d&comment=", | |
- CountPlayers(FirstServer),MaxClients); | |
- AddURLEnc(body,MetaServer.Comment); | |
- | |
- if (MetaServer.LocalName[0]) { | |
- g_string_append(body,"&hostname="); | |
- AddURLEnc(body,MetaServer.LocalName); | |
- } | |
- if (MetaServer.Password[0]) { | |
- g_string_append(body,"&password="); | |
- AddURLEnc(body,MetaServer.Password); | |
- } | |
- | |
- if (SendData && HighScoreRead(ScoreFP,MultiScore,AntiqueScore,TRUE)) { | |
- for (i=0;i<NUMHISCORE;i++) { | |
- if (MultiScore[i].Name && MultiScore[i].Name[0]) { | |
- g_string_sprintfa(body,"&nm[%d]=",i); | |
- AddURLEnc(body,MultiScore[i].Name); | |
- g_string_sprintfa(body,"&dt[%d]=",i); | |
- AddURLEnc(body,MultiScore[i].Time); | |
- g_string_sprintfa(body,"&st[%d]=%s&sc[%d]=",i, | |
- MultiScore[i].Dead ? "dead" : "alive",i); | |
- AddURLEnc(body,prstr=FormatPrice(MultiScore[i].Money)); | |
- g_free(prstr); | |
- } | |
+ struct HISCORE MultiScore[NUMHISCORE], AntiqueScore[NUMHISCORE]; | |
+ GString *headers, *body; | |
+ gchar *prstr; | |
+ gboolean retval; | |
+ int i; | |
+ | |
+ if (!MetaServer.Active || !NotifyMetaServer || WantQuit) | |
+ return; | |
+ | |
+ if (MetaMinTimeout > time(NULL) && RespectTimeout) { | |
+ dopelog(3, _("Attempt to connect to metaserver too frequently " | |
+ "- waiting for next timeout")); | |
+ MetaPlayerPending = TRUE; | |
+ return; | |
+ } | |
+ | |
+ /* If the previous connect hung for so long that it's still active, then | |
+ * break the connection before we start a new one */ | |
+ if (MetaConn) | |
+ CloseHttpConnection(MetaConn); | |
+ | |
+ headers = g_string_new(""); | |
+ body = g_string_new(""); | |
+ | |
+ g_string_assign(body, "output=text&"); | |
+ | |
+ g_string_sprintfa(body, "up=%d&port=%d&version=", Up ? 1 : 0, Port); | |
+ AddURLEnc(body, VERSION); | |
+ g_string_sprintfa(body, "&players=%d&maxplay=%d&comment=", | |
+ CountPlayers(FirstServer), MaxClients); | |
+ AddURLEnc(body, MetaServer.Comment); | |
+ | |
+ if (MetaServer.LocalName[0]) { | |
+ g_string_append(body, "&hostname="); | |
+ AddURLEnc(body, MetaServer.LocalName); | |
+ } | |
+ if (MetaServer.Password[0]) { | |
+ g_string_append(body, "&password="); | |
+ AddURLEnc(body, MetaServer.Password); | |
+ } | |
+ | |
+ if (SendData && HighScoreRead(ScoreFP, MultiScore, AntiqueScore, TRUE)) { | |
+ for (i = 0; i < NUMHISCORE; i++) { | |
+ if (MultiScore[i].Name && MultiScore[i].Name[0]) { | |
+ g_string_sprintfa(body, "&nm[%d]=", i); | |
+ AddURLEnc(body, MultiScore[i].Name); | |
+ g_string_sprintfa(body, "&dt[%d]=", i); | |
+ AddURLEnc(body, MultiScore[i].Time); | |
+ g_string_sprintfa(body, "&st[%d]=%s&sc[%d]=", i, | |
+ MultiScore[i].Dead ? "dead" : "alive", i); | |
+ AddURLEnc(body, prstr = FormatPrice(MultiScore[i].Money)); | |
+ g_free(prstr); | |
} | |
- } | |
- | |
- g_string_sprintf(headers, | |
- "Content-Type: application/x-www-form-urlencoded\n" | |
- "Content-Length: %d",(int)strlen(body->str)); | |
- | |
- retval=OpenHttpConnection(&MetaConn,MetaServer.Name,MetaServer.Port, | |
- MetaServer.ProxyName,MetaServer.ProxyPort, | |
- UseSocks && MetaServer.UseSocks ? &Socks : NULL, | |
- "POST",MetaServer.Path,headers->str,body->str); | |
- g_string_free(headers,TRUE); | |
- g_string_free(body,TRUE); | |
- | |
- if (retval) { | |
- dopelog(2,_("Waiting for metaserver connect to %s:%u..."), | |
- MetaServer.Name,MetaServer.Port); | |
- } else { | |
- MetaConnectError(MetaConn); | |
- CloseHttpConnection(MetaConn); MetaConn=NULL; | |
- return; | |
- } | |
- SetHttpAuthFunc(MetaConn,ServerHttpAuth,NULL); | |
- | |
- if (Socks.authuser && Socks.authuser[0] && | |
- Socks.authpassword && Socks.authpassword[0]) { | |
- SetNetworkBufferUserPasswdFunc(&MetaConn->NetBuf,ServerNetBufAuth,NULL); | |
- } | |
+ } | |
+ } | |
+ | |
+ g_string_sprintf(headers, | |
+ "Content-Type: application/x-www-form-urlencoded\n" | |
+ "Content-Length: %d", (int)strlen(body->str)); | |
+ | |
+ retval = OpenHttpConnection(&MetaConn, MetaServer.Name, MetaServer.Port, | |
+ MetaServer.ProxyName, MetaServer.ProxyPort, | |
+ UseSocks && MetaServer.UseSocks ? &Socks : NULL, | |
+ "POST", MetaServer.Path, headers->str, | |
+ body->str); | |
+ g_string_free(headers, TRUE); | |
+ g_string_free(body, TRUE); | |
+ | |
+ if (retval) { | |
+ dopelog(2, _("Waiting for metaserver connect to %s:%u..."), | |
+ MetaServer.Name, MetaServer.Port); | |
+ } else { | |
+ MetaConnectError(MetaConn); | |
+ CloseHttpConnection(MetaConn); | |
+ MetaConn = NULL; | |
+ return; | |
+ } | |
+ SetHttpAuthFunc(MetaConn, ServerHttpAuth, NULL); | |
+ | |
+ if (Socks.authuser && Socks.authuser[0] && | |
+ Socks.authpassword && Socks.authpassword[0]) { | |
+ SetNetworkBufferUserPasswdFunc(&MetaConn->NetBuf, ServerNetBufAuth, | |
+ NULL); | |
+ } | |
#ifdef GUI_SERVER | |
- SetNetworkBufferCallBack(&MetaConn->NetBuf,MetaSocketStatus,NULL); | |
+ SetNetworkBufferCallBack(&MetaConn->NetBuf, MetaSocketStatus, NULL); | |
#endif | |
- MetaPlayerPending=FALSE; | |
+ MetaPlayerPending = FALSE; | |
- MetaUpdateTimeout=time(NULL)+METAUPDATETIME; | |
- MetaMinTimeout=time(NULL)+METAMINTIME; | |
+ MetaUpdateTimeout = time(NULL) + METAUPDATETIME; | |
+ MetaMinTimeout = time(NULL) + METAMINTIME; | |
#endif /* NETWORKING */ | |
} | |
#ifdef NETWORKING | |
-void HandleServerPlayer(Player *Play) { | |
- gchar *buf; | |
- gboolean MessageRead=FALSE; | |
- while ((buf=GetWaitingPlayerMessage(Play))!=NULL) { | |
- MessageRead=TRUE; | |
- HandleServerMessage(buf,Play); | |
- g_free(buf); | |
- } | |
-/* Reset the idle timeout (if necessary) */ | |
- if (MessageRead && IdleTimeout) { | |
- Play->IdleTimeout=time(NULL)+(time_t)IdleTimeout; | |
- } | |
+void HandleServerPlayer(Player *Play) | |
+{ | |
+ gchar *buf; | |
+ gboolean MessageRead = FALSE; | |
+ | |
+ while ((buf = GetWaitingPlayerMessage(Play)) != NULL) { | |
+ MessageRead = TRUE; | |
+ HandleServerMessage(buf, Play); | |
+ g_free(buf); | |
+ } | |
+ /* Reset the idle timeout (if necessary) */ | |
+ if (MessageRead && IdleTimeout) { | |
+ Play->IdleTimeout = time(NULL) + (time_t) IdleTimeout; | |
+ } | |
} | |
#endif /* NETWORKING */ | |
-void SendPlayerDetails(Player *Play,Player *To,MsgCode Code) { | |
-/* Sends details (name, ID) about player "Play" to player "To", using */ | |
-/* message code "Code" */ | |
- GString *text; | |
- text=g_string_new(GetPlayerName(Play)); | |
- if (HaveAbility(To,A_PLAYERID)) { | |
- g_string_sprintfa(text,"^%d",Play->ID); | |
- } | |
- SendServerMessage(NULL,C_NONE,Code,To,text->str); | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-void HandleServerMessage(gchar *buf,Player *Play) { | |
-/* Given a message "buf", from player "Play", performs processing and */ | |
-/* sends suitable replies. */ | |
- Player *To,*tmp,*pt; | |
- GSList *list; | |
- char *Data; | |
- AICode AI; | |
- MsgCode Code; | |
- gchar *text; | |
- DopeEntry NewEntry; | |
- int i; | |
- price_t money; | |
- | |
- if (ProcessMessage(buf,Play,&To,&AI,&Code,&Data,FirstServer)==-1) { | |
- g_warning("Bad message"); | |
- return; | |
- } | |
- switch(Code) { | |
- case C_MSGTO: | |
- if (Network) { | |
- dopelog(3,"%s->%s: %s",GetPlayerName(Play),GetPlayerName(To),Data); | |
- } | |
- SendServerMessage(Play,AI,Code,To,Data); | |
- break; | |
-/* case C_NETMESSAGE: | |
- dopelog(1,"Net:%s\n",Data);*/ | |
-/* Make sure they do actually disconnect, eventually! */ | |
-/* if (ConnectTimeout) { | |
- Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout; | |
- } | |
- break;*/ | |
- case C_ABILITIES: | |
- ReceiveAbilities(Play,Data); | |
- break; | |
- case C_NAME: | |
- pt=GetPlayerByName(Data,FirstServer); | |
- if (pt && pt!=Play) { | |
- if (ConnectTimeout) { | |
- Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout; | |
- } | |
- SendServerMessage(NULL,C_NONE,C_NEWNAME,Play,NULL); | |
- } else if (strlen(GetPlayerName(Play))==0 && Data[0]) { | |
- if (CountPlayers(FirstServer)<MaxClients || !Network) { | |
- SendAbilities(Play); | |
- CombineAbilities(Play); | |
- SendInitialData(Play); | |
- SendMiscData(Play); | |
- SetPlayerName(Play,Data); | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- pt=(Player *)list->data; | |
- if (pt!=Play && IsConnectedPlayer(pt) && !IsCop(pt)) { | |
- SendPlayerDetails(pt,Play,C_LIST); | |
- } | |
- } | |
- SendServerMessage(NULL,C_NONE,C_ENDLIST,Play,NULL); | |
- RegisterWithMetaServer(TRUE,FALSE,TRUE); | |
- Play->ConnectTimeout=0; | |
- | |
- if (Network) { | |
- dopelog(2,_("%s joins the game!"),GetPlayerName(Play)); | |
- } | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- pt=(Player *)list->data; | |
- if (IsConnectedPlayer(pt) && pt!=Play) { | |
- SendPlayerDetails(Play,pt,C_JOIN); | |
- } | |
- } | |
- Play->EventNum=E_ARRIVE; | |
- SendPlayerData(Play); | |
- SendEvent(Play); | |
- } else { | |
-/* Message displayed in the server when too many players try to connect */ | |
- dopelog(2,_("MaxClients (%d) exceeded - dropping connection"), | |
- MaxClients); | |
- if (MaxClients==1) { | |
- text=g_strdup_printf( | |
-/* Message sent to a player if the server is full */ | |
- _("Sorry, but this server has a limit of 1 " | |
- "player, which has been reached.^" | |
- "Please try connecting again later.")); | |
- } else { | |
- text=g_strdup_printf( | |
-/* Message sent to a player if the server is full */ | |
- _("Sorry, but this server has a limit of %d " | |
- "players, which has been reached.^" | |
- "Please try connecting again later."),MaxClients); | |
- } | |
- SendServerMessage(NULL,C_NONE,C_PRINTMESSAGE,Play,text); | |
- g_free(text); | |
-/* Make sure they do actually disconnect, eventually! */ | |
- if (ConnectTimeout) { | |
- Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout; | |
- } | |
- } | |
- } else { | |
-/* A player changed their name during the game (unusual, and not really | |
- properly supported anyway) - notify all players of the change */ | |
- dopelog(2,_("%s will now be known as %s"),GetPlayerName(Play),Data… | |
- BroadcastToClients(C_NONE,C_RENAME,Data,Play,Play); | |
- SetPlayerName(Play,Data); | |
- } | |
- break; | |
- case C_WANTQUIT: | |
- if (Play->EventNum!=E_FINISH) FinishGame(Play,NULL); | |
- break; | |
- case C_REQUESTJET: | |
- i=atoi(Data); | |
- if (Play->EventNum==E_FIGHT || Play->EventNum==E_FIGHTASK) { | |
- if (CanRunHere(Play)) break; | |
- else RunFromCombat(Play,i); | |
- } | |
- if (NumTurns>0 && Play->Turn>=NumTurns && Play->EventNum!=E_FINISH) { | |
-/* Message displayed when a player reaches their maximum number of turns */ | |
- FinishGame(Play,_("Your dealing time is up...")); | |
- } else if (i!=Play->IsAt && (NumTurns==0 || Play->Turn<NumTurns) && | |
- Play->EventNum==E_NONE && Play->Health>0) { | |
- dopelog(4,"%s jets to %s",GetPlayerName(Play),Location[i].Name); | |
- Play->IsAt=(char)i; | |
- Play->Turn++; | |
- Play->Debt=(price_t)((float)Play->Debt*1.1); | |
- Play->Bank=(price_t)((float)Play->Bank*1.05); | |
- SendPlayerData(Play); | |
- Play->EventNum=E_SUBWAY; | |
- SendEvent(Play); | |
- } else { | |
-/* A player has tried to jet to a new location, but we don't allow them to. | |
- (e.g. they're still fighting someone, or they're supposed to be dead) */ | |
- dopelog(3,_("%s: DENIED jet to %s"),GetPlayerName(Play), | |
- Location[i].Name); | |
- } | |
- break; | |
- case C_REQUESTSCORE: | |
- SendHighScores(Play,FALSE,NULL); | |
- break; | |
- case C_CONTACTSPY: | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- i=GetListEntry(&(tmp->SpyList),Play); | |
- if (tmp!=Play && i>=0 && tmp->SpyList.Data[i].Turns>=0) { | |
- SendSpyReport(Play,tmp); | |
- } | |
+/* | |
+ * Sends details (name, ID) about player "Play" to player "To", using | |
+ * message code "Code". | |
+ */ | |
+void SendPlayerDetails(Player *Play, Player *To, MsgCode Code) | |
+{ | |
+ GString *text; | |
+ | |
+ text = g_string_new(GetPlayerName(Play)); | |
+ if (HaveAbility(To, A_PLAYERID)) { | |
+ g_string_sprintfa(text, "^%d", Play->ID); | |
+ } | |
+ SendServerMessage(NULL, C_NONE, Code, To, text->str); | |
+ g_string_free(text, TRUE); | |
+} | |
+ | |
+/* | |
+ * Given a message "buf", from player "Play", performs processing and | |
+ * sends suitable replies. | |
+ */ | |
+void HandleServerMessage(gchar *buf, Player *Play) | |
+{ | |
+ Player *To, *tmp, *pt; | |
+ GSList *list; | |
+ char *Data; | |
+ AICode AI; | |
+ MsgCode Code; | |
+ gchar *text; | |
+ DopeEntry NewEntry; | |
+ int i; | |
+ price_t money; | |
+ | |
+ if (ProcessMessage(buf, Play, &To, &AI, &Code, &Data, FirstServer) == -1) { | |
+ g_warning("Bad message"); | |
+ return; | |
+ } | |
+ switch (Code) { | |
+ case C_MSGTO: | |
+ if (Network) { | |
+ dopelog(3, "%s->%s: %s", GetPlayerName(Play), GetPlayerName(To), | |
+ Data); | |
+ } | |
+ SendServerMessage(Play, AI, Code, To, Data); | |
+ break; | |
+ case C_ABILITIES: | |
+ ReceiveAbilities(Play, Data); | |
+ break; | |
+ case C_NAME: | |
+ pt = GetPlayerByName(Data, FirstServer); | |
+ if (pt && pt != Play) { | |
+ if (ConnectTimeout) { | |
+ Play->ConnectTimeout = time(NULL) + (time_t) ConnectTimeout; | |
+ } | |
+ SendServerMessage(NULL, C_NONE, C_NEWNAME, Play, NULL); | |
+ } else if (strlen(GetPlayerName(Play)) == 0 && Data[0]) { | |
+ if (CountPlayers(FirstServer) < MaxClients || !Network) { | |
+ SendAbilities(Play); | |
+ CombineAbilities(Play); | |
+ SendInitialData(Play); | |
+ SendMiscData(Play); | |
+ SetPlayerName(Play, Data); | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ pt = (Player *)list->data; | |
+ if (pt != Play && IsConnectedPlayer(pt) && !IsCop(pt)) { | |
+ SendPlayerDetails(pt, Play, C_LIST); | |
+ } | |
+ } | |
+ SendServerMessage(NULL, C_NONE, C_ENDLIST, Play, NULL); | |
+ RegisterWithMetaServer(TRUE, FALSE, TRUE); | |
+ Play->ConnectTimeout = 0; | |
+ | |
+ if (Network) { | |
+ dopelog(2, _("%s joins the game!"), GetPlayerName(Play)); | |
+ } | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ pt = (Player *)list->data; | |
+ if (IsConnectedPlayer(pt) && pt != Play) { | |
+ SendPlayerDetails(Play, pt, C_JOIN); | |
+ } | |
+ } | |
+ Play->EventNum = E_ARRIVE; | |
+ SendPlayerData(Play); | |
+ SendEvent(Play); | |
+ } else { | |
+ /* Message displayed in the server when too many players try to | |
+ * connect */ | |
+ dopelog(2, _("MaxClients (%d) exceeded - dropping connection"), | |
+ MaxClients); | |
+ if (MaxClients == 1) { | |
+ text = g_strdup_printf( | |
+ /* Message sent to a player if the | |
+ * server is full */ | |
+ _("Sorry, but this server has a limit of " | |
+ "1 player, which has been reached.^" | |
+ "Please try connecting again later.")); | |
+ } else { | |
+ text = g_strdup_printf( | |
+ /* Message sent to a player if the | |
+ * server is full */ | |
+ _("Sorry, but this server has a limit of " | |
+ "%d players, which has been reached.^" | |
+ "Please try connecting again later."), | |
+ MaxClients); | |
+ } | |
+ SendServerMessage(NULL, C_NONE, C_PRINTMESSAGE, Play, text); | |
+ g_free(text); | |
+ /* Make sure they do actually disconnect, eventually! */ | |
+ if (ConnectTimeout) { | |
+ Play->ConnectTimeout = time(NULL) + (time_t) ConnectTimeout; | |
} | |
+ } | |
+ } else { | |
+ /* A player changed their name during the game (unusual, and not | |
+ * really properly supported anyway) - notify all players of the | |
+ * change */ | |
+ dopelog(2, _("%s will now be known as %s"), GetPlayerName(Play), | |
+ Data); | |
+ BroadcastToClients(C_NONE, C_RENAME, Data, Play, Play); | |
+ SetPlayerName(Play, Data); | |
+ } | |
+ break; | |
+ case C_WANTQUIT: | |
+ if (Play->EventNum != E_FINISH) | |
+ FinishGame(Play, NULL); | |
+ break; | |
+ case C_REQUESTJET: | |
+ i = atoi(Data); | |
+ if (Play->EventNum == E_FIGHT || Play->EventNum == E_FIGHTASK) { | |
+ if (CanRunHere(Play)) | |
break; | |
- case C_DEPOSIT: | |
- money=strtoprice(Data); | |
- if (Play->Bank+money >=0 && Play->Cash-money >=0) { | |
- Play->Bank+=money; Play->Cash-=money; | |
- SendPlayerData(Play); | |
- } | |
- break; | |
- case C_PAYLOAN: | |
- money=strtoprice(Data); | |
- if (Play->Debt-money >=0 && Play->Cash-money >=0) { | |
- Play->Debt-=money; Play->Cash-=money; | |
- SendPlayerData(Play); | |
- } | |
- break; | |
- case C_BUYOBJECT: | |
- BuyObject(Play,Data); | |
- break; | |
- case C_FIGHTACT: | |
- if (Data[0]=='R') RunFromCombat(Play,-1); else Fire(Play); | |
- break; | |
- case C_ANSWER: | |
- HandleAnswer(Play,To,Data); | |
- break; | |
- case C_DONE: | |
- if (Play->EventNum!=E_NONE && Play->EventNum<E_OUTOFSYNC) { | |
- Play->EventNum++; SendEvent(Play); | |
- } | |
- break; | |
- case C_SPYON: | |
- if (Play->Cash >= Prices.Spy) { | |
- dopelog(3,_("%s now spying on %s"),GetPlayerName(Play), | |
- GetPlayerName(To)); | |
- Play->Cash -= Prices.Spy; | |
- LoseBitch(Play,NULL,NULL); | |
- NewEntry.Play=Play; NewEntry.Turns=-1; | |
- AddListEntry(&(To->SpyList),&NewEntry); | |
- SendPlayerData(Play); | |
- } else { | |
- g_warning(_("%s spy on %s: DENIED"),GetPlayerName(Play), | |
- GetPlayerName(To)); | |
- } | |
- break; | |
- case C_TIPOFF: | |
- if (Play->Cash >= Prices.Tipoff) { | |
- dopelog(3,_("%s tipped off the cops to %s"),GetPlayerName(Play), | |
- GetPlayerName(To)); | |
- Play->Cash -= Prices.Tipoff; | |
- LoseBitch(Play,NULL,NULL); | |
- NewEntry.Play=Play; NewEntry.Turns=0; | |
- AddListEntry(&(To->TipList),&NewEntry); | |
- SendPlayerData(Play); | |
- } else { | |
- g_warning(_("%s tipoff about %s: DENIED"),GetPlayerName(Play), | |
- GetPlayerName(To)); | |
- } | |
- break; | |
- case C_SACKBITCH: | |
- if (Play->Bitches.Carried>0) { | |
- LoseBitch(Play,NULL,NULL); | |
- SendPlayerData(Play); | |
- } | |
- break; | |
- case C_MSG: | |
- if (Network) dopelog(3,"%s: %s",GetPlayerName(Play),Data); | |
- BroadcastToClients(C_NONE,C_MSG,Data,Play,Play); | |
- break; | |
- default: | |
- dopelog(0,_("Unknown message: %s:%c:%s:%s"),GetPlayerName(Play),Code, | |
- GetPlayerName(To),Data); | |
- break; | |
- } | |
-} | |
- | |
-void ClientLeftServer(Player *Play) { | |
-/* Notifies all clients that player "Play" has left the game and */ | |
-/* cleans up after them if necessary. */ | |
- Player *tmp; | |
- GSList *list; | |
- | |
- if (!IsConnectedPlayer(Play)) return; | |
- | |
- if (Play->EventNum==E_FIGHT || Play->EventNum==E_FIGHTASK) { | |
- WithdrawFromCombat(Play); | |
- } | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- if (tmp!=Play) { | |
- RemoveAllEntries(&(tmp->TipList),Play); | |
- RemoveAllEntries(&(tmp->SpyList),Play); | |
+ else | |
+ RunFromCombat(Play, i); | |
+ } | |
+ if (NumTurns > 0 && Play->Turn >= NumTurns | |
+ && Play->EventNum != E_FINISH) { | |
+ /* Message displayed when a player reaches their maximum number of | |
+ * turns */ | |
+ FinishGame(Play, _("Your dealing time is up...")); | |
+ } else if (i != Play->IsAt && (NumTurns == 0 || Play->Turn < NumTurns) | |
+ && Play->EventNum == E_NONE && Play->Health > 0) { | |
+ dopelog(4, "%s jets to %s", GetPlayerName(Play), Location[i].Name); | |
+ Play->IsAt = (char)i; | |
+ Play->Turn++; | |
+ Play->Debt = (price_t)((float)Play->Debt * 1.1); | |
+ Play->Bank = (price_t)((float)Play->Bank * 1.05); | |
+ SendPlayerData(Play); | |
+ Play->EventNum = E_SUBWAY; | |
+ SendEvent(Play); | |
+ } else { | |
+ /* A player has tried to jet to a new location, but we don't allow | |
+ * them to. (e.g. they're still fighting someone, or they're | |
+ * supposed to be dead) */ | |
+ dopelog(3, _("%s: DENIED jet to %s"), GetPlayerName(Play), | |
+ Location[i].Name); | |
+ } | |
+ break; | |
+ case C_REQUESTSCORE: | |
+ SendHighScores(Play, FALSE, NULL); | |
+ break; | |
+ case C_CONTACTSPY: | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ i = GetListEntry(&(tmp->SpyList), Play); | |
+ if (tmp != Play && i >= 0 && tmp->SpyList.Data[i].Turns >= 0) { | |
+ SendSpyReport(Play, tmp); | |
} | |
- } | |
- BroadcastToClients(C_NONE,C_LEAVE,GetPlayerName(Play),Play,Play); | |
+ } | |
+ break; | |
+ case C_DEPOSIT: | |
+ money = strtoprice(Data); | |
+ if (Play->Bank + money >= 0 && Play->Cash - money >= 0) { | |
+ Play->Bank += money; | |
+ Play->Cash -= money; | |
+ SendPlayerData(Play); | |
+ } | |
+ break; | |
+ case C_PAYLOAN: | |
+ money = strtoprice(Data); | |
+ if (Play->Debt - money >= 0 && Play->Cash - money >= 0) { | |
+ Play->Debt -= money; | |
+ Play->Cash -= money; | |
+ SendPlayerData(Play); | |
+ } | |
+ break; | |
+ case C_BUYOBJECT: | |
+ BuyObject(Play, Data); | |
+ break; | |
+ case C_FIGHTACT: | |
+ if (Data[0] == 'R') | |
+ RunFromCombat(Play, -1); | |
+ else | |
+ Fire(Play); | |
+ break; | |
+ case C_ANSWER: | |
+ HandleAnswer(Play, To, Data); | |
+ break; | |
+ case C_DONE: | |
+ if (Play->EventNum != E_NONE && Play->EventNum < E_OUTOFSYNC) { | |
+ Play->EventNum++; | |
+ SendEvent(Play); | |
+ } | |
+ break; | |
+ case C_SPYON: | |
+ if (Play->Cash >= Prices.Spy) { | |
+ dopelog(3, _("%s now spying on %s"), GetPlayerName(Play), | |
+ GetPlayerName(To)); | |
+ Play->Cash -= Prices.Spy; | |
+ LoseBitch(Play, NULL, NULL); | |
+ NewEntry.Play = Play; | |
+ NewEntry.Turns = -1; | |
+ AddListEntry(&(To->SpyList), &NewEntry); | |
+ SendPlayerData(Play); | |
+ } else { | |
+ g_warning(_("%s spy on %s: DENIED"), GetPlayerName(Play), | |
+ GetPlayerName(To)); | |
+ } | |
+ break; | |
+ case C_TIPOFF: | |
+ if (Play->Cash >= Prices.Tipoff) { | |
+ dopelog(3, _("%s tipped off the cops to %s"), GetPlayerName(Play), | |
+ GetPlayerName(To)); | |
+ Play->Cash -= Prices.Tipoff; | |
+ LoseBitch(Play, NULL, NULL); | |
+ NewEntry.Play = Play; | |
+ NewEntry.Turns = 0; | |
+ AddListEntry(&(To->TipList), &NewEntry); | |
+ SendPlayerData(Play); | |
+ } else { | |
+ g_warning(_("%s tipoff about %s: DENIED"), GetPlayerName(Play), | |
+ GetPlayerName(To)); | |
+ } | |
+ break; | |
+ case C_SACKBITCH: | |
+ if (Play->Bitches.Carried > 0) { | |
+ LoseBitch(Play, NULL, NULL); | |
+ SendPlayerData(Play); | |
+ } | |
+ break; | |
+ case C_MSG: | |
+ if (Network) | |
+ dopelog(3, "%s: %s", GetPlayerName(Play), Data); | |
+ BroadcastToClients(C_NONE, C_MSG, Data, Play, Play); | |
+ break; | |
+ default: | |
+ dopelog(0, _("Unknown message: %s:%c:%s:%s"), GetPlayerName(Play), | |
+ Code, GetPlayerName(To), Data); | |
+ break; | |
+ } | |
+} | |
+ | |
+/* | |
+ * Notifies all clients that player "Play" has left the game and | |
+ * cleans up after them if necessary. | |
+ */ | |
+void ClientLeftServer(Player *Play) | |
+{ | |
+ Player *tmp; | |
+ GSList *list; | |
+ | |
+ if (!IsConnectedPlayer(Play)) | |
+ return; | |
+ | |
+ if (Play->EventNum == E_FIGHT || Play->EventNum == E_FIGHTASK) { | |
+ WithdrawFromCombat(Play); | |
+ } | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ if (tmp != Play) { | |
+ RemoveAllEntries(&(tmp->TipList), Play); | |
+ RemoveAllEntries(&(tmp->SpyList), Play); | |
+ } | |
+ } | |
+ BroadcastToClients(C_NONE, C_LEAVE, GetPlayerName(Play), Play, Play); | |
} | |
-void CleanUpServer() { | |
-/* Closes down the server and frees up associated handles and memory */ | |
- while (FirstServer) { | |
- FirstServer=RemovePlayer((Player *)FirstServer->data,FirstServer); | |
- } | |
+/* | |
+ * Closes down the server and frees up associated handles and memory. | |
+ */ | |
+void CleanUpServer() | |
+{ | |
+ while (FirstServer) { | |
+ FirstServer = RemovePlayer((Player *)FirstServer->data, FirstServer); | |
+ } | |
#if NETWORKING | |
- if (Server) CloseSocket(ListenSock); | |
+ if (Server) | |
+ CloseSocket(ListenSock); | |
#endif | |
} | |
-void ReregisterHandle(int sig) { | |
-/* Responds to a SIGUSR1 signal, and requests the main event loop to */ | |
-/* reregister the server with the dopewars metaserver. */ | |
- ReregisterRequest=1; | |
-} | |
- | |
-void RelogHandle(int sig) { | |
-/* Responds to a SIGHUP signal, and requests the main event loop to | |
- close and then reopen the log file (if any). */ | |
- RelogRequest=1; | |
-} | |
- | |
-void BreakHandle(int sig) { | |
-/* Traps an attempt by the user to send dopewars a SIGTERM or SIGINT */ | |
-/* (e.g. pressing Ctrl-C) and signals for a "nice" shutdown. Restores */ | |
-/* the default signal action (to terminate without cleanup) so that */ | |
-/* the user can still close the program easily if this cleanup code */ | |
-/* then causes problems or long delays. */ | |
- struct sigaction sact; | |
- TerminateRequest=1; | |
- sact.sa_handler=SIG_DFL; | |
- sact.sa_flags=0; | |
- sigaction(SIGTERM,&sact,NULL); | |
- sigaction(SIGINT,&sact,NULL); | |
-} | |
- | |
-void PrintHelpTo(FILE *fp) { | |
-/* Prints the server help screen to the given file pointer */ | |
- int i; | |
- GString *VarName; | |
- VarName=g_string_new(""); | |
- fprintf(fp,_(HelpText),VERSION); | |
- for (i=0;i<NUMGLOB;i++) { | |
- if (Globals[i].NameStruct[0]) { | |
- g_string_sprintf(VarName,"%s%s.%s",Globals[i].NameStruct, | |
- Globals[i].StructListPt ? "[x]" : "",Globals[i].Name… | |
- } else { | |
- g_string_assign(VarName,Globals[i].Name); | |
- } | |
- fprintf(fp,"%-26s %s\n",VarName->str,_(Globals[i].Help)); | |
- } | |
- fprintf(fp,"\n\n"); | |
- g_string_free(VarName,TRUE); | |
+/* | |
+ * Responds to a SIGUSR1 signal, and requests the main event loop to | |
+ * reregister the server with the dopewars metaserver. | |
+ */ | |
+void ReregisterHandle(int sig) | |
+{ | |
+ ReregisterRequest = 1; | |
+} | |
+ | |
+/* | |
+ * Responds to a SIGHUP signal, and requests the main event loop to | |
+ * close and then reopen the log file (if any). | |
+ */ | |
+void RelogHandle(int sig) | |
+{ | |
+ RelogRequest = 1; | |
+} | |
+ | |
+/* | |
+ * Traps an attempt by the user to send dopewars a SIGTERM or SIGINT | |
+ * (e.g. pressing Ctrl-C) and signals for a "nice" shutdown. Restores | |
+ * the default signal action (to terminate without cleanup) so that | |
+ * the user can still close the program easily if this cleanup code | |
+ * then causes problems or long delays. | |
+ */ | |
+void BreakHandle(int sig) | |
+{ | |
+ struct sigaction sact; | |
+ | |
+ TerminateRequest = 1; | |
+ sact.sa_handler = SIG_DFL; | |
+ sact.sa_flags = 0; | |
+ sigaction(SIGTERM, &sact, NULL); | |
+ sigaction(SIGINT, &sact, NULL); | |
+} | |
+ | |
+/* | |
+ * Prints the server help screen to the given file pointer. | |
+ */ | |
+void PrintHelpTo(FILE *fp) | |
+{ | |
+ int i; | |
+ GString *VarName; | |
+ | |
+ VarName = g_string_new(""); | |
+ fprintf(fp, _(HelpText), VERSION); | |
+ for (i = 0; i < NUMGLOB; i++) { | |
+ if (Globals[i].NameStruct[0]) { | |
+ g_string_sprintf(VarName, "%s%s.%s", Globals[i].NameStruct, | |
+ Globals[i].StructListPt ? "[x]" : "", | |
+ Globals[i].Name); | |
+ } else { | |
+ g_string_assign(VarName, Globals[i].Name); | |
+ } | |
+ fprintf(fp, "%-26s %s\n", VarName->str, _(Globals[i].Help)); | |
+ } | |
+ fprintf(fp, "\n\n"); | |
+ g_string_free(VarName, TRUE); | |
} | |
static NetworkBuffer *reply_netbuf; | |
-static void ServerReply(const gchar *msg) { | |
+static void ServerReply(const gchar *msg) | |
+{ | |
int msglen; | |
gchar *msgcp; | |
if (reply_netbuf) { | |
- msglen=strlen(msg); | |
- while (msglen>0 && msg[msglen-1]=='\n') msglen--; | |
- if (msglen>0) { | |
- msgcp = g_strndup(msg,msglen); | |
- QueueMessageForSend(reply_netbuf,msgcp); | |
+ msglen = strlen(msg); | |
+ while (msglen > 0 && msg[msglen - 1] == '\n') | |
+ msglen--; | |
+ if (msglen > 0) { | |
+ msgcp = g_strndup(msg, msglen); | |
+ QueueMessageForSend(reply_netbuf, msgcp); | |
g_free(msgcp); | |
} | |
- } else g_print(msg); | |
+ } else | |
+ g_print(msg); | |
} | |
-void ServerHelp(void) { | |
-/* Displays a simple help screen listing the server commands and options */ | |
+/* | |
+ * Displays a simple help screen listing the server commands and options. | |
+ */ | |
+void ServerHelp(void) | |
+{ | |
int i; | |
GString *VarName; | |
- VarName=g_string_new(""); | |
- g_print(_(HelpText),VERSION); | |
- for (i=0;i<NUMGLOB;i++) { | |
+ | |
+ VarName = g_string_new(""); | |
+ g_print(_(HelpText), VERSION); | |
+ for (i = 0; i < NUMGLOB; i++) { | |
if (Globals[i].NameStruct[0]) { | |
- g_string_sprintf(VarName,"%s%s.%s",Globals[i].NameStruct, | |
- Globals[i].StructListPt ? "[x]" : "",Globals[i].Name); | |
+ g_string_sprintf(VarName, "%s%s.%s", Globals[i].NameStruct, | |
+ Globals[i].StructListPt ? "[x]" : "", | |
+ Globals[i].Name); | |
} else { | |
- g_string_assign(VarName,Globals[i].Name); | |
+ g_string_assign(VarName, Globals[i].Name); | |
} | |
- g_print("%-26s\t%s\n",VarName->str,_(Globals[i].Help)); | |
+ g_print("%-26s\t%s\n", VarName->str, _(Globals[i].Help)); | |
} | |
- g_string_free(VarName,TRUE); | |
+ g_string_free(VarName, TRUE); | |
} | |
#if NETWORKING | |
-void CreatePidFile(void) { | |
-/* Creates a pid file (if "PidFile" is non-NULL) and writes the process */ | |
-/* ID into it */ | |
- FILE *fp; | |
- char *OpenError; | |
- if (!PidFile) return; | |
- fp=fopen(PidFile,"w"); | |
- if (fp) { | |
- dopelog(1,_("Maintaining pid file %s"),PidFile); | |
- fprintf(fp,"%ld\n",(long)getpid()); | |
- fclose(fp); | |
- chmod(PidFile,S_IREAD|S_IWRITE); | |
- } else { | |
- OpenError=strerror(errno); | |
- g_warning(_("Cannot create pid file %s: %s"),PidFile,OpenError); | |
- } | |
-} | |
- | |
-void RemovePidFile(void) { | |
-/* Removes the previously-created pid file "PidFile" */ | |
- if (PidFile) unlink(PidFile); | |
-} | |
- | |
-static gboolean StartServer(void) { | |
- LastError *sockerr=NULL; | |
- GString *errstr; | |
+/* | |
+ * Creates a pid file (if "PidFile" is non-NULL) and writes the process | |
+ * ID into it. | |
+ */ | |
+void CreatePidFile(void) | |
+{ | |
+ FILE *fp; | |
+ char *OpenError; | |
+ | |
+ if (!PidFile) | |
+ return; | |
+ fp = fopen(PidFile, "w"); | |
+ if (fp) { | |
+ dopelog(1, _("Maintaining pid file %s"), PidFile); | |
+ fprintf(fp, "%ld\n", (long)getpid()); | |
+ fclose(fp); | |
+ chmod(PidFile, S_IREAD | S_IWRITE); | |
+ } else { | |
+ OpenError = strerror(errno); | |
+ g_warning(_("Cannot create pid file %s: %s"), PidFile, OpenError); | |
+ } | |
+} | |
+ | |
+/* | |
+ * Removes the previously-created pid file "PidFile". | |
+ */ | |
+void RemovePidFile(void) | |
+{ | |
+ if (PidFile) | |
+ unlink(PidFile); | |
+} | |
+ | |
+static gboolean StartServer(void) | |
+{ | |
+ LastError *sockerr = NULL; | |
+ GString *errstr; | |
+ | |
#ifndef CYGWIN | |
- struct sigaction sact; | |
+ struct sigaction sact; | |
#else | |
- SERVICE_STATUS status; | |
+ SERVICE_STATUS status; | |
#endif | |
- if (!CheckHighScoreFileConfig()) return FALSE; | |
- Scanner=g_scanner_new(&ScannerConfig); | |
- Scanner->msg_handler=ScannerErrorHandler; | |
- Scanner->input_name="(stdin)"; | |
- CreatePidFile(); | |
- | |
-/* Make the output line-buffered, so that the log file (if used) is */ | |
-/* updated regularly */ | |
- fflush(stdout); | |
- | |
-#ifdef SETVBUF_REVERSED /* 2nd and 3rd arguments are reversed on some systems … | |
- setvbuf(stdout,_IOLBF,(char *)NULL,0); | |
+ if (!CheckHighScoreFileConfig()) | |
+ return FALSE; | |
+ Scanner = g_scanner_new(&ScannerConfig); | |
+ Scanner->msg_handler = ScannerErrorHandler; | |
+ Scanner->input_name = "(stdin)"; | |
+ CreatePidFile(); | |
+ | |
+ /* Make the output line-buffered, so that the log file (if used) is | |
+ * updated regularly */ | |
+ fflush(stdout); | |
+ | |
+#ifdef SETVBUF_REVERSED /* 2nd and 3rd arguments are reversed on | |
+ * some systems */ | |
+ setvbuf(stdout, _IOLBF, (char *)NULL, 0); | |
#else | |
- setvbuf(stdout,(char *)NULL,_IOLBF,0); | |
+ setvbuf(stdout, (char *)NULL, _IOLBF, 0); | |
#endif | |
- Network=TRUE; | |
- FirstServer=NULL; | |
- ClientMessageHandlerPt=NULL; | |
- ListenSock=CreateTCPSocket(&sockerr); | |
- if (ListenSock==SOCKET_ERROR) { | |
- errstr=g_string_new(""); | |
- g_string_assign_error(errstr,sockerr); | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL, | |
- _("Cannot create server (listening) socket (%s) Aborting."), | |
- errstr->str); | |
- g_string_free(errstr,TRUE); | |
- FreeError(sockerr); | |
- exit(1); | |
- } | |
- | |
-/* This doesn't seem to work properly under Win32 */ | |
+ Network = TRUE; | |
+ FirstServer = NULL; | |
+ ClientMessageHandlerPt = NULL; | |
+ ListenSock = CreateTCPSocket(&sockerr); | |
+ if (ListenSock == SOCKET_ERROR) { | |
+ errstr = g_string_new(""); | |
+ g_string_assign_error(errstr, sockerr); | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("Cannot create server (listening) socket (%s) Aborting."), | |
+ errstr->str); | |
+ g_string_free(errstr, TRUE); | |
+ FreeError(sockerr); | |
+ exit(1); | |
+ } | |
+ | |
+ /* This doesn't seem to work properly under Win32 */ | |
#ifndef CYGWIN | |
- SetReuse(ListenSock); | |
+ SetReuse(ListenSock); | |
#endif | |
- SetBlocking(ListenSock,FALSE); | |
+ SetBlocking(ListenSock, FALSE); | |
- if (!BindTCPSocket(ListenSock,Port,&sockerr)) { | |
- errstr=g_string_new(""); | |
- g_string_assign_error(errstr,sockerr); | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL, | |
- _("Cannot bind to port %u (%s) Aborting."), | |
- Port,errstr->str); | |
- g_string_free(errstr,TRUE); | |
- FreeError(sockerr); | |
- exit(1); | |
- } | |
+ if (!BindTCPSocket(ListenSock, Port, &sockerr)) { | |
+ errstr = g_string_new(""); | |
+ g_string_assign_error(errstr, sockerr); | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("Cannot bind to port %u (%s) Aborting."), Port, errstr->str); | |
+ g_string_free(errstr, TRUE); | |
+ FreeError(sockerr); | |
+ exit(1); | |
+ } | |
- if (listen(ListenSock,10)==SOCKET_ERROR) { | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL, | |
- _("Cannot listen to network socket. Aborting.")); | |
- exit(1); | |
- } | |
+ if (listen(ListenSock, 10) == SOCKET_ERROR) { | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("Cannot listen to network socket. Aborting.")); | |
+ exit(1); | |
+ } | |
-/* Initial startup message for the server */ | |
- dopelog(0,_("dopewars server version %s ready and waiting for " | |
- "connections on port %d."),VERSION,Port); | |
+ /* Initial startup message for the server */ | |
+ dopelog(0, _("dopewars server version %s ready and waiting for " | |
+ "connections on port %d."), VERSION, Port); | |
- MetaUpdateTimeout=MetaMinTimeout=0; | |
+ MetaUpdateTimeout = MetaMinTimeout = 0; | |
- TerminateRequest=ReregisterRequest=RelogRequest=0; | |
+ TerminateRequest = ReregisterRequest = RelogRequest = 0; | |
#if !CYGWIN | |
- sact.sa_handler=ReregisterHandle; | |
- sact.sa_flags=0; | |
- sigemptyset(&sact.sa_mask); | |
- if (sigaction(SIGUSR1,&sact,NULL)==-1) { | |
-/* Warning messages displayed if we fail to trap various signals */ | |
- g_warning(_("Cannot install SIGUSR1 interrupt handler!")); | |
- } | |
- sact.sa_handler=RelogHandle; | |
- sact.sa_flags=0; | |
- sigemptyset(&sact.sa_mask); | |
- if (sigaction(SIGHUP,&sact,NULL)==-1) { | |
- g_warning(_("Cannot install SIGHUP interrupt handler!")); | |
- } | |
- sact.sa_handler=BreakHandle; | |
- sact.sa_flags=0; | |
- sigemptyset(&sact.sa_mask); | |
- if (sigaction(SIGINT,&sact,NULL)==-1) { | |
- g_warning(_("Cannot install SIGINT interrupt handler!")); | |
- } | |
- if (sigaction(SIGTERM,&sact,NULL)==-1) { | |
- g_warning(_("Cannot install SIGTERM interrupt handler!")); | |
- } | |
- sact.sa_handler=SIG_IGN; | |
- sact.sa_flags=0; | |
- if (sigaction(SIGPIPE,&sact,NULL)==-1) { | |
- g_warning(_("Cannot install pipe handler!")); | |
- } | |
+ sact.sa_handler = ReregisterHandle; | |
+ sact.sa_flags = 0; | |
+ sigemptyset(&sact.sa_mask); | |
+ if (sigaction(SIGUSR1, &sact, NULL) == -1) { | |
+ /* Warning messages displayed if we fail to trap various signals */ | |
+ g_warning(_("Cannot install SIGUSR1 interrupt handler!")); | |
+ } | |
+ sact.sa_handler = RelogHandle; | |
+ sact.sa_flags = 0; | |
+ sigemptyset(&sact.sa_mask); | |
+ if (sigaction(SIGHUP, &sact, NULL) == -1) { | |
+ g_warning(_("Cannot install SIGHUP interrupt handler!")); | |
+ } | |
+ sact.sa_handler = BreakHandle; | |
+ sact.sa_flags = 0; | |
+ sigemptyset(&sact.sa_mask); | |
+ if (sigaction(SIGINT, &sact, NULL) == -1) { | |
+ g_warning(_("Cannot install SIGINT interrupt handler!")); | |
+ } | |
+ if (sigaction(SIGTERM, &sact, NULL) == -1) { | |
+ g_warning(_("Cannot install SIGTERM interrupt handler!")); | |
+ } | |
+ sact.sa_handler = SIG_IGN; | |
+ sact.sa_flags = 0; | |
+ if (sigaction(SIGPIPE, &sact, NULL) == -1) { | |
+ g_warning(_("Cannot install pipe handler!")); | |
+ } | |
#endif | |
- RegisterWithMetaServer(TRUE,TRUE,FALSE); | |
- return TRUE; | |
-} | |
- | |
-void RequestServerShutdown(void) { | |
-/* Begin the process of shutting down the server. In order to do this, */ | |
-/* we need to log out all of the currently connected players, and tell */ | |
-/* the metaserver that we're shutting down. We only shut down properly */ | |
-/* once all of these messages have been completely sent and */ | |
-/* acknowledged. (Of course, this can be overridden by a SIGINT or */ | |
-/* similar in the case of unresponsive players.) */ | |
- RegisterWithMetaServer(FALSE,FALSE,FALSE); | |
- BroadcastToClients(C_NONE,C_QUIT,NULL,NULL,NULL); | |
- WantQuit=TRUE; | |
-} | |
- | |
-gboolean IsServerShutdown(void) { | |
-/* Returns TRUE if the actions initiated by RequestServerShutdown() */ | |
-/* have been successfully completed, such that we can shut down the */ | |
-/* server properly now. */ | |
- return (WantQuit && !FirstServer && !MetaConn); | |
+ RegisterWithMetaServer(TRUE, TRUE, FALSE); | |
+ return TRUE; | |
} | |
-static GPrintFunc StartServerReply(NetworkBuffer *netbuf) { | |
+/* | |
+ * Begin the process of shutting down the server. In order to do this, | |
+ * we need to log out all of the currently connected players, and tell | |
+ * the metaserver that we're shutting down. We only shut down properly | |
+ * once all of these messages have been completely sent and | |
+ * acknowledged. (Of course, this can be overridden by a SIGINT or | |
+ * similar in the case of unresponsive players.) | |
+ */ | |
+void RequestServerShutdown(void) | |
+{ | |
+ RegisterWithMetaServer(FALSE, FALSE, FALSE); | |
+ BroadcastToClients(C_NONE, C_QUIT, NULL, NULL, NULL); | |
+ WantQuit = TRUE; | |
+} | |
+ | |
+/* | |
+ * Returns TRUE if the actions initiated by RequestServerShutdown() | |
+ * have been successfully completed, such that we can shut down the | |
+ * server properly now. | |
+ */ | |
+gboolean IsServerShutdown(void) | |
+{ | |
+ return (WantQuit && !FirstServer && !MetaConn); | |
+} | |
+ | |
+static GPrintFunc StartServerReply(NetworkBuffer *netbuf) | |
+{ | |
reply_netbuf = netbuf; | |
- if (netbuf) return g_set_print_handler(ServerReply); | |
- else return NULL; | |
-} | |
- | |
-static void FinishServerReply(GPrintFunc oldprint) { | |
- if (oldprint) g_set_print_handler(oldprint); | |
-} | |
- | |
-static void HandleServerCommand(char *string,NetworkBuffer *netbuf) { | |
- GSList *list; | |
- Player *tmp; | |
- GPrintFunc oldprint; | |
- | |
- oldprint = StartServerReply(netbuf); | |
- | |
- g_scanner_input_text(Scanner,string,strlen(string)); | |
- if (!ParseNextConfig(Scanner,TRUE)) { | |
- if (g_strcasecmp(string,"help")==0 || g_strcasecmp(string,"h")==0 || | |
- strcmp(string,"?")==0) { | |
- ServerHelp(); | |
- } else if (g_strcasecmp(string,"quit")==0) { | |
- RequestServerShutdown(); | |
- } else if (g_strncasecmp(string,"msg:",4)==0) { | |
- BroadcastToClients(C_NONE,C_MSG,string+4,NULL,NULL); | |
- } else if (g_strcasecmp(string,"list")==0) { | |
- if (FirstServer) { | |
- g_print(_("Users currently logged on:-\n")); | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- if (!IsCop(tmp)) { | |
- g_print("%s\n",GetPlayerName(tmp)); | |
- } | |
- } | |
- } else g_print(_("No users currently logged on!\n")); | |
- } else if (g_strncasecmp(string,"push ",5)==0) { | |
- tmp=GetPlayerByName(string+5,FirstServer); | |
- if (tmp) { | |
- g_print(_("Pushing %s\n"),GetPlayerName(tmp)); | |
- SendServerMessage(NULL,C_NONE,C_PUSH,tmp,NULL); | |
- } else g_print(_("No such user!\n")); | |
- } else if (g_strncasecmp(string,"kill ",5)==0) { | |
- tmp=GetPlayerByName(string+5,FirstServer); | |
- if (tmp) { | |
- g_print(_("%s killed\n"),GetPlayerName(tmp)); | |
- BroadcastToClients(C_NONE,C_KILL,GetPlayerName(tmp),tmp, | |
- (Player *)FirstServer->data); | |
- FirstServer=RemovePlayer(tmp,FirstServer); | |
- } else g_print(_("No such user!\n")); | |
- } else { | |
- g_print(_("Unknown command - try \"help\" for help...\n")); | |
- } | |
- } | |
- FinishServerReply(oldprint); | |
-} | |
- | |
-Player *HandleNewConnection(void) { | |
- int cadsize; | |
- int ClientSock; | |
- struct sockaddr_in ClientAddr; | |
- Player *tmp; | |
- cadsize=sizeof(struct sockaddr); | |
- if ((ClientSock=accept(ListenSock,(struct sockaddr *)&ClientAddr, | |
- &cadsize))==-1) { | |
- perror("accept socket"); bgetch(); exit(1); | |
- } | |
- dopelog(2,_("got connection from %s"),inet_ntoa(ClientAddr.sin_addr)); | |
- tmp=g_new(Player,1); | |
- FirstServer=AddPlayer(ClientSock,tmp,FirstServer); | |
- if (ConnectTimeout) { | |
- tmp->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout; | |
- } | |
- return tmp; | |
-} | |
- | |
-void StopServer() { | |
- dopelog(0,_("dopewars server terminating.")); | |
- g_scanner_destroy(Scanner); | |
- CleanUpServer(); | |
- RemovePidFile(); | |
-} | |
- | |
-void RemovePlayerFromServer(Player *Play) { | |
- if (!WantQuit && strlen(GetPlayerName(Play))>0) { | |
- dopelog(2,_("%s leaves the server!"),GetPlayerName(Play)); | |
- ClientLeftServer(Play); | |
-/* Blank the name, so that CountPlayers ignores this player */ | |
- SetPlayerName(Play,NULL); | |
-/* Report the new high scores (if any) and the new number of players | |
- to the metaserver */ | |
- RegisterWithMetaServer(TRUE,TRUE,TRUE); | |
- } | |
- FirstServer=RemovePlayer(Play,FirstServer); | |
+ if (netbuf) | |
+ return g_set_print_handler(ServerReply); | |
+ else | |
+ return NULL; | |
+} | |
+ | |
+static void FinishServerReply(GPrintFunc oldprint) | |
+{ | |
+ if (oldprint) | |
+ g_set_print_handler(oldprint); | |
+} | |
+ | |
+static void HandleServerCommand(char *string, NetworkBuffer *netbuf) | |
+{ | |
+ GSList *list; | |
+ Player *tmp; | |
+ GPrintFunc oldprint; | |
+ | |
+ oldprint = StartServerReply(netbuf); | |
+ | |
+ g_scanner_input_text(Scanner, string, strlen(string)); | |
+ if (!ParseNextConfig(Scanner, TRUE)) { | |
+ if (g_strcasecmp(string, "help") == 0 || g_strcasecmp(string, "h") == 0 | |
+ || strcmp(string, "?") == 0) { | |
+ ServerHelp(); | |
+ } else if (g_strcasecmp(string, "quit") == 0) { | |
+ RequestServerShutdown(); | |
+ } else if (g_strncasecmp(string, "msg:", 4) == 0) { | |
+ BroadcastToClients(C_NONE, C_MSG, string + 4, NULL, NULL); | |
+ } else if (g_strcasecmp(string, "list") == 0) { | |
+ if (FirstServer) { | |
+ g_print(_("Users currently logged on:-\n")); | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ if (!IsCop(tmp)) { | |
+ g_print("%s\n", GetPlayerName(tmp)); | |
+ } | |
+ } | |
+ } else | |
+ g_print(_("No users currently logged on!\n")); | |
+ } else if (g_strncasecmp(string, "push ", 5) == 0) { | |
+ tmp = GetPlayerByName(string + 5, FirstServer); | |
+ if (tmp) { | |
+ g_print(_("Pushing %s\n"), GetPlayerName(tmp)); | |
+ SendServerMessage(NULL, C_NONE, C_PUSH, tmp, NULL); | |
+ } else | |
+ g_print(_("No such user!\n")); | |
+ } else if (g_strncasecmp(string, "kill ", 5) == 0) { | |
+ tmp = GetPlayerByName(string + 5, FirstServer); | |
+ if (tmp) { | |
+ g_print(_("%s killed\n"), GetPlayerName(tmp)); | |
+ BroadcastToClients(C_NONE, C_KILL, GetPlayerName(tmp), tmp, | |
+ (Player *)FirstServer->data); | |
+ FirstServer = RemovePlayer(tmp, FirstServer); | |
+ } else | |
+ g_print(_("No such user!\n")); | |
+ } else { | |
+ g_print(_("Unknown command - try \"help\" for help...\n")); | |
+ } | |
+ } | |
+ FinishServerReply(oldprint); | |
+} | |
+ | |
+Player *HandleNewConnection(void) | |
+{ | |
+ int cadsize; | |
+ int ClientSock; | |
+ struct sockaddr_in ClientAddr; | |
+ Player *tmp; | |
+ cadsize = sizeof(struct sockaddr); | |
+ if ((ClientSock = accept(ListenSock, (struct sockaddr *)&ClientAddr, | |
+ &cadsize)) == -1) { | |
+ perror("accept socket"); | |
+ bgetch(); | |
+ exit(1); | |
+ } | |
+ dopelog(2, _("got connection from %s"), inet_ntoa(ClientAddr.sin_addr)); | |
+ tmp = g_new(Player, 1); | |
+ | |
+ FirstServer = AddPlayer(ClientSock, tmp, FirstServer); | |
+ if (ConnectTimeout) { | |
+ tmp->ConnectTimeout = time(NULL) + (time_t) ConnectTimeout; | |
+ } | |
+ return tmp; | |
+} | |
+ | |
+void StopServer() | |
+{ | |
+ dopelog(0, _("dopewars server terminating.")); | |
+ g_scanner_destroy(Scanner); | |
+ CleanUpServer(); | |
+ RemovePidFile(); | |
+} | |
+ | |
+void RemovePlayerFromServer(Player *Play) | |
+{ | |
+ if (!WantQuit && strlen(GetPlayerName(Play)) > 0) { | |
+ dopelog(2, _("%s leaves the server!"), GetPlayerName(Play)); | |
+ ClientLeftServer(Play); | |
+ /* Blank the name, so that CountPlayers ignores this player */ | |
+ SetPlayerName(Play, NULL); | |
+ /* Report the new high scores (if any) and the new number of players | |
+ * to the metaserver */ | |
+ RegisterWithMetaServer(TRUE, TRUE, TRUE); | |
+ } | |
+ FirstServer = RemovePlayer(Play, FirstServer); | |
} | |
#ifndef CYGWIN | |
static gchar sockdir[] = "/tmp/.dopewars/"; | |
-gchar *GetLocalSocket(void) { | |
- return g_strdup_printf("%ssocket-%u",sockdir,Port); | |
+gchar *GetLocalSocket(void) | |
+{ | |
+ return g_strdup_printf("%ssocket-%u", sockdir, Port); | |
} | |
-static void CloseLocalSocket(int localsock) { | |
+static void CloseLocalSocket(int localsock) | |
+{ | |
gchar *sockname; | |
- if (localsock>=0) close(localsock); | |
+ if (localsock >= 0) | |
+ close(localsock); | |
- sockname=GetLocalSocket(); | |
+ sockname = GetLocalSocket(); | |
unlink(sockname); | |
rmdir(sockdir); | |
g_free(sockname); | |
} | |
-static int SetupLocalSocket(void) { | |
+static int SetupLocalSocket(void) | |
+{ | |
int sock; | |
struct sockaddr_un addr; | |
gchar *sockname; | |
CloseLocalSocket(-1); | |
- sock = socket(PF_UNIX,SOCK_STREAM,0); | |
- if (sock==-1) return -1; | |
+ sock = socket(PF_UNIX, SOCK_STREAM, 0); | |
+ if (sock == -1) | |
+ return -1; | |
- SetBlocking(sock,FALSE); | |
+ SetBlocking(sock, FALSE); | |
- sockname=GetLocalSocket(); | |
- mkdir(sockdir,S_IRUSR|S_IWUSR|S_IXUSR); | |
+ sockname = GetLocalSocket(); | |
+ mkdir(sockdir, S_IRUSR | S_IWUSR | S_IXUSR); | |
addr.sun_family = AF_UNIX; | |
- strncpy(addr.sun_path,sockname,sizeof(addr.sun_path)); | |
- addr.sun_path[sizeof(addr.sun_path)-1]='\0'; | |
+ strncpy(addr.sun_path, sockname, sizeof(addr.sun_path)); | |
+ addr.sun_path[sizeof(addr.sun_path) - 1] = '\0'; | |
- bind(sock,(struct sockaddr *)&addr,sizeof(struct sockaddr_un)); | |
+ bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)); | |
- chmod(sockname,S_IRUSR|S_IWUSR); | |
+ chmod(sockname, S_IRUSR | S_IWUSR); | |
g_free(sockname); | |
- listen(sock,10); | |
- | |
+ listen(sock, 10); | |
+ | |
return sock; | |
} | |
#endif | |
-void ServerLoop() { | |
-/* Initialises server, processes network and interactive messages, and */ | |
-/* finally cleans up the server on exit. */ | |
- Player *tmp; | |
- GSList *list,*nextlist,*localconn=NULL; | |
- fd_set readfs,writefs,errorfs; | |
- int topsock; | |
- GPrintFunc oldprint; | |
- struct timeval timeout; | |
- int MinTimeout; | |
- GString *LineBuf; | |
- gboolean DoneOK; | |
- gchar *buf; | |
+/* | |
+ * Initialises server, processes network and interactive messages, and | |
+ * finally cleans up the server on exit. | |
+ */ | |
+void ServerLoop() | |
+{ | |
+ Player *tmp; | |
+ GSList *list, *nextlist, *localconn = NULL; | |
+ fd_set readfs, writefs, errorfs; | |
+ int topsock; | |
+ GPrintFunc oldprint; | |
+ struct timeval timeout; | |
+ int MinTimeout; | |
+ GString *LineBuf; | |
+ gboolean DoneOK; | |
+ gchar *buf; | |
+ | |
#ifndef CYGWIN | |
- int localsock; | |
+ int localsock; | |
#endif | |
- if (!StartServer()) return; | |
+ if (!StartServer()) | |
+ return; | |
#ifdef HAVE_FORK | |
-/* Daemonize; continue if the fork was successful and we are the child, or | |
- if the fork failed */ | |
- if (Daemonize && fork()>0) return; | |
+ /* Daemonize; continue if the fork was successful and we are the child, | |
+ * or if the fork failed */ | |
+ if (Daemonize && fork() > 0) | |
+ return; | |
#endif | |
#ifndef CYGWIN | |
- localsock=SetupLocalSocket(); | |
+ localsock = SetupLocalSocket(); | |
#endif | |
- LineBuf=g_string_new(""); | |
- while (1) { | |
- FD_ZERO(&readfs); | |
- FD_ZERO(&writefs); | |
- FD_ZERO(&errorfs); | |
- FD_SET(ListenSock,&readfs); | |
- FD_SET(ListenSock,&errorfs); | |
- topsock=ListenSock+1; | |
+ LineBuf = g_string_new(""); | |
+ while (1) { | |
+ FD_ZERO(&readfs); | |
+ FD_ZERO(&writefs); | |
+ FD_ZERO(&errorfs); | |
+ FD_SET(ListenSock, &readfs); | |
+ FD_SET(ListenSock, &errorfs); | |
+ topsock = ListenSock + 1; | |
#ifndef CYGWIN | |
- FD_SET(localsock,&readfs); | |
- topsock=MAX(topsock,localsock+1); | |
- for (list=localconn;list;list=g_slist_next(list)) { | |
- NetworkBuffer *netbuf; | |
- netbuf = (NetworkBuffer *)list->data; | |
- SetSelectForNetworkBuffer(netbuf,&readfs,&writefs,&errorfs,&topsock); | |
- } | |
+ FD_SET(localsock, &readfs); | |
+ topsock = MAX(topsock, localsock + 1); | |
+ for (list = localconn; list; list = g_slist_next(list)) { | |
+ NetworkBuffer *netbuf; | |
+ | |
+ netbuf = (NetworkBuffer *)list->data; | |
+ SetSelectForNetworkBuffer(netbuf, &readfs, &writefs, &errorfs, | |
+ &topsock); | |
+ } | |
#endif | |
- if (MetaConn) { | |
- SetSelectForNetworkBuffer(&MetaConn->NetBuf,&readfs,&writefs, | |
- &errorfs,&topsock); | |
- } | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- tmp=(Player *)list->data; | |
- if (!IsCop(tmp)) { | |
- SetSelectForNetworkBuffer(&tmp->NetBuf,&readfs,&writefs, | |
- &errorfs,&topsock); | |
- } | |
- } | |
- MinTimeout=GetMinimumTimeout(FirstServer); | |
- if (MinTimeout!=-1) { | |
- timeout.tv_sec=MinTimeout; | |
- timeout.tv_usec=0; | |
- } | |
- if (select(topsock,&readfs,&writefs,&errorfs, | |
- MinTimeout==-1 ? NULL : &timeout)==-1) { | |
- if (errno==EINTR) { | |
- if (ReregisterRequest) { | |
- ReregisterRequest=0; | |
- RegisterWithMetaServer(TRUE,TRUE,FALSE); | |
- continue; | |
- } else if (TerminateRequest) { | |
- TerminateRequest=0; | |
- RequestServerShutdown(); | |
- if (IsServerShutdown()) break; | |
- else continue; | |
- } else if (RelogRequest) { /* Re-open log file */ | |
- RelogRequest=0; | |
- CloseLog(); | |
- OpenLog(); | |
- continue; | |
- } else continue; | |
- } | |
- perror("select"); bgetch(); break; | |
+ if (MetaConn) { | |
+ SetSelectForNetworkBuffer(&MetaConn->NetBuf, &readfs, &writefs, | |
+ &errorfs, &topsock); | |
+ } | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ tmp = (Player *)list->data; | |
+ if (!IsCop(tmp)) { | |
+ SetSelectForNetworkBuffer(&tmp->NetBuf, &readfs, &writefs, | |
+ &errorfs, &topsock); | |
} | |
- FirstServer=HandleTimeouts(FirstServer); | |
- if (FD_ISSET(ListenSock,&readfs)) { | |
- HandleNewConnection(); | |
+ } | |
+ MinTimeout = GetMinimumTimeout(FirstServer); | |
+ if (MinTimeout != -1) { | |
+ timeout.tv_sec = MinTimeout; | |
+ timeout.tv_usec = 0; | |
+ } | |
+ if (select(topsock, &readfs, &writefs, &errorfs, | |
+ MinTimeout == -1 ? NULL : &timeout) == -1) { | |
+ if (errno == EINTR) { | |
+ if (ReregisterRequest) { | |
+ ReregisterRequest = 0; | |
+ RegisterWithMetaServer(TRUE, TRUE, FALSE); | |
+ continue; | |
+ } else if (TerminateRequest) { | |
+ TerminateRequest = 0; | |
+ RequestServerShutdown(); | |
+ if (IsServerShutdown()) | |
+ break; | |
+ else | |
+ continue; | |
+ } else if (RelogRequest) { /* Re-open log file */ | |
+ RelogRequest = 0; | |
+ CloseLog(); | |
+ OpenLog(); | |
+ continue; | |
+ } else | |
+ continue; | |
} | |
+ perror("select"); | |
+ bgetch(); | |
+ break; | |
+ } | |
+ FirstServer = HandleTimeouts(FirstServer); | |
+ if (FD_ISSET(ListenSock, &readfs)) { | |
+ HandleNewConnection(); | |
+ } | |
#ifndef CYGWIN | |
- if (FD_ISSET(localsock,&readfs)) { | |
- int newlocal; | |
- NetworkBuffer *netbuf; | |
- newlocal = accept(localsock,NULL,NULL); | |
- netbuf=g_new(NetworkBuffer,1); | |
- InitNetworkBuffer(netbuf,'\n','\r',NULL); | |
- BindNetworkBufferToSocket(netbuf,newlocal); | |
- localconn = g_slist_append(localconn,netbuf); | |
- oldprint = StartServerReply(netbuf); | |
- g_print(_("dopewars server version %s ready for admin commands; " | |
- "try \"help\" for help"),VERSION); | |
- FinishServerReply(oldprint); | |
- dopelog(1,_("New admin connection")); | |
- } | |
- list=localconn; | |
- while (list) { | |
- NetworkBuffer *netbuf; | |
- nextlist=g_slist_next(list); | |
- netbuf = (NetworkBuffer *)list->data; | |
- if (netbuf) { | |
- if (RespondToSelect(netbuf,&readfs,&writefs,&errorfs,&DoneOK)) { | |
- while((buf=GetWaitingMessage(netbuf))!=NULL) { | |
- dopelog(2,_("Admin command: %s"),buf); | |
- HandleServerCommand(buf,netbuf); | |
- g_free(buf); | |
- } | |
- } | |
- if (!DoneOK) { | |
- dopelog(1,_("Admin connection closed")); | |
- localconn = g_slist_remove(localconn,netbuf); | |
- ShutdownNetworkBuffer(netbuf); | |
- g_free(netbuf); | |
+ if (FD_ISSET(localsock, &readfs)) { | |
+ int newlocal; | |
+ NetworkBuffer *netbuf; | |
+ | |
+ newlocal = accept(localsock, NULL, NULL); | |
+ netbuf = g_new(NetworkBuffer, 1); | |
+ | |
+ InitNetworkBuffer(netbuf, '\n', '\r', NULL); | |
+ BindNetworkBufferToSocket(netbuf, newlocal); | |
+ localconn = g_slist_append(localconn, netbuf); | |
+ oldprint = StartServerReply(netbuf); | |
+ g_print(_("dopewars server version %s ready for admin commands; " | |
+ "try \"help\" for help"), VERSION); | |
+ FinishServerReply(oldprint); | |
+ dopelog(1, _("New admin connection")); | |
+ } | |
+ list = localconn; | |
+ while (list) { | |
+ NetworkBuffer *netbuf; | |
+ | |
+ nextlist = g_slist_next(list); | |
+ netbuf = (NetworkBuffer *)list->data; | |
+ if (netbuf) { | |
+ if (RespondToSelect(netbuf, &readfs, &writefs, &errorfs, &DoneOK)) { | |
+ while ((buf = GetWaitingMessage(netbuf)) != NULL) { | |
+ dopelog(2, _("Admin command: %s"), buf); | |
+ HandleServerCommand(buf, netbuf); | |
+ g_free(buf); | |
} | |
- list=nextlist; | |
} | |
+ if (!DoneOK) { | |
+ dopelog(1, _("Admin connection closed")); | |
+ localconn = g_slist_remove(localconn, netbuf); | |
+ ShutdownNetworkBuffer(netbuf); | |
+ g_free(netbuf); | |
+ } | |
+ list = nextlist; | |
} | |
- if (IsServerShutdown()) break; | |
+ } | |
+ if (IsServerShutdown()) | |
+ break; | |
#endif | |
- if (MetaConn) { | |
- if (RespondToSelect(&MetaConn->NetBuf,&readfs,&writefs, | |
- &errorfs,&DoneOK)) { | |
- while ((buf=ReadHttpResponse(MetaConn,&DoneOK))) { | |
- gboolean ReadingBody = (MetaConn->Status==HS_READBODY); | |
- if (buf[0] || !ReadingBody) { | |
- dopelog(ReadingBody ? 2 : 4,"MetaServer: %s",buf); | |
- } | |
- g_free(buf); | |
- } | |
- } | |
- if (!DoneOK && HandleHttpCompletion(MetaConn)) { | |
- if (!MetaConnectError(MetaConn)) { | |
- dopelog(4,"MetaServer: (closed)\n"); | |
- } | |
- CloseHttpConnection(MetaConn); MetaConn=NULL; | |
- if (IsServerShutdown()) break; | |
- } | |
+ if (MetaConn) { | |
+ if (RespondToSelect(&MetaConn->NetBuf, &readfs, &writefs, | |
+ &errorfs, &DoneOK)) { | |
+ while ((buf = ReadHttpResponse(MetaConn, &DoneOK))) { | |
+ gboolean ReadingBody = (MetaConn->Status == HS_READBODY); | |
+ | |
+ if (buf[0] || !ReadingBody) { | |
+ dopelog(ReadingBody ? 2 : 4, "MetaServer: %s", buf); | |
+ } | |
+ g_free(buf); | |
+ } | |
+ } | |
+ if (!DoneOK && HandleHttpCompletion(MetaConn)) { | |
+ if (!MetaConnectError(MetaConn)) { | |
+ dopelog(4, "MetaServer: (closed)\n"); | |
+ } | |
+ CloseHttpConnection(MetaConn); | |
+ MetaConn = NULL; | |
+ if (IsServerShutdown()) | |
+ break; | |
} | |
- list=FirstServer; | |
- while (list) { | |
- nextlist=g_slist_next(list); | |
- tmp=(Player *)list->data; | |
- if (tmp) { | |
- if (RespondToSelect(&tmp->NetBuf,&readfs,&writefs, | |
- &errorfs,&DoneOK)) { | |
-/* If any complete messages were read, process them */ | |
- HandleServerPlayer(tmp); | |
- } | |
- if (!DoneOK) { | |
-/* The socket has been shut down, or the buffer was filled - remove player */ | |
- RemovePlayerFromServer(tmp); | |
- if (IsServerShutdown()) break; | |
- tmp=NULL; | |
- } | |
- } | |
- list=nextlist; | |
+ } | |
+ list = FirstServer; | |
+ while (list) { | |
+ nextlist = g_slist_next(list); | |
+ tmp = (Player *)list->data; | |
+ if (tmp) { | |
+ if (RespondToSelect(&tmp->NetBuf, &readfs, &writefs, | |
+ &errorfs, &DoneOK)) { | |
+ /* If any complete messages were read, process them */ | |
+ HandleServerPlayer(tmp); | |
+ } | |
+ if (!DoneOK) { | |
+ /* The socket has been shut down, or the buffer was filled - | |
+ * remove player */ | |
+ RemovePlayerFromServer(tmp); | |
+ if (IsServerShutdown()) | |
+ break; | |
+ tmp = NULL; | |
+ } | |
} | |
- if (list && IsServerShutdown()) break; | |
- } | |
+ list = nextlist; | |
+ } | |
+ if (list && IsServerShutdown()) | |
+ break; | |
+ } | |
#ifndef CYGWIN | |
- CloseLocalSocket(localsock); | |
+ CloseLocalSocket(localsock); | |
#endif | |
- StopServer(); | |
- g_string_free(LineBuf,TRUE); | |
+ StopServer(); | |
+ g_string_free(LineBuf, TRUE); | |
} | |
#ifdef GUI_SERVER | |
static GtkWidget *TextOutput; | |
-static gint ListenTag=0; | |
-static void SocketStatus(NetworkBuffer *NetBuf,gboolean Read,gboolean Write, | |
- gboolean CallNow); | |
+static gint ListenTag = 0; | |
+static void SocketStatus(NetworkBuffer *NetBuf, gboolean Read, | |
+ gboolean Write, gboolean CallNow); | |
static void GuiSetTimeouts(void); | |
-static time_t NextTimeout=0; | |
-static guint TimeoutTag=0; | |
- | |
-static gint GuiDoTimeouts(gpointer data) { | |
-/* Forget the TimeoutTag so that GuiSetTimeouts doesn't delete it - it'll be | |
- deleted automatically anyway when we return FALSE */ | |
- TimeoutTag=0; | |
- NextTimeout=0; | |
- | |
- FirstServer=HandleTimeouts(FirstServer); | |
- GuiSetTimeouts(); | |
- return FALSE; | |
-} | |
- | |
-void GuiSetTimeouts(void) { | |
- int MinTimeout; | |
- time_t TimeNow; | |
- TimeNow=time(NULL); | |
- MinTimeout=GetMinimumTimeout(FirstServer); | |
- if (TimeNow+MinTimeout < NextTimeout || NextTimeout<TimeNow) { | |
- if (TimeoutTag>0) gtk_timeout_remove(TimeoutTag); | |
- TimeoutTag = 0; | |
- if (MinTimeout>0) { | |
- TimeoutTag=gtk_timeout_add(MinTimeout*1000,GuiDoTimeouts,NULL); | |
- NextTimeout=TimeNow+MinTimeout; | |
- } | |
- } | |
+static time_t NextTimeout = 0; | |
+static guint TimeoutTag = 0; | |
+ | |
+static gint GuiDoTimeouts(gpointer data) | |
+{ | |
+ /* Forget the TimeoutTag so that GuiSetTimeouts doesn't delete it - | |
+ * it'll be deleted automatically anyway when we return FALSE */ | |
+ TimeoutTag = 0; | |
+ NextTimeout = 0; | |
+ | |
+ FirstServer = HandleTimeouts(FirstServer); | |
+ GuiSetTimeouts(); | |
+ return FALSE; | |
+} | |
+ | |
+void GuiSetTimeouts(void) | |
+{ | |
+ int MinTimeout; | |
+ time_t TimeNow; | |
+ | |
+ TimeNow = time(NULL); | |
+ MinTimeout = GetMinimumTimeout(FirstServer); | |
+ if (TimeNow + MinTimeout < NextTimeout || NextTimeout < TimeNow) { | |
+ if (TimeoutTag > 0) | |
+ gtk_timeout_remove(TimeoutTag); | |
+ TimeoutTag = 0; | |
+ if (MinTimeout > 0) { | |
+ TimeoutTag = gtk_timeout_add(MinTimeout * 1000, GuiDoTimeouts, NULL); | |
+ NextTimeout = TimeNow + MinTimeout; | |
+ } | |
+ } | |
} | |
-static void GuiServerPrintFunc(const gchar *string) { | |
- gint EditPos; | |
- | |
- gtk_text_freeze(GTK_TEXT(TextOutput)); | |
- EditPos=gtk_text_get_length(GTK_TEXT(TextOutput)); | |
- gtk_editable_insert_text(GTK_EDITABLE(TextOutput),string,strlen(string), | |
- &EditPos); | |
- gtk_text_thaw(GTK_TEXT(TextOutput)); | |
- gtk_editable_set_position(GTK_EDITABLE(TextOutput),EditPos); | |
+static void GuiServerPrintFunc(const gchar *string) | |
+{ | |
+ gint EditPos; | |
+ | |
+ gtk_text_freeze(GTK_TEXT(TextOutput)); | |
+ EditPos = gtk_text_get_length(GTK_TEXT(TextOutput)); | |
+ gtk_editable_insert_text(GTK_EDITABLE(TextOutput), string, | |
+ strlen(string), &EditPos); | |
+ gtk_text_thaw(GTK_TEXT(TextOutput)); | |
+ gtk_editable_set_position(GTK_EDITABLE(TextOutput), EditPos); | |
} | |
static void GuiServerLogMessage(const gchar *log_domain, | |
- GLogLevelFlags log_level,const gchar *message, | |
- gpointer user_data) { | |
- GString *text; | |
- text=GetLogString(log_level,message); | |
- if (text) { | |
- g_string_append(text,"\n"); | |
- GuiServerPrintFunc(text->str); | |
- g_string_free(text,TRUE); | |
- } | |
+ GLogLevelFlags log_level, | |
+ const gchar *message, gpointer user_data) | |
+{ | |
+ GString *text; | |
+ | |
+ text = GetLogString(log_level, message); | |
+ if (text) { | |
+ g_string_append(text, "\n"); | |
+ GuiServerPrintFunc(text->str); | |
+ g_string_free(text, TRUE); | |
+ } | |
} | |
#ifdef CYGWIN | |
static void ServiceFailure(const gchar *log_domain, | |
- GLogLevelFlags log_level,const gchar *message, | |
- gpointer user_data) { | |
+ GLogLevelFlags log_level, const gchar *message, | |
+ gpointer user_data) | |
+{ | |
SERVICE_STATUS status; | |
- g_print("%s\n",message); | |
+ g_print("%s\n", message); | |
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; | |
status.dwCurrentState = SERVICE_STOPPED; | |
status.dwControlsAccepted = SERVICE_ACCEPT_STOP; | |
status.dwWin32ExitCode = ERROR_NETWORK_UNREACHABLE; | |
status.dwCheckPoint = 0; | |
status.dwWaitHint = 0; | |
- SetServiceStatus(scHandle,&status); | |
+ SetServiceStatus(scHandle, &status); | |
} | |
#endif | |
-static void GuiQuitServer() { | |
- gtk_main_quit(); | |
- StopServer(); | |
-} | |
- | |
-static void GuiDoCommand(GtkWidget *widget,gpointer data) { | |
- gchar *text; | |
- text=gtk_editable_get_chars(GTK_EDITABLE(widget),0,-1); | |
- gtk_editable_delete_text(GTK_EDITABLE(widget),0,-1); | |
- HandleServerCommand(text,NULL); | |
- g_free(text); | |
- if (IsServerShutdown()) GuiQuitServer(); | |
-} | |
- | |
-void GuiHandleMeta(gpointer data,gint socket,GdkInputCondition condition) { | |
- gboolean DoneOK; | |
- gchar *buf; | |
- | |
- if (!MetaConn) return; | |
- if (NetBufHandleNetwork(&MetaConn->NetBuf,condition&GDK_INPUT_READ, | |
- condition&GDK_INPUT_WRITE,&DoneOK)) { | |
- while ((buf=ReadHttpResponse(MetaConn,&DoneOK))) { | |
- gboolean ReadingBody = (MetaConn->Status==HS_READBODY); | |
- if (buf[0] || !ReadingBody) { | |
- dopelog(ReadingBody ? 2 : 4,"MetaServer: %s",buf); | |
- } | |
- g_free(buf); | |
- } | |
- } | |
- if (!DoneOK && HandleHttpCompletion(MetaConn)) { | |
- if (!MetaConnectError(MetaConn)) { | |
- dopelog(4,"MetaServer: (closed)\n"); | |
+static void GuiQuitServer() | |
+{ | |
+ gtk_main_quit(); | |
+ StopServer(); | |
+} | |
+ | |
+static void GuiDoCommand(GtkWidget *widget, gpointer data) | |
+{ | |
+ gchar *text; | |
+ | |
+ text = gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1); | |
+ gtk_editable_delete_text(GTK_EDITABLE(widget), 0, -1); | |
+ HandleServerCommand(text, NULL); | |
+ g_free(text); | |
+ if (IsServerShutdown()) | |
+ GuiQuitServer(); | |
+} | |
+ | |
+void GuiHandleMeta(gpointer data, gint socket, GdkInputCondition condition) | |
+{ | |
+ gboolean DoneOK; | |
+ gchar *buf; | |
+ | |
+ if (!MetaConn) | |
+ return; | |
+ if (NetBufHandleNetwork(&MetaConn->NetBuf, condition & GDK_INPUT_READ, | |
+ condition & GDK_INPUT_WRITE, &DoneOK)) { | |
+ while ((buf = ReadHttpResponse(MetaConn, &DoneOK))) { | |
+ gboolean ReadingBody = (MetaConn->Status == HS_READBODY); | |
+ | |
+ if (buf[0] || !ReadingBody) { | |
+ dopelog(ReadingBody ? 2 : 4, "MetaServer: %s", buf); | |
} | |
- CloseHttpConnection(MetaConn); MetaConn=NULL; | |
- if (IsServerShutdown()) GuiQuitServer(); | |
- } | |
-} | |
- | |
-static void GuiHandleSocket(gpointer data,gint socket, | |
- GdkInputCondition condition) { | |
- Player *Play; | |
- gboolean DoneOK; | |
- Play = (Player *)data; | |
- | |
- /* Sanity check - is the player still around? */ | |
- if (!g_slist_find(FirstServer,(gpointer)Play)) return; | |
- | |
- if (PlayerHandleNetwork(Play,condition&GDK_INPUT_READ, | |
- condition&GDK_INPUT_WRITE,&DoneOK)) { | |
- HandleServerPlayer(Play); | |
- GuiSetTimeouts(); /* We may have set some new timeouts */ | |
- } | |
- if (!DoneOK) { | |
- RemovePlayerFromServer(Play); | |
- if (IsServerShutdown()) GuiQuitServer(); | |
- } | |
-} | |
- | |
-void SocketStatus(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), | |
- GuiHandleSocket,NetBuf->CallBackData); | |
- } | |
- if (CallNow) GuiHandleSocket(NetBuf->CallBackData,NetBuf->fd,0); | |
+ g_free(buf); | |
+ } | |
+ } | |
+ if (!DoneOK && HandleHttpCompletion(MetaConn)) { | |
+ if (!MetaConnectError(MetaConn)) { | |
+ dopelog(4, "MetaServer: (closed)\n"); | |
+ } | |
+ CloseHttpConnection(MetaConn); | |
+ MetaConn = NULL; | |
+ if (IsServerShutdown()) | |
+ GuiQuitServer(); | |
+ } | |
+} | |
+ | |
+static void GuiHandleSocket(gpointer data, gint socket, | |
+ GdkInputCondition condition) | |
+{ | |
+ Player *Play; | |
+ gboolean DoneOK; | |
+ | |
+ Play = (Player *)data; | |
+ | |
+ /* Sanity check - is the player still around? */ | |
+ if (!g_slist_find(FirstServer, (gpointer)Play)) | |
+ return; | |
+ | |
+ if (PlayerHandleNetwork(Play, condition & GDK_INPUT_READ, | |
+ condition & GDK_INPUT_WRITE, &DoneOK)) { | |
+ HandleServerPlayer(Play); | |
+ GuiSetTimeouts(); /* We may have set some new timeouts */ | |
+ } | |
+ if (!DoneOK) { | |
+ RemovePlayerFromServer(Play); | |
+ if (IsServerShutdown()) | |
+ GuiQuitServer(); | |
+ } | |
} | |
-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, | |
+void SocketStatus(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), | |
- GuiHandleMeta,NetBuf->CallBackData); | |
- } | |
- if (CallNow) GuiHandleMeta(NetBuf->CallBackData,NetBuf->fd,0); | |
+ GuiHandleSocket, | |
+ NetBuf->CallBackData); | |
+ } | |
+ if (CallNow) | |
+ GuiHandleSocket(NetBuf->CallBackData, NetBuf->fd, 0); | |
+} | |
+ | |
+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), | |
+ GuiHandleMeta, NetBuf->CallBackData); | |
+ } | |
+ if (CallNow) | |
+ GuiHandleMeta(NetBuf->CallBackData, NetBuf->fd, 0); | |
} | |
-static void GuiNewConnect(gpointer data,gint socket, | |
- GdkInputCondition condition) { | |
- Player *Play; | |
- if (condition&GDK_INPUT_READ) { | |
- Play=HandleNewConnection(); | |
- SetNetworkBufferCallBack(&Play->NetBuf,SocketStatus,(gpointer)Play); | |
- } | |
+static void GuiNewConnect(gpointer data, gint socket, | |
+ GdkInputCondition condition) | |
+{ | |
+ Player *Play; | |
+ | |
+ if (condition & GDK_INPUT_READ) { | |
+ Play = HandleNewConnection(); | |
+ SetNetworkBufferCallBack(&Play->NetBuf, SocketStatus, (gpointer)Play); | |
+ } | |
} | |
-static gboolean TriedPoliteShutdown=FALSE; | |
+static gboolean TriedPoliteShutdown = FALSE; | |
-static gint GuiRequestDelete(GtkWidget *widget,GdkEvent *event,gpointer data) { | |
- if (TriedPoliteShutdown) { | |
+static gint GuiRequestDelete(GtkWidget *widget, GdkEvent * event, | |
+ gpointer data) | |
+{ | |
+ if (TriedPoliteShutdown) { | |
+ GuiQuitServer(); | |
+ } else { | |
+ TriedPoliteShutdown = TRUE; | |
+ HandleServerCommand("quit", NULL); | |
+ if (IsServerShutdown()) | |
GuiQuitServer(); | |
- } else { | |
- TriedPoliteShutdown=TRUE; | |
- HandleServerCommand("quit",NULL); | |
- if (IsServerShutdown()) GuiQuitServer(); | |
- } | |
- return TRUE; /* Never allow automatic deletion - we handle it manually */ | |
+ } | |
+ return TRUE; /* Never allow automatic deletion - we | |
+ * handle it manually */ | |
} | |
#ifdef CYGWIN | |
-static HWND mainhwnd=NULL; | |
-static BOOL systray=FALSE; | |
+static HWND mainhwnd = NULL; | |
+static BOOL systray = FALSE; | |
-static BOOL RegisterStatus(DWORD state) { | |
+static BOOL RegisterStatus(DWORD state) | |
+{ | |
SERVICE_STATUS status; | |
+ | |
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; | |
status.dwCurrentState = state; | |
status.dwControlsAccepted = SERVICE_ACCEPT_STOP; | |
status.dwWin32ExitCode = NO_ERROR; | |
status.dwCheckPoint = 0; | |
status.dwWaitHint = 5000; | |
- return SetServiceStatus(scHandle,&status); | |
+ return SetServiceStatus(scHandle, &status); | |
} | |
-static VOID WINAPI ServiceHandler(DWORD control) { | |
- DWORD state=SERVICE_RUNNING; | |
- switch(control) { | |
- case SERVICE_CONTROL_STOP: | |
- state=SERVICE_STOP_PENDING; | |
- break; | |
+static VOID WINAPI ServiceHandler(DWORD control) | |
+{ | |
+ DWORD state = SERVICE_RUNNING; | |
+ | |
+ switch (control) { | |
+ case SERVICE_CONTROL_STOP: | |
+ state = SERVICE_STOP_PENDING; | |
+ break; | |
} | |
if (!RegisterStatus(state)) { | |
- dopelog(0,_("Failed to set NT Service status")); | |
+ dopelog(0, _("Failed to set NT Service status")); | |
return; | |
} | |
- if (mainhwnd && !PostMessage(mainhwnd,MYWM_SERVICE,0,(LPARAM)control)) { | |
- dopelog(0,_("Failed to post service notification message")); | |
+ if (mainhwnd | |
+ && !PostMessage(mainhwnd, MYWM_SERVICE, 0, (LPARAM) control)) { | |
+ dopelog(0, _("Failed to post service notification message")); | |
return; | |
} | |
} | |
-static VOID WINAPI ServiceInit(DWORD argc,LPTSTR *argv) { | |
- scHandle = RegisterServiceCtrlHandler("dopewars-server",ServiceHandler); | |
+static VOID WINAPI ServiceInit(DWORD argc, LPTSTR * argv) | |
+{ | |
+ scHandle = RegisterServiceCtrlHandler("dopewars-server", ServiceHandler); | |
if (!scHandle) { | |
- dopelog(0,_("Failed to register service handler")); return; | |
+ dopelog(0, _("Failed to register service handler")); | |
+ return; | |
} | |
if (!RegisterStatus(SERVICE_START_PENDING)) { | |
- dopelog(0,_("Failed to set NT Service status")); | |
+ dopelog(0, _("Failed to set NT Service status")); | |
return; | |
} | |
GuiServerLoop(TRUE); | |
if (!RegisterStatus(SERVICE_STOPPED)) { | |
- dopelog(0,_("Failed to set NT Service status")); | |
+ dopelog(0, _("Failed to set NT Service status")); | |
return; | |
} | |
} | |
-void ServiceMain(void) { | |
+void ServiceMain(void) | |
+{ | |
SERVICE_TABLE_ENTRY services[] = { | |
- { "dopewars-server",ServiceInit }, | |
- { NULL,NULL } | |
+ {"dopewars-server", ServiceInit}, | |
+ {NULL, NULL} | |
}; | |
+ | |
if (!StartServiceCtrlDispatcher(services)) { | |
- dopelog(0,_("Failed to start NT Service")); | |
+ dopelog(0, _("Failed to start NT Service")); | |
} | |
} | |
-static LRESULT CALLBACK GuiServerWndProc(HWND hwnd,UINT msg,WPARAM wparam, | |
- LPARAM lparam) { | |
- if (hwnd==mainhwnd) switch(msg) { | |
+static LRESULT CALLBACK GuiServerWndProc(HWND hwnd, UINT msg, | |
+ WPARAM wparam, LPARAM lparam) | |
+{ | |
+ if (hwnd == mainhwnd) | |
+ switch (msg) { | |
case MYWM_SERVICE: | |
- if (lparam==SERVICE_CONTROL_STOP) { | |
+ if (lparam == SERVICE_CONTROL_STOP) { | |
GuiQuitServer(); | |
} | |
break; | |
case MYWM_TASKBAR: | |
- if ((UINT)lparam==WM_LBUTTONDOWN) ShowWindow(mainhwnd,SW_SHOW); | |
+ if ((UINT) lparam == WM_LBUTTONDOWN) | |
+ ShowWindow(mainhwnd, SW_SHOW); | |
break; | |
case WM_SYSCOMMAND: | |
- if (wparam==SC_MINIMIZE && systray) { | |
- ShowWindow(mainhwnd,SW_HIDE); return TRUE; | |
+ if (wparam == SC_MINIMIZE && systray) { | |
+ ShowWindow(mainhwnd, SW_HIDE); | |
+ return TRUE; | |
} | |
break; | |
- } | |
+ } | |
return FALSE; | |
} | |
-static void SetupTaskBarIcon(GtkWidget *widget) { | |
+static void SetupTaskBarIcon(GtkWidget *widget) | |
+{ | |
NOTIFYICONDATA nid; | |
nid.cbSize = sizeof(NOTIFYICONDATA); | |
nid.uID = 1000; | |
- if (widget && !widget->hWnd) return; | |
- if (!widget && !mainhwnd) return; | |
+ if (widget && !widget->hWnd) | |
+ return; | |
+ if (!widget && !mainhwnd) | |
+ return; | |
nid.hWnd = mainhwnd; | |
if (widget && MinToSysTray) { | |
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; | |
nid.uCallbackMessage = MYWM_TASKBAR; | |
nid.hIcon = mainIcon; | |
- strcpy(nid.szTip,"dopewars server - running"); | |
- systray=Shell_NotifyIcon(NIM_ADD,&nid); | |
+ strcpy(nid.szTip, "dopewars server - running"); | |
+ systray = Shell_NotifyIcon(NIM_ADD, &nid); | |
} else { | |
- systray=FALSE; | |
- Shell_NotifyIcon(NIM_DELETE,&nid); | |
+ systray = FALSE; | |
+ Shell_NotifyIcon(NIM_DELETE, &nid); | |
} | |
} | |
#endif /* CYGWIN */ | |
-void GuiServerLoop(gboolean is_service) { | |
- GtkWidget *window,*text,*hbox,*vbox,*entry,*label; | |
- GtkAdjustment *adj; | |
- | |
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
- gtk_signal_connect(GTK_OBJECT(window),"delete_event", | |
- GTK_SIGNAL_FUNC(GuiRequestDelete),NULL); | |
- gtk_window_set_default_size(GTK_WINDOW(window),500,250); | |
- | |
-/* Title of dopewars server window (if used) */ | |
- gtk_window_set_title(GTK_WINDOW(window),_("dopewars server")); | |
- | |
- gtk_container_set_border_width(GTK_CONTAINER(window),7); | |
- | |
- vbox=gtk_vbox_new(FALSE,7); | |
- adj=(GtkAdjustment *)gtk_adjustment_new(0,0,100,1,10,10); | |
- TextOutput=text=gtk_scrolled_text_new(NULL,adj,&hbox); | |
- gtk_text_set_editable(GTK_TEXT(text),FALSE); | |
- gtk_text_set_word_wrap(GTK_TEXT(text),TRUE); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); | |
- | |
- hbox=gtk_hbox_new(FALSE,4); | |
- label=gtk_label_new(_("Command:")); | |
- gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); | |
- entry=gtk_entry_new(); | |
- gtk_signal_connect(GTK_OBJECT(entry),"activate", | |
- GTK_SIGNAL_FUNC(GuiDoCommand),NULL); | |
- gtk_box_pack_start(GTK_BOX(hbox),entry,TRUE,TRUE,0); | |
- gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); | |
- | |
- gtk_container_add(GTK_CONTAINER(window),vbox); | |
- gtk_widget_show_all(window); | |
- | |
- if (is_service) { | |
+void GuiServerLoop(gboolean is_service) | |
+{ | |
+ GtkWidget *window, *text, *hbox, *vbox, *entry, *label; | |
+ GtkAdjustment *adj; | |
+ | |
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
+ gtk_signal_connect(GTK_OBJECT(window), "delete_event", | |
+ GTK_SIGNAL_FUNC(GuiRequestDelete), NULL); | |
+ gtk_window_set_default_size(GTK_WINDOW(window), 500, 250); | |
+ | |
+ /* Title of dopewars server window (if used) */ | |
+ gtk_window_set_title(GTK_WINDOW(window), _("dopewars server")); | |
+ | |
+ gtk_container_set_border_width(GTK_CONTAINER(window), 7); | |
+ | |
+ vbox = gtk_vbox_new(FALSE, 7); | |
+ adj = (GtkAdjustment *)gtk_adjustment_new(0, 0, 100, 1, 10, 10); | |
+ TextOutput = text = gtk_scrolled_text_new(NULL, adj, &hbox); | |
+ gtk_text_set_editable(GTK_TEXT(text), FALSE); | |
+ gtk_text_set_word_wrap(GTK_TEXT(text), TRUE); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); | |
+ | |
+ hbox = gtk_hbox_new(FALSE, 4); | |
+ label = gtk_label_new(_("Command:")); | |
+ gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
+ entry = gtk_entry_new(); | |
+ gtk_signal_connect(GTK_OBJECT(entry), "activate", | |
+ GTK_SIGNAL_FUNC(GuiDoCommand), NULL); | |
+ gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); | |
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
+ | |
+ gtk_container_add(GTK_CONTAINER(window), vbox); | |
+ gtk_widget_show_all(window); | |
+ | |
+ if (is_service) { | |
#ifdef CYGWIN | |
- g_log_set_handler(NULL,G_LOG_LEVEL_CRITICAL,ServiceFailure,NULL); | |
+ g_log_set_handler(NULL, G_LOG_LEVEL_CRITICAL, ServiceFailure, NULL); | |
#endif | |
- } else { | |
- g_set_print_handler(GuiServerPrintFunc); | |
- g_log_set_handler(NULL,LogMask()|G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING, | |
- GuiServerLogMessage,NULL); | |
- } | |
- if (!StartServer()) return; | |
- | |
- ListenTag=gdk_input_add(ListenSock,GDK_INPUT_READ,GuiNewConnect,NULL); | |
+ } else { | |
+ g_set_print_handler(GuiServerPrintFunc); | |
+ g_log_set_handler(NULL, | |
+ LogMask() | G_LOG_LEVEL_MESSAGE | | |
+ G_LOG_LEVEL_WARNING, GuiServerLogMessage, NULL); | |
+ } | |
+ if (!StartServer()) | |
+ return; | |
+ | |
+ ListenTag = | |
+ gdk_input_add(ListenSock, GDK_INPUT_READ, GuiNewConnect, NULL); | |
#ifdef CYGWIN | |
- mainhwnd=window->hWnd; | |
- SetupTaskBarIcon(window); | |
- SetCustomWndProc(GuiServerWndProc); | |
- if (is_service && !RegisterStatus(SERVICE_RUNNING)) { | |
- dopelog(0,_("Failed to set NT Service status")); | |
- return; | |
- } | |
+ mainhwnd = window->hWnd; | |
+ SetupTaskBarIcon(window); | |
+ SetCustomWndProc(GuiServerWndProc); | |
+ if (is_service && !RegisterStatus(SERVICE_RUNNING)) { | |
+ dopelog(0, _("Failed to set NT Service status")); | |
+ return; | |
+ } | |
#endif | |
- gtk_main(); | |
+ gtk_main(); | |
#ifdef CYGWIN | |
- SetupTaskBarIcon(NULL); | |
+ SetupTaskBarIcon(NULL); | |
#endif | |
} | |
#endif /* GUI_SERVER */ | |
#endif /* NETWORKING */ | |
-void FinishGame(Player *Play,char *Message) { | |
-/* Tells player "Play" that the game is over; display "Message" */ | |
- Play->EventNum=E_FINISH; | |
- ClientLeftServer(Play); | |
- SendHighScores(Play,TRUE,Message); | |
- | |
-/* Blank the name, so that CountPlayers ignores this player */ | |
- SetPlayerName(Play,NULL); | |
- | |
-/* Make sure they do actually disconnect, eventually! */ | |
- if (ConnectTimeout) { | |
- Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout; | |
- } | |
-} | |
- | |
-void HighScoreTypeRead(struct HISCORE *HiScore,FILE *fp) { | |
-/* Reads a batch of NUMHISCORE high scores into "HiScore" from "fp" */ | |
- int i; | |
- char *buf; | |
- for (i=0;i<NUMHISCORE;i++) { | |
- if (read_string(fp,&HiScore[i].Name)==EOF) break; | |
- read_string(fp,&HiScore[i].Time); | |
- read_string(fp,&buf); | |
- HiScore[i].Money=strtoprice(buf); g_free(buf); | |
- HiScore[i].Dead=(fgetc(fp)>0); | |
- } | |
-} | |
- | |
-void HighScoreTypeWrite(struct HISCORE *HiScore,FILE *fp) { | |
-/* Writes out a batch of NUMHISCORE high scores from "HiScore" to "fp" */ | |
- int i; | |
- gchar *text; | |
- for (i=0;i<NUMHISCORE;i++) { | |
- if (HiScore[i].Name) { | |
- fwrite(HiScore[i].Name,strlen(HiScore[i].Name)+1,1,fp); | |
- } else fputc(0,fp); | |
- if (HiScore[i].Time) { | |
- fwrite(HiScore[i].Time,strlen(HiScore[i].Time)+1,1,fp); | |
- } else fputc(0,fp); | |
- text=pricetostr(HiScore[i].Money); | |
- fwrite(text,strlen(text)+1,1,fp); | |
- g_free(text); | |
- fputc(HiScore[i].Dead ? 1 : 0,fp); | |
- } | |
+/* | |
+ * Tells player "Play" that the game is over; display "Message". | |
+ */ | |
+void FinishGame(Player *Play, char *Message) | |
+{ | |
+ Play->EventNum = E_FINISH; | |
+ ClientLeftServer(Play); | |
+ SendHighScores(Play, TRUE, Message); | |
+ | |
+ /* Blank the name, so that CountPlayers ignores this player */ | |
+ SetPlayerName(Play, NULL); | |
+ | |
+ /* Make sure they do actually disconnect, eventually! */ | |
+ if (ConnectTimeout) { | |
+ Play->ConnectTimeout = time(NULL) + (time_t) ConnectTimeout; | |
+ } | |
} | |
-void CloseHighScoreFile() { | |
-/* Closes the high score file opened by OpenHighScoreFile, below */ | |
- if (ScoreFP) fclose(ScoreFP); | |
+/* | |
+ * Reads a batch of NUMHISCORE high scores into "HiScore" from "fp". | |
+ */ | |
+void HighScoreTypeRead(struct HISCORE *HiScore, FILE *fp) | |
+{ | |
+ int i; | |
+ char *buf; | |
+ | |
+ for (i = 0; i < NUMHISCORE; i++) { | |
+ if (read_string(fp, &HiScore[i].Name) == EOF) | |
+ break; | |
+ read_string(fp, &HiScore[i].Time); | |
+ read_string(fp, &buf); | |
+ HiScore[i].Money = strtoprice(buf); | |
+ g_free(buf); | |
+ HiScore[i].Dead = (fgetc(fp) > 0); | |
+ } | |
+} | |
+ | |
+/* | |
+ * Writes out a batch of NUMHISCORE high scores from "HiScore" to "fp". | |
+ */ | |
+void HighScoreTypeWrite(struct HISCORE *HiScore, FILE *fp) | |
+{ | |
+ int i; | |
+ gchar *text; | |
+ | |
+ for (i = 0; i < NUMHISCORE; i++) { | |
+ if (HiScore[i].Name) { | |
+ fwrite(HiScore[i].Name, strlen(HiScore[i].Name) + 1, 1, fp); | |
+ } else | |
+ fputc(0, fp); | |
+ if (HiScore[i].Time) { | |
+ fwrite(HiScore[i].Time, strlen(HiScore[i].Time) + 1, 1, fp); | |
+ } else | |
+ fputc(0, fp); | |
+ text = pricetostr(HiScore[i].Money); | |
+ fwrite(text, strlen(text) + 1, 1, fp); | |
+ g_free(text); | |
+ fputc(HiScore[i].Dead ? 1 : 0, fp); | |
+ } | |
+} | |
+ | |
+/* | |
+ * Closes the high score file opened by OpenHighScoreFile, below. | |
+ */ | |
+void CloseHighScoreFile() | |
+{ | |
+ if (ScoreFP) | |
+ fclose(ScoreFP); | |
} | |
-void DropPrivileges() { | |
-/* If we're running setuid/setgid, drop down to the privilege level of the */ | |
-/* user that started the dopewars process */ | |
+/* | |
+ * If we're running setuid/setgid, drop down to the privilege level of the | |
+ * user that started the dopewars process. | |
+ */ | |
+void DropPrivileges() | |
+{ | |
#ifndef CYGWIN | |
- if (setregid(getgid(),getgid())!=0) { | |
- perror("setregid"); | |
- exit(1); | |
- } | |
+ if (setregid(getgid(), getgid()) != 0) { | |
+ perror("setregid"); | |
+ exit(1); | |
+ } | |
#endif | |
} | |
static const gchar SCOREHEADER[] = "DOPEWARS SCORES V."; | |
-static const guint SCOREHDRLEN = sizeof(SCOREHEADER)-1; /* Don't include \0 */ | |
+static const guint SCOREHDRLEN = sizeof(SCOREHEADER) - 1; /* Don't include \0 … | |
static const guint SCOREVERSION = 1; | |
-static gboolean HighScoreReadHeader(FILE *fp,gint *ScoreVersion) { | |
- gchar *header; | |
- | |
- if (read_string(fp,&header)!=EOF) { | |
- if (header && strlen(header) > SCOREHDRLEN && | |
- strncmp(header,SCOREHEADER,SCOREHDRLEN)==0) { | |
- if (ScoreVersion) *ScoreVersion = atoi(header+SCOREHDRLEN); | |
- g_free(header); | |
- return TRUE; | |
- } | |
- } | |
- g_free(header); | |
- return FALSE; | |
+static gboolean HighScoreReadHeader(FILE *fp, gint *ScoreVersion) | |
+{ | |
+ gchar *header; | |
+ | |
+ if (read_string(fp, &header) != EOF) { | |
+ if (header && strlen(header) > SCOREHDRLEN && | |
+ strncmp(header, SCOREHEADER, SCOREHDRLEN) == 0) { | |
+ if (ScoreVersion) | |
+ *ScoreVersion = atoi(header + SCOREHDRLEN); | |
+ g_free(header); | |
+ return TRUE; | |
+ } | |
+ } | |
+ g_free(header); | |
+ return FALSE; | |
} | |
-static void HighScoreWriteHeader(FILE *fp) { | |
- gchar *header; | |
+static void HighScoreWriteHeader(FILE *fp) | |
+{ | |
+ gchar *header; | |
- header = g_strdup_printf("%s%d",SCOREHEADER,SCOREVERSION); | |
- fwrite(header,strlen(header)+1,1,fp); | |
+ header = g_strdup_printf("%s%d", SCOREHEADER, SCOREVERSION); | |
+ fwrite(header, strlen(header) + 1, 1, fp); | |
} | |
-void ConvertHighScoreFile(void) { | |
-/* Converts an old format high score file to the new format. */ | |
- FILE *old,*backup; | |
- gchar *BackupFile; | |
- int ch; | |
- char *OldError=NULL,*BackupError=NULL; | |
- struct HISCORE MultiScore[NUMHISCORE],AntiqueScore[NUMHISCORE]; | |
+/* | |
+ * Converts an old format high score file to the new format. | |
+ */ | |
+void ConvertHighScoreFile(void) | |
+{ | |
+ FILE *old, *backup; | |
+ gchar *BackupFile; | |
+ int ch; | |
+ char *OldError = NULL, *BackupError = NULL; | |
+ struct HISCORE MultiScore[NUMHISCORE], AntiqueScore[NUMHISCORE]; | |
-/* The user running dopewars must be allowed to mess with the score file */ | |
- DropPrivileges(); | |
+ /* The user running dopewars must be allowed to mess with the score file */ | |
+ DropPrivileges(); | |
- BackupFile = g_strdup_printf("%s.bak",ConvertFile); | |
+ BackupFile = g_strdup_printf("%s.bak", ConvertFile); | |
- old=fopen(ConvertFile,"r+"); | |
- if (!old) OldError = strerror(errno); | |
+ old = fopen(ConvertFile, "r+"); | |
+ if (!old) | |
+ OldError = strerror(errno); | |
- backup=fopen(BackupFile,"w"); | |
- if (!backup) BackupError = strerror(errno); | |
+ backup = fopen(BackupFile, "w"); | |
+ if (!backup) | |
+ BackupError = strerror(errno); | |
- if (old && backup) { | |
+ if (old && backup) { | |
-/* First, make sure that the "old" file doesn't have a valid "new" header */ | |
+ /* First, make sure that the "old" file doesn't have a valid "new" | |
+ * header */ | |
+ rewind(old); | |
+ if (HighScoreReadHeader(old, NULL)) { | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("The high score file %s\n" | |
+ "is already in the new format! Aborting."), ConvertFile); | |
+ fclose(old); | |
+ fclose(backup); | |
+ } else { | |
+ /* Make a backup of the old file */ | |
+ ftruncate(fileno(backup), 0); | |
+ rewind(backup); | |
rewind(old); | |
- if (HighScoreReadHeader(old,NULL)) { | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL, | |
- _("The high score file %s\n" | |
- "is already in the new format! Aborting."), | |
- ConvertFile); | |
- fclose(old); fclose(backup); | |
- } else { | |
-/* Make a backup of the old file */ | |
- ftruncate(fileno(backup),0); rewind(backup); | |
- rewind(old); | |
- while(1) { | |
- ch = fgetc(old); | |
- if (ch==EOF) break; else fputc(ch,backup); | |
- } | |
- fclose(backup); | |
- | |
-/* Read in the scores without the header, and then write out with the header */ | |
- if (!HighScoreRead(old,MultiScore,AntiqueScore,FALSE)) { | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL,_("Error reading scores from %s."), | |
- ConvertFile); | |
- } else { | |
- ftruncate(fileno(old),0); rewind(old); | |
- if (HighScoreWrite(old,MultiScore,AntiqueScore)) { | |
- g_message(_("The high score file %s has been converted to the " | |
- "new format.\nA backup of the old file has been " | |
- "created as %s.\n"),ConvertFile,BackupFile); | |
- } | |
- } | |
- fclose(old); | |
+ while (1) { | |
+ ch = fgetc(old); | |
+ if (ch == EOF) | |
+ break; | |
+ else | |
+ fputc(ch, backup); | |
} | |
- } else { | |
- if (!old) { | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL, | |
- _("Cannot open high score file %s: %s."), | |
- ConvertFile,OldError); | |
- } else if (!backup) { | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL, | |
- _("Cannot create backup (%s) of the\nhigh score file: %s."), | |
- BackupFile,BackupError); | |
+ fclose(backup); | |
+ | |
+ /* Read in the scores without the header, and then write out with | |
+ * the header */ | |
+ if (!HighScoreRead(old, MultiScore, AntiqueScore, FALSE)) { | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("Error reading scores from %s."), ConvertFile); | |
+ } else { | |
+ ftruncate(fileno(old), 0); | |
+ rewind(old); | |
+ if (HighScoreWrite(old, MultiScore, AntiqueScore)) { | |
+ g_message(_("The high score file %s has been converted to the " | |
+ "new format.\nA backup of the old file has been " | |
+ "created as %s.\n"), ConvertFile, BackupFile); | |
+ } | |
} | |
- } | |
+ fclose(old); | |
+ } | |
+ } else { | |
+ if (!old) { | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("Cannot open high score file %s: %s."), | |
+ ConvertFile, OldError); | |
+ } else if (!backup) { | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("Cannot create backup (%s) of the\nhigh score file: %s."), | |
+ BackupFile, BackupError); | |
+ } | |
+ } | |
- g_free(BackupFile); | |
+ g_free(BackupFile); | |
} | |
/* State, set by OpenHighScoreFile, and later used by | |
- CheckHighScoreFileConfig */ | |
+ * CheckHighScoreFileConfig */ | |
static gboolean NewFile; | |
static int OpenError; | |
-void OpenHighScoreFile(void) { | |
-/* Opens the high score file for later use, and then drops privileges. */ | |
+/* | |
+ * Opens the high score file for later use, and then drops privileges. | |
+ */ | |
+void OpenHighScoreFile(void) | |
+{ | |
+ NewFile = FALSE; | |
+ OpenError = 0; | |
- NewFile=FALSE; OpenError=0; | |
- | |
- if (ScoreFP) return; /* If already opened, then we're done */ | |
+ if (ScoreFP) | |
+ return; /* If already opened, then we're done */ | |
/* Win32 gets upset if we use "a+" so we use this nasty hack instead */ | |
- ScoreFP=fopen(HiScoreFile,"r+"); | |
+ ScoreFP = fopen(HiScoreFile, "r+"); | |
if (!ScoreFP) { | |
- ScoreFP=fopen(HiScoreFile,"w+"); | |
- if (!ScoreFP) OpenError=errno; | |
- NewFile=TRUE; | |
+ ScoreFP = fopen(HiScoreFile, "w+"); | |
+ if (!ScoreFP) | |
+ OpenError = errno; | |
+ NewFile = TRUE; | |
} | |
DropPrivileges(); | |
} | |
-gboolean CheckHighScoreFileConfig(void) { | |
-/* Checks the high score file opened by OpenHighScoreFile, above. Also warns | |
- the user about other problems encountered during startup. Returns | |
- TRUE if it's valid; otherwise, returns FALSE. */ | |
+/* | |
+ * Checks the high score file opened by OpenHighScoreFile, above. Also warns | |
+ * the user about other problems encountered during startup. Returns | |
+ * TRUE if it's valid; otherwise, returns FALSE. | |
+ */ | |
+gboolean CheckHighScoreFileConfig(void) | |
+{ | |
if (!ScoreFP) { | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL,_("Cannot open high score file %s.\n" | |
- "(%s.) Either ensure you have permissions to access\n" | |
- "this file and directory, or specify an alternate high score " | |
- "file with the\n-f command line option."),HiScoreFile, | |
- strerror(OpenError)); | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("Cannot open high score file %s.\n" | |
+ "(%s.) Either ensure you have permissions to access\n" | |
+ "this file and directory, or specify an alternate high score " | |
+ "file with the\n-f command line option."), | |
+ HiScoreFile, strerror(OpenError)); | |
return FALSE; | |
} | |
if (NewFile) { | |
HighScoreWriteHeader(ScoreFP); | |
fflush(ScoreFP); | |
- } else if (!HighScoreReadHeader(ScoreFP,NULL)) { | |
- g_log(NULL,G_LOG_LEVEL_CRITICAL,_("%s does not appear to be a valid\n" | |
- "high score file - please check it. If it is a high score file\n" | |
- "from an older version of dopewars, then first convert it to the\n" | |
- "new format by running \"dopewars -C %s\"\n" | |
- "from the command line."),HiScoreFile,HiScoreFile); | |
+ } else if (!HighScoreReadHeader(ScoreFP, NULL)) { | |
+ g_log(NULL, G_LOG_LEVEL_CRITICAL, | |
+ _("%s does not appear to be a valid\n" | |
+ "high score file - please check it. If it is a high score file\n" | |
+ "from an older version of dopewars, then first convert it to the\n" | |
+ "new format by running \"dopewars -C %s\"\n" | |
+ "from the command line."), HiScoreFile, HiScoreFile); | |
return FALSE; | |
} | |
if (ConfigErrors) { | |
#ifdef CYGWIN | |
- g_warning( | |
-_("Errors were encountered during the reading of the configuration file.\n" | |
-"As as result, some settings may not work as expected. Please consult the\n" | |
-"file \"dopewars-log.txt\" for further details.")); | |
+ g_warning(_("Errors were encountered during the reading of the " | |
+ "configuration file.\nAs as result, some settings may not " | |
+ "work as expected. Please consult the\n" | |
+ "file \"dopewars-log.txt\" for further details.")); | |
#else | |
- g_warning( | |
-_("Errors were encountered during the reading of the configuration\n" | |
-"file. As a result, some settings may not work as expected. Please see the\n" | |
-"messages on standard output for further details.")); | |
+ g_warning(_("Errors were encountered during the reading of the " | |
+ "configuration\nfile. As a result, some settings may not " | |
+ "work as expected. Please see the\nmessages on standard " | |
+ "output for further details.")); | |
#endif | |
} | |
return TRUE; | |
} | |
-gboolean HighScoreRead(FILE *fp,struct HISCORE *MultiScore, | |
- struct HISCORE *AntiqueScore,gboolean ReadHeader) { | |
-/* Reads all the high scores into MultiScore and AntiqueScore (antique */ | |
-/* mode scores). If ReadHeader is TRUE, read the high score file header */ | |
-/* first. Returns TRUE on success, FALSE on failure. */ | |
- gint ScoreVersion=0; | |
- memset(MultiScore,0,sizeof(struct HISCORE)*NUMHISCORE); | |
- memset(AntiqueScore,0,sizeof(struct HISCORE)*NUMHISCORE); | |
- if (fp && ReadLock(fp)==0) { | |
- rewind(fp); | |
- if (ReadHeader && !HighScoreReadHeader(fp,&ScoreVersion)) { | |
- ReleaseLock(fp); | |
- return FALSE; | |
- } | |
- HighScoreTypeRead(AntiqueScore,fp); | |
- HighScoreTypeRead(MultiScore,fp); | |
+/* | |
+ * Reads all the high scores into MultiScore and AntiqueScore (antique | |
+ * mode scores). If ReadHeader is TRUE, read the high score file header | |
+ * first. Returns TRUE on success, FALSE on failure. | |
+ */ | |
+gboolean HighScoreRead(FILE *fp, struct HISCORE *MultiScore, | |
+ struct HISCORE *AntiqueScore, gboolean ReadHeader) | |
+{ | |
+ gint ScoreVersion = 0; | |
+ memset(MultiScore, 0, sizeof(struct HISCORE) * NUMHISCORE); | |
+ memset(AntiqueScore, 0, sizeof(struct HISCORE) * NUMHISCORE); | |
+ if (fp && ReadLock(fp) == 0) { | |
+ rewind(fp); | |
+ if (ReadHeader && !HighScoreReadHeader(fp, &ScoreVersion)) { | |
ReleaseLock(fp); | |
- } else return FALSE; | |
- return TRUE; | |
-} | |
- | |
-gboolean HighScoreWrite(FILE *fp,struct HISCORE *MultiScore, | |
- struct HISCORE *AntiqueScore) { | |
-/* Writes out all the high scores from MultiScore and AntiqueScore; returns */ | |
-/* TRUE on success, FALSE on failure. */ | |
- if (fp && WriteLock(fp)==0) { | |
- ftruncate(fileno(fp),0); | |
- rewind(fp); | |
- HighScoreWriteHeader(fp); | |
- HighScoreTypeWrite(AntiqueScore,fp); | |
- HighScoreTypeWrite(MultiScore,fp); | |
- ReleaseLock(fp); | |
- fflush(fp); | |
- } else return 0; | |
- return 1; | |
-} | |
- | |
-void SendHighScores(Player *Play,gboolean EndGame,char *Message) { | |
-/* Adds "Play" to the high score list if necessary, and then sends the */ | |
-/* scores over the network to "Play" */ | |
-/* If "EndGame" is TRUE, add the current score if it's high enough and */ | |
-/* display an explanatory message. "Message" is tacked onto the start */ | |
-/* if it's non-NULL. The client is then informed that the game's over. */ | |
- struct HISCORE MultiScore[NUMHISCORE],AntiqueScore[NUMHISCORE],Score; | |
- struct HISCORE *HiScore; | |
- struct tm *timep; | |
- time_t tim; | |
- GString *text; | |
- int i,j,InList=-1; | |
- text=g_string_new(""); | |
- if (!HighScoreRead(ScoreFP,MultiScore,AntiqueScore,TRUE)) { | |
- g_warning(_("Unable to read high score file %s"),HiScoreFile); | |
- } | |
- if (Message) { | |
- g_string_assign(text,Message); | |
- if (strlen(text->str)>0) g_string_append_c(text,'^'); | |
- } | |
- if (WantAntique) HiScore=AntiqueScore; else HiScore=MultiScore; | |
- if (EndGame) { | |
- Score.Money=Play->Cash+Play->Bank-Play->Debt; | |
- Score.Name=g_strdup(GetPlayerName(Play)); | |
- Score.Dead = (Play->Health==0); | |
- tim=time(NULL); | |
- timep=gmtime(&tim); | |
- Score.Time=g_new(char,80); /* Yuck! */ | |
- strftime(Score.Time,80,"%d-%m-%Y",timep); | |
- Score.Time[79]='\0'; | |
- for (i=0;i<NUMHISCORE;i++) { | |
- if (InList==-1 && (Score.Money > HiScore[i].Money || | |
- !HiScore[i].Time || HiScore[i].Time[0]==0)) { | |
- InList=i; | |
- g_string_append(text, | |
- _("Congratulations! You made the high scores!")); | |
- SendPrintMessage(NULL,C_NONE,Play,text->str); | |
- g_free(HiScore[NUMHISCORE-1].Name); | |
- g_free(HiScore[NUMHISCORE-1].Time); | |
- for (j=NUMHISCORE-1;j>i;j--) { | |
- memcpy(&HiScore[j],&HiScore[j-1],sizeof(struct HISCORE)); | |
- } | |
- memcpy(&HiScore[i],&Score,sizeof(struct HISCORE)); | |
- break; | |
- } | |
+ return FALSE; | |
+ } | |
+ HighScoreTypeRead(AntiqueScore, fp); | |
+ HighScoreTypeRead(MultiScore, fp); | |
+ ReleaseLock(fp); | |
+ } else | |
+ return FALSE; | |
+ return TRUE; | |
+} | |
+ | |
+/* | |
+ * Writes out all the high scores from MultiScore and AntiqueScore; returns | |
+ * TRUE on success, FALSE on failure. | |
+ */ | |
+gboolean HighScoreWrite(FILE *fp, struct HISCORE *MultiScore, | |
+ struct HISCORE *AntiqueScore) | |
+{ | |
+ if (fp && WriteLock(fp) == 0) { | |
+ ftruncate(fileno(fp), 0); | |
+ rewind(fp); | |
+ HighScoreWriteHeader(fp); | |
+ HighScoreTypeWrite(AntiqueScore, fp); | |
+ HighScoreTypeWrite(MultiScore, fp); | |
+ ReleaseLock(fp); | |
+ fflush(fp); | |
+ } else | |
+ return 0; | |
+ return 1; | |
+} | |
+ | |
+/* | |
+ * Adds "Play" to the high score list if necessary, and then sends the | |
+ * scores over the network to "Play". | |
+ * If "EndGame" is TRUE, add the current score if it's high enough and | |
+ * display an explanatory message. "Message" is tacked onto the start | |
+ * if it's non-NULL. The client is then informed that the game's over. | |
+ */ | |
+void SendHighScores(Player *Play, gboolean EndGame, char *Message) | |
+{ | |
+ struct HISCORE MultiScore[NUMHISCORE], AntiqueScore[NUMHISCORE], Score; | |
+ struct HISCORE *HiScore; | |
+ struct tm *timep; | |
+ time_t tim; | |
+ GString *text; | |
+ int i, j, InList = -1; | |
+ | |
+ text = g_string_new(""); | |
+ if (!HighScoreRead(ScoreFP, MultiScore, AntiqueScore, TRUE)) { | |
+ g_warning(_("Unable to read high score file %s"), HiScoreFile); | |
+ } | |
+ if (Message) { | |
+ g_string_assign(text, Message); | |
+ if (strlen(text->str) > 0) | |
+ g_string_append_c(text, '^'); | |
+ } | |
+ if (WantAntique) | |
+ HiScore = AntiqueScore; | |
+ else | |
+ HiScore = MultiScore; | |
+ if (EndGame) { | |
+ Score.Money = Play->Cash + Play->Bank - Play->Debt; | |
+ Score.Name = g_strdup(GetPlayerName(Play)); | |
+ Score.Dead = (Play->Health == 0); | |
+ tim = time(NULL); | |
+ timep = gmtime(&tim); | |
+ Score.Time = g_new(char, 80); /* Yuck! */ | |
+ | |
+ strftime(Score.Time, 80, "%d-%m-%Y", timep); | |
+ Score.Time[79] = '\0'; | |
+ for (i = 0; i < NUMHISCORE; i++) { | |
+ if (InList == -1 && (Score.Money > HiScore[i].Money || | |
+ !HiScore[i].Time || HiScore[i].Time[0] == 0)) { | |
+ InList = i; | |
+ g_string_append(text, | |
+ _("Congratulations! You made the high scores!")); | |
+ SendPrintMessage(NULL, C_NONE, Play, text->str); | |
+ g_free(HiScore[NUMHISCORE - 1].Name); | |
+ g_free(HiScore[NUMHISCORE - 1].Time); | |
+ for (j = NUMHISCORE - 1; j > i; j--) { | |
+ memcpy(&HiScore[j], &HiScore[j - 1], sizeof(struct HISCORE)); | |
+ } | |
+ memcpy(&HiScore[i], &Score, sizeof(struct HISCORE)); | |
+ break; | |
+ } | |
+ } | |
+ if (InList == -1) { | |
+ g_string_append(text, | |
+ _("You didn't even make the high score table...")); | |
+ SendPrintMessage(NULL, C_NONE, Play, text->str); | |
+ } | |
+ } | |
+ SendServerMessage(NULL, C_NONE, C_STARTHISCORE, Play, NULL); | |
+ | |
+ j = 0; | |
+ for (i = 0; i < NUMHISCORE; i++) { | |
+ if (SendSingleHighScore(Play, &HiScore[i], j, InList == i)) | |
+ j++; | |
+ } | |
+ if (InList == -1 && EndGame) | |
+ SendSingleHighScore(Play, &Score, j, TRUE); | |
+ SendServerMessage(NULL, C_NONE, C_ENDHISCORE, Play, | |
+ EndGame ? "end" : NULL); | |
+ if (!EndGame) | |
+ SendDrugsHere(Play, FALSE); | |
+ if (EndGame && !HighScoreWrite(ScoreFP, MultiScore, AntiqueScore)) { | |
+ g_warning(_("Unable to write high score file %s"), HiScoreFile); | |
+ } | |
+ for (i = 0; i < NUMHISCORE; i++) { | |
+ g_free(MultiScore[i].Name); | |
+ g_free(MultiScore[i].Time); | |
+ g_free(AntiqueScore[i].Name); | |
+ g_free(AntiqueScore[i].Time); | |
+ } | |
+ g_string_free(text, TRUE); | |
+} | |
+ | |
+/* | |
+ * Sends a single high score in "Score" with position "ind" to player | |
+ * "Play". If Bold is TRUE, instructs the client to display the score in | |
+ * bold text. | |
+ */ | |
+int SendSingleHighScore(Player *Play, struct HISCORE *Score, | |
+ int ind, gboolean Bold) | |
+{ | |
+ gchar *Data, *prstr; | |
+ | |
+ if (!Score->Time || Score->Time[0] == 0) | |
+ return 0; | |
+ Data = g_strdup_printf("%d^%c%c%18s %-14s %-34s %8s%c", ind, | |
+ Bold ? 'B' : 'N', Bold ? '>' : ' ', | |
+ prstr = FormatPrice(Score->Money), | |
+ Score->Time, Score->Name, | |
+ Score->Dead ? _("(R.I.P.)") : "", | |
+ Bold ? '<' : ' '); | |
+ SendServerMessage(NULL, C_NONE, C_HISCORE, Play, Data); | |
+ g_free(prstr); | |
+ g_free(Data); | |
+ return 1; | |
+} | |
+ | |
+/* | |
+ * In order for the server to keep track of the state of each client, each | |
+ * client's state is identified by its EventNum data member. So, for example, | |
+ * there is a state for fighting the cops, a state for going to the bank, and | |
+ * so on. This function instructs client player "To" to carry out the actions | |
+ * expected of it in its current state. It is the client's responsibility to | |
+ * ensure that it carries out the correct actions to advance itself to the | |
+ * "next" state; if it fails in this duty it will hang! | |
+ */ | |
+void SendEvent(Player *To) | |
+{ | |
+ price_t Money; | |
+ int i, j; | |
+ gchar *text; | |
+ Player *Play; | |
+ GSList *list; | |
+ | |
+ if (!To) | |
+ return; | |
+ if (To->EventNum == E_MAX) | |
+ To->EventNum = E_NONE; | |
+ if (To->EventNum == E_NONE || To->EventNum >= E_OUTOFSYNC) | |
+ return; | |
+ Money = To->Cash + To->Bank - To->Debt; | |
+ | |
+ ClearPrices(To); | |
+ | |
+ while (To->EventNum < E_MAX) { | |
+ switch (To->EventNum) { | |
+ case E_SUBWAY: | |
+ SendServerMessage(NULL, C_NONE, C_SUBWAYFLASH, To, NULL); | |
+ break; | |
+ case E_OFFOBJECT: | |
+ To->OnBehalfOf = NULL; | |
+ for (i = 0; i < To->TipList.Number; i++) { | |
+ dopelog(3, _("%s: Tipoff from %s"), GetPlayerName(To), | |
+ GetPlayerName(To->TipList.Data[i].Play)); | |
+ To->OnBehalfOf = To->TipList.Data[i].Play; | |
+ SendCopOffer(To, FORCECOPS); | |
+ return; | |
} | |
- if (InList==-1) { | |
- g_string_append(text, | |
- _("You didn't even make the high score table...")); | |
- SendPrintMessage(NULL,C_NONE,Play,text->str); | |
+ for (i = 0; i < To->SpyList.Number; i++) { | |
+ if (To->SpyList.Data[i].Turns < 0) { | |
+ dopelog(3, _("%s: Spy offered by %s"), GetPlayerName(To), | |
+ GetPlayerName(To->SpyList.Data[i].Play)); | |
+ To->OnBehalfOf = To->SpyList.Data[i].Play; | |
+ SendCopOffer(To, FORCEBITCH); | |
+ return; | |
+ } | |
+ To->SpyList.Data[i].Turns++; | |
+ if (To->SpyList.Data[i].Turns > 3 && | |
+ brandom(0, 100) < 10 + To->SpyList.Data[i].Turns) { | |
+ if (TotalGunsCarried(To) > 0) | |
+ j = brandom(0, NUMDISCOVER); | |
+ else | |
+ j = brandom(0, NUMDISCOVER - 1); | |
+ text = | |
+ dpg_strdup_printf(_("One of your %tde was spying for %s." | |
+ "^The spy %s!"), Names.Bitches, | |
+ GetPlayerName(To->SpyList.Data[i].Play), | |
+ _(Discover[j])); | |
+ if (j != DEFECT) | |
+ LoseBitch(To, NULL, NULL); | |
+ SendPlayerData(To); | |
+ SendPrintMessage(NULL, C_NONE, To, text); | |
+ g_free(text); | |
+ text = g_strdup_printf(_("Your spy working with %s has " | |
+ "been discovered!^The spy %s!"), | |
+ GetPlayerName(To), _(Discover[j])); | |
+ if (j == ESCAPE) | |
+ GainBitch(To->SpyList.Data[i].Play); | |
+ To->SpyList.Data[i].Play->Flags &= ~SPYINGON; | |
+ SendPlayerData(To->SpyList.Data[i].Play); | |
+ SendPrintMessage(NULL, C_NONE, To->SpyList.Data[i].Play, text); | |
+ g_free(text); | |
+ RemoveListEntry(&(To->SpyList), i); | |
+ i--; | |
+ } | |
} | |
- } | |
- SendServerMessage(NULL,C_NONE,C_STARTHISCORE,Play,NULL); | |
- | |
- j=0; | |
- for (i=0;i<NUMHISCORE;i++) { | |
- if (SendSingleHighScore(Play,&HiScore[i],j,InList==i)) j++; | |
- } | |
- if (InList==-1 && EndGame) SendSingleHighScore(Play,&Score,j,TRUE); | |
- SendServerMessage(NULL,C_NONE,C_ENDHISCORE,Play,EndGame ? "end" : NULL); | |
- if (!EndGame) SendDrugsHere(Play,FALSE); | |
- if (EndGame && !HighScoreWrite(ScoreFP,MultiScore,AntiqueScore)) { | |
- g_warning(_("Unable to write high score file %s"),HiScoreFile); | |
- } | |
- for (i=0;i<NUMHISCORE;i++) { | |
- g_free(MultiScore[i].Name); g_free(MultiScore[i].Time); | |
- g_free(AntiqueScore[i].Name); g_free(AntiqueScore[i].Time); | |
- } | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-int SendSingleHighScore(Player *Play,struct HISCORE *Score, | |
- int ind,gboolean Bold) { | |
-/* Sends a single high score in "Score" with position "ind" to player */ | |
-/* "Play". If Bold is TRUE, instructs the client to display the score in */ | |
-/* bold text. */ | |
- gchar *Data,*prstr; | |
- if (!Score->Time || Score->Time[0]==0) return 0; | |
- Data=g_strdup_printf("%d^%c%c%18s %-14s %-34s %8s%c",ind, | |
- Bold ? 'B' : 'N',Bold ? '>' : ' ', | |
- prstr=FormatPrice(Score->Money), | |
- Score->Time,Score->Name,Score->Dead ? _("(R.I.P.)") :"… | |
- Bold ? '<' : ' '); | |
- SendServerMessage(NULL,C_NONE,C_HISCORE,Play,Data); | |
- g_free(prstr); g_free(Data); | |
- return 1; | |
-} | |
- | |
-void SendEvent(Player *To) { | |
-/* In order for the server to keep track of the state of each client, each … | |
-/* client's state is identified by its EventNum data member. So, for example, … | |
-/* there is a state for fighting the cops, a state for going to the bank, and … | |
-/* so on. This function instructs client player "To" to carry out the actions … | |
-/* expected of it in its current state. It is the client's responsibility to … | |
-/* ensure that it carries out the correct actions to advance itself to the … | |
-/* "next" state; if it fails in this duty it will hang! … | |
- price_t Money; | |
- int i,j; | |
- gchar *text; | |
- Player *Play; | |
- GSList *list; | |
- | |
- if (!To) return; | |
- if (To->EventNum==E_MAX) To->EventNum=E_NONE; | |
- if (To->EventNum==E_NONE || To->EventNum>=E_OUTOFSYNC) return; | |
- Money=To->Cash+To->Bank-To->Debt; | |
- | |
- ClearPrices(To); | |
- | |
- while (To->EventNum<E_MAX) { | |
- switch (To->EventNum) { | |
- case E_SUBWAY: | |
- SendServerMessage(NULL,C_NONE,C_SUBWAYFLASH,To,NULL); | |
- break; | |
- case E_OFFOBJECT: | |
- To->OnBehalfOf=NULL; | |
- for (i=0;i<To->TipList.Number;i++) { | |
- dopelog(3,_("%s: Tipoff from %s"),GetPlayerName(To), | |
- GetPlayerName(To->TipList.Data[i].Play)); | |
- To->OnBehalfOf=To->TipList.Data[i].Play; | |
- SendCopOffer(To,FORCECOPS); | |
- return; | |
- } | |
- for (i=0;i<To->SpyList.Number;i++) { | |
- if (To->SpyList.Data[i].Turns<0) { | |
- dopelog(3,_("%s: Spy offered by %s"),GetPlayerName(To), | |
- GetPlayerName(To->SpyList.Data[i].Play)); | |
- To->OnBehalfOf=To->SpyList.Data[i].Play; | |
- SendCopOffer(To,FORCEBITCH); | |
- return; | |
- } | |
- To->SpyList.Data[i].Turns++; | |
- if (To->SpyList.Data[i].Turns>3 && | |
- brandom(0,100)<10+To->SpyList.Data[i].Turns) { | |
- if (TotalGunsCarried(To) > 0) j=brandom(0,NUMDISCOVER); | |
- else j=brandom(0,NUMDISCOVER-1); | |
- text=dpg_strdup_printf( | |
- _("One of your %tde was spying for %s.^The spy %s!"), | |
- Names.Bitches,GetPlayerName(To->SpyList.Data[i].Play), | |
- _(Discover[j])); | |
- if (j!=DEFECT) LoseBitch(To,NULL,NULL); | |
- SendPlayerData(To); | |
- SendPrintMessage(NULL,C_NONE,To,text); | |
- g_free(text); | |
- text=g_strdup_printf(_("Your spy working with %s has " | |
- "been discovered!^The spy %s!"), | |
- GetPlayerName(To),_(Discover[j])); | |
- if (j==ESCAPE) GainBitch(To->SpyList.Data[i].Play); | |
- To->SpyList.Data[i].Play->Flags &= ~SPYINGON; | |
- SendPlayerData(To->SpyList.Data[i].Play); | |
- SendPrintMessage(NULL,C_NONE, | |
- To->SpyList.Data[i].Play,text); | |
- g_free(text); | |
- RemoveListEntry(&(To->SpyList),i); | |
- i--; | |
- } | |
- } | |
- if (Money>3000000) i=130; | |
- else if (Money>1000000) i=115; | |
- else i=100; | |
- if (brandom(0,i)>75) { | |
- if (SendCopOffer(To,NOFORCE)) return; | |
- } | |
- break; | |
- case E_SAYING: | |
- if (!Sanitized && (brandom(0,100) < 15)) { | |
- if (brandom(0,100)<50) { | |
- text=g_strdup_printf(_("The lady next to you on the subway " | |
- "said,^ \"%s\"%s"), | |
- SubwaySaying[brandom(0,NumSubway)],brandom(0,100)<30 ? | |
- _("^ (at least, you -think- that's what she said)") : ""… | |
- } else { | |
- text=g_strdup_printf(_("You hear someone playing %s"), | |
- Playing[brandom(0,NumPlaying)]); | |
- } | |
- SendPrintMessage(NULL,C_NONE,To,text); | |
- g_free(text); | |
- } | |
- break; | |
- case E_LOANSHARK: | |
- if (To->IsAt+1==LoanSharkLoc && To->Debt>0) { | |
- text=dpg_strdup_printf(_("YN^Would you like to visit %tde?"), | |
- Names.LoanSharkName); | |
- SendQuestion(NULL,C_ASKLOAN,To,text); | |
- g_free(text); | |
- return; | |
- } | |
- break; | |
- case E_BANK: | |
- if (To->IsAt+1==BankLoc) { | |
- text=dpg_strdup_printf(_("YN^Would you like to visit %tde?"), | |
- Names.BankName); | |
- SendQuestion(NULL,C_ASKBANK,To,text); | |
- g_free(text); | |
- return; | |
- } | |
- break; | |
- case E_GUNSHOP: | |
- if (To->IsAt+1==GunShopLoc && !Sanitized && !WantAntique) { | |
- text=dpg_strdup_printf(_("YN^Would you like to visit %tde?"), | |
- Names.GunShopName); | |
- SendQuestion(NULL,C_ASKGUNSHOP,To,text); | |
- g_free(text); | |
- return; | |
- } | |
- break; | |
- case E_ROUGHPUB: | |
- if (To->IsAt+1==RoughPubLoc && !WantAntique) { | |
- text=dpg_strdup_printf(_("YN^Would you like to visit %tde?"), | |
- Names.RoughPubName); | |
- SendQuestion(NULL,C_ASKPUB,To,text); | |
- g_free(text); | |
- return; | |
- } | |
- break; | |
- case E_HIREBITCH: | |
- if (To->IsAt+1==RoughPubLoc && !WantAntique) { | |
- To->Bitches.Price=prandom(Bitch.MinPrice,Bitch.MaxPrice); | |
- text=dpg_strdup_printf( | |
- _("YN^^Would you like to hire a %tde for %P?"), | |
- Names.Bitch,To->Bitches.Price); | |
- SendQuestion(NULL,C_ASKBITCH,To,text); | |
- g_free(text); | |
- return; | |
- } | |
- break; | |
- case E_ARRIVE: | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- Play=(Player *)list->data; | |
- if (IsConnectedPlayer(Play) && Play!=To && | |
- Play->IsAt==To->IsAt && | |
- Play->EventNum==E_NONE && TotalGunsCarried(To)>0) { | |
- text=g_strdup_printf(_("AE^%s is already here!^" | |
- "Do you Attack, or Evade?"), | |
- GetPlayerName(Play)); | |
-/* Steal this to keep track of the potential defender */ | |
- To->OnBehalfOf=Play; | |
- | |
- SendDrugsHere(To,TRUE); | |
- SendQuestion(NULL,C_MEETPLAYER,To,text); | |
- g_free(text); | |
- return; | |
- } | |
- } | |
- SendDrugsHere(To,TRUE); | |
- break; | |
- default: | |
- break; | |
+ if (Money > 3000000) | |
+ i = 130; | |
+ else if (Money > 1000000) | |
+ i = 115; | |
+ else | |
+ i = 100; | |
+ if (brandom(0, i) > 75) { | |
+ if (SendCopOffer(To, NOFORCE)) | |
+ return; | |
} | |
- To->EventNum++; | |
- } | |
- if (To->EventNum >= E_MAX) To->EventNum=E_NONE; | |
-} | |
- | |
-int SendCopOffer(Player *To,OfferForce Force) { | |
-/* In response to client player "To" being in state E_OFFOBJECT, */ | |
-/* randomly engages the client in combat with the cops or offers */ | |
-/* other random events. Returns 0 if the client should then be */ | |
-/* advanced to the next state, 1 otherwise (i.e. if there are */ | |
-/* questions pending which the client must answer first) */ | |
-/* If Force==FORCECOPS, engage in combat with the cops for certain */ | |
-/* If Force==FORCEBITCH, offer the client a bitch for certain */ | |
- int i; | |
- | |
- /* The cops are more likely to attack in locations with higher | |
- police presence ratings */ | |
- i=brandom(0,80+Location[(int)To->IsAt].PolicePresence); | |
- | |
- if (Force==FORCECOPS) i=100; | |
- else if (Force==FORCEBITCH) i=0; | |
- else To->OnBehalfOf=NULL; | |
- if (i<33) { | |
- return(OfferObject(To,Force==FORCEBITCH)); | |
- } else if (i<50) { return(RandomOffer(To)); | |
- } else if (Sanitized) { return 0; | |
- } else { | |
- CopsAttackPlayer(To); | |
- return 1; | |
- } | |
- return 1; | |
-} | |
- | |
-void CopsAttackPlayer(Player *Play) { | |
-/* Has the cops attack player "Play" */ | |
- Player *Cops; | |
- gint CopIndex,NumDeputy,GunIndex; | |
- | |
- CopIndex=1-Play->CopIndex; | |
- if (CopIndex<0) { | |
- g_warning(_("Cops cannot attack other cops!")); | |
- return; | |
- } | |
- if (CopIndex > NumCop) CopIndex=NumCop; | |
- Cops=g_new(Player,1); | |
- FirstServer=AddPlayer(0,Cops,FirstServer); | |
- SetPlayerName(Cops,Cop[CopIndex-1].Name); | |
- Cops->CopIndex=CopIndex; | |
- Cops->Cash=brandom(100,2000); | |
- Cops->Debt=Cops->Bank=0; | |
- | |
- NumDeputy=brandom(Cop[CopIndex-1].MinDeputies, | |
- Cop[CopIndex-1].MaxDeputies); | |
- Cops->Bitches.Carried=NumDeputy; | |
- GunIndex=Cop[CopIndex-1].GunIndex; | |
- if (GunIndex>=NumGun) GunIndex=NumGun-1; | |
- Cops->Guns[GunIndex].Carried=(NumDeputy*Cop[CopIndex-1].DeputyGun)+ | |
- Cop[CopIndex-1].CopGun; | |
- Cops->Health=100; | |
- | |
- Play->EventNum++; | |
- AttackPlayer(Cops,Play); | |
-} | |
- | |
-void AttackPlayer(Player *Play,Player *Attacked) { | |
-/* Starts combat between player "Play" and player "Attacked"; if */ | |
-/* either player is currently engaged in combat, add the other */ | |
-/* player to the existing combat. If neither player is currently */ | |
-/* fighting, start a new combat between them. Either player can be */ | |
-/* the cops. */ | |
- GPtrArray *FightArray; | |
- g_assert(Play && Attacked); | |
- | |
- if (Play->FightArray && Attacked->FightArray) { | |
- if (Play->FightArray==Attacked->FightArray) { | |
- g_error(_("Players are already in a fight!")); | |
- } else { | |
- g_error(_("Players are already in separate fights!")); | |
+ break; | |
+ case E_SAYING: | |
+ if (!Sanitized && (brandom(0, 100) < 15)) { | |
+ if (brandom(0, 100) < 50) { | |
+ text = g_strdup_printf(_("The lady next to you on the subway " | |
+ "said,^ \"%s\"%s"), | |
+ SubwaySaying[brandom(0, NumSubway)], | |
+ brandom(0, 100) < 30 ? | |
+ _("^ (at least, you -think- that's " | |
+ "what she said)") : ""); | |
+ } else { | |
+ text = g_strdup_printf(_("You hear someone playing %s"), | |
+ Playing[brandom(0, NumPlaying)]); | |
+ } | |
+ SendPrintMessage(NULL, C_NONE, To, text); | |
+ g_free(text); | |
+ } | |
+ break; | |
+ case E_LOANSHARK: | |
+ if (To->IsAt + 1 == LoanSharkLoc && To->Debt > 0) { | |
+ text = dpg_strdup_printf(_("YN^Would you like to visit %tde?"), | |
+ Names.LoanSharkName); | |
+ SendQuestion(NULL, C_ASKLOAN, To, text); | |
+ g_free(text); | |
+ return; | |
+ } | |
+ break; | |
+ case E_BANK: | |
+ if (To->IsAt + 1 == BankLoc) { | |
+ text = dpg_strdup_printf(_("YN^Would you like to visit %tde?"), | |
+ Names.BankName); | |
+ SendQuestion(NULL, C_ASKBANK, To, text); | |
+ g_free(text); | |
+ return; | |
+ } | |
+ break; | |
+ case E_GUNSHOP: | |
+ if (To->IsAt + 1 == GunShopLoc && !Sanitized && !WantAntique) { | |
+ text = dpg_strdup_printf(_("YN^Would you like to visit %tde?"), | |
+ Names.GunShopName); | |
+ SendQuestion(NULL, C_ASKGUNSHOP, To, text); | |
+ g_free(text); | |
+ return; | |
} | |
- return; | |
- } | |
- if (NumGun==0) { | |
- g_error(_("Cannot start fight - no guns to use!")); | |
- return; | |
- } | |
- | |
- if (!Play->FightArray && !Attacked->FightArray) { | |
- FightArray = g_ptr_array_new(); | |
- } else { | |
- FightArray = Play->FightArray ? Play->FightArray : Attacked->FightArray; | |
- } | |
- | |
- if (!Play->FightArray) { | |
- Play->ResyncNum=Play->EventNum; | |
- g_ptr_array_add(FightArray,Play); | |
- } | |
- if (!Attacked->FightArray) { | |
- Attacked->ResyncNum=Attacked->EventNum; | |
- g_ptr_array_add(FightArray,Attacked); | |
- } | |
- Play->FightArray=Attacked->FightArray=FightArray; | |
- Play->EventNum=Attacked->EventNum=E_FIGHT; | |
- | |
- Play->Attacking = Attacked; | |
- | |
- SendFightMessage(Attacked,Play,0,F_ARRIVED,(price_t)0,TRUE,NULL); | |
- | |
- Fire(Play); | |
-} | |
- | |
-gboolean IsOpponent(Player *Play,Player *Other) { | |
-/* Returns TRUE if player "Other" is not allied with player "Play" */ | |
- return TRUE; | |
-} | |
- | |
-void HandleDamage(Player *Defend,Player *Attack,int Damage, | |
- int *BitchesKilled,price_t *Loot) { | |
- Inventory *Guns,*Drugs; | |
- price_t Bounty; | |
- | |
- Guns=(Inventory *)g_malloc0(sizeof(Inventory)*NumGun); | |
- Drugs=(Inventory *)g_malloc0(sizeof(Inventory)*NumDrug); | |
- ClearInventory(Guns,Drugs); | |
- | |
- Bounty=0; | |
- if (Defend->Health<=Damage && Defend->Bitches.Carried==0) { | |
- Bounty=Defend->Cash+Defend->Bank-Defend->Debt; | |
- AddInventory(Guns,Defend->Guns,NumGun); | |
- AddInventory(Drugs,Defend->Drugs,NumDrug); | |
- Defend->Health=0; | |
- } else if (Defend->Bitches.Carried>0 && | |
- Defend->Health<=Damage) { | |
- if (IsCop(Defend)) LoseBitch(Defend,NULL,NULL); | |
- else LoseBitch(Defend,Guns,Drugs); | |
- Defend->Health=100; | |
- *BitchesKilled=1; | |
- } else { | |
- Defend->Health-=Damage; | |
- } | |
- if (IsCop(Attack)) { /* Don't let cops loot players */ | |
- ClearInventory(Guns,Drugs); | |
- } else { | |
- TruncateInventoryFor(Guns,Drugs,Attack); | |
- } | |
- SendPlayerData(Defend); | |
- if (Bounty<0) Bounty=0; | |
- if (!IsInventoryClear(Guns,Drugs)) { | |
- AddInventory(Attack->Guns,Guns,NumGun); | |
- AddInventory(Attack->Drugs,Drugs,NumDrug); | |
- ChangeSpaceForInventory(Guns,Drugs,Attack); | |
- } | |
- Attack->Cash+=Bounty; | |
- if (Bounty>0 || !IsInventoryClear(Guns,Drugs)) { | |
- if (Bounty>0) *Loot=Bounty; else *Loot=-1; | |
- SendPlayerData(Attack); | |
- } | |
- g_free(Guns); g_free(Drugs); | |
-} | |
- | |
-void GetFightRatings(Player *Attack,Player *Defend, | |
- int *AttackRating,int *DefendRating) { | |
- int i; | |
- | |
-/* Base values */ | |
- *AttackRating=80; | |
- *DefendRating=100; | |
- | |
- for (i=0;i<NumGun;i++) { | |
- *AttackRating+=Gun[i].Damage*Attack->Guns[i].Carried; | |
- } | |
- if (IsCop(Attack)) *AttackRating-=Cop[Attack->CopIndex-1].AttackPenalty; | |
- | |
- *DefendRating-=5*Defend->Bitches.Carried; | |
- if (IsCop(Defend)) *DefendRating-=Cop[Defend->CopIndex-1].DefendPenalty; | |
- | |
- *DefendRating=MAX(*DefendRating,10); | |
- *AttackRating=MAX(*AttackRating,10); | |
-} | |
- | |
-void AllowNextShooter(Player *Play) { | |
- Player *NextShooter; | |
- if (FightTimeout) { | |
- NextShooter=GetNextShooter(Play); | |
- if (NextShooter && !CanPlayerFire(NextShooter)) { | |
- NextShooter->FightTimeout=0; | |
+ break; | |
+ case E_ROUGHPUB: | |
+ if (To->IsAt + 1 == RoughPubLoc && !WantAntique) { | |
+ text = dpg_strdup_printf(_("YN^Would you like to visit %tde?"), | |
+ Names.RoughPubName); | |
+ SendQuestion(NULL, C_ASKPUB, To, text); | |
+ g_free(text); | |
+ return; | |
+ } | |
+ break; | |
+ case E_HIREBITCH: | |
+ if (To->IsAt + 1 == RoughPubLoc && !WantAntique) { | |
+ To->Bitches.Price = prandom(Bitch.MinPrice, Bitch.MaxPrice); | |
+ text = | |
+ dpg_strdup_printf(_ | |
+ ("YN^^Would you like to hire a %tde for %P?"), | |
+ Names.Bitch, To->Bitches.Price); | |
+ SendQuestion(NULL, C_ASKBITCH, To, text); | |
+ g_free(text); | |
+ return; | |
+ } | |
+ break; | |
+ case E_ARRIVE: | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ Play = (Player *)list->data; | |
+ if (IsConnectedPlayer(Play) && Play != To && | |
+ Play->IsAt == To->IsAt && | |
+ Play->EventNum == E_NONE && TotalGunsCarried(To) > 0) { | |
+ text = g_strdup_printf(_("AE^%s is already here!^" | |
+ "Do you Attack, or Evade?"), | |
+ GetPlayerName(Play)); | |
+ /* Steal this to keep track of the potential defender */ | |
+ To->OnBehalfOf = Play; | |
+ | |
+ SendDrugsHere(To, TRUE); | |
+ SendQuestion(NULL, C_MEETPLAYER, To, text); | |
+ g_free(text); | |
+ return; | |
+ } | |
} | |
- } | |
+ SendDrugsHere(To, TRUE); | |
+ break; | |
+ default: | |
+ break; | |
+ } | |
+ To->EventNum++; | |
+ } | |
+ if (To->EventNum >= E_MAX) | |
+ To->EventNum = E_NONE; | |
+} | |
+ | |
+/* | |
+ * In response to client player "To" being in state E_OFFOBJECT, | |
+ * randomly engages the client in combat with the cops or offers | |
+ * other random events. Returns 0 if the client should then be | |
+ * advanced to the next state, 1 otherwise (i.e. if there are | |
+ * questions pending which the client must answer first) | |
+ * If Force==FORCECOPS, engage in combat with the cops for certain | |
+ * If Force==FORCEBITCH, offer the client a bitch for certain | |
+ */ | |
+int SendCopOffer(Player *To, OfferForce Force) | |
+{ | |
+ int i; | |
+ | |
+ /* The cops are more likely to attack in locations with higher police | |
+ * presence ratings */ | |
+ i = brandom(0, 80 + Location[(int)To->IsAt].PolicePresence); | |
+ | |
+ if (Force == FORCECOPS) | |
+ i = 100; | |
+ else if (Force == FORCEBITCH) | |
+ i = 0; | |
+ else | |
+ To->OnBehalfOf = NULL; | |
+ if (i < 33) { | |
+ return (OfferObject(To, Force == FORCEBITCH)); | |
+ } else if (i < 50) { | |
+ return (RandomOffer(To)); | |
+ } else if (Sanitized) { | |
+ return 0; | |
+ } else { | |
+ CopsAttackPlayer(To); | |
+ return 1; | |
+ } | |
+ return 1; | |
} | |
-void DoReturnFire(Player *Play) { | |
- guint ArrayInd; | |
- Player *Defend; | |
+/* | |
+ * Has the cops attack player "Play". | |
+ */ | |
+void CopsAttackPlayer(Player *Play) | |
+{ | |
+ Player *Cops; | |
+ gint CopIndex, NumDeputy, GunIndex; | |
- if (!Play || !Play->FightArray) return; | |
+ CopIndex = 1 - Play->CopIndex; | |
+ if (CopIndex < 0) { | |
+ g_warning(_("Cops cannot attack other cops!")); | |
+ return; | |
+ } | |
+ if (CopIndex > NumCop) | |
+ CopIndex = NumCop; | |
+ Cops = g_new(Player, 1); | |
+ | |
+ FirstServer = AddPlayer(0, Cops, FirstServer); | |
+ SetPlayerName(Cops, Cop[CopIndex - 1].Name); | |
+ Cops->CopIndex = CopIndex; | |
+ Cops->Cash = brandom(100, 2000); | |
+ Cops->Debt = Cops->Bank = 0; | |
+ | |
+ NumDeputy = brandom(Cop[CopIndex - 1].MinDeputies, | |
+ Cop[CopIndex - 1].MaxDeputies); | |
+ Cops->Bitches.Carried = NumDeputy; | |
+ GunIndex = Cop[CopIndex - 1].GunIndex; | |
+ if (GunIndex >= NumGun) | |
+ GunIndex = NumGun - 1; | |
+ Cops->Guns[GunIndex].Carried = | |
+ (NumDeputy * Cop[CopIndex - 1].DeputyGun) + Cop[CopIndex - 1].CopGun; | |
+ Cops->Health = 100; | |
+ | |
+ Play->EventNum++; | |
+ AttackPlayer(Cops, Play); | |
+} | |
+ | |
+/* | |
+ * Starts combat between player "Play" and player "Attacked"; if | |
+ * either player is currently engaged in combat, add the other | |
+ * player to the existing combat. If neither player is currently | |
+ * fighting, start a new combat between them. Either player can be | |
+ * the cops. | |
+ */ | |
+void AttackPlayer(Player *Play, Player *Attacked) | |
+{ | |
+ GPtrArray *FightArray; | |
+ | |
+ g_assert(Play && Attacked); | |
+ | |
+ if (Play->FightArray && Attacked->FightArray) { | |
+ if (Play->FightArray == Attacked->FightArray) { | |
+ g_error(_("Players are already in a fight!")); | |
+ } else { | |
+ g_error(_("Players are already in separate fights!")); | |
+ } | |
+ return; | |
+ } | |
+ if (NumGun == 0) { | |
+ g_error(_("Cannot start fight - no guns to use!")); | |
+ return; | |
+ } | |
- if (FightTimeout!=0 || !IsCop(Play)) { | |
- for (ArrayInd=0;Play->FightArray && ArrayInd<Play->FightArray->len; | |
- ArrayInd++) { | |
- Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd); | |
- if (IsCop(Defend) && CanPlayerFire(Defend)) Fire(Defend); | |
- } | |
- } | |
+ if (!Play->FightArray && !Attacked->FightArray) { | |
+ FightArray = g_ptr_array_new(); | |
+ } else { | |
+ FightArray = | |
+ Play->FightArray ? Play->FightArray : Attacked->FightArray; | |
+ } | |
+ | |
+ if (!Play->FightArray) { | |
+ Play->ResyncNum = Play->EventNum; | |
+ g_ptr_array_add(FightArray, Play); | |
+ } | |
+ if (!Attacked->FightArray) { | |
+ Attacked->ResyncNum = Attacked->EventNum; | |
+ g_ptr_array_add(FightArray, Attacked); | |
+ } | |
+ Play->FightArray = Attacked->FightArray = FightArray; | |
+ Play->EventNum = Attacked->EventNum = E_FIGHT; | |
+ | |
+ Play->Attacking = Attacked; | |
+ | |
+ SendFightMessage(Attacked, Play, 0, F_ARRIVED, (price_t)0, TRUE, NULL); | |
+ | |
+ Fire(Play); | |
+} | |
+ | |
+/* | |
+ * Returns TRUE if player "Other" is not allied with player "Play". | |
+ */ | |
+gboolean IsOpponent(Player *Play, Player *Other) | |
+{ | |
+ return TRUE; | |
+} | |
+ | |
+void HandleDamage(Player *Defend, Player *Attack, int Damage, | |
+ int *BitchesKilled, price_t *Loot) | |
+{ | |
+ Inventory *Guns, *Drugs; | |
+ price_t Bounty; | |
+ | |
+ Guns = (Inventory *)g_malloc0(sizeof(Inventory) * NumGun); | |
+ Drugs = (Inventory *)g_malloc0(sizeof(Inventory) * NumDrug); | |
+ ClearInventory(Guns, Drugs); | |
+ | |
+ Bounty = 0; | |
+ if (Defend->Health <= Damage && Defend->Bitches.Carried == 0) { | |
+ Bounty = Defend->Cash + Defend->Bank - Defend->Debt; | |
+ AddInventory(Guns, Defend->Guns, NumGun); | |
+ AddInventory(Drugs, Defend->Drugs, NumDrug); | |
+ Defend->Health = 0; | |
+ } else if (Defend->Bitches.Carried > 0 && Defend->Health <= Damage) { | |
+ if (IsCop(Defend)) | |
+ LoseBitch(Defend, NULL, NULL); | |
+ else | |
+ LoseBitch(Defend, Guns, Drugs); | |
+ Defend->Health = 100; | |
+ *BitchesKilled = 1; | |
+ } else { | |
+ Defend->Health -= Damage; | |
+ } | |
+ if (IsCop(Attack)) { /* Don't let cops loot players */ | |
+ ClearInventory(Guns, Drugs); | |
+ } else { | |
+ TruncateInventoryFor(Guns, Drugs, Attack); | |
+ } | |
+ SendPlayerData(Defend); | |
+ if (Bounty < 0) | |
+ Bounty = 0; | |
+ if (!IsInventoryClear(Guns, Drugs)) { | |
+ AddInventory(Attack->Guns, Guns, NumGun); | |
+ AddInventory(Attack->Drugs, Drugs, NumDrug); | |
+ ChangeSpaceForInventory(Guns, Drugs, Attack); | |
+ } | |
+ Attack->Cash += Bounty; | |
+ if (Bounty > 0 || !IsInventoryClear(Guns, Drugs)) { | |
+ if (Bounty > 0) | |
+ *Loot = Bounty; | |
+ else | |
+ *Loot = -1; | |
+ SendPlayerData(Attack); | |
+ } | |
+ g_free(Guns); | |
+ g_free(Drugs); | |
} | |
-void RunFromCombat(Player *Play,int ToLocation) { | |
-/* Withdraws player "Play" from combat, and levies any penalties on */ | |
-/* the player for this cowardly act, if applicable. If "ToLocation" */ | |
-/* is >=0, then it identifies the location that the player is */ | |
-/* trying to run to. */ | |
- int EscapeProb,RandNum; | |
- guint ArrayInd; | |
- gboolean FightingCop=FALSE; | |
- Player *Defend; | |
- char BackupAt; | |
+void GetFightRatings(Player *Attack, Player *Defend, | |
+ int *AttackRating, int *DefendRating) | |
+{ | |
+ int i; | |
- if (!Play || !Play->FightArray) return; | |
+ /* Base values */ | |
+ *AttackRating = 80; | |
+ *DefendRating = 100; | |
- EscapeProb=60; | |
+ for (i = 0; i < NumGun; i++) { | |
+ *AttackRating += Gun[i].Damage * Attack->Guns[i].Carried; | |
+ } | |
+ if (IsCop(Attack)) | |
+ *AttackRating -= Cop[Attack->CopIndex - 1].AttackPenalty; | |
-/* Penalise players that are attacking others */ | |
- if (Play->Attacking) EscapeProb/=2; | |
+ *DefendRating -= 5 * Defend->Bitches.Carried; | |
+ if (IsCop(Defend)) | |
+ *DefendRating -= Cop[Defend->CopIndex - 1].DefendPenalty; | |
- RandNum=brandom(0,100); | |
+ *DefendRating = MAX(*DefendRating, 10); | |
+ *AttackRating = MAX(*AttackRating, 10); | |
+} | |
- if (RandNum<EscapeProb) { | |
- if (!IsCop(Play) && brandom(0,100)<30) { | |
- for (ArrayInd=0;ArrayInd<Play->FightArray->len;ArrayInd++) { | |
- Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd); | |
- if (IsCop(Defend)) { FightingCop=TRUE; break; } | |
- } | |
- if (FightingCop) Play->CopIndex--; | |
- } | |
- BackupAt=Play->IsAt; | |
- Play->IsAt=(char)ToLocation; | |
- WithdrawFromCombat(Play); | |
- Play->IsAt=BackupAt; | |
- Play->EventNum=Play->ResyncNum; SendEvent(Play); | |
- } else { | |
- SendFightMessage(Play,NULL,0,F_FAILFLEE,(price_t)0,TRUE,NULL); | |
- AllowNextShooter(Play); | |
- if (FightTimeout) SetFightTimeout(Play); | |
- DoReturnFire(Play); | |
- } | |
-} | |
- | |
-void CheckForKilledPlayers(Player *Play) { | |
- Player *Defend; | |
- guint ArrayInd; | |
- GPtrArray *KilledPlayers; | |
- | |
- KilledPlayers=g_ptr_array_new(); | |
- for (ArrayInd=0;ArrayInd<Play->FightArray->len;ArrayInd++) { | |
- Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd); | |
- | |
- if (Defend && Defend!=Play && IsOpponent(Play,Defend) && | |
- Defend->Health==0) { | |
- g_ptr_array_add(KilledPlayers,(gpointer)Defend); | |
- } | |
- } | |
- for (ArrayInd=0;ArrayInd<KilledPlayers->len;ArrayInd++) { | |
- Defend=(Player *)g_ptr_array_index(KilledPlayers,ArrayInd); | |
- WithdrawFromCombat(Defend); | |
- if (IsCop(Defend)) { | |
- if (!IsCop(Play)) Play->CopIndex=-Defend->CopIndex; | |
- FirstServer=RemovePlayer(Defend,FirstServer); | |
- } else { | |
- FinishGame(Defend,_("You're dead! Game over.")); | |
+void AllowNextShooter(Player *Play) | |
+{ | |
+ Player *NextShooter; | |
+ | |
+ if (FightTimeout) { | |
+ NextShooter = GetNextShooter(Play); | |
+ if (NextShooter && !CanPlayerFire(NextShooter)) { | |
+ NextShooter->FightTimeout = 0; | |
+ } | |
+ } | |
+} | |
+ | |
+void DoReturnFire(Player *Play) | |
+{ | |
+ guint ArrayInd; | |
+ Player *Defend; | |
+ | |
+ if (!Play || !Play->FightArray) | |
+ return; | |
+ | |
+ if (FightTimeout != 0 || !IsCop(Play)) { | |
+ for (ArrayInd = 0; | |
+ Play->FightArray && ArrayInd < Play->FightArray->len; | |
+ ArrayInd++) { | |
+ Defend = (Player *)g_ptr_array_index(Play->FightArray, ArrayInd); | |
+ if (IsCop(Defend) && CanPlayerFire(Defend)) | |
+ Fire(Defend); | |
+ } | |
+ } | |
+} | |
+ | |
+/* | |
+ * Withdraws player "Play" from combat, and levies any penalties on | |
+ * the player for this cowardly act, if applicable. If "ToLocation" | |
+ * is >=0, then it identifies the location that the player is | |
+ * trying to run to. | |
+ */ | |
+void RunFromCombat(Player *Play, int ToLocation) | |
+{ | |
+ int EscapeProb, RandNum; | |
+ guint ArrayInd; | |
+ gboolean FightingCop = FALSE; | |
+ Player *Defend; | |
+ char BackupAt; | |
+ | |
+ if (!Play || !Play->FightArray) | |
+ return; | |
+ | |
+ EscapeProb = 60; | |
+ | |
+ /* Penalise players that are attacking others */ | |
+ if (Play->Attacking) | |
+ EscapeProb /= 2; | |
+ | |
+ RandNum = brandom(0, 100); | |
+ | |
+ if (RandNum < EscapeProb) { | |
+ if (!IsCop(Play) && brandom(0, 100) < 30) { | |
+ for (ArrayInd = 0; ArrayInd < Play->FightArray->len; ArrayInd++) { | |
+ Defend = (Player *)g_ptr_array_index(Play->FightArray, ArrayInd); | |
+ if (IsCop(Defend)) { | |
+ FightingCop = TRUE; | |
+ break; | |
+ } | |
} | |
- } | |
+ if (FightingCop) | |
+ Play->CopIndex--; | |
+ } | |
+ BackupAt = Play->IsAt; | |
+ Play->IsAt = (char)ToLocation; | |
+ WithdrawFromCombat(Play); | |
+ Play->IsAt = BackupAt; | |
+ Play->EventNum = Play->ResyncNum; | |
+ SendEvent(Play); | |
+ } else { | |
+ SendFightMessage(Play, NULL, 0, F_FAILFLEE, (price_t)0, TRUE, NULL); | |
+ AllowNextShooter(Play); | |
+ if (FightTimeout) | |
+ SetFightTimeout(Play); | |
+ DoReturnFire(Play); | |
+ } | |
+} | |
+ | |
+void CheckForKilledPlayers(Player *Play) | |
+{ | |
+ Player *Defend; | |
+ guint ArrayInd; | |
+ GPtrArray *KilledPlayers; | |
- g_ptr_array_free(KilledPlayers,FALSE); | |
+ KilledPlayers = g_ptr_array_new(); | |
+ for (ArrayInd = 0; ArrayInd < Play->FightArray->len; ArrayInd++) { | |
+ Defend = (Player *)g_ptr_array_index(Play->FightArray, ArrayInd); | |
+ | |
+ if (Defend && Defend != Play && IsOpponent(Play, Defend) && | |
+ Defend->Health == 0) { | |
+ g_ptr_array_add(KilledPlayers, (gpointer)Defend); | |
+ } | |
+ } | |
+ for (ArrayInd = 0; ArrayInd < KilledPlayers->len; ArrayInd++) { | |
+ Defend = (Player *)g_ptr_array_index(KilledPlayers, ArrayInd); | |
+ WithdrawFromCombat(Defend); | |
+ if (IsCop(Defend)) { | |
+ if (!IsCop(Play)) | |
+ Play->CopIndex = -Defend->CopIndex; | |
+ FirstServer = RemovePlayer(Defend, FirstServer); | |
+ } else { | |
+ FinishGame(Defend, _("You're dead! Game over.")); | |
+ } | |
+ } | |
+ | |
+ g_ptr_array_free(KilledPlayers, FALSE); | |
} | |
-static void CheckCopsIntervene(Player *Play) { | |
-/* If "Play" is attacking someone, and no cops are currently present, */ | |
-/* then have the cops intervene (with a probability dependent on the */ | |
-/* current location's PolicePresence) */ | |
- guint ArrayInd; | |
- Player *Defend; | |
+/* | |
+ * If "Play" is attacking someone, and no cops are currently present, | |
+ * then have the cops intervene (with a probability dependent on the | |
+ * current location's PolicePresence) | |
+ */ | |
+static void CheckCopsIntervene(Player *Play) | |
+{ | |
+ guint ArrayInd; | |
+ Player *Defend; | |
- if (!Play || !Play->FightArray) return; /* Sanity check */ | |
+ if (!Play || !Play->FightArray) | |
+ return; /* Sanity check */ | |
- if (!Play->Attacking) return; /* Cops don't attack "innocent victims" ;) */ | |
+ if (!Play->Attacking) | |
+ return; /* Cops don't attack "innocent victims" ;) */ | |
- if (brandom(0,100) > Location[(int)Play->IsAt].PolicePresence) { | |
- return; /* The cops shouldn't _always_ attack (unless P.P. == 100) */ | |
- } | |
+ if (brandom(0, 100) > Location[(int)Play->IsAt].PolicePresence) { | |
+ return; /* The cops shouldn't _always_ attack | |
+ * (unless P.P. == 100) */ | |
+ } | |
- for (ArrayInd=0;Play->FightArray && ArrayInd<Play->FightArray->len; | |
- ArrayInd++) { | |
- Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd); | |
- if (IsCop(Defend)) return; /* We don't want _more_ cops! */ | |
- } | |
+ for (ArrayInd = 0; Play->FightArray && ArrayInd < Play->FightArray->len; | |
+ ArrayInd++) { | |
+ Defend = (Player *)g_ptr_array_index(Play->FightArray, ArrayInd); | |
+ if (IsCop(Defend)) | |
+ return; /* We don't want _more_ cops! */ | |
+ } | |
- /* OK - let 'em have it... */ | |
- CopsAttackPlayer(Play); | |
+ /* OK - let 'em have it... */ | |
+ CopsAttackPlayer(Play); | |
} | |
-static Player *GetFireTarget(Player *Play) { | |
-/* Returns a suitable player (or cop) for "Play" to fire at. If "Play" */ | |
-/* is attacking a designated target already, return that, otherwise */ | |
-/* return the first valid opponent in the player's FightArray. */ | |
- Player *Defend; | |
- guint ArrayInd; | |
+/* | |
+ * Returns a suitable player (or cop) for "Play" to fire at. If "Play" | |
+ * is attacking a designated target already, return that, otherwise | |
+ * return the first valid opponent in the player's FightArray. | |
+ */ | |
+static Player *GetFireTarget(Player *Play) | |
+{ | |
+ Player *Defend; | |
+ guint ArrayInd; | |
- if (Play->Attacking && g_slist_find(FirstServer,(gpointer)Play->Attacking))… | |
- return Play->Attacking; | |
- } else { | |
- Play->Attacking=NULL; | |
- for (ArrayInd=0;ArrayInd<Play->FightArray->len;ArrayInd++) { | |
- Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd); | |
- if (Defend && Defend!=Play && IsOpponent(Play,Defend)) { | |
- return Defend; | |
- } | |
- } | |
- } | |
- return NULL; | |
-} | |
- | |
-static int GetArmour(Player *Play) { | |
- int Armour; | |
- if (IsCop(Play)) { | |
- if (Play->Bitches.Carried==0) Armour=Cop[Play->CopIndex-1].Armour; | |
- else Armour=Cop[Play->CopIndex-1].DeputyArmour; | |
- } else { | |
- if (Play->Bitches.Carried==0) Armour=PlayerArmour; | |
- else Armour=BitchArmour; | |
- } | |
- if (Armour==0) Armour=1; | |
- return Armour; | |
-} | |
- | |
-void Fire(Player *Play) { | |
-/* Fires all weapons of player "Play" at an opponent, and resets */ | |
-/* the fight timeout (the reload time) */ | |
- int Damage,i,j; | |
- int AttackRating,DefendRating; | |
- int BitchesKilled; | |
- price_t Loot; | |
- FightPoint fp; | |
- Player *Defend; | |
- | |
- if (!Play->FightArray) return; | |
- if (!CanPlayerFire(Play)) return; | |
- | |
- AllowNextShooter(Play); | |
- if (FightTimeout) SetFightTimeout(Play); | |
- | |
- Defend = GetFireTarget(Play); | |
- if (Defend) { | |
- Damage=0; BitchesKilled=0; Loot=0; | |
- if (TotalGunsCarried(Play)>0) { | |
- GetFightRatings(Play,Defend,&AttackRating,&DefendRating); | |
- if (brandom(0,AttackRating)>brandom(0,DefendRating)) { | |
- fp=F_HIT; | |
- for (i=0;i<NumGun;i++) for (j=0;j<Play->Guns[i].Carried;j++) { | |
- Damage+=brandom(0,Gun[i].Damage); | |
- } | |
- Damage=Damage*100/GetArmour(Defend); | |
- if (Damage==0) Damage=1; | |
- HandleDamage(Defend,Play,Damage,&BitchesKilled,&Loot); | |
- } else fp=F_MISS; | |
- } else fp=F_STAND; | |
- SendFightMessage(Play,Defend,BitchesKilled,fp,Loot,TRUE,NULL); | |
- } | |
- CheckForKilledPlayers(Play); | |
- | |
-/* Careful, as we might have killed Player "Play" */ | |
- if (g_slist_find(FirstServer,(gpointer)Play)) DoReturnFire(Play); | |
- | |
- if (g_slist_find(FirstServer,(gpointer)Play)) CheckCopsIntervene(Play); | |
-} | |
- | |
-gboolean CanPlayerFire(Player *Play) { | |
- return (FightTimeout==0 || Play->FightTimeout==0 || | |
- Play->FightTimeout<=time(NULL)); | |
-} | |
- | |
-gboolean CanRunHere(Player *Play) { | |
- return (Play->ResyncNum < E_ARRIVE && Play->ResyncNum!=E_NONE); | |
-} | |
- | |
-Player *GetNextShooter(Player *Play) { | |
-/* To avoid boring waits, return the player who is next in line to be */ | |
-/* able to shoot (i.e. with the smallest FightTimeout) so that this */ | |
-/* player can be allowed to shoot immediately. If a player is already */ | |
-/* eligible to shoot, or there is a tie for "first place" then do */ | |
-/* nothing (i.e. return NULL) */ | |
- Player *MinPlay,*Defend; | |
- time_t MinTimeout; | |
- guint ArrayInd; | |
- gboolean Tie=FALSE; | |
- | |
- if (!FightTimeout) return NULL; | |
- | |
- MinPlay=NULL; MinTimeout=0; | |
- for (ArrayInd=0;ArrayInd<Play->FightArray->len;ArrayInd++) { | |
- Defend=(Player *)g_ptr_array_index(Play->FightArray,ArrayInd); | |
- if (Defend==Play) continue; | |
- if (Defend->FightTimeout==0) return NULL; | |
- if (MinTimeout==0 || Defend->FightTimeout<=MinTimeout) { | |
- Tie = (Defend->FightTimeout==MinTimeout); | |
- MinPlay=Defend; MinTimeout=Defend->FightTimeout; | |
+ if (Play->Attacking | |
+ && g_slist_find(FirstServer, (gpointer)Play->Attacking)) { | |
+ return Play->Attacking; | |
+ } else { | |
+ Play->Attacking = NULL; | |
+ for (ArrayInd = 0; ArrayInd < Play->FightArray->len; ArrayInd++) { | |
+ Defend = (Player *)g_ptr_array_index(Play->FightArray, ArrayInd); | |
+ if (Defend && Defend != Play && IsOpponent(Play, Defend)) { | |
+ return Defend; | |
} | |
- } | |
+ } | |
+ } | |
+ return NULL; | |
+} | |
+ | |
+static int GetArmour(Player *Play) | |
+{ | |
+ int Armour; | |
- return (Tie ? NULL : MinPlay); | |
+ if (IsCop(Play)) { | |
+ if (Play->Bitches.Carried == 0) | |
+ Armour = Cop[Play->CopIndex - 1].Armour; | |
+ else | |
+ Armour = Cop[Play->CopIndex - 1].DeputyArmour; | |
+ } else { | |
+ if (Play->Bitches.Carried == 0) | |
+ Armour = PlayerArmour; | |
+ else | |
+ Armour = BitchArmour; | |
+ } | |
+ if (Armour == 0) | |
+ Armour = 1; | |
+ return Armour; | |
+} | |
+ | |
+/* | |
+ * Fires all weapons of player "Play" at an opponent, and resets | |
+ * the fight timeout (the reload time). | |
+ */ | |
+void Fire(Player *Play) | |
+{ | |
+ int Damage, i, j; | |
+ int AttackRating, DefendRating; | |
+ int BitchesKilled; | |
+ price_t Loot; | |
+ FightPoint fp; | |
+ Player *Defend; | |
+ | |
+ if (!Play->FightArray) | |
+ return; | |
+ if (!CanPlayerFire(Play)) | |
+ return; | |
+ | |
+ AllowNextShooter(Play); | |
+ if (FightTimeout) | |
+ SetFightTimeout(Play); | |
+ | |
+ Defend = GetFireTarget(Play); | |
+ if (Defend) { | |
+ Damage = 0; | |
+ BitchesKilled = 0; | |
+ Loot = 0; | |
+ if (TotalGunsCarried(Play) > 0) { | |
+ GetFightRatings(Play, Defend, &AttackRating, &DefendRating); | |
+ if (brandom(0, AttackRating) > brandom(0, DefendRating)) { | |
+ fp = F_HIT; | |
+ for (i = 0; i < NumGun; i++) | |
+ for (j = 0; j < Play->Guns[i].Carried; j++) { | |
+ Damage += brandom(0, Gun[i].Damage); | |
+ } | |
+ Damage = Damage * 100 / GetArmour(Defend); | |
+ if (Damage == 0) | |
+ Damage = 1; | |
+ HandleDamage(Defend, Play, Damage, &BitchesKilled, &Loot); | |
+ } else | |
+ fp = F_MISS; | |
+ } else | |
+ fp = F_STAND; | |
+ SendFightMessage(Play, Defend, BitchesKilled, fp, Loot, TRUE, NULL); | |
+ } | |
+ CheckForKilledPlayers(Play); | |
+ | |
+ /* Careful, as we might have killed Player "Play" */ | |
+ if (g_slist_find(FirstServer, (gpointer)Play)) | |
+ DoReturnFire(Play); | |
+ | |
+ if (g_slist_find(FirstServer, (gpointer)Play)) | |
+ CheckCopsIntervene(Play); | |
+} | |
+ | |
+gboolean CanPlayerFire(Player *Play) | |
+{ | |
+ return (FightTimeout == 0 || Play->FightTimeout == 0 || | |
+ Play->FightTimeout <= time(NULL)); | |
+} | |
+ | |
+gboolean CanRunHere(Player *Play) | |
+{ | |
+ return (Play->ResyncNum < E_ARRIVE && Play->ResyncNum != E_NONE); | |
+} | |
+ | |
+/* | |
+ * To avoid boring waits, return the player who is next in line to be | |
+ * able to shoot (i.e. with the smallest FightTimeout) so that this | |
+ * player can be allowed to shoot immediately. If a player is already | |
+ * eligible to shoot, or there is a tie for "first place" then do | |
+ * nothing (i.e. return NULL). | |
+ */ | |
+Player *GetNextShooter(Player *Play) | |
+{ | |
+ Player *MinPlay, *Defend; | |
+ time_t MinTimeout; | |
+ guint ArrayInd; | |
+ gboolean Tie = FALSE; | |
+ | |
+ if (!FightTimeout) | |
+ return NULL; | |
+ | |
+ MinPlay = NULL; | |
+ MinTimeout = 0; | |
+ for (ArrayInd = 0; ArrayInd < Play->FightArray->len; ArrayInd++) { | |
+ Defend = (Player *)g_ptr_array_index(Play->FightArray, ArrayInd); | |
+ if (Defend == Play) | |
+ continue; | |
+ if (Defend->FightTimeout == 0) | |
+ return NULL; | |
+ if (MinTimeout == 0 || Defend->FightTimeout <= MinTimeout) { | |
+ Tie = (Defend->FightTimeout == MinTimeout); | |
+ MinPlay = Defend; | |
+ MinTimeout = Defend->FightTimeout; | |
+ } | |
+ } | |
+ | |
+ return (Tie ? NULL : MinPlay); | |
} | |
-void ResolveTipoff(Player *Play) { | |
- GString *text; | |
+void ResolveTipoff(Player *Play) | |
+{ | |
+ GString *text; | |
- if (IsCop(Play) || !CanRunHere(Play)) return; | |
+ if (IsCop(Play) || !CanRunHere(Play)) | |
+ return; | |
- if (g_slist_find(FirstServer,(gpointer)Play->OnBehalfOf)) { | |
- dopelog(4,_("%s: tipoff by %s finished OK."),GetPlayerName(Play), | |
- GetPlayerName(Play->OnBehalfOf)); | |
- RemoveListPlayer(&(Play->TipList),Play->OnBehalfOf); | |
- text=g_string_new(""); | |
- if (Play->Health==0) { | |
- g_string_sprintf(text, | |
- _("Following your tipoff, the cops ambushed %s, who was shot dead!"… | |
- GetPlayerName(Play)); | |
- } else { | |
- dpg_string_sprintf(text, | |
- _("Following your tipoff, the cops ambushed %s, who escaped " | |
- "with %d %tde. "),GetPlayerName(Play), | |
- Play->Bitches.Carried,Names.Bitches); | |
- } | |
- GainBitch(Play->OnBehalfOf); | |
- SendPlayerData(Play->OnBehalfOf); | |
- SendPrintMessage(NULL,C_NONE,Play->OnBehalfOf,text->str); | |
- g_string_free(text,TRUE); | |
- } | |
- Play->OnBehalfOf=NULL; | |
-} | |
- | |
-void WithdrawFromCombat(Player *Play) { | |
-/* Cleans up combat after player "Play" has left */ | |
- guint AttackInd,DefendInd; | |
- gboolean FightDone; | |
- Player *Attack,*Defend; | |
- GSList *list; | |
- gchar *text; | |
- | |
- for (list=FirstServer;list;list=g_slist_next(list)) { | |
- Attack=(Player *)list->data; | |
- if (Attack->Attacking==Play) Attack->Attacking=NULL; | |
- } | |
- | |
- if (!Play->FightArray) return; | |
- | |
- ResolveTipoff(Play); | |
- FightDone=TRUE; | |
- for (AttackInd=0;AttackInd<Play->FightArray->len;AttackInd++) { | |
- Attack=(Player *)g_ptr_array_index(Play->FightArray,AttackInd); | |
- for (DefendInd=0;DefendInd<AttackInd;DefendInd++) { | |
- Defend=(Player *)g_ptr_array_index(Play->FightArray,DefendInd); | |
- if (Attack!=Play && Defend!=Play && | |
- IsOpponent(Attack,Defend)) { FightDone=FALSE; break; } | |
- } | |
- if (!FightDone) break; | |
- } | |
- | |
- SendFightLeave(Play,FightDone); | |
- g_ptr_array_remove(Play->FightArray,(gpointer)Play); | |
- | |
- if (FightDone) { | |
- for (DefendInd=0;DefendInd<Play->FightArray->len;DefendInd++) { | |
- Defend=(Player *)g_ptr_array_index(Play->FightArray,DefendInd); | |
- Defend->FightArray=NULL; | |
- ResolveTipoff(Defend); | |
- if (IsCop(Defend)) { | |
- FirstServer=RemovePlayer(Defend,FirstServer); | |
- } else if (Defend->Health==0) { | |
- FinishGame(Defend,_("You're dead! Game over.")); | |
- } else if (CanRunHere(Defend) && | |
- brandom(0,100)>Location[(int)Defend->IsAt].PolicePresence)… | |
- Defend->EventNum=E_DOCTOR; | |
- Defend->DocPrice=prandom(Bitch.MinPrice,Bitch.MaxPrice)* | |
- Defend->Health/500; | |
- text=dpg_strdup_printf( | |
- _("YN^Do you pay a doctor %P to sew you up?"), | |
- Defend->DocPrice); | |
- SendQuestion(NULL,C_ASKSEW,Defend,text); | |
- g_free(text); | |
- } else { | |
- Defend->EventNum=Defend->ResyncNum; SendEvent(Defend); | |
- } | |
- } | |
- g_ptr_array_free(Play->FightArray,TRUE); | |
- } | |
- Play->FightArray=NULL; | |
- Play->Attacking=NULL; | |
-} | |
- | |
-int RandomOffer(Player *To) { | |
-/* Inform player "To" of random offers or happenings. Returns 0 if */ | |
-/* the client can immediately be advanced to the next state, or 1 */ | |
-/* there are first questions to be answered. */ | |
- int r,amount,ind; | |
- GString *text; | |
- r=brandom(0,100); | |
- | |
- text=g_string_new(NULL); | |
- | |
- if (!Sanitized && (r < 10)) { | |
- g_string_assign(text,_("You were mugged in the subway!")); | |
- To->Cash=To->Cash*(price_t)brandom(80,95)/100l; | |
- } else if (r<30) { | |
- amount=brandom(3,7); | |
- ind=IsCarryingRandom(To,amount); | |
- if (ind==-1 && amount>To->CoatSize) { | |
- g_string_free(text,TRUE); return 0; | |
+ if (g_slist_find(FirstServer, (gpointer)Play->OnBehalfOf)) { | |
+ dopelog(4, _("%s: tipoff by %s finished OK."), GetPlayerName(Play), | |
+ GetPlayerName(Play->OnBehalfOf)); | |
+ RemoveListPlayer(&(Play->TipList), Play->OnBehalfOf); | |
+ text = g_string_new(""); | |
+ if (Play->Health == 0) { | |
+ g_string_sprintf(text, | |
+ _("Following your tipoff, the cops ambushed %s, " | |
+ "who was shot dead!"), GetPlayerName(Play)); | |
+ } else { | |
+ dpg_string_sprintf(text, | |
+ _("Following your tipoff, the cops ambushed %s, " | |
+ "who escaped with %d %tde. "), GetPlayerName(Play), | |
+ Play->Bitches.Carried, Names.Bitches); | |
+ } | |
+ GainBitch(Play->OnBehalfOf); | |
+ SendPlayerData(Play->OnBehalfOf); | |
+ SendPrintMessage(NULL, C_NONE, Play->OnBehalfOf, text->str); | |
+ g_string_free(text, TRUE); | |
+ } | |
+ Play->OnBehalfOf = NULL; | |
+} | |
+ | |
+/* | |
+ * Cleans up combat after player "Play" has left. | |
+ */ | |
+void WithdrawFromCombat(Player *Play) | |
+{ | |
+ guint AttackInd, DefendInd; | |
+ gboolean FightDone; | |
+ Player *Attack, *Defend; | |
+ GSList *list; | |
+ gchar *text; | |
+ | |
+ for (list = FirstServer; list; list = g_slist_next(list)) { | |
+ Attack = (Player *)list->data; | |
+ if (Attack->Attacking == Play) | |
+ Attack->Attacking = NULL; | |
+ } | |
+ | |
+ if (!Play->FightArray) | |
+ return; | |
+ | |
+ ResolveTipoff(Play); | |
+ FightDone = TRUE; | |
+ for (AttackInd = 0; AttackInd < Play->FightArray->len; AttackInd++) { | |
+ Attack = (Player *)g_ptr_array_index(Play->FightArray, AttackInd); | |
+ for (DefendInd = 0; DefendInd < AttackInd; DefendInd++) { | |
+ Defend = (Player *)g_ptr_array_index(Play->FightArray, DefendInd); | |
+ if (Attack != Play && Defend != Play && IsOpponent(Attack, Defend)) { | |
+ FightDone = FALSE; | |
+ break; | |
} | |
- if (ind==-1) { | |
- ind=brandom(0,NumDrug); | |
- dpg_string_sprintf(text,_("You meet a friend! He gives you %d %tde."), | |
- amount,Drug[ind].Name); | |
- To->Drugs[ind].Carried+=amount; | |
- To->CoatSize-=amount; | |
+ } | |
+ if (!FightDone) | |
+ break; | |
+ } | |
+ | |
+ SendFightLeave(Play, FightDone); | |
+ g_ptr_array_remove(Play->FightArray, (gpointer)Play); | |
+ | |
+ if (FightDone) { | |
+ for (DefendInd = 0; DefendInd < Play->FightArray->len; DefendInd++) { | |
+ Defend = (Player *)g_ptr_array_index(Play->FightArray, DefendInd); | |
+ Defend->FightArray = NULL; | |
+ ResolveTipoff(Defend); | |
+ if (IsCop(Defend)) { | |
+ FirstServer = RemovePlayer(Defend, FirstServer); | |
+ } else if (Defend->Health == 0) { | |
+ FinishGame(Defend, _("You're dead! Game over.")); | |
+ } else if (CanRunHere(Defend) && | |
+ brandom(0, | |
+ 100) > | |
+ Location[(int)Defend->IsAt].PolicePresence) { | |
+ Defend->EventNum = E_DOCTOR; | |
+ Defend->DocPrice = prandom(Bitch.MinPrice, Bitch.MaxPrice) * | |
+ Defend->Health / 500; | |
+ text = | |
+ dpg_strdup_printf(_ | |
+ ("YN^Do you pay a doctor %P to sew you up?"), | |
+ Defend->DocPrice); | |
+ SendQuestion(NULL, C_ASKSEW, Defend, text); | |
+ g_free(text); | |
} else { | |
- dpg_string_sprintf(text,_("You meet a friend! You give him %d %tde."), | |
- amount,Drug[ind].Name); | |
- To->Drugs[ind].TotalValue = To->Drugs[ind].TotalValue* | |
- (To->Drugs[ind].Carried-amount)/To->Drugs[ind].Carried; | |
- To->Drugs[ind].Carried-=amount; | |
- To->CoatSize+=amount; | |
+ Defend->EventNum = Defend->ResyncNum; | |
+ SendEvent(Defend); | |
} | |
+ } | |
+ g_ptr_array_free(Play->FightArray, TRUE); | |
+ } | |
+ Play->FightArray = NULL; | |
+ Play->Attacking = NULL; | |
+} | |
+ | |
+/* | |
+ * Inform player "To" of random offers or happenings. Returns 0 if | |
+ * the client can immediately be advanced to the next state, or 1 | |
+ * there are first questions to be answered. | |
+ */ | |
+int RandomOffer(Player *To) | |
+{ | |
+ int r, amount, ind; | |
+ GString *text; | |
+ | |
+ r = brandom(0, 100); | |
+ | |
+ text = g_string_new(NULL); | |
+ | |
+ if (!Sanitized && (r < 10)) { | |
+ g_string_assign(text, _("You were mugged in the subway!")); | |
+ To->Cash = To->Cash * (price_t)brandom(80, 95) / 100l; | |
+ } else if (r < 30) { | |
+ amount = brandom(3, 7); | |
+ ind = IsCarryingRandom(To, amount); | |
+ if (ind == -1 && amount > To->CoatSize) { | |
+ g_string_free(text, TRUE); | |
+ return 0; | |
+ } | |
+ if (ind == -1) { | |
+ ind = brandom(0, NumDrug); | |
+ dpg_string_sprintf(text, | |
+ _("You meet a friend! He gives you %d %tde."), | |
+ amount, Drug[ind].Name); | |
+ To->Drugs[ind].Carried += amount; | |
+ To->CoatSize -= amount; | |
+ } else { | |
+ dpg_string_sprintf(text, | |
+ _("You meet a friend! You give him %d %tde."), | |
+ amount, Drug[ind].Name); | |
+ To->Drugs[ind].TotalValue = | |
+ To->Drugs[ind].TotalValue * (To->Drugs[ind].Carried - | |
+ amount) / To->Drugs[ind].Carried; | |
+ To->Drugs[ind].Carried -= amount; | |
+ To->CoatSize += amount; | |
+ } | |
+ SendPlayerData(To); | |
+ SendPrintMessage(NULL, C_NONE, To, text->str); | |
+ } else if (Sanitized) { | |
+ dopelog(3, _("Sanitized away a RandomOffer")); | |
+ } else if (r < 50) { | |
+ amount = brandom(3, 7); | |
+ ind = IsCarryingRandom(To, amount); | |
+ if (ind != -1) { | |
+ dpg_string_sprintf(text, _("Police dogs chase you for %d blocks! " | |
+ "You dropped some %tde! That's a drag, man!"), | |
+ brandom(3, 7), Names.Drugs); | |
+ To->Drugs[ind].TotalValue = To->Drugs[ind].TotalValue * | |
+ (To->Drugs[ind].Carried - amount) / To->Drugs[ind].Carried; | |
+ To->Drugs[ind].Carried -= amount; | |
+ To->CoatSize += amount; | |
SendPlayerData(To); | |
- SendPrintMessage(NULL,C_NONE,To,text->str); | |
- } else if (Sanitized) { | |
- dopelog(3,_("Sanitized away a RandomOffer")); | |
- } else if (r<50) { | |
- amount=brandom(3,7); | |
- ind=IsCarryingRandom(To,amount); | |
- if (ind!=-1) { | |
- dpg_string_sprintf(text,_("Police dogs chase you for %d blocks! " | |
- "You dropped some %tde! That's a drag, man!"), | |
- brandom(3,7),Names.Drugs); | |
- To->Drugs[ind].TotalValue = To->Drugs[ind].TotalValue* | |
- (To->Drugs[ind].Carried-amount)/To->Drugs[ind].Carried; | |
- To->Drugs[ind].Carried-=amount; | |
- To->CoatSize+=amount; | |
- SendPlayerData(To); | |
- SendPrintMessage(NULL,C_NONE,To,text->str); | |
- } else { | |
- ind=brandom(0,NumDrug); | |
- amount=brandom(3,7); | |
- if (amount>To->CoatSize) { | |
- g_string_free(text,TRUE); return 0; | |
- } | |
- dpg_string_sprintf(text, | |
- _("You find %d %tde on a dead dude in the subway!"… | |
- amount,Drug[ind].Name); | |
- To->Drugs[ind].Carried+=amount; | |
- To->CoatSize-=amount; | |
- SendPlayerData(To); | |
- SendPrintMessage(NULL,C_NONE,To,text->str); | |
+ SendPrintMessage(NULL, C_NONE, To, text->str); | |
+ } else { | |
+ ind = brandom(0, NumDrug); | |
+ amount = brandom(3, 7); | |
+ if (amount > To->CoatSize) { | |
+ g_string_free(text, TRUE); | |
+ return 0; | |
} | |
- } else if (r<60 && To->Drugs[WEED].Carried+To->Drugs[HASHISH].Carried>0) { | |
- ind = (To->Drugs[WEED].Carried>To->Drugs[HASHISH].Carried) ? | |
- WEED : HASHISH; | |
- amount=brandom(2,6); | |
- if (amount>To->Drugs[ind].Carried) amount=To->Drugs[ind].Carried; | |
dpg_string_sprintf(text, | |
- _("Your mama made brownies with some of your %tde! " | |
- "They were great!"),Drug[ind].Name); | |
- To->Drugs[ind].TotalValue = To->Drugs[ind].TotalValue* | |
- (To->Drugs[ind].Carried-amount)/To->Drugs[ind].Carried; | |
- To->Drugs[ind].Carried-=amount; | |
- To->CoatSize+=amount; | |
- SendPlayerData(To); | |
- SendPrintMessage(NULL,C_NONE,To,text->str); | |
- } else if (r<65) { | |
- g_string_assign(text, | |
- _("YN^There is some weed that smells like paraquat here!" | |
- "^It looks good! Will you smoke it? ")); | |
- To->EventNum=E_WEED; | |
- SendQuestion(NULL,C_NONE,To,text->str); | |
- g_string_free(text,TRUE); | |
- return 1; | |
- } else { | |
- g_string_sprintf(text,_("You stopped to %s."), | |
- StoppedTo[brandom(0,NumStoppedTo)]); | |
- amount=brandom(1,10); | |
- if (To->Cash>=amount) To->Cash-=amount; | |
+ _("You find %d %tde on a dead dude in the subway!"), | |
+ amount, Drug[ind].Name); | |
+ To->Drugs[ind].Carried += amount; | |
+ To->CoatSize -= amount; | |
SendPlayerData(To); | |
- SendPrintMessage(NULL,C_NONE,To,text->str); | |
- } | |
- g_string_free(text,TRUE); | |
- return 0; | |
-} | |
- | |
-int OfferObject(Player *To,gboolean ForceBitch) { | |
-/* Offers player "To" bitches/trenchcoats or guns. If ForceBitch is */ | |
-/* TRUE, then a bitch is definitely offered. Returns 0 if the client */ | |
-/* can advance immediately to the next state, 1 otherwise. */ | |
- int ObjNum; | |
- gchar *text=NULL; | |
- | |
- if (brandom(0,100)<50 || ForceBitch) { | |
- if (WantAntique) { | |
- To->Bitches.Price=prandom(MINTRENCHPRICE,MAXTRENCHPRICE); | |
- text=dpg_strdup_printf(_("YN^Would you like to buy a bigger " | |
- "trenchcoat for %P?"),To->Bitches.Price); | |
+ SendPrintMessage(NULL, C_NONE, To, text->str); | |
+ } | |
+ } else if (r < 60 | |
+ && To->Drugs[WEED].Carried + To->Drugs[HASHISH].Carried > 0) { | |
+ ind = (To->Drugs[WEED].Carried > | |
+ To->Drugs[HASHISH].Carried) ? WEED : HASHISH; | |
+ amount = brandom(2, 6); | |
+ if (amount > To->Drugs[ind].Carried) | |
+ amount = To->Drugs[ind].Carried; | |
+ dpg_string_sprintf(text, | |
+ _("Your mama made brownies with some of your %tde! " | |
+ "They were great!"), Drug[ind].Name); | |
+ To->Drugs[ind].TotalValue = To->Drugs[ind].TotalValue * | |
+ (To->Drugs[ind].Carried - amount) / To->Drugs[ind].Carried; | |
+ To->Drugs[ind].Carried -= amount; | |
+ To->CoatSize += amount; | |
+ SendPlayerData(To); | |
+ SendPrintMessage(NULL, C_NONE, To, text->str); | |
+ } else if (r < 65) { | |
+ g_string_assign(text, | |
+ _("YN^There is some weed that smells like paraquat " | |
+ "here!^It looks good! Will you smoke it? ")); | |
+ To->EventNum = E_WEED; | |
+ SendQuestion(NULL, C_NONE, To, text->str); | |
+ g_string_free(text, TRUE); | |
+ return 1; | |
+ } else { | |
+ g_string_sprintf(text, _("You stopped to %s."), | |
+ StoppedTo[brandom(0, NumStoppedTo)]); | |
+ amount = brandom(1, 10); | |
+ if (To->Cash >= amount) | |
+ To->Cash -= amount; | |
+ SendPlayerData(To); | |
+ SendPrintMessage(NULL, C_NONE, To, text->str); | |
+ } | |
+ g_string_free(text, TRUE); | |
+ return 0; | |
+} | |
+ | |
+/* | |
+ * Offers player "To" bitches/trenchcoats or guns. If ForceBitch is | |
+ * TRUE, then a bitch is definitely offered. Returns 0 if the client | |
+ * can advance immediately to the next state, 1 otherwise. | |
+ */ | |
+int OfferObject(Player *To, gboolean ForceBitch) | |
+{ | |
+ int ObjNum; | |
+ gchar *text = NULL; | |
+ | |
+ if (brandom(0, 100) < 50 || ForceBitch) { | |
+ if (WantAntique) { | |
+ To->Bitches.Price = prandom(MINTRENCHPRICE, MAXTRENCHPRICE); | |
+ text = dpg_strdup_printf(_("YN^Would you like to buy a bigger " | |
+ "trenchcoat for %P?"), To->Bitches.Price); | |
+ } else { | |
+ To->Bitches.Price = | |
+ prandom(Bitch.MinPrice, Bitch.MaxPrice) / (price_t)10; | |
+ text = | |
+ dpg_strdup_printf(_ | |
+ ("YN^Hey dude! I'll help carry your %tde for a " | |
+ "mere %P. Yes or no?"), Names.Drugs, | |
+ To->Bitches.Price); | |
+ } | |
+ SendQuestion(NULL, C_ASKBITCH, To, text); | |
+ g_free(text); | |
+ return 1; | |
+ } else if (!Sanitized | |
+ && (TotalGunsCarried(To) < To->Bitches.Carried + 2)) { | |
+ ObjNum = brandom(0, NumGun); | |
+ To->Guns[ObjNum].Price = Gun[ObjNum].Price / 10; | |
+ if (Gun[ObjNum].Space > To->CoatSize) | |
+ return 0; | |
+ text = dpg_strdup_printf(_("YN^Would you like to buy a %tde for %P?"), | |
+ Gun[ObjNum].Name, To->Guns[ObjNum].Price); | |
+ SendQuestion(NULL, C_ASKGUN, To, text); | |
+ g_free(text); | |
+ return 1; | |
+ } | |
+ return 0; | |
+} | |
+ | |
+/* | |
+ * Sends details of drug prices to player "To". If "DisplayBusts" | |
+ * is TRUE, also regenerates drug prices and sends details of | |
+ * special events such as drug busts. | |
+ */ | |
+void SendDrugsHere(Player *To, gboolean DisplayBusts) | |
+{ | |
+ int i; | |
+ gchar *Deal, *prstr; | |
+ GString *text; | |
+ gboolean First; | |
+ | |
+ Deal = g_malloc0(NumDrug); | |
+ if (DisplayBusts) | |
+ GenerateDrugsHere(To, Deal); | |
+ | |
+ text = g_string_new(NULL); | |
+ First = TRUE; | |
+ if (DisplayBusts) | |
+ for (i = 0; i < NumDrug; i++) | |
+ if (Deal[i]) { | |
+ if (!First) | |
+ g_string_append_c(text, '^'); | |
+ if (Drug[i].Expensive) { | |
+ dpg_string_sprintfa(text, Deal[i] == 1 ? Drugs.ExpensiveStr1 : | |
+ Drugs.ExpensiveStr2, Drug[i].Name); | |
+ } else if (Drug[i].Cheap) { | |
+ g_string_append(text, Drug[i].CheapStr); | |
+ } | |
+ First = FALSE; | |
+ } | |
+ if (!First) | |
+ SendPrintMessage(NULL, C_NONE, To, text->str); | |
+ g_string_truncate(text, 0); | |
+ for (i = 0; i < NumDrug; i++) { | |
+ g_string_sprintfa(text, "%s^", | |
+ (prstr = pricetostr(To->Drugs[i].Price))); | |
+ g_free(prstr); | |
+ } | |
+ SendServerMessage(NULL, C_NONE, C_DRUGHERE, To, text->str); | |
+ g_string_free(text, TRUE); | |
+} | |
+ | |
+/* | |
+ * Generates drug prices and drug busts etc. for player "To" | |
+ * "Deal" is an array of chars of size NumDrug. | |
+ */ | |
+void GenerateDrugsHere(Player *To, gchar *Deal) | |
+{ | |
+ int NumEvents, NumDrugs, NumRandom, i; | |
+ | |
+ for (i = 0; i < NumDrug; i++) { | |
+ To->Drugs[i].Price = 0; | |
+ Deal[i] = 0; | |
+ } | |
+ NumEvents = 0; | |
+ if (brandom(0, 100) < 70) | |
+ NumEvents = 1; | |
+ if (brandom(0, 100) < 40 && NumEvents == 1) | |
+ NumEvents = 2; | |
+ if (brandom(0, 100) < 5 && NumEvents == 2) | |
+ NumEvents = 3; | |
+ NumDrugs = 0; | |
+ while (NumEvents > 0) { | |
+ i = brandom(0, NumDrug); | |
+ if (Deal[i] != 0) | |
+ continue; | |
+ if (Drug[i].Expensive && (!Drug[i].Cheap || brandom(0, 100) < 50)) { | |
+ Deal[i] = brandom(1, 3); | |
+ To->Drugs[i].Price = prandom(Drug[i].MinPrice, Drug[i].MaxPrice) | |
+ * Drugs.ExpensiveMultiply; | |
+ NumDrugs++; | |
+ NumEvents--; | |
+ } else if (Drug[i].Cheap) { | |
+ Deal[i] = 1; | |
+ To->Drugs[i].Price = prandom(Drug[i].MinPrice, Drug[i].MaxPrice) | |
+ / Drugs.CheapDivide; | |
+ NumDrugs++; | |
+ NumEvents--; | |
+ } | |
+ } | |
+ NumRandom = brandom(Location[(int)To->IsAt].MinDrug, | |
+ Location[(int)To->IsAt].MaxDrug); | |
+ if (NumRandom > NumDrug) | |
+ NumRandom = NumDrug; | |
+ | |
+ NumDrugs = NumRandom - NumDrugs; | |
+ while (NumDrugs > 0) { | |
+ i = brandom(0, NumDrug); | |
+ if (To->Drugs[i].Price == 0) { | |
+ To->Drugs[i].Price = prandom(Drug[i].MinPrice, Drug[i].MaxPrice); | |
+ NumDrugs--; | |
+ } | |
+ } | |
+} | |
+ | |
+/* | |
+ * Handles the incoming message in "answer" from player "From" and | |
+ * intended for player "To". | |
+ */ | |
+void HandleAnswer(Player *From, Player *To, char *answer) | |
+{ | |
+ int i; | |
+ gchar *text; | |
+ Player *Defender; | |
+ | |
+ if (!From || From->EventNum == E_NONE) | |
+ return; | |
+ if (answer[0] == 'Y' && From->EventNum == E_OFFOBJECT | |
+ && From->Bitches.Price && From->Bitches.Price > From->Cash) | |
+ answer[0] = 'N'; | |
+ if ((From->EventNum == E_FIGHT || From->EventNum == E_FIGHTASK) && | |
+ CanRunHere(From)) { | |
+ From->EventNum = E_FIGHT; | |
+ if (answer[0] == 'R' || answer[0] == 'Y') | |
+ RunFromCombat(From, -1); | |
+ else | |
+ Fire(From); | |
+ } else if (answer[0] == 'Y') | |
+ switch (From->EventNum) { | |
+ case E_OFFOBJECT: | |
+ if (g_slist_find(FirstServer, (gpointer)From->OnBehalfOf)) { | |
+ dopelog(3, _("%s: offer was on behalf of %s"), GetPlayerName(From), | |
+ GetPlayerName(From->OnBehalfOf)); | |
+ if (From->Bitches.Price) { | |
+ text = dpg_strdup_printf(_("%s has accepted your %tde!" | |
+ "^Use the G key to contact your spy."), | |
+ GetPlayerName(From), Names.Bitch); | |
+ From->OnBehalfOf->Flags |= SPYINGON; | |
+ SendPlayerData(From->OnBehalfOf); | |
+ SendPrintMessage(NULL, C_NONE, From->OnBehalfOf, text); | |
+ g_free(text); | |
+ i = GetListEntry(&(From->SpyList), From->OnBehalfOf); | |
+ if (i >= 0) | |
+ From->SpyList.Data[i].Turns = 0; | |
+ } | |
+ } | |
+ if (From->Bitches.Price) { | |
+ text = g_strdup_printf("bitch^0^1"); | |
+ BuyObject(From, text); | |
+ g_free(text); | |
} else { | |
- To->Bitches.Price=prandom(Bitch.MinPrice,Bitch.MaxPrice)/(price_t)10; | |
- text=dpg_strdup_printf( | |
- _("YN^Hey dude! I'll help carry your %tde for a " | |
- "mere %P. Yes or no?"),Names.Drugs,To->Bitches.Price); | |
+ for (i = 0; i < NumGun; i++) | |
+ if (From->Guns[i].Price) { | |
+ text = g_strdup_printf("gun^%d^1", i); | |
+ BuyObject(From, text); | |
+ g_free(text); | |
+ break; | |
+ } | |
} | |
- SendQuestion(NULL,C_ASKBITCH,To,text); | |
- g_free(text); | |
- return 1; | |
- } else if (!Sanitized && (TotalGunsCarried(To) < To->Bitches.Carried+2)) { | |
- ObjNum=brandom(0,NumGun); | |
- To->Guns[ObjNum].Price=Gun[ObjNum].Price/10; | |
- if (Gun[ObjNum].Space>To->CoatSize) return 0; | |
- text=dpg_strdup_printf(_("YN^Would you like to buy a %tde for %P?"), | |
- Gun[ObjNum].Name,To->Guns[ObjNum].Price); | |
- SendQuestion(NULL,C_ASKGUN,To,text); | |
+ From->OnBehalfOf = NULL; | |
+ From->EventNum++; | |
+ SendEvent(From); | |
+ break; | |
+ case E_LOANSHARK: | |
+ SendServerMessage(NULL, C_NONE, C_LOANSHARK, From, NULL); | |
+ break; | |
+ case E_BANK: | |
+ SendServerMessage(NULL, C_NONE, C_BANK, From, NULL); | |
+ break; | |
+ case E_GUNSHOP: | |
+ for (i = 0; i < NumGun; i++) | |
+ From->Guns[i].Price = Gun[i].Price; | |
+ SendServerMessage(NULL, C_NONE, C_GUNSHOP, From, NULL); | |
+ break; | |
+ case E_HIREBITCH: | |
+ text = g_strdup_printf("bitch^0^1"); | |
+ BuyObject(From, text); | |
g_free(text); | |
- return 1; | |
- } | |
- return 0; | |
-} | |
- | |
-void SendDrugsHere(Player *To,gboolean DisplayBusts) { | |
-/* Sends details of drug prices to player "To". If "DisplayBusts" */ | |
-/* is TRUE, also regenerates drug prices and sends details of */ | |
-/* special events such as drug busts */ | |
- int i; | |
- gchar *Deal,*prstr; | |
- GString *text; | |
- gboolean First; | |
- | |
- Deal=g_malloc0(NumDrug); | |
- if (DisplayBusts) GenerateDrugsHere(To,Deal); | |
- | |
- text=g_string_new(NULL); | |
- First=TRUE; | |
- if (DisplayBusts) for (i=0;i<NumDrug;i++) if (Deal[i]) { | |
- if (!First) g_string_append_c(text,'^'); | |
- if (Drug[i].Expensive) { | |
- dpg_string_sprintfa(text,Deal[i]==1 ? Drugs.ExpensiveStr1 : | |
- Drugs.ExpensiveStr2,Drug[i].Name); | |
- } else if (Drug[i].Cheap) { | |
- g_string_append(text,Drug[i].CheapStr); | |
- } | |
- First=FALSE; | |
- } | |
- if (!First) SendPrintMessage(NULL,C_NONE,To,text->str); | |
- g_string_truncate(text,0); | |
- for (i=0;i<NumDrug;i++) { | |
- g_string_sprintfa(text,"%s^",(prstr=pricetostr(To->Drugs[i].Price))); | |
- g_free(prstr); | |
- } | |
- SendServerMessage(NULL,C_NONE,C_DRUGHERE,To,text->str); | |
- g_string_free(text,TRUE); | |
-} | |
- | |
-void GenerateDrugsHere(Player *To,gchar *Deal) { | |
-/* Generates drug prices and drug busts etc. for player "To" */ | |
-/* "Deal" is an array of chars of size NumDrug */ | |
- int NumEvents,NumDrugs,NumRandom,i; | |
- for (i=0;i<NumDrug;i++) { | |
- To->Drugs[i].Price=0; | |
- Deal[i]=0; | |
- } | |
- NumEvents=0; | |
- if (brandom(0,100)<70) NumEvents=1; | |
- if (brandom(0,100)<40 && NumEvents==1) NumEvents=2; | |
- if (brandom(0,100)<5 && NumEvents==2) NumEvents=3; | |
- NumDrugs=0; | |
- while (NumEvents>0) { | |
- i=brandom(0,NumDrug); | |
- if (Deal[i]!=0) continue; | |
- if (Drug[i].Expensive && (!Drug[i].Cheap || brandom(0,100)<50)) { | |
- Deal[i]=brandom(1,3); | |
- To->Drugs[i].Price=prandom(Drug[i].MinPrice,Drug[i].MaxPrice) | |
- *Drugs.ExpensiveMultiply; | |
- NumDrugs++; | |
- NumEvents--; | |
- } else if (Drug[i].Cheap) { | |
- Deal[i]=1; | |
- To->Drugs[i].Price=prandom(Drug[i].MinPrice,Drug[i].MaxPrice) | |
- /Drugs.CheapDivide; | |
- NumDrugs++; | |
- NumEvents--; | |
- } | |
- } | |
- NumRandom=brandom(Location[(int)To->IsAt].MinDrug, | |
- Location[(int)To->IsAt].MaxDrug); | |
- if (NumRandom > NumDrug) NumRandom=NumDrug; | |
- | |
- NumDrugs=NumRandom-NumDrugs; | |
- while (NumDrugs>0) { | |
- i=brandom(0,NumDrug); | |
- if (To->Drugs[i].Price==0) { | |
- To->Drugs[i].Price=prandom(Drug[i].MinPrice,Drug[i].MaxPrice); | |
- NumDrugs--; | |
+ From->EventNum++; | |
+ SendEvent(From); | |
+ break; | |
+ case E_ROUGHPUB: | |
+ From->EventNum++; | |
+ SendEvent(From); | |
+ break; | |
+ case E_WEED: | |
+ FinishGame(From, _("You hallucinated for three days on the wildest " | |
+ "trip you ever imagined!^Then you died because " | |
+ "your brain disintegrated!")); | |
+ break; | |
+ case E_DOCTOR: | |
+ if (From->Cash >= From->DocPrice) { | |
+ From->Cash -= From->DocPrice; | |
+ From->Health = 100; | |
+ SendPlayerData(From); | |
} | |
- } | |
-} | |
- | |
-void HandleAnswer(Player *From,Player *To,char *answer) { | |
-/* Handles the incoming message in "answer" from player "From" and */ | |
-/* intended for player "To". */ | |
- int i; | |
- gchar *text; | |
- Player *Defender; | |
- if (!From || From->EventNum==E_NONE) return; | |
- if (answer[0]=='Y' && From->EventNum==E_OFFOBJECT && From->Bitches.Price | |
- && From->Bitches.Price>From->Cash) answer[0]='N'; | |
- if ((From->EventNum==E_FIGHT || From->EventNum==E_FIGHTASK) && | |
- CanRunHere(From)) { | |
- From->EventNum=E_FIGHT; | |
- if (answer[0]=='R' || answer[0]=='Y') RunFromCombat(From,-1); | |
- else Fire(From); | |
- } else if (answer[0]=='Y') switch (From->EventNum) { | |
- case E_OFFOBJECT: | |
- if (g_slist_find(FirstServer,(gpointer)From->OnBehalfOf)) { | |
- dopelog(3,_("%s: offer was on behalf of %s"),GetPlayerName(From), | |
- GetPlayerName(From->OnBehalfOf)); | |
- if (From->Bitches.Price) { | |
- text=dpg_strdup_printf(_("%s has accepted your %tde!" | |
- "^Use the G key to contact your spy."), | |
- GetPlayerName(From),Names.Bitch); | |
- From->OnBehalfOf->Flags |= SPYINGON; | |
- SendPlayerData(From->OnBehalfOf); | |
- SendPrintMessage(NULL,C_NONE,From->OnBehalfOf,text); | |
- g_free(text); | |
- i=GetListEntry(&(From->SpyList),From->OnBehalfOf); | |
- if (i>=0) From->SpyList.Data[i].Turns=0; | |
- } | |
- } | |
- if (From->Bitches.Price) { | |
- text=g_strdup_printf("bitch^0^1"); | |
- BuyObject(From,text); | |
- g_free(text); | |
- } else { | |
- for (i=0;i<NumGun;i++) if (From->Guns[i].Price) { | |
- text=g_strdup_printf("gun^%d^1",i); | |
- BuyObject(From,text); | |
- g_free(text); | |
- break; | |
- } | |
- } | |
- From->OnBehalfOf=NULL; | |
- From->EventNum++; SendEvent(From); | |
- break; | |
- case E_LOANSHARK: | |
- SendServerMessage(NULL,C_NONE,C_LOANSHARK,From,NULL); | |
- break; | |
- case E_BANK: | |
- SendServerMessage(NULL,C_NONE,C_BANK,From,NULL); | |
- break; | |
- case E_GUNSHOP: | |
- for (i=0;i<NumGun;i++) From->Guns[i].Price=Gun[i].Price; | |
- SendServerMessage(NULL,C_NONE,C_GUNSHOP,From,NULL); | |
- break; | |
- case E_HIREBITCH: | |
- text=g_strdup_printf("bitch^0^1"); | |
- BuyObject(From,text); | |
- g_free(text); | |
- From->EventNum++; SendEvent(From); | |
- break; | |
- case E_ROUGHPUB: | |
- From->EventNum++; SendEvent(From); | |
- break; | |
- case E_WEED: | |
- FinishGame(From,_("You hallucinated for three days on the wildest " | |
-"trip you ever imagined!^Then you died because your brain disintegrated!")); | |
- break; | |
- case E_DOCTOR: | |
- if (From->Cash >= From->DocPrice) { | |
- From->Cash -= From->DocPrice; | |
- From->Health=100; | |
- SendPlayerData(From); | |
- } | |
- From->EventNum=From->ResyncNum; SendEvent(From); | |
- break; | |
- default: | |
- break; | |
- } else if (From->EventNum==E_ARRIVE) { | |
- if ((answer[0]=='A' || answer[0]=='T') && | |
- IsConnectedPlayer(From->OnBehalfOf) && | |
- g_slist_find(FirstServer,(gpointer)From->OnBehalfOf)) { | |
- Defender=From->OnBehalfOf; | |
- From->OnBehalfOf=NULL; /* So we don't think it was a tipoff */ | |
- if (Defender->IsAt==From->IsAt) { | |
- if (answer[0]=='A') { | |
- From->EventNum=Defender->EventNum=E_NONE; | |
- AttackPlayer(From,Defender); | |
-/* } else if (answer[0]=='T') { | |
- From->Flags |= TRADING; | |
- SendPlayerData(From); | |
- SendServerMessage(NULL,C_NONE,C_TRADE,From,NULL);*/ | |
- } | |
- } else { | |
- text=g_strdup_printf(_("Too late - %s has just left!"), | |
- GetPlayerName(Defender)); | |
- SendPrintMessage(NULL,C_NONE,From,text); | |
- g_free(text); | |
- From->EventNum++; SendEvent(From); | |
- } | |
+ From->EventNum = From->ResyncNum; | |
+ SendEvent(From); | |
+ break; | |
+ default: | |
+ break; | |
+ } else if (From->EventNum == E_ARRIVE) { | |
+ if ((answer[0] == 'A' || answer[0] == 'T') && | |
+ IsConnectedPlayer(From->OnBehalfOf) && | |
+ g_slist_find(FirstServer, (gpointer)From->OnBehalfOf)) { | |
+ Defender = From->OnBehalfOf; | |
+ From->OnBehalfOf = NULL; /* So we don't think it was a tipoff */ | |
+ if (Defender->IsAt == From->IsAt) { | |
+ if (answer[0] == 'A') { | |
+ From->EventNum = Defender->EventNum = E_NONE; | |
+ AttackPlayer(From, Defender); | |
+ } | |
} else { | |
- From->EventNum++; SendEvent(From); | |
+ text = g_strdup_printf(_("Too late - %s has just left!"), | |
+ GetPlayerName(Defender)); | |
+ SendPrintMessage(NULL, C_NONE, From, text); | |
+ g_free(text); | |
+ From->EventNum++; | |
+ SendEvent(From); | |
} | |
- From->OnBehalfOf=NULL; | |
- } else switch(From->EventNum) { | |
- case E_ROUGHPUB: | |
- From->EventNum++; | |
- From->EventNum++; SendEvent(From); | |
- break; | |
- case E_DOCTOR: | |
- From->EventNum=From->ResyncNum; SendEvent(From); | |
- break; | |
- case E_HIREBITCH: case E_GUNSHOP: case E_BANK: case E_LOANSHARK: | |
- case E_OFFOBJECT: case E_WEED: | |
- if (g_slist_find(FirstServer,(gpointer)From->OnBehalfOf)) { | |
- dopelog(3,_("%s: offer was on behalf of %s"),GetPlayerName(From), | |
- GetPlayerName(From->OnBehalfOf)); | |
- if (From->Bitches.Price && From->EventNum==E_OFFOBJECT) { | |
- text=dpg_strdup_printf(_("%s has rejected your %tde!"), | |
- GetPlayerName(From),Names.Bitch); | |
- GainBitch(From->OnBehalfOf); | |
- SendPlayerData(From->OnBehalfOf); | |
- SendPrintMessage(NULL,C_NONE,From->OnBehalfOf,text); | |
- g_free(text); | |
- RemoveListPlayer(&(From->SpyList),From->OnBehalfOf); | |
- } | |
- } | |
- From->EventNum++; SendEvent(From); | |
- break; | |
- default: | |
- break; | |
- } | |
-} | |
- | |
-void BuyObject(Player *From,char *data) { | |
-/* Processes a request stored in "data" from player "From" to buy an */ | |
-/* object (bitch, gun, or drug) */ | |
-/* Objects can be sold if the amount given in "data" is negative, and */ | |
-/* given away if their current price is zero. */ | |
- char *cp,*type; | |
- int index,i,amount; | |
- cp=data; | |
- type=GetNextWord(&cp,""); | |
- index=GetNextInt(&cp,0); | |
- amount=GetNextInt(&cp,0); | |
- if (strcmp(type,"drug")==0) { | |
- if (index>=0 && index<NumDrug && From->Drugs[index].Carried+amount >= 0 | |
- && From->CoatSize-amount >= 0 && (From->Drugs[index].Price!=0 || | |
- amount<0) && From->Cash >= amount*From->Drugs[index].Price) { | |
- if (amount>0) { | |
- From->Drugs[index].TotalValue+=amount*From->Drugs[index].Price; | |
- } else if (From->Drugs[index].Carried!=0) { | |
- From->Drugs[index].TotalValue = From->Drugs[index].TotalValue* | |
- (From->Drugs[index].Carried+amount)/From->Drugs[index].Carrie… | |
- } | |
- From->Drugs[index].Carried+=amount; | |
- From->CoatSize-=amount; | |
- From->Cash-=amount*From->Drugs[index].Price; | |
- SendPlayerData(From); | |
- | |
- if (!Sanitized && (From->Drugs[index].Price==0 && | |
- brandom(0,100)<Location[(int)From->IsAt].PolicePresence)) { | |
- SendPrintMessage(NULL,C_NONE,From, | |
- _("The cops spot you dropping drugs!")); | |
- CopsAttackPlayer(From); | |
- } | |
+ } else { | |
+ From->EventNum++; | |
+ SendEvent(From); | |
+ } | |
+ From->OnBehalfOf = NULL; | |
+ } else | |
+ switch (From->EventNum) { | |
+ case E_ROUGHPUB: | |
+ From->EventNum++; | |
+ From->EventNum++; | |
+ SendEvent(From); | |
+ break; | |
+ case E_DOCTOR: | |
+ From->EventNum = From->ResyncNum; | |
+ SendEvent(From); | |
+ break; | |
+ case E_HIREBITCH: | |
+ case E_GUNSHOP: | |
+ case E_BANK: | |
+ case E_LOANSHARK: | |
+ case E_OFFOBJECT: | |
+ case E_WEED: | |
+ if (g_slist_find(FirstServer, (gpointer)From->OnBehalfOf)) { | |
+ dopelog(3, _("%s: offer was on behalf of %s"), GetPlayerName(From), | |
+ GetPlayerName(From->OnBehalfOf)); | |
+ if (From->Bitches.Price && From->EventNum == E_OFFOBJECT) { | |
+ text = dpg_strdup_printf(_("%s has rejected your %tde!"), | |
+ GetPlayerName(From), Names.Bitch); | |
+ GainBitch(From->OnBehalfOf); | |
+ SendPlayerData(From->OnBehalfOf); | |
+ SendPrintMessage(NULL, C_NONE, From->OnBehalfOf, text); | |
+ g_free(text); | |
+ RemoveListPlayer(&(From->SpyList), From->OnBehalfOf); | |
+ } | |
} | |
- } else if (strcmp(type,"gun")==0) { | |
- if (index>=0 && index<NumGun && TotalGunsCarried(From)+amount >= 0 | |
- && TotalGunsCarried(From)+amount <= From->Bitches.Carried+2 | |
- && From->Guns[index].Price!=0 | |
- && From->CoatSize-amount*Gun[index].Space >= 0 | |
- && From->Cash >= amount*From->Guns[index].Price) { | |
- From->Guns[index].Carried+=amount; | |
- From->CoatSize-=amount*Gun[index].Space; | |
- From->Cash-=amount*From->Guns[index].Price; | |
- SendPlayerData(From); | |
+ From->EventNum++; | |
+ SendEvent(From); | |
+ break; | |
+ default: | |
+ break; | |
+ } | |
+} | |
+ | |
+/* | |
+ * Processes a request stored in "data" from player "From" to buy an | |
+ * object (bitch, gun, or drug). | |
+ * Objects can be sold if the amount given in "data" is negative, and | |
+ * given away if their current price is zero. | |
+ */ | |
+void BuyObject(Player *From, char *data) | |
+{ | |
+ char *cp, *type; | |
+ int index, i, amount; | |
+ | |
+ cp = data; | |
+ type = GetNextWord(&cp, ""); | |
+ index = GetNextInt(&cp, 0); | |
+ amount = GetNextInt(&cp, 0); | |
+ if (strcmp(type, "drug") == 0) { | |
+ if (index >= 0 && index < NumDrug | |
+ && From->Drugs[index].Carried + amount >= 0 | |
+ && From->CoatSize - amount >= 0 && (From->Drugs[index].Price != 0 | |
+ || amount < 0) | |
+ && From->Cash >= amount * From->Drugs[index].Price) { | |
+ if (amount > 0) { | |
+ From->Drugs[index].TotalValue += amount * From->Drugs[index].Price; | |
+ } else if (From->Drugs[index].Carried != 0) { | |
+ From->Drugs[index].TotalValue = From->Drugs[index].TotalValue * | |
+ (From->Drugs[index].Carried + | |
+ amount) / From->Drugs[index].Carried; | |
} | |
- } else if (strcmp(type,"bitch")==0) { | |
- if (From->Bitches.Carried+amount >= 0 | |
- && From->Bitches.Price!=0 | |
- && amount*From->Bitches.Price <= From->Cash) { | |
- for (i=0;i<amount;i++) GainBitch(From); | |
- if (amount>0) From->Cash-=amount*From->Bitches.Price; | |
- SendPlayerData(From); | |
+ From->Drugs[index].Carried += amount; | |
+ From->CoatSize -= amount; | |
+ From->Cash -= amount * From->Drugs[index].Price; | |
+ SendPlayerData(From); | |
+ | |
+ if (!Sanitized && (From->Drugs[index].Price == 0 && | |
+ brandom(0, | |
+ 100) < | |
+ Location[(int)From->IsAt].PolicePresence)) { | |
+ SendPrintMessage(NULL, C_NONE, From, | |
+ _("The cops spot you dropping drugs!")); | |
+ CopsAttackPlayer(From); | |
} | |
- } | |
-} | |
- | |
-void ClearPrices(Player *Play) { | |
-/* Clears the bitch and gun prices stored for player "Play" */ | |
- int i; | |
- Play->Bitches.Price=0; | |
- for (i=0;i<NumGun;i++) Play->Guns[i].Price=0; | |
-} | |
- | |
-void GainBitch(Player *Play) { | |
-/* Gives player "Play" a new bitch (or larger trenchcoat) */ | |
- Play->CoatSize+=10; | |
- Play->Bitches.Carried++; | |
-} | |
- | |
-int LoseBitch(Player *Play,Inventory *Guns,Inventory *Drugs) { | |
-/* Loses one bitch belonging to player "Play". If drugs or guns are */ | |
-/* lost with the bitch, 1 is returned (0 otherwise) and the lost */ | |
-/* items are added to "Guns" and "Drugs" if non-NULL */ | |
- int losedrug=0,i,num,drugslost; | |
- int *GunIndex,tmp; | |
- GunIndex=g_new(int,NumGun); | |
- ClearInventory(Guns,Drugs); | |
- Play->CoatSize-=10; | |
- if (TotalGunsCarried(Play)>0) { | |
- if (brandom(0,100)<TotalGunsCarried(Play)*100/(Play->Bitches.Carried+2))… | |
- for (i=0;i<NumGun;i++) GunIndex[i]=i; | |
- for (i=0;i<NumGun*5;i++) { | |
- num=brandom(0,NumGun-1); | |
- tmp=GunIndex[num+1]; | |
- GunIndex[num+1]=GunIndex[num]; | |
- GunIndex[num]=tmp; | |
- } | |
- for (i=0;i<NumGun;i++) { | |
- if (Play->Guns[GunIndex[i]].Carried > 0) { | |
- Play->Guns[GunIndex[i]].Carried--; losedrug=1; | |
- Play->CoatSize+=Gun[GunIndex[i]].Space; | |
- if (Guns) Guns[GunIndex[i]].Carried++; | |
- break; | |
- } | |
- } | |
+ } | |
+ } else if (strcmp(type, "gun") == 0) { | |
+ if (index >= 0 && index < NumGun | |
+ && TotalGunsCarried(From) + amount >= 0 | |
+ && TotalGunsCarried(From) + amount <= From->Bitches.Carried + 2 | |
+ && From->Guns[index].Price != 0 | |
+ && From->CoatSize - amount * Gun[index].Space >= 0 | |
+ && From->Cash >= amount * From->Guns[index].Price) { | |
+ From->Guns[index].Carried += amount; | |
+ From->CoatSize -= amount * Gun[index].Space; | |
+ From->Cash -= amount * From->Guns[index].Price; | |
+ SendPlayerData(From); | |
+ } | |
+ } else if (strcmp(type, "bitch") == 0) { | |
+ if (From->Bitches.Carried + amount >= 0 | |
+ && From->Bitches.Price != 0 | |
+ && amount * From->Bitches.Price <= From->Cash) { | |
+ for (i = 0; i < amount; i++) | |
+ GainBitch(From); | |
+ if (amount > 0) | |
+ From->Cash -= amount * From->Bitches.Price; | |
+ SendPlayerData(From); | |
+ } | |
+ } | |
+} | |
+ | |
+/* | |
+ * Clears the bitch and gun prices stored for player "Play". | |
+ */ | |
+void ClearPrices(Player *Play) | |
+{ | |
+ int i; | |
+ | |
+ Play->Bitches.Price = 0; | |
+ for (i = 0; i < NumGun; i++) | |
+ Play->Guns[i].Price = 0; | |
+} | |
+ | |
+/* | |
+ * Gives player "Play" a new bitch (or larger trenchcoat). | |
+ */ | |
+void GainBitch(Player *Play) | |
+{ | |
+ Play->CoatSize += 10; | |
+ Play->Bitches.Carried++; | |
+} | |
+ | |
+/* | |
+ * Loses one bitch belonging to player "Play". If drugs or guns are | |
+ * lost with the bitch, 1 is returned (0 otherwise) and the lost | |
+ * items are added to "Guns" and "Drugs" if non-NULL. | |
+ */ | |
+int LoseBitch(Player *Play, Inventory *Guns, Inventory *Drugs) | |
+{ | |
+ int losedrug = 0, i, num, drugslost; | |
+ int *GunIndex, tmp; | |
+ GunIndex = g_new(int, NumGun); | |
+ | |
+ ClearInventory(Guns, Drugs); | |
+ Play->CoatSize -= 10; | |
+ if (TotalGunsCarried(Play) > 0) { | |
+ if (brandom(0, 100) < | |
+ TotalGunsCarried(Play) * 100 / (Play->Bitches.Carried + 2)) { | |
+ for (i = 0; i < NumGun; i++) | |
+ GunIndex[i] = i; | |
+ for (i = 0; i < NumGun * 5; i++) { | |
+ num = brandom(0, NumGun - 1); | |
+ tmp = GunIndex[num + 1]; | |
+ GunIndex[num + 1] = GunIndex[num]; | |
+ GunIndex[num] = tmp; | |
} | |
- } | |
- for (i=0;i<NumDrug;i++) if (Play->Drugs[i].Carried>0) { | |
- num=(int)((float)Play->Drugs[i].Carried/(Play->Bitches.Carried+2.0)+0.5); | |
- if (num>0) { | |
- Play->Drugs[i].TotalValue = Play->Drugs[i].TotalValue* | |
- (Play->Drugs[i].Carried-num)/Play->Drugs[i].Carried; | |
- Play->Drugs[i].Carried-=num; | |
- if (Drugs) Drugs[i].Carried+=num; | |
- Play->CoatSize+=num; | |
- losedrug=1; | |
+ for (i = 0; i < NumGun; i++) { | |
+ if (Play->Guns[GunIndex[i]].Carried > 0) { | |
+ Play->Guns[GunIndex[i]].Carried--; | |
+ losedrug = 1; | |
+ Play->CoatSize += Gun[GunIndex[i]].Space; | |
+ if (Guns) | |
+ Guns[GunIndex[i]].Carried++; | |
+ break; | |
+ } | |
} | |
- } | |
- while (Play->CoatSize<0) { | |
- drugslost=0; | |
- for (i=0;i<NumDrug;i++) { | |
- if (Play->Drugs[i].Carried>0) { | |
- losedrug=1; drugslost=1; | |
- Play->Drugs[i].TotalValue = Play->Drugs[i].TotalValue* | |
- (Play->Drugs[i].Carried-1)/Play->Drugs[i].Carried; | |
- Play->Drugs[i].Carried--; | |
- Play->CoatSize++; | |
- if (Play->CoatSize>=0) break; | |
- } | |
+ } | |
+ } | |
+ for (i = 0; i < NumDrug; i++) | |
+ if (Play->Drugs[i].Carried > 0) { | |
+ num = | |
+ (int)((float)Play->Drugs[i].Carried / | |
+ (Play->Bitches.Carried + 2.0) + 0.5); | |
+ if (num > 0) { | |
+ Play->Drugs[i].TotalValue = Play->Drugs[i].TotalValue * | |
+ (Play->Drugs[i].Carried - num) / Play->Drugs[i].Carried; | |
+ Play->Drugs[i].Carried -= num; | |
+ if (Drugs) | |
+ Drugs[i].Carried += num; | |
+ Play->CoatSize += num; | |
+ losedrug = 1; | |
} | |
- if (!drugslost) for (i=0;i<NumGun;i++) { | |
- if (Play->Guns[i].Carried>0) { | |
- losedrug=1; | |
- Play->Guns[i].Carried--; | |
- Play->CoatSize+=Gun[i].Space; | |
- if (Play->CoatSize>=0) break; | |
- } | |
+ } | |
+ while (Play->CoatSize < 0) { | |
+ drugslost = 0; | |
+ for (i = 0; i < NumDrug; i++) { | |
+ if (Play->Drugs[i].Carried > 0) { | |
+ losedrug = 1; | |
+ drugslost = 1; | |
+ Play->Drugs[i].TotalValue = Play->Drugs[i].TotalValue * | |
+ (Play->Drugs[i].Carried - 1) / Play->Drugs[i].Carried; | |
+ Play->Drugs[i].Carried--; | |
+ Play->CoatSize++; | |
+ if (Play->CoatSize >= 0) | |
+ break; | |
} | |
- } | |
- Play->Bitches.Carried--; | |
- g_free(GunIndex); | |
- return losedrug; | |
-} | |
- | |
-void SetFightTimeout(Player *Play) { | |
-/* If fight timeouts are in force, sets the timeout for the given player. */ | |
- if (FightTimeout) Play->FightTimeout=time(NULL)+(time_t)FightTimeout; | |
- else Play->FightTimeout=0; | |
-} | |
- | |
-void ClearFightTimeout(Player *Play) { | |
-/* Removes any fight timeout for the given player. */ | |
- Play->FightTimeout=0; | |
+ } | |
+ if (!drugslost) | |
+ for (i = 0; i < NumGun; i++) { | |
+ if (Play->Guns[i].Carried > 0) { | |
+ losedrug = 1; | |
+ Play->Guns[i].Carried--; | |
+ Play->CoatSize += Gun[i].Space; | |
+ if (Play->CoatSize >= 0) | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ Play->Bitches.Carried--; | |
+ g_free(GunIndex); | |
+ return losedrug; | |
+} | |
+ | |
+/* | |
+ * If fight timeouts are in force, sets the timeout for the given player. | |
+ */ | |
+void SetFightTimeout(Player *Play) | |
+{ | |
+ if (FightTimeout) | |
+ Play->FightTimeout = time(NULL) + (time_t) FightTimeout; | |
+ else | |
+ Play->FightTimeout = 0; | |
+} | |
+ | |
+/* | |
+ * Removes any fight timeout for the given player. | |
+ */ | |
+void ClearFightTimeout(Player *Play) | |
+{ | |
+ Play->FightTimeout = 0; | |
+} | |
+ | |
+/* | |
+ * Given the time of a pending event in "timeout" and the current time in | |
+ * "timenow", updates "mintime" with the number of seconds to that event, | |
+ * unless "mintime" is already smaller (as long as it's not -1, which | |
+ * means "uninitialized"). Returns 1 if the timeout has already expired. | |
+ */ | |
+int AddTimeout(time_t timeout, time_t timenow, int *mintime) | |
+{ | |
+ if (timeout == 0) | |
+ return 0; | |
+ else if (timeout <= timenow) | |
+ return 1; | |
+ else { | |
+ if (*mintime < 0 || timeout - timenow < *mintime) | |
+ *mintime = timeout - timenow; | |
+ return 0; | |
+ } | |
} | |
-int AddTimeout(time_t timeout,time_t timenow,int *mintime) { | |
-/* Given the time of a pending event in "timeout" and the current time in */ | |
-/* "timenow", updates "mintime" with the number of seconds to that event, */ | |
-/* unless "mintime" is already smaller (as long as it's not -1, which */ | |
-/* means "uninitialized"). Returns 1 if the timeout has already expired. */ | |
- if (timeout==0) return 0; | |
- else if (timeout<=timenow) return 1; | |
- else { | |
- if (*mintime<0 || timeout-timenow < *mintime) *mintime=timeout-timenow; | |
+/* | |
+ * Returns the number of seconds until the next scheduled event. If such | |
+ * an event has already expired, returns 0. If no events are pending, | |
+ * returns -1. "First" should point to a list of valid players. | |
+ */ | |
+int GetMinimumTimeout(GSList *First) | |
+{ | |
+ Player *Play; | |
+ GSList *list; | |
+ int mintime = -1; | |
+ time_t timenow; | |
+ | |
+ timenow = time(NULL); | |
+ if (AddTimeout(MetaMinTimeout, timenow, &mintime)) | |
+ return 0; | |
+ if (AddTimeout(MetaUpdateTimeout, timenow, &mintime)) | |
+ return 0; | |
+ for (list = First; list; list = g_slist_next(list)) { | |
+ Play = (Player *)list->data; | |
+ if (AddTimeout(Play->FightTimeout, timenow, &mintime) || | |
+ AddTimeout(Play->IdleTimeout, timenow, &mintime) || | |
+ AddTimeout(Play->ConnectTimeout, timenow, &mintime)) | |
return 0; | |
- } | |
-} | |
- | |
-int GetMinimumTimeout(GSList *First) { | |
-/* Returns the number of seconds until the next scheduled event. If such */ | |
-/* an event has already expired, returns 0. If no events are pending, */ | |
-/* returns -1. "First" should point to a list of valid players. */ | |
- Player *Play; | |
- GSList *list; | |
- int mintime=-1; | |
- time_t timenow; | |
- | |
- timenow=time(NULL); | |
- if (AddTimeout(MetaMinTimeout,timenow,&mintime)) return 0; | |
- if (AddTimeout(MetaUpdateTimeout,timenow,&mintime)) return 0; | |
- for (list=First;list;list=g_slist_next(list)) { | |
- Play=(Player *)list->data; | |
- if (AddTimeout(Play->FightTimeout,timenow,&mintime) || | |
- AddTimeout(Play->IdleTimeout,timenow,&mintime) || | |
- AddTimeout(Play->ConnectTimeout,timenow,&mintime)) return 0; | |
- } | |
- return mintime; | |
-} | |
- | |
-GSList *HandleTimeouts(GSList *First) { | |
-/* Given a list of players in "First", checks to see if any events */ | |
-/* have timed out, and if so, performs the necessary actions. The */ | |
-/* new start of the list is returned, since a player may be removed */ | |
-/* if their ConnectTimeout has expired. */ | |
- GSList *list,*nextlist; | |
- Player *Play; | |
- time_t timenow; | |
- | |
- timenow=time(NULL); | |
- if (MetaMinTimeout<=timenow) { | |
- MetaMinTimeout=0; | |
- if (MetaPlayerPending) { | |
- dopelog(3,_("Sending pending updates to the metaserver...")); | |
- RegisterWithMetaServer(TRUE,TRUE,FALSE); | |
- } | |
- } | |
- if (MetaUpdateTimeout!=0 && MetaUpdateTimeout<=timenow) { | |
- dopelog(3,_("Sending reminder message to the metaserver...")); | |
- RegisterWithMetaServer(TRUE,FALSE,FALSE); | |
- } | |
- list=First; | |
- while (list) { | |
- nextlist=g_slist_next(list); | |
- Play=(Player *)list->data; | |
- if (Play->IdleTimeout!=0 && Play->IdleTimeout<=timenow) { | |
- Play->IdleTimeout=0; | |
- dopelog(1,_("Player removed due to idle timeout")); | |
- SendPrintMessage(NULL,C_NONE,Play,"Disconnected due to idle timeout"); | |
- ClientLeftServer(Play); | |
-/* Blank the name, so that CountPlayers ignores this player */ | |
- SetPlayerName(Play,NULL); | |
-/* Make sure they do actually disconnect, eventually! */ | |
- if (ConnectTimeout) { | |
- Play->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout; | |
- } | |
- } else if (Play->ConnectTimeout!=0 && Play->ConnectTimeout<=timenow) { | |
- Play->ConnectTimeout=0; | |
- dopelog(1,_("Player removed due to connect timeout")); | |
- First=RemovePlayer(Play,First); | |
- } else if (IsConnectedPlayer(Play) && | |
- Play->FightTimeout!=0 && Play->FightTimeout<=timenow) { | |
- ClearFightTimeout(Play); | |
- if (IsCop(Play)) Fire(Play); | |
- else SendFightReload(Play); | |
+ } | |
+ return mintime; | |
+} | |
+ | |
+/* | |
+ * Given a list of players in "First", checks to see if any events | |
+ * have timed out, and if so, performs the necessary actions. The | |
+ * new start of the list is returned, since a player may be removed | |
+ * if their ConnectTimeout has expired. | |
+ */ | |
+GSList *HandleTimeouts(GSList *First) | |
+{ | |
+ GSList *list, *nextlist; | |
+ Player *Play; | |
+ time_t timenow; | |
+ | |
+ timenow = time(NULL); | |
+ if (MetaMinTimeout <= timenow) { | |
+ MetaMinTimeout = 0; | |
+ if (MetaPlayerPending) { | |
+ dopelog(3, _("Sending pending updates to the metaserver...")); | |
+ RegisterWithMetaServer(TRUE, TRUE, FALSE); | |
+ } | |
+ } | |
+ if (MetaUpdateTimeout != 0 && MetaUpdateTimeout <= timenow) { | |
+ dopelog(3, _("Sending reminder message to the metaserver...")); | |
+ RegisterWithMetaServer(TRUE, FALSE, FALSE); | |
+ } | |
+ list = First; | |
+ while (list) { | |
+ nextlist = g_slist_next(list); | |
+ Play = (Player *)list->data; | |
+ if (Play->IdleTimeout != 0 && Play->IdleTimeout <= timenow) { | |
+ Play->IdleTimeout = 0; | |
+ dopelog(1, _("Player removed due to idle timeout")); | |
+ SendPrintMessage(NULL, C_NONE, Play, | |
+ "Disconnected due to idle timeout"); | |
+ ClientLeftServer(Play); | |
+ /* Blank the name, so that CountPlayers ignores this player */ | |
+ SetPlayerName(Play, NULL); | |
+ /* Make sure they do actually disconnect, eventually! */ | |
+ if (ConnectTimeout) { | |
+ Play->ConnectTimeout = time(NULL) + (time_t) ConnectTimeout; | |
} | |
- list=nextlist; | |
- } | |
- return First; | |
+ } else if (Play->ConnectTimeout != 0 | |
+ && Play->ConnectTimeout <= timenow) { | |
+ Play->ConnectTimeout = 0; | |
+ dopelog(1, _("Player removed due to connect timeout")); | |
+ First = RemovePlayer(Play, First); | |
+ } else if (IsConnectedPlayer(Play) && | |
+ Play->FightTimeout != 0 && Play->FightTimeout <= timenow) { | |
+ ClearFightTimeout(Play); | |
+ if (IsCop(Play)) | |
+ Fire(Play); | |
+ else | |
+ SendFightReload(Play); | |
+ } | |
+ list = nextlist; | |
+ } | |
+ return First; | |
} | |
diff --git a/src/serverside.h b/src/serverside.h | |
t@@ -1,23 +1,24 @@ | |
-/* serverside.h Server-side parts of dopewars */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * serverside.h Server-side parts of dopewars * | |
+ * 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 __SERVERSIDE_H__ | |
#define __SERVERSIDE_H__ | |
t@@ -38,17 +39,17 @@ void StopServer(void); | |
Player *HandleNewConnection(void); | |
void ServerLoop(void); | |
void HandleServerPlayer(Player *Play); | |
-void HandleServerMessage(gchar *buf,Player *ReallyFrom); | |
-void FinishGame(Player *Play,char *Message); | |
-void SendHighScores(Player *Play,gboolean EndGame,char *Message); | |
+void HandleServerMessage(gchar *buf, Player *ReallyFrom); | |
+void FinishGame(Player *Play, char *Message); | |
+void SendHighScores(Player *Play, gboolean EndGame, char *Message); | |
void SendEvent(Player *To); | |
-void SendDrugsHere(Player *To,gboolean DisplayBusts); | |
-void GenerateDrugsHere(Player *To,char *Deal); | |
-void BuyObject(Player *From,char *data); | |
+void SendDrugsHere(Player *To, gboolean DisplayBusts); | |
+void GenerateDrugsHere(Player *To, char *Deal); | |
+void BuyObject(Player *From, char *data); | |
int RandomOffer(Player *To); | |
-void HandleAnswer(Player *From,Player *To,char *answer); | |
+void HandleAnswer(Player *From, Player *To, char *answer); | |
void ClearPrices(Player *Play); | |
-int LoseBitch(Player *Play,Inventory *Guns,Inventory *Drugs); | |
+int LoseBitch(Player *Play, Inventory *Guns, Inventory *Drugs); | |
void GainBitch(Player *Play); | |
void SetFightTimeout(Player *Play); | |
void ClearFightTimeout(Player *Play); | |
t@@ -58,18 +59,19 @@ void ConvertHighScoreFile(void); | |
void OpenHighScoreFile(void); | |
gboolean CheckHighScoreFileConfig(void); | |
void CloseHighScoreFile(void); | |
-gboolean HighScoreRead(FILE *fp,struct HISCORE *MultiScore, | |
- struct HISCORE *AntiqueScore,gboolean ReadHeader); | |
+gboolean HighScoreRead(FILE *fp, struct HISCORE *MultiScore, | |
+ struct HISCORE *AntiqueScore, gboolean ReadHeader); | |
void CopsAttackPlayer(Player *Play); | |
-void AttackPlayer(Player *Play,Player *Attacked); | |
-gboolean IsOpponent(Player *Play,Player *Other); | |
+void AttackPlayer(Player *Play, Player *Attacked); | |
+gboolean IsOpponent(Player *Play, Player *Other); | |
void Fire(Player *Play); | |
void WithdrawFromCombat(Player *Play); | |
-void RunFromCombat(Player *Play,int ToLocation); | |
+void RunFromCombat(Player *Play, int ToLocation); | |
gboolean CanPlayerFire(Player *Play); | |
gboolean CanRunHere(Player *Play); | |
Player *GetNextShooter(Player *Play); | |
void DropPrivileges(void); | |
+ | |
#ifdef GUI_SERVER | |
void GuiServerLoop(gboolean is_service); | |
#endif | |
diff --git a/src/tstring.c b/src/tstring.c | |
t@@ -1,23 +1,24 @@ | |
-/* tstring.c "Translated string" wrappers for dopewars */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * tstring.c "Translated string" wrappers for dopewars * | |
+ * 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. * | |
+ ************************************************************************/ | |
#include <stdio.h> | |
#include <string.h> | |
t@@ -33,216 +34,284 @@ | |
#include "tstring.h" | |
typedef struct _FmtData { | |
- union { | |
- int IntVal; | |
- price_t PriceVal; | |
- char CharVal; | |
- char *StrVal; | |
- } data; | |
- char Type; | |
+ union { | |
+ int IntVal; | |
+ price_t PriceVal; | |
+ char CharVal; | |
+ char *StrVal; | |
+ } data; | |
+ char Type; | |
} FmtData; | |
-gchar *GetDefaultTString(gchar *tstring) { | |
- gchar *dstr,*pt; | |
- dstr=g_strdup(tstring); | |
- pt=strchr(dstr,'_'); | |
- if (pt) *pt='\0'; | |
- return dstr; | |
-} | |
+gchar *GetDefaultTString(gchar *tstring) | |
+{ | |
+ gchar *dstr, *pt; | |
-gchar *GetTranslatedString(gchar *str,gchar *code,gboolean Caps) { | |
- gchar *dstr,*pt,*tstr,*Default,*tcode; | |
- | |
- dstr=g_strdup(str); | |
- g_strdelimit(dstr,"_",'^'); | |
- pt=dstr; | |
- Default=GetNextWord(&pt,""); | |
- tstr=NULL; | |
- | |
- while(1) { | |
- tcode=GetNextWord(&pt,NULL); | |
- tstr=GetNextWord(&pt,""); | |
- if (!tcode) { tstr=NULL; break; } | |
- if (strcmp(tcode,code)==0) { | |
- break; | |
- } else tstr=NULL; | |
- } | |
- | |
- if (tstr) { | |
- if (Caps) tstr=InitialCaps(tstr); else tstr=g_strdup(tstr); | |
- } else { | |
- if (Caps) tstr=InitialCaps(Default); else tstr=g_strdup(Default); | |
- } | |
- | |
- g_free(dstr); | |
- return tstr; | |
+ dstr = g_strdup(tstring); | |
+ pt = strchr(dstr, '_'); | |
+ if (pt) | |
+ *pt = '\0'; | |
+ return dstr; | |
} | |
-void GetNextFormat(guint *Index,gchar *str,int *StartPos, | |
- int *EndPos,int *FmtPos,gchar *Type,int *ArgNum,int *Wid, | |
- int *Prec,char *Code) { | |
- int anum,wid,prec; | |
- guint i; | |
- gchar type; | |
- *StartPos=-1; | |
- *EndPos=*FmtPos=*ArgNum=*Wid=*Prec=0; | |
- *Type=0; | |
- Code[0]=0; | |
- anum=wid=prec=0; | |
- i=*Index; | |
- while (str[i]) { | |
- if (str[i]=='%') { | |
- *StartPos=*EndPos=i++; | |
- while (strchr("#0- +'",str[i])) i++; /* Skip flag characters */ | |
- while (str[i]>='0' && str[i]<='9') wid=wid*10+str[i++]-'0'; | |
- if (str[i]=='$') { | |
- *EndPos=i; | |
- i++; anum=wid; wid=0; | |
- while (strchr("#0- +'",str[i])) i++; /* Skip flag characters */ | |
- while (str[i]>='0' && str[i]<='9') wid=wid*10+str[i++]-'0'; | |
- } | |
- if (str[i]=='.') { | |
- i++; | |
- while (str[i]>='0' && str[i]<='9') prec=prec*10+str[i++]-'0'; | |
- } | |
- *FmtPos=i; | |
- type=str[i]; | |
- if ((type=='T' || type=='t') && i+2<strlen(str)) { | |
- Code[0]=str[i+1]; | |
- Code[1]=str[i+2]; | |
- Code[2]=0; | |
- i+=3; | |
- } else if (type=='/') { | |
- i++; | |
- while (str[i]!='\0' && str[i]!='/') i++; | |
- if (str[i]=='/') i++; | |
- } else i++; | |
- *ArgNum=anum; *Wid=wid; *Prec=prec; *Index=i; *Type=type; | |
- return; | |
- } else i++; | |
- } | |
- *Index=i; | |
+gchar *GetTranslatedString(gchar *str, gchar *code, gboolean Caps) | |
+{ | |
+ gchar *dstr, *pt, *tstr, *Default, *tcode; | |
+ | |
+ dstr = g_strdup(str); | |
+ g_strdelimit(dstr, "_", '^'); | |
+ pt = dstr; | |
+ Default = GetNextWord(&pt, ""); | |
+ tstr = NULL; | |
+ | |
+ while (1) { | |
+ tcode = GetNextWord(&pt, NULL); | |
+ tstr = GetNextWord(&pt, ""); | |
+ if (!tcode) { | |
+ tstr = NULL; | |
+ break; | |
+ } | |
+ if (strcmp(tcode, code) == 0) { | |
+ break; | |
+ } else | |
+ tstr = NULL; | |
+ } | |
+ | |
+ if (tstr) { | |
+ if (Caps) | |
+ tstr = InitialCaps(tstr); | |
+ else | |
+ tstr = g_strdup(tstr); | |
+ } else { | |
+ if (Caps) | |
+ tstr = InitialCaps(Default); | |
+ else | |
+ tstr = g_strdup(Default); | |
+ } | |
+ | |
+ g_free(dstr); | |
+ return tstr; | |
} | |
-gchar *HandleTFmt(gchar *format, va_list va) { | |
- int StrInd,StartPos,EndPos,FmtPos,Wid,Prec; | |
- guint i,ArgNum,DefaultArgNum; | |
- char Code[3],Type; | |
- gchar *retstr,*fstr; | |
- GString *string,*tmpfmt; | |
- GArray *arr; | |
- FmtData *fdat; | |
- | |
- string=g_string_new(""); | |
- tmpfmt=g_string_new(""); | |
- | |
- arr=g_array_new(FALSE,TRUE,sizeof(FmtData)); | |
- i=DefaultArgNum=0; | |
- while (i<strlen(format)) { | |
- GetNextFormat(&i,format,&StartPos,&EndPos,&FmtPos,&Type,&ArgNum, | |
- &Wid,&Prec,Code); | |
- if (StartPos==-1) break; | |
- if (ArgNum==0) ArgNum=++DefaultArgNum; | |
- if (ArgNum>arr->len) { | |
- g_array_set_size(arr,ArgNum); | |
- } | |
- g_array_index(arr,FmtData,ArgNum-1).Type=Type; | |
- } | |
- for (i=0;i<arr->len;i++) { | |
- fdat=&g_array_index(arr,FmtData,i); | |
- switch(fdat->Type) { | |
- case '\0': | |
- g_error("Incomplete format string!"); break; | |
- case 'd': | |
- fdat->data.IntVal=va_arg(va,int); break; | |
- case 'P': | |
- fdat->data.PriceVal=va_arg(va,price_t); break; | |
- case 'c': | |
- fdat->data.CharVal=(char)va_arg(va,int); break; | |
- case 's': case 't': case 'T': | |
- fdat->data.StrVal=va_arg(va,char *); break; | |
- case '%': case '/': | |
- break; /* No special action for %% or %/.../ */ | |
- default: | |
- g_error("Unknown format type %c!",fdat->Type); | |
- } | |
- } | |
- i=DefaultArgNum=0; | |
- while (i<strlen(format)) { | |
- StrInd=i; | |
- GetNextFormat(&i,format,&StartPos,&EndPos,&FmtPos,&Type,&ArgNum, | |
- &Wid,&Prec,Code); | |
- if (StartPos==-1) { | |
- g_string_append(string,&format[StrInd]); break; | |
+void GetNextFormat(guint *Index, gchar *str, int *StartPos, | |
+ int *EndPos, int *FmtPos, gchar *Type, int *ArgNum, | |
+ int *Wid, int *Prec, char *Code) | |
+{ | |
+ int anum, wid, prec; | |
+ guint i; | |
+ gchar type; | |
+ | |
+ *StartPos = -1; | |
+ *EndPos = *FmtPos = *ArgNum = *Wid = *Prec = 0; | |
+ *Type = 0; | |
+ Code[0] = 0; | |
+ anum = wid = prec = 0; | |
+ i = *Index; | |
+ while (str[i]) { | |
+ if (str[i] == '%') { | |
+ *StartPos = *EndPos = i++; | |
+ while (strchr("#0- +'", str[i])) | |
+ i++; /* Skip flag characters */ | |
+ while (str[i] >= '0' && str[i] <= '9') | |
+ wid = wid * 10 + str[i++] - '0'; | |
+ if (str[i] == '$') { | |
+ *EndPos = i; | |
+ i++; | |
+ anum = wid; | |
+ wid = 0; | |
+ while (strchr("#0- +'", str[i])) | |
+ i++; /* Skip flag characters */ | |
+ while (str[i] >= '0' && str[i] <= '9') | |
+ wid = wid * 10 + str[i++] - '0'; | |
} | |
- while (StrInd<StartPos) g_string_append_c(string,format[StrInd++]); | |
- if (ArgNum==0) ArgNum=++DefaultArgNum; | |
- g_string_assign(tmpfmt,"%"); | |
- EndPos++; | |
- while (EndPos<FmtPos) g_string_append_c(tmpfmt,format[EndPos++]); | |
- if (Type=='T' || Type=='t' || Type=='P') g_string_append_c(tmpfmt,'s'); | |
- else g_string_append_c(tmpfmt,Type); | |
- fdat=&g_array_index(arr,FmtData,ArgNum-1); | |
- if (Type!=fdat->Type) g_error("Unmatched types!"); | |
- switch(Type) { | |
- case 'd': | |
- g_string_sprintfa(string,tmpfmt->str,fdat->data.IntVal); break; | |
- case 'c': | |
- g_string_sprintfa(string,tmpfmt->str,fdat->data.CharVal); break; | |
- case 'P': | |
- fstr=FormatPrice(fdat->data.PriceVal); | |
- g_string_sprintfa(string,tmpfmt->str,fstr); g_free(fstr); break; | |
- case 't': case 'T': | |
- fstr=GetTranslatedString(fdat->data.StrVal,Code,Type=='T'); | |
- g_string_sprintfa(string,tmpfmt->str,fstr); g_free(fstr); break; | |
- case 's': | |
- g_string_sprintfa(string,tmpfmt->str,fdat->data.StrVal); break; | |
- case '%': | |
- g_string_append_c(string,'%'); break; | |
+ if (str[i] == '.') { | |
+ i++; | |
+ while (str[i] >= '0' && str[i] <= '9') | |
+ prec = prec * 10 + str[i++] - '0'; | |
} | |
- } | |
- retstr=string->str; | |
- g_array_free(arr,TRUE); | |
- g_string_free(string,FALSE); | |
- g_string_free(tmpfmt,TRUE); | |
- return retstr; | |
+ *FmtPos = i; | |
+ type = str[i]; | |
+ if ((type == 'T' || type == 't') && i + 2 < strlen(str)) { | |
+ Code[0] = str[i + 1]; | |
+ Code[1] = str[i + 2]; | |
+ Code[2] = 0; | |
+ i += 3; | |
+ } else if (type == '/') { | |
+ i++; | |
+ while (str[i] != '\0' && str[i] != '/') | |
+ i++; | |
+ if (str[i] == '/') | |
+ i++; | |
+ } else | |
+ i++; | |
+ *ArgNum = anum; | |
+ *Wid = wid; | |
+ *Prec = prec; | |
+ *Index = i; | |
+ *Type = type; | |
+ return; | |
+ } else | |
+ i++; | |
+ } | |
+ *Index = i; | |
} | |
-void dpg_print(gchar *format, ...) { | |
- va_list ap; | |
- gchar *retstr; | |
- va_start(ap,format); | |
- retstr=HandleTFmt(format,ap); | |
- va_end(ap); | |
- g_print(retstr); | |
- g_free(retstr); | |
+gchar *HandleTFmt(gchar *format, va_list va) | |
+{ | |
+ int StrInd, StartPos, EndPos, FmtPos, Wid, Prec; | |
+ guint i, ArgNum, DefaultArgNum; | |
+ char Code[3], Type; | |
+ gchar *retstr, *fstr; | |
+ GString *string, *tmpfmt; | |
+ GArray *arr; | |
+ FmtData *fdat; | |
+ | |
+ string = g_string_new(""); | |
+ tmpfmt = g_string_new(""); | |
+ | |
+ arr = g_array_new(FALSE, TRUE, sizeof(FmtData)); | |
+ i = DefaultArgNum = 0; | |
+ while (i < strlen(format)) { | |
+ GetNextFormat(&i, format, &StartPos, &EndPos, &FmtPos, &Type, &ArgNum, | |
+ &Wid, &Prec, Code); | |
+ if (StartPos == -1) | |
+ break; | |
+ if (ArgNum == 0) | |
+ ArgNum = ++DefaultArgNum; | |
+ if (ArgNum > arr->len) { | |
+ g_array_set_size(arr, ArgNum); | |
+ } | |
+ g_array_index(arr, FmtData, ArgNum - 1).Type = Type; | |
+ } | |
+ for (i = 0; i < arr->len; i++) { | |
+ fdat = &g_array_index(arr, FmtData, i); | |
+ | |
+ switch (fdat->Type) { | |
+ case '\0': | |
+ g_error("Incomplete format string!"); | |
+ break; | |
+ case 'd': | |
+ fdat->data.IntVal = va_arg(va, int); | |
+ break; | |
+ case 'P': | |
+ fdat->data.PriceVal = va_arg(va, price_t); | |
+ break; | |
+ case 'c': | |
+ fdat->data.CharVal = (char)va_arg(va, int); | |
+ break; | |
+ case 's': | |
+ case 't': | |
+ case 'T': | |
+ fdat->data.StrVal = va_arg(va, char *); | |
+ break; | |
+ case '%': | |
+ case '/': | |
+ break; /* No special action for %% or %/.../ */ | |
+ default: | |
+ g_error("Unknown format type %c!", fdat->Type); | |
+ } | |
+ } | |
+ i = DefaultArgNum = 0; | |
+ while (i < strlen(format)) { | |
+ StrInd = i; | |
+ GetNextFormat(&i, format, &StartPos, &EndPos, &FmtPos, &Type, &ArgNum, | |
+ &Wid, &Prec, Code); | |
+ if (StartPos == -1) { | |
+ g_string_append(string, &format[StrInd]); | |
+ break; | |
+ } | |
+ while (StrInd < StartPos) | |
+ g_string_append_c(string, format[StrInd++]); | |
+ if (ArgNum == 0) | |
+ ArgNum = ++DefaultArgNum; | |
+ g_string_assign(tmpfmt, "%"); | |
+ EndPos++; | |
+ while (EndPos < FmtPos) | |
+ g_string_append_c(tmpfmt, format[EndPos++]); | |
+ if (Type == 'T' || Type == 't' || Type == 'P') | |
+ g_string_append_c(tmpfmt, 's'); | |
+ else | |
+ g_string_append_c(tmpfmt, Type); | |
+ fdat = &g_array_index(arr, FmtData, ArgNum - 1); | |
+ | |
+ if (Type != fdat->Type) | |
+ g_error("Unmatched types!"); | |
+ switch (Type) { | |
+ case 'd': | |
+ g_string_sprintfa(string, tmpfmt->str, fdat->data.IntVal); | |
+ break; | |
+ case 'c': | |
+ g_string_sprintfa(string, tmpfmt->str, fdat->data.CharVal); | |
+ break; | |
+ case 'P': | |
+ fstr = FormatPrice(fdat->data.PriceVal); | |
+ g_string_sprintfa(string, tmpfmt->str, fstr); | |
+ g_free(fstr); | |
+ break; | |
+ case 't': | |
+ case 'T': | |
+ fstr = GetTranslatedString(fdat->data.StrVal, Code, Type == 'T'); | |
+ g_string_sprintfa(string, tmpfmt->str, fstr); | |
+ g_free(fstr); | |
+ break; | |
+ case 's': | |
+ g_string_sprintfa(string, tmpfmt->str, fdat->data.StrVal); | |
+ break; | |
+ case '%': | |
+ g_string_append_c(string, '%'); | |
+ break; | |
+ } | |
+ } | |
+ retstr = string->str; | |
+ g_array_free(arr, TRUE); | |
+ g_string_free(string, FALSE); | |
+ g_string_free(tmpfmt, TRUE); | |
+ return retstr; | |
} | |
-gchar *dpg_strdup_printf(gchar *format, ...) { | |
- va_list ap; | |
- gchar *retstr; | |
- va_start(ap,format); | |
- retstr=HandleTFmt(format,ap); | |
- va_end(ap); | |
- return retstr; | |
+void dpg_print(gchar *format, ...) | |
+{ | |
+ va_list ap; | |
+ gchar *retstr; | |
+ | |
+ va_start(ap, format); | |
+ retstr = HandleTFmt(format, ap); | |
+ va_end(ap); | |
+ g_print(retstr); | |
+ g_free(retstr); | |
} | |
-void dpg_string_sprintf(GString *string, gchar *format, ...) { | |
- va_list ap; | |
- gchar *newstr; | |
- va_start(ap,format); | |
- newstr=HandleTFmt(format,ap); | |
- g_string_assign(string,newstr); | |
- g_free(newstr); | |
- va_end(ap); | |
+gchar *dpg_strdup_printf(gchar *format, ...) | |
+{ | |
+ va_list ap; | |
+ gchar *retstr; | |
+ | |
+ va_start(ap, format); | |
+ retstr = HandleTFmt(format, ap); | |
+ va_end(ap); | |
+ return retstr; | |
} | |
-void dpg_string_sprintfa(GString *string, gchar *format, ...) { | |
- va_list ap; | |
- gchar *newstr; | |
- va_start(ap,format); | |
- newstr=HandleTFmt(format,ap); | |
- g_string_append(string,newstr); | |
- g_free(newstr); | |
- va_end(ap); | |
+void dpg_string_sprintf(GString *string, gchar *format, ...) | |
+{ | |
+ va_list ap; | |
+ gchar *newstr; | |
+ | |
+ va_start(ap, format); | |
+ newstr = HandleTFmt(format, ap); | |
+ g_string_assign(string, newstr); | |
+ g_free(newstr); | |
+ va_end(ap); | |
+} | |
+ | |
+void dpg_string_sprintfa(GString *string, gchar *format, ...) | |
+{ | |
+ va_list ap; | |
+ gchar *newstr; | |
+ | |
+ va_start(ap, format); | |
+ newstr = HandleTFmt(format, ap); | |
+ g_string_append(string, newstr); | |
+ g_free(newstr); | |
+ va_end(ap); | |
} | |
diff --git a/src/tstring.h b/src/tstring.h | |
t@@ -1,22 +1,24 @@ | |
-/* tstring.h "Translated string" wrappers for dopewars */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * tstring.h "Translated string" wrappers for dopewars * | |
+ * 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 __TSTRING_H__ | |
#define __TSTRING_H__ | |
diff --git a/src/winmain.c b/src/winmain.c | |
t@@ -1,22 +1,24 @@ | |
-/* winmain.c Startup code and support for the Win32 platform */ | |
-/* 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. */ | |
+/************************************************************************ | |
+ * winmain.c Startup code and support for the Win32 platform * | |
+ * 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> | |
t@@ -41,103 +43,122 @@ | |
#include "gtkport.h" | |
#include "winmain.h" | |
-static void ServerLogMessage(const gchar *log_domain,GLogLevelFlags log_level, | |
- const gchar *message,gpointer user_data) { | |
- DWORD NumChar; | |
- GString *text; | |
- text=GetLogString(log_level,message); | |
- if (text) { | |
- g_string_append(text,"\n"); | |
- g_print(text->str); | |
-/* WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),text->str,strlen(text->str), | |
- &NumChar,NULL);*/ | |
- g_string_free(text,TRUE); | |
- } | |
+static void ServerLogMessage(const gchar *log_domain, | |
+ GLogLevelFlags log_level, | |
+ const gchar *message, gpointer user_data) | |
+{ | |
+ DWORD NumChar; | |
+ GString *text; | |
+ | |
+ text = GetLogString(log_level, message); | |
+ if (text) { | |
+ g_string_append(text, "\n"); | |
+ g_print(text->str); | |
+ g_string_free(text, TRUE); | |
+ } | |
} | |
-static void ServerPrintFunc(const gchar *string) { | |
- DWORD NumChar; | |
- WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),string,strlen(string), | |
- &NumChar,NULL); | |
+static void ServerPrintFunc(const gchar *string) | |
+{ | |
+ DWORD NumChar; | |
+ | |
+ WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), string, strlen(string), | |
+ &NumChar, NULL); | |
} | |
-static void LogMessage(const gchar *log_domain,GLogLevelFlags log_level, | |
- const gchar *message,gpointer user_data) { | |
- MessageBox(NULL,message,"Error",MB_OK|MB_ICONSTOP); | |
+static void LogMessage(const gchar *log_domain, GLogLevelFlags log_level, | |
+ const gchar *message, gpointer user_data) | |
+{ | |
+ MessageBox(NULL, message, "Error", MB_OK | MB_ICONSTOP); | |
} | |
-static GString *TextOutput=NULL; | |
+static GString *TextOutput = NULL; | |
-static void WindowPrintStart() { | |
- TextOutput=g_string_new(""); | |
+static void WindowPrintStart() | |
+{ | |
+ TextOutput = g_string_new(""); | |
} | |
-static void WindowPrintFunc(const gchar *string) { | |
- g_string_append(TextOutput,string); | |
+static void WindowPrintFunc(const gchar *string) | |
+{ | |
+ g_string_append(TextOutput, string); | |
} | |
-static void WindowPrintEnd() { | |
- MessageBox(NULL,TextOutput->str,"dopewars",MB_OK|MB_ICONINFORMATION); | |
- g_string_free(TextOutput,TRUE); | |
- TextOutput=NULL; | |
+static void WindowPrintEnd() | |
+{ | |
+ MessageBox(NULL, TextOutput->str, "dopewars", | |
+ MB_OK | MB_ICONINFORMATION); | |
+ g_string_free(TextOutput, TRUE); | |
+ TextOutput = NULL; | |
} | |
-static FILE *LogFile=NULL; | |
+static FILE *LogFile = NULL; | |
-static void LogFileStart() { | |
- LogFile=fopen("dopewars-log.txt","w"); | |
+static void LogFileStart() | |
+{ | |
+ LogFile = fopen("dopewars-log.txt", "w"); | |
} | |
-static void LogFilePrintFunc(const gchar *string) { | |
+static void LogFilePrintFunc(const gchar *string) | |
+{ | |
if (LogFile) { | |
- fprintf(LogFile,string); | |
+ fprintf(LogFile, string); | |
fflush(LogFile); | |
} | |
} | |
-static void LogFileEnd(void) { | |
- if (LogFile) fclose(LogFile); | |
+static void LogFileEnd(void) | |
+{ | |
+ if (LogFile) | |
+ fclose(LogFile); | |
} | |
-gchar *GetBinaryDir(void) { | |
- gchar *filename=NULL,*lastslash; | |
- gint filelen=80; | |
+gchar *GetBinaryDir(void) | |
+{ | |
+ gchar *filename = NULL, *lastslash; | |
+ gint filelen = 80; | |
DWORD retval; | |
- while(1) { | |
- filename = g_realloc(filename,filelen); | |
- filename[filelen-1]='\0'; | |
- retval = GetModuleFileName(NULL,filename,filelen); | |
+ while (1) { | |
+ filename = g_realloc(filename, filelen); | |
+ filename[filelen - 1] = '\0'; | |
+ retval = GetModuleFileName(NULL, filename, filelen); | |
- if (retval==0) { | |
- g_free(filename); filename=NULL; break; | |
- } else if (filename[filelen-1]) { | |
- filelen*=2; | |
- } else break; | |
+ if (retval == 0) { | |
+ g_free(filename); | |
+ filename = NULL; | |
+ break; | |
+ } else if (filename[filelen - 1]) { | |
+ filelen *= 2; | |
+ } else | |
+ break; | |
} | |
if (filename) { | |
- lastslash=strrchr(filename,'\\'); | |
- if (lastslash) *lastslash='\0'; | |
+ lastslash = strrchr(filename, '\\'); | |
+ if (lastslash) | |
+ *lastslash = '\0'; | |
} | |
return filename; | |
} | |
#ifdef ENABLE_NLS | |
-static gchar *GetWindowsLocale(void) { | |
+static gchar *GetWindowsLocale(void) | |
+{ | |
LCID userID; | |
- WORD lang,sublang; | |
- static gchar langenv[30]; /* Should only be 5 chars, so this'll be plenty */ | |
+ WORD lang, sublang; | |
+ static gchar langenv[30]; /* Should only be 5 chars, so | |
+ * this'll be plenty */ | |
gchar *oldlang; | |
- langenv[0]='\0'; | |
- strcpy(langenv,"LANG="); | |
+ langenv[0] = '\0'; | |
+ strcpy(langenv, "LANG="); | |
oldlang = getenv("LANG"); | |
if (oldlang) { | |
- g_print("Started with LANG = %s\n",oldlang); | |
+ g_print("Started with LANG = %s\n", oldlang); | |
return NULL; | |
} | |
t@@ -145,45 +166,53 @@ static gchar *GetWindowsLocale(void) { | |
lang = PRIMARYLANGID(LANGIDFROMLCID(userID)); | |
sublang = SUBLANGID(LANGIDFROMLCID(userID)); | |
- switch(lang) { | |
- case LANG_ENGLISH: | |
- strcat(langenv,"en"); | |
- if (sublang==SUBLANG_ENGLISH_UK) strcat(langenv,"_gb"); | |
- break; | |
- case LANG_FRENCH: | |
- strcat(langenv,"fr"); break; | |
- case LANG_GERMAN: | |
- strcat(langenv,"de"); break; | |
- case LANG_POLISH: | |
- strcat(langenv,"pl"); break; | |
- case LANG_PORTUGUESE: | |
- strcat(langenv,"pt"); | |
- if (sublang==SUBLANG_PORTUGUESE_BRAZILIAN) strcat(langenv,"_br"); | |
- break; | |
+ switch (lang) { | |
+ case LANG_ENGLISH: | |
+ strcat(langenv, "en"); | |
+ if (sublang == SUBLANG_ENGLISH_UK) | |
+ strcat(langenv, "_gb"); | |
+ break; | |
+ case LANG_FRENCH: | |
+ strcat(langenv, "fr"); | |
+ break; | |
+ case LANG_GERMAN: | |
+ strcat(langenv, "de"); | |
+ break; | |
+ case LANG_POLISH: | |
+ strcat(langenv, "pl"); | |
+ break; | |
+ case LANG_PORTUGUESE: | |
+ strcat(langenv, "pt"); | |
+ if (sublang == SUBLANG_PORTUGUESE_BRAZILIAN) | |
+ strcat(langenv, "_br"); | |
+ break; | |
} | |
if (strlen(langenv) > 5) { | |
- g_print("Using Windows language %s\n",langenv); | |
+ g_print("Using Windows language %s\n", langenv); | |
return langenv; | |
- } else return NULL; | |
+ } else | |
+ return NULL; | |
} | |
-#endif /* ENABLE_NLS */ | |
+#endif /* ENABLE_NLS */ | |
-int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, | |
- LPSTR lpszCmdParam,int nCmdShow) { | |
+int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, | |
+ LPSTR lpszCmdParam, int nCmdShow) | |
+{ | |
gchar **split; | |
int argc; | |
gboolean is_service; | |
gchar *modpath; | |
+ | |
#ifdef ENABLE_NLS | |
gchar *winlocale; | |
#endif | |
-/* Are we running as an NT service? */ | |
- is_service = (lpszCmdParam && strncmp(lpszCmdParam,"-N",2)==0); | |
+ /* Are we running as an NT service? */ | |
+ is_service = (lpszCmdParam && strncmp(lpszCmdParam, "-N", 2) == 0); | |
if (is_service) { | |
- modpath=GetBinaryDir(); | |
+ modpath = GetBinaryDir(); | |
SetCurrentDirectory(modpath); | |
g_free(modpath); | |
} | |
t@@ -191,34 +220,36 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrev… | |
LogFileStart(); | |
g_set_print_handler(LogFilePrintFunc); | |
- g_log_set_handler(NULL,LogMask()|G_LOG_LEVEL_MESSAGE,ServerLogMessage,NULL); | |
+ g_log_set_handler(NULL, LogMask() | G_LOG_LEVEL_MESSAGE, | |
+ ServerLogMessage, NULL); | |
if (!is_service) { | |
- g_log_set_handler(NULL,G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL, | |
- LogMessage,NULL); | |
+ g_log_set_handler(NULL, G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL, | |
+ LogMessage, NULL); | |
} | |
- | |
#ifdef ENABLE_NLS | |
- winlocale=GetWindowsLocale(); | |
- if (winlocale) putenv(winlocale); | |
+ winlocale = GetWindowsLocale(); | |
+ if (winlocale) | |
+ putenv(winlocale); | |
- setlocale(LC_ALL,""); | |
- bindtextdomain(PACKAGE,LOCALEDIR); | |
+ setlocale(LC_ALL, ""); | |
+ bindtextdomain(PACKAGE, LOCALEDIR); | |
textdomain(PACKAGE); | |
#endif | |
-/* Informational comment placed at the start of the Windows log file | |
- (this is used for messages printed during processing of the config | |
- files - under Unix these are just printed to stdout) */ | |
+ /* Informational comment placed at the start of the Windows log file | |
+ * (this is used for messages printed during processing of the config | |
+ * files - under Unix these are just printed to stdout) */ | |
g_print(_("# This is the dopewars startup log, containing any\n" | |
"# informative messages resulting from configuration\n" | |
"# file processing and the like.\n\n")); | |
- split=g_strsplit(lpszCmdParam," ",0); | |
- argc=0; | |
- while (split[argc] && split[argc][0]) argc++; | |
+ split = g_strsplit(lpszCmdParam, " ", 0); | |
+ argc = 0; | |
+ while (split[argc] && split[argc][0]) | |
+ argc++; | |
- GeneralStartup(argc,split); | |
+ GeneralStartup(argc, split); | |
OpenLog(); | |
if (WantVersion || WantHelp) { | |
WindowPrintStart(); | |
t@@ -228,8 +259,8 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevIn… | |
#ifdef NETWORKING | |
} else if (is_service) { | |
StartNetworking(); | |
- Network=Server=TRUE; | |
- win32_init(hInstance,hPrevInstance,"mainicon"); | |
+ Network = Server = TRUE; | |
+ win32_init(hInstance, hPrevInstance, "mainicon"); | |
ServiceMain(); | |
StopNetworking(); | |
#endif | |
t@@ -245,17 +276,17 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrev… | |
if (Server) { | |
#ifdef NETWORKING | |
#ifdef GUI_SERVER | |
- g_log_set_handler(NULL,G_LOG_LEVEL_CRITICAL,LogMessage,NULL); | |
- win32_init(hInstance,hPrevInstance,"mainicon"); | |
+ g_log_set_handler(NULL, G_LOG_LEVEL_CRITICAL, LogMessage, NULL); | |
+ win32_init(hInstance, hPrevInstance, "mainicon"); | |
GuiServerLoop(FALSE); | |
#else | |
AllocConsole(); | |
SetConsoleTitle(_("dopewars server")); | |
g_log_set_handler(NULL, | |
- LogMask()|G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING, | |
- ServerLogMessage,NULL); | |
+ LogMask() | G_LOG_LEVEL_MESSAGE | | |
+ G_LOG_LEVEL_WARNING, ServerLogMessage, NULL); | |
g_set_print_handler(ServerPrintFunc); | |
- newterm(NULL,NULL,NULL); | |
+ newterm(NULL, NULL, NULL); | |
ServerLoop(); | |
#endif /* GUI_SERVER */ | |
#else | |
t@@ -270,26 +301,26 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrev… | |
} else if (AIPlayer) { | |
AllocConsole(); | |
-/* Title of the Windows window used for AI player output */ | |
+ /* Title of the Windows window used for AI player output */ | |
SetConsoleTitle(_("dopewars AI")); | |
g_log_set_handler(NULL, | |
- LogMask()|G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING, | |
- ServerLogMessage,NULL); | |
+ LogMask() | G_LOG_LEVEL_MESSAGE | | |
+ G_LOG_LEVEL_WARNING, ServerLogMessage, NULL); | |
g_set_print_handler(ServerPrintFunc); | |
- newterm(NULL,NULL,NULL); | |
+ newterm(NULL, NULL, NULL); | |
AIPlayerLoop(); | |
- } else if (WantedClient==CLIENT_CURSES) { | |
+ } else if (WantedClient == CLIENT_CURSES) { | |
AllocConsole(); | |
SetConsoleTitle(_("dopewars")); | |
CursesLoop(); | |
} else { | |
#if GUI_CLIENT | |
- GtkLoop(hInstance,hPrevInstance); | |
+ GtkLoop(hInstance, hPrevInstance); | |
#else | |
g_print(_("No graphical client available - rebuild the binary\n" | |
- "passing the --enable-gui-client option to configure, or\n" | |
- "use the curses client (if available) instead!\n")); | |
+ "passing the --enable-gui-client option to configure, or\n" | |
+ "use the curses client (if available) instead!\n")); | |
#endif | |
} | |
#ifdef NETWORKING | |
diff --git a/src/winmain.h b/src/winmain.h | |
t@@ -1,23 +1,24 @@ | |
-/* winmain.h Startup code and support for the Win32 platform */ | |
-/* 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. */ | |
- | |
+/************************************************************************ | |
+ * winmain.h Startup code and support for the Win32 platform * | |
+ * 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 __WINMAIN_H__ | |
#define __WINMAIN_H__ | |
diff --git a/win32/guifunc.c b/win32/guifunc.c | |
t@@ -1,90 +1,103 @@ | |
-/* guifunc.c GUI-specific shared functions for installer */ | |
-/* Copyright (C) 2001 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. */ | |
+/************************************************************************ | |
+ * guifunc.c GUI-specific shared functions for installer * | |
+ * Copyright (C) 2001-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. * | |
+ ************************************************************************/ | |
#include <windows.h> | |
#include "guifunc.h" | |
-static LRESULT CALLBACK GtkSepProc(HWND hwnd,UINT msg,WPARAM wParam, | |
- LPARAM lParam) { | |
- PAINTSTRUCT ps; | |
- HPEN oldpen,dkpen,ltpen; | |
- RECT rect; | |
- HDC hDC; | |
- if (msg==WM_PAINT) { | |
- if (GetUpdateRect(hwnd,NULL,TRUE)) { | |
- BeginPaint(hwnd,&ps); | |
- GetClientRect(hwnd,&rect); | |
- hDC=ps.hdc; | |
- ltpen=CreatePen(PS_SOLID,0,(COLORREF)GetSysColor(COLOR_3DHILIGHT)); | |
- dkpen=CreatePen(PS_SOLID,0,(COLORREF)GetSysColor(COLOR_3DSHADOW)); | |
+static LRESULT CALLBACK GtkSepProc(HWND hwnd, UINT msg, WPARAM wParam, | |
+ LPARAM lParam) | |
+{ | |
+ PAINTSTRUCT ps; | |
+ HPEN oldpen, dkpen, ltpen; | |
+ RECT rect; | |
+ HDC hDC; | |
- if (rect.right > rect.bottom) { | |
- oldpen=SelectObject(hDC,dkpen); | |
- MoveToEx(hDC,rect.left,rect.top,NULL); | |
- LineTo(hDC,rect.right,rect.top); | |
+ if (msg == WM_PAINT) { | |
+ if (GetUpdateRect(hwnd, NULL, TRUE)) { | |
+ BeginPaint(hwnd, &ps); | |
+ GetClientRect(hwnd, &rect); | |
+ hDC = ps.hdc; | |
+ ltpen = CreatePen(PS_SOLID, 0, (COLORREF)GetSysColor(COLOR_3DHILIGHT)); | |
+ dkpen = CreatePen(PS_SOLID, 0, (COLORREF)GetSysColor(COLOR_3DSHADOW)); | |
- SelectObject(hDC,ltpen); | |
- MoveToEx(hDC,rect.left,rect.top+1,NULL); | |
- LineTo(hDC,rect.right,rect.top+1); | |
- } else { | |
- oldpen=SelectObject(hDC,dkpen); | |
- MoveToEx(hDC,rect.left,rect.top,NULL); | |
- LineTo(hDC,rect.left,rect.bottom); | |
+ if (rect.right > rect.bottom) { | |
+ oldpen = SelectObject(hDC, dkpen); | |
+ MoveToEx(hDC, rect.left, rect.top, NULL); | |
+ LineTo(hDC, rect.right, rect.top); | |
- SelectObject(hDC,ltpen); | |
- MoveToEx(hDC,rect.left+1,rect.top,NULL); | |
- LineTo(hDC,rect.left+1,rect.bottom); | |
- } | |
+ SelectObject(hDC, ltpen); | |
+ MoveToEx(hDC, rect.left, rect.top + 1, NULL); | |
+ LineTo(hDC, rect.right, rect.top + 1); | |
+ } else { | |
+ oldpen = SelectObject(hDC, dkpen); | |
+ MoveToEx(hDC, rect.left, rect.top, NULL); | |
+ LineTo(hDC, rect.left, rect.bottom); | |
- SelectObject(hDC,oldpen); | |
- DeleteObject(ltpen); DeleteObject(dkpen); | |
- EndPaint(hwnd,&ps); | |
+ SelectObject(hDC, ltpen); | |
+ MoveToEx(hDC, rect.left + 1, rect.top, NULL); | |
+ LineTo(hDC, rect.left + 1, rect.bottom); | |
} | |
- return TRUE; | |
- } else return DefWindowProc(hwnd,msg,wParam,lParam); | |
+ | |
+ SelectObject(hDC, oldpen); | |
+ DeleteObject(ltpen); | |
+ DeleteObject(dkpen); | |
+ EndPaint(hwnd, &ps); | |
+ } | |
+ return TRUE; | |
+ } else | |
+ return DefWindowProc(hwnd, msg, wParam, lParam); | |
} | |
-void RegisterSepClass(HINSTANCE hInstance) { | |
+void RegisterSepClass(HINSTANCE hInstance) | |
+{ | |
WNDCLASS wc; | |
- wc.style = CS_HREDRAW|CS_VREDRAW; | |
+ | |
+ wc.style = CS_HREDRAW | CS_VREDRAW; | |
wc.lpfnWndProc = GtkSepProc; | |
wc.cbClsExtra = 0; | |
wc.cbWndExtra = 0; | |
wc.hInstance = hInstance; | |
wc.hIcon = NULL; | |
- wc.hCursor = LoadCursor(NULL,IDC_ARROW); | |
- wc.hbrBackground = (HBRUSH)(1+COLOR_BTNFACE); | |
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
+ wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); | |
wc.lpszMenuName = NULL; | |
wc.lpszClassName = "WC_GTKSEP"; | |
RegisterClass(&wc); | |
} | |
-static BOOL CALLBACK enumFunc(HWND hWnd,LPARAM lParam) { | |
+static BOOL CALLBACK enumFunc(HWND hWnd, LPARAM lParam) | |
+{ | |
HFONT GuiFont; | |
- GuiFont=(HFONT)lParam; | |
- SendMessage(hWnd,WM_SETFONT,(WPARAM)GuiFont,MAKELPARAM(FALSE,0)); | |
+ | |
+ GuiFont = (HFONT)lParam; | |
+ SendMessage(hWnd, WM_SETFONT, (WPARAM)GuiFont, MAKELPARAM(FALSE, 0)); | |
return TRUE; | |
} | |
-void SetGuiFont(HWND hWnd) { | |
+void SetGuiFont(HWND hWnd) | |
+{ | |
HFONT GuiFont; | |
- GuiFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT); | |
- if (GuiFont) EnumChildWindows(hWnd,enumFunc,(LPARAM)GuiFont); | |
+ | |
+ GuiFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); | |
+ if (GuiFont) | |
+ EnumChildWindows(hWnd, enumFunc, (LPARAM)GuiFont); | |
} | |
diff --git a/win32/guifunc.h b/win32/guifunc.h | |
t@@ -1,22 +1,24 @@ | |
-/* guifunc.h GUI-specific shared functions for installer */ | |
-/* Copyright (C) 2001 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. */ | |
+/************************************************************************ | |
+ * guifunc.h GUI-specific shared functions for installer * | |
+ * Copyright (C) 2001-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. * | |
+ ************************************************************************/ | |
#include <windows.h> | |
diff --git a/win32/makeinstall.c b/win32/makeinstall.c | |
t@@ -1,68 +1,81 @@ | |
-/* makeinstall.c Program to create install data for setup.c */ | |
-/* Copyright (C) 2001 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. */ | |
+/************************************************************************ | |
+ * makeinstall.c Program to create install data for setup.c * | |
+ * Copyright (C) 2001-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. * | |
+ ************************************************************************/ | |
#include <windows.h> | |
#include <stdio.h> | |
#include "zlib/zlib.h" | |
#include "util.h" | |
-char *read_line(HANDLE hin) { | |
+char *read_line(HANDLE hin) | |
+{ | |
char *buf; | |
- int bufsize=32,strind=0; | |
+ int bufsize = 32, strind = 0; | |
DWORD bytes_read; | |
+ | |
buf = bmalloc(bufsize); | |
while (1) { | |
- if (!ReadFile(hin,&buf[strind],1,&bytes_read,NULL)) { | |
- printf("Read error\n"); break; | |
+ if (!ReadFile(hin, &buf[strind], 1, &bytes_read, NULL)) { | |
+ printf("Read error\n"); | |
+ break; | |
} | |
- if (bytes_read==0) { buf[strind]='\0'; break; } | |
- else if (buf[strind]=='\r') continue; | |
- else if (buf[strind]=='\n') { buf[strind++]='\0'; break; } | |
- else { | |
+ if (bytes_read == 0) { | |
+ buf[strind] = '\0'; | |
+ break; | |
+ } else if (buf[strind] == '\r') | |
+ continue; | |
+ else if (buf[strind] == '\n') { | |
+ buf[strind++] = '\0'; | |
+ break; | |
+ } else { | |
strind++; | |
- if (strind>=bufsize) { | |
- bufsize*=2; | |
- buf = brealloc(buf,bufsize); | |
+ if (strind >= bufsize) { | |
+ bufsize *= 2; | |
+ buf = brealloc(buf, bufsize); | |
} | |
} | |
} | |
- if (strind==0) { bfree(buf); return NULL; } | |
- else return buf; | |
+ if (strind == 0) { | |
+ bfree(buf); | |
+ return NULL; | |
+ } else | |
+ return buf; | |
} | |
-InstData *ReadInstallData() { | |
+InstData *ReadInstallData() | |
+{ | |
HANDLE fin; | |
- char *line,*line2,*line3,*line4; | |
- InstFiles *lastinst=NULL,*lastextra=NULL,*lastkeep=NULL; | |
- InstLink *lastmenu=NULL,*lastdesktop=NULL; | |
+ char *line, *line2, *line3, *line4; | |
+ InstFiles *lastinst = NULL, *lastextra = NULL, *lastkeep = NULL; | |
+ InstLink *lastmenu = NULL, *lastdesktop = NULL; | |
InstData *idata; | |
int i; | |
enum { | |
- S_PRODUCT=0,S_INSTDIR,S_INSTALL,S_EXTRA,S_KEEP,S_STARTMENUDIR, | |
- S_STARTMENU,S_DESKTOP,S_NTSERVICE, | |
- S_NONE | |
- } section=S_NONE; | |
+ S_PRODUCT = 0, S_INSTDIR, S_INSTALL, S_EXTRA, S_KEEP, S_STARTMENUDIR, | |
+ S_STARTMENU, S_DESKTOP, S_NTSERVICE, S_NONE | |
+ } section = S_NONE; | |
char *titles[S_NONE] = { | |
- "[product]","[instdir]", "[install]","[extrafiles]","[keepfiles]", | |
- "[startmenudir]","[startmenu]","[desktop]","[NT Service]" | |
+ "[product]", "[instdir]", "[install]", "[extrafiles]", "[keepfiles]", | |
+ "[startmenudir]", "[startmenu]", "[desktop]", "[NT Service]" | |
}; | |
idata = bmalloc(sizeof(InstData)); | |
t@@ -71,57 +84,73 @@ InstData *ReadInstallData() { | |
idata->startmenu = idata->desktop = NULL; | |
idata->service = NULL; | |
- fin = CreateFile("filelist",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | |
+ fin = CreateFile("filelist", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); | |
- if (fin!=INVALID_HANDLE_VALUE) { | |
+ if (fin != INVALID_HANDLE_VALUE) { | |
while (1) { | |
- line=read_line(fin); | |
- if (!line) break; | |
- if (line[0]=='\0') { bfree(line); continue; } | |
+ line = read_line(fin); | |
+ if (!line) | |
+ break; | |
+ if (line[0] == '\0') { | |
+ bfree(line); | |
+ continue; | |
+ } | |
- for (i=S_PRODUCT;i<S_NONE;i++) { | |
- if (strcmp(line,titles[i])==0) { | |
- section=i; break; | |
+ for (i = S_PRODUCT; i < S_NONE; i++) { | |
+ if (strcmp(line, titles[i]) == 0) { | |
+ section = i; | |
+ break; | |
} | |
} | |
- if (i<S_NONE) { bfree(line); continue; } | |
- | |
- switch(section) { | |
- case S_NONE: | |
- printf("Bad line %s\n",line); exit(1); | |
- case S_PRODUCT: | |
-printf("product ID = %s\n",line); | |
- idata->product = line; break; | |
- case S_INSTDIR: | |
-printf("install dir = %s\n",line); | |
- idata->installdir = line; break; | |
- case S_STARTMENUDIR: | |
-printf("start menu dir = %s\n",line); | |
- idata->startmenudir = line; break; | |
- case S_INSTALL: | |
- AddInstFiles(line,0,&lastinst,&idata->instfiles); | |
- break; | |
- case S_EXTRA: | |
- AddInstFiles(line,0,&lastextra,&idata->extrafiles); | |
- break; | |
- case S_KEEP: | |
- AddInstFiles(line,0,&lastkeep,&idata->keepfiles); | |
- break; | |
- case S_STARTMENU: | |
- line2=read_line(fin); line3=read_line(fin); | |
-printf("start menu entry = %s/%s/%s\n",line,line2,line3); | |
- AddInstLink(line,line2,line3,&lastmenu,&idata->startmenu); | |
- break; | |
- case S_NTSERVICE: | |
- line2=read_line(fin); line3=read_line(fin); line4=read_line(fin); | |
-printf("NT Service = %s/%s/%s/%s\n",line,line2,line3,line4); | |
- AddServiceDetails(line,line2,line3,line4,&idata->service); | |
- break; | |
- case S_DESKTOP: | |
- line2=read_line(fin); line3=read_line(fin); | |
-printf("desktop entry = %s/%s/%s\n",line,line2,line3); | |
- AddInstLink(line,line2,line3,&lastdesktop,&idata->desktop); | |
- break; | |
+ if (i < S_NONE) { | |
+ bfree(line); | |
+ continue; | |
+ } | |
+ | |
+ switch (section) { | |
+ case S_NONE: | |
+ printf("Bad line %s\n", line); | |
+ exit(1); | |
+ case S_PRODUCT: | |
+ printf("product ID = %s\n", line); | |
+ idata->product = line; | |
+ break; | |
+ case S_INSTDIR: | |
+ printf("install dir = %s\n", line); | |
+ idata->installdir = line; | |
+ break; | |
+ case S_STARTMENUDIR: | |
+ printf("start menu dir = %s\n", line); | |
+ idata->startmenudir = line; | |
+ break; | |
+ case S_INSTALL: | |
+ AddInstFiles(line, 0, &lastinst, &idata->instfiles); | |
+ break; | |
+ case S_EXTRA: | |
+ AddInstFiles(line, 0, &lastextra, &idata->extrafiles); | |
+ break; | |
+ case S_KEEP: | |
+ AddInstFiles(line, 0, &lastkeep, &idata->keepfiles); | |
+ break; | |
+ case S_STARTMENU: | |
+ line2 = read_line(fin); | |
+ line3 = read_line(fin); | |
+ printf("start menu entry = %s/%s/%s\n", line, line2, line3); | |
+ AddInstLink(line, line2, line3, &lastmenu, &idata->startmenu); | |
+ break; | |
+ case S_NTSERVICE: | |
+ line2 = read_line(fin); | |
+ line3 = read_line(fin); | |
+ line4 = read_line(fin); | |
+ printf("NT Service = %s/%s/%s/%s\n", line, line2, line3, line4); | |
+ AddServiceDetails(line, line2, line3, line4, &idata->service); | |
+ break; | |
+ case S_DESKTOP: | |
+ line2 = read_line(fin); | |
+ line3 = read_line(fin); | |
+ printf("desktop entry = %s/%s/%s\n", line, line2, line3); | |
+ AddInstLink(line, line2, line3, &lastdesktop, &idata->desktop); | |
+ break; | |
} | |
} | |
CloseHandle(fin); | |
t@@ -138,38 +167,47 @@ printf("desktop entry = %s/%s/%s\n",line,line2,line3); | |
#define BUFFER_SIZE (32*1024) | |
#define COMPRESSION Z_BEST_COMPRESSION | |
-void OpenNextFile(InstFiles *filelist,InstFiles **listpt,HANDLE *fin) { | |
- char *filename,*sep; | |
- if (*fin) CloseHandle(*fin); | |
- *fin=NULL; | |
+void OpenNextFile(InstFiles *filelist, InstFiles **listpt, HANDLE *fin) | |
+{ | |
+ char *filename, *sep; | |
+ | |
+ if (*fin) | |
+ CloseHandle(*fin); | |
+ *fin = NULL; | |
- if (!*listpt) *listpt = filelist; | |
- else *listpt = (*listpt)->next; | |
+ if (!*listpt) | |
+ *listpt = filelist; | |
+ else | |
+ *listpt = (*listpt)->next; | |
if (*listpt) { | |
filename = (*listpt)->filename; | |
- sep = strstr(filename," -> "); | |
- if (sep) *sep='\0'; | |
- *fin = CreateFile(filename,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | |
- if (sep) strcpy(filename,sep+4); | |
- if (*fin==INVALID_HANDLE_VALUE) printf("Cannot open file: %s\n",filename); | |
+ sep = strstr(filename, " -> "); | |
+ if (sep) | |
+ *sep = '\0'; | |
+ *fin = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); | |
+ if (sep) | |
+ strcpy(filename, sep + 4); | |
+ if (*fin == INVALID_HANDLE_VALUE) | |
+ printf("Cannot open file: %s\n", filename); | |
} | |
} | |
-int main() { | |
- HANDLE fout,fin; | |
- DWORD bytes_read,bytes_written; | |
+int main() | |
+{ | |
+ HANDLE fout, fin; | |
+ DWORD bytes_read, bytes_written; | |
InstData *idata; | |
InstFiles *filept; | |
- char *inbuf,*outbuf; | |
- int status,count; | |
+ char *inbuf, *outbuf; | |
+ int status, count; | |
bstr *str; | |
z_stream z; | |
- idata=ReadInstallData(); | |
+ idata = ReadInstallData(); | |
- fout = CreateFile("installfiles.gz",GENERIC_WRITE,0,NULL, | |
- CREATE_ALWAYS,0,NULL); | |
+ fout = CreateFile("installfiles.gz", GENERIC_WRITE, 0, NULL, | |
+ CREATE_ALWAYS, 0, NULL); | |
outbuf = bmalloc(BUFFER_SIZE); | |
inbuf = bmalloc(BUFFER_SIZE); | |
t@@ -177,40 +215,44 @@ int main() { | |
z.zalloc = Z_NULL; | |
z.zfree = Z_NULL; | |
z.opaque = Z_NULL; | |
- deflateInit(&z,COMPRESSION); | |
- z.avail_in=0; | |
+ deflateInit(&z, COMPRESSION); | |
+ z.avail_in = 0; | |
z.next_out = outbuf; | |
z.avail_out = BUFFER_SIZE; | |
- filept=NULL; | |
- fin=NULL; | |
- OpenNextFile(idata->instfiles,&filept,&fin); | |
- if (fin==INVALID_HANDLE_VALUE) { return 1; } | |
+ filept = NULL; | |
+ fin = NULL; | |
+ OpenNextFile(idata->instfiles, &filept, &fin); | |
+ if (fin == INVALID_HANDLE_VALUE) { | |
+ return 1; | |
+ } | |
- while (fin!=INVALID_HANDLE_VALUE) { | |
- if (z.avail_in==0) { | |
+ while (fin != INVALID_HANDLE_VALUE) { | |
+ if (z.avail_in == 0) { | |
z.next_in = inbuf; | |
- bytes_read=0; | |
+ bytes_read = 0; | |
while (!bytes_read && fin) { | |
- if (!ReadFile(fin,inbuf,BUFFER_SIZE,&bytes_read,NULL)) { | |
- printf("Read error\n"); break; | |
+ if (!ReadFile(fin, inbuf, BUFFER_SIZE, &bytes_read, NULL)) { | |
+ printf("Read error\n"); | |
+ break; | |
} | |
- filept->filesize+=bytes_read; | |
- if (!bytes_read) OpenNextFile(idata->instfiles,&filept,&fin); | |
+ filept->filesize += bytes_read; | |
+ if (!bytes_read) | |
+ OpenNextFile(idata->instfiles, &filept, &fin); | |
} | |
z.avail_in = bytes_read; | |
} | |
- if (z.avail_in==0) { | |
- status = deflate(&z,Z_FINISH); | |
+ if (z.avail_in == 0) { | |
+ status = deflate(&z, Z_FINISH); | |
count = BUFFER_SIZE - z.avail_out; | |
- if (!WriteFile(fout,outbuf,count,&bytes_written,NULL)) { | |
+ if (!WriteFile(fout, outbuf, count, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
break; | |
} | |
- status = deflate(&z,Z_NO_FLUSH); | |
+ status = deflate(&z, Z_NO_FLUSH); | |
count = BUFFER_SIZE - z.avail_out; | |
- if (!WriteFile(fout,outbuf,count,&bytes_written,NULL)) { | |
+ if (!WriteFile(fout, outbuf, count, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
z.next_out = outbuf; | |
t@@ -218,50 +260,52 @@ int main() { | |
} | |
printf("Written compressed data: raw %lu, compressed %lu\n", | |
- z.total_in,z.total_out); | |
+ z.total_in, z.total_out); | |
bytes_written = z.total_out; | |
deflateEnd(&z); | |
CloseHandle(fout); | |
- fout = CreateFile("manifest",GENERIC_WRITE,0,NULL, | |
- CREATE_ALWAYS,0,NULL); | |
- if (fout==INVALID_HANDLE_VALUE) printf("Cannot create file list\n"); | |
+ fout = CreateFile("manifest", GENERIC_WRITE, 0, NULL, | |
+ CREATE_ALWAYS, 0, NULL); | |
+ if (fout == INVALID_HANDLE_VALUE) | |
+ printf("Cannot create file list\n"); | |
- str=bstr_new(); | |
- bstr_setlength(str,0); | |
- bstr_append_long(str,bytes_written); | |
- if (!WriteFile(fout,str->text,str->length+1,&bytes_written,NULL)) { | |
+ str = bstr_new(); | |
+ bstr_setlength(str, 0); | |
+ bstr_append_long(str, bytes_written); | |
+ if (!WriteFile(fout, str->text, str->length + 1, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- if (!WriteFile(fout,idata->product,strlen(idata->product)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile(fout, idata->product, strlen(idata->product) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- if (!WriteFile(fout,idata->installdir,strlen(idata->installdir)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile(fout, idata->installdir, strlen(idata->installdir) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- if (!WriteFile(fout,idata->startmenudir,strlen(idata->startmenudir)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile | |
+ (fout, idata->startmenudir, strlen(idata->startmenudir) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- WriteFileList(fout,idata->instfiles); | |
- WriteFileList(fout,idata->extrafiles); | |
+ WriteFileList(fout, idata->instfiles); | |
+ WriteFileList(fout, idata->extrafiles); | |
- WriteLinkList(fout,idata->startmenu); | |
- WriteLinkList(fout,idata->desktop); | |
+ WriteLinkList(fout, idata->startmenu); | |
+ WriteLinkList(fout, idata->desktop); | |
- WriteServiceDetails(fout,idata->service); | |
- WriteFileList(fout,idata->keepfiles); | |
+ WriteServiceDetails(fout, idata->service); | |
+ WriteFileList(fout, idata->keepfiles); | |
CloseHandle(fout); | |
bfree(inbuf); | |
bfree(outbuf); | |
- FreeInstData(idata,TRUE); | |
+ FreeInstData(idata, TRUE); | |
return 0; | |
} | |
diff --git a/win32/setup.c b/win32/setup.c | |
t@@ -1,22 +1,24 @@ | |
-/* setup.c Simple Win32 installer for dopewars */ | |
-/* Copyright (C) 2001 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. */ | |
+/************************************************************************ | |
+ * setup.c Simple Win32 installer for dopewars * | |
+ * Copyright (C) 2001-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. * | |
+ ************************************************************************/ | |
#include <windows.h> | |
#include <commctrl.h> | |
t@@ -31,75 +33,79 @@ | |
#include "util.h" | |
typedef enum { | |
- DL_INTRO=0, DL_LICENCE,DL_SHORTCUTS,DL_INSTALLDIR,DL_DOINSTALL, | |
- DL_NUM | |
+ DL_INTRO = 0, | |
+ DL_LICENCE, DL_SHORTCUTS, DL_INSTALLDIR, DL_DOINSTALL, DL_NUM | |
} DialogType; | |
InstData *idata; | |
HWND mainDlg[DL_NUM]; | |
DialogType CurrentDialog; | |
-HINSTANCE hInst=NULL; | |
-char *oldversion=NULL; | |
+HINSTANCE hInst = NULL; | |
+char *oldversion = NULL; | |
BOOL services_supported, have_admin_rights, install_all_users; | |
DWORD WINAPI DoInstall(LPVOID lpParam); | |
-static void GetWinText(char **text,HWND hWnd); | |
+static void GetWinText(char **text, HWND hWnd); | |
static void FillFolderList(void); | |
-/* Does this OS version support NT services? If so, do we have the | |
+/* | |
+ * Does this OS version support NT services? If so, do we have the | |
* necessary (administrator) rights to use them? | |
*/ | |
-void ServiceCheck(BOOL *hasServices, BOOL *isAdmin) { | |
+void ServiceCheck(BOOL *hasServices, BOOL *isAdmin) | |
+{ | |
SC_HANDLE scManager; | |
- scManager = OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE); | |
+ scManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); | |
if (scManager) { | |
*hasServices = *isAdmin = TRUE; | |
CloseServiceHandle(scManager); | |
- } else if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) { | |
+ } else if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { | |
*hasServices = *isAdmin = FALSE; | |
} else { | |
*hasServices = TRUE; | |
*isAdmin = FALSE; | |
- } | |
+ } | |
} | |
-BOOL InstallService(InstData *idata) { | |
- SC_HANDLE scManager,scService; | |
+BOOL InstallService(InstData *idata) | |
+{ | |
+ SC_HANDLE scManager, scService; | |
HKEY key; | |
bstr *str; | |
static char keyprefix[] = "SYSTEM\\ControlSet001\\Services\\"; | |
NTService *service; | |
service = idata->service; | |
- if (!service) return FALSE; | |
+ if (!service) | |
+ return FALSE; | |
- scManager = OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE); | |
+ scManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); | |
if (!scManager) { | |
- DisplayError("Cannot connect to service manager",TRUE,FALSE); | |
+ DisplayError("Cannot connect to service manager", TRUE, FALSE); | |
return FALSE; | |
} | |
str = bstr_new(); | |
- bstr_assign(str,idata->installdir); | |
- bstr_appendpath(str,service->exe); | |
+ bstr_assign(str, idata->installdir); | |
+ bstr_appendpath(str, service->exe); | |
- scService = CreateService(scManager,service->name,service->display, | |
- SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS, | |
- SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL, | |
- str->text,NULL,NULL,NULL,NULL,NULL); | |
+ scService = CreateService(scManager, service->name, service->display, | |
+ SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, | |
+ SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, | |
+ str->text, NULL, NULL, NULL, NULL, NULL); | |
if (!scService) { | |
- DisplayError("Cannot create service",TRUE,FALSE); | |
- bstr_free(str,TRUE); | |
+ DisplayError("Cannot create service", TRUE, FALSE); | |
+ bstr_free(str, TRUE); | |
return FALSE; | |
} | |
- bstr_assign(str,keyprefix); | |
- bstr_append(str,service->name); | |
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,str->text,0,KEY_WRITE,&key) | |
- ==ERROR_SUCCESS) { | |
- RegSetValueEx(key,"Description",0,REG_SZ,service->description, | |
+ bstr_assign(str, keyprefix); | |
+ bstr_append(str, service->name); | |
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, str->text, | |
+ 0, KEY_WRITE, &key) == ERROR_SUCCESS) { | |
+ RegSetValueEx(key, "Description", 0, REG_SZ, service->description, | |
strlen(service->description)); | |
RegCloseKey(key); | |
} | |
t@@ -109,46 +115,54 @@ BOOL InstallService(InstData *idata) { | |
return TRUE; | |
} | |
-BOOL CheckCreateDir(void) { | |
-/* Checks that the install directory exists, and creates it if it does not. | |
- Returns TRUE if the directory is OK. */ | |
- | |
+/* | |
+ * Checks that the install directory exists, and creates it if it does not. | |
+ * Returns TRUE if the directory is OK. | |
+ */ | |
+BOOL CheckCreateDir(void) | |
+{ | |
char *instdir; | |
- GetWinText(&idata->installdir,GetDlgItem(mainDlg[DL_INSTALLDIR],ED_INSTDIR)); | |
- instdir=idata->installdir; | |
+ | |
+ GetWinText(&idata->installdir, | |
+ GetDlgItem(mainDlg[DL_INSTALLDIR], ED_INSTDIR)); | |
+ instdir = idata->installdir; | |
if (SetCurrentDirectory(instdir)) { | |
return TRUE; | |
} else { | |
if (MessageBox(mainDlg[CurrentDialog], | |
"The install directory does not exist.\n" | |
- "Create it?","Install Directory",MB_YESNO)==IDYES) { | |
+ "Create it?", "Install Directory", MB_YESNO) == IDYES) { | |
if (CreateWholeDirectory(instdir)) { | |
return TRUE; | |
} else { | |
- DisplayError("Could not create directory",TRUE,FALSE); | |
+ DisplayError("Could not create directory", TRUE, FALSE); | |
} | |
} | |
return FALSE; | |
} | |
} | |
-void ShowNewDialog(DialogType NewDialog) { | |
- RECT DeskRect,OurRect; | |
- int newX,newY; | |
+void ShowNewDialog(DialogType NewDialog) | |
+{ | |
+ RECT DeskRect, OurRect; | |
+ int newX, newY; | |
HWND hWnd; | |
HANDLE hThread; | |
DWORD threadID; | |
- if (NewDialog<0 || NewDialog>=DL_NUM) return; | |
+ | |
+ if (NewDialog < 0 || NewDialog >= DL_NUM) | |
+ return; | |
if (NewDialog > CurrentDialog) { | |
- switch(CurrentDialog) { | |
+ switch (CurrentDialog) { | |
case DL_INSTALLDIR: | |
- if (!CheckCreateDir()) return; | |
+ if (!CheckCreateDir()) | |
+ return; | |
break; | |
case DL_INTRO: | |
install_all_users = (services_supported | |
&& IsDlgButtonChecked(mainDlg[DL_INTRO], | |
- RB_ALLUSERS)==BST_CHECKED); | |
+ RB_ALLUSERS) == BST_CHECKED); | |
FillFolderList(); | |
break; | |
default: | |
t@@ -156,212 +170,253 @@ void ShowNewDialog(DialogType NewDialog) { | |
} | |
} | |
- hWnd=mainDlg[NewDialog]; | |
- if (GetWindowRect(hWnd,&OurRect) && | |
- GetWindowRect(GetDesktopWindow(),&DeskRect)) { | |
- newX = (DeskRect.left+DeskRect.right+OurRect.left-OurRect.right)/2; | |
- newY = (DeskRect.top+DeskRect.bottom+OurRect.top-OurRect.bottom)/2; | |
- SetWindowPos(hWnd,HWND_TOP,newX,newY,0,0,SWP_NOSIZE); | |
+ hWnd = mainDlg[NewDialog]; | |
+ if (GetWindowRect(hWnd, &OurRect) && | |
+ GetWindowRect(GetDesktopWindow(), &DeskRect)) { | |
+ newX = (DeskRect.left + DeskRect.right + OurRect.left - OurRect.right) / 2; | |
+ newY = (DeskRect.top + DeskRect.bottom + OurRect.top - OurRect.bottom) / 2; | |
+ SetWindowPos(hWnd, HWND_TOP, newX, newY, 0, 0, SWP_NOSIZE); | |
} | |
- ShowWindow(hWnd,SW_SHOW); | |
+ ShowWindow(hWnd, SW_SHOW); | |
- if (CurrentDialog!=DL_NUM) ShowWindow(mainDlg[CurrentDialog],SW_HIDE); | |
- CurrentDialog=NewDialog; | |
+ if (CurrentDialog != DL_NUM) | |
+ ShowWindow(mainDlg[CurrentDialog], SW_HIDE); | |
+ CurrentDialog = NewDialog; | |
- if (NewDialog==DL_DOINSTALL) { | |
- hThread = CreateThread(NULL,0,DoInstall,NULL,0,&threadID); | |
+ if (NewDialog == DL_DOINSTALL) { | |
+ hThread = CreateThread(NULL, 0, DoInstall, NULL, 0, &threadID); | |
} | |
} | |
-int CALLBACK BrowseCallback(HWND hwnd,UINT msg,LPARAM lParam,LPARAM lpData) { | |
- switch(msg) { | |
- case BFFM_INITIALIZED: | |
- SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)idata->installdir); | |
- break; | |
+int CALLBACK BrowseCallback(HWND hwnd, UINT msg, LPARAM lParam, | |
+ LPARAM lpData) | |
+{ | |
+ switch (msg) { | |
+ case BFFM_INITIALIZED: | |
+ SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)idata->installdir); | |
+ break; | |
} | |
return 0; | |
} | |
-void SelectInstDir(HWND parent) { | |
+void SelectInstDir(HWND parent) | |
+{ | |
BROWSEINFO bi = { 0 }; | |
TCHAR path[MAX_PATH]; | |
LPITEMIDLIST pidl; | |
- IMalloc *imalloc=0; | |
+ IMalloc *imalloc = 0; | |
if (SUCCEEDED(SHGetMalloc(&imalloc))) { | |
bi.lpszTitle = "Pick a directory"; | |
bi.pszDisplayName = path; | |
- bi.ulFlags = BIF_STATUSTEXT|BIF_RETURNONLYFSDIRS; | |
+ bi.ulFlags = BIF_STATUSTEXT | BIF_RETURNONLYFSDIRS; | |
bi.lpfn = BrowseCallback; | |
pidl = SHBrowseForFolder(&bi); | |
if (pidl) { | |
- if (SHGetPathFromIDList(pidl,path)) { | |
+ if (SHGetPathFromIDList(pidl, path)) { | |
bfree(idata->installdir); | |
idata->installdir = bstrdup(path); | |
- SendDlgItemMessage(mainDlg[DL_INSTALLDIR],ED_INSTDIR,WM_SETTEXT, | |
- 0,(LPARAM)idata->installdir); | |
+ SendDlgItemMessage(mainDlg[DL_INSTALLDIR], ED_INSTDIR, WM_SETTEXT, | |
+ 0, (LPARAM)idata->installdir); | |
} | |
- imalloc->lpVtbl->Free(imalloc,pidl); | |
+ imalloc->lpVtbl->Free(imalloc, pidl); | |
} | |
imalloc->lpVtbl->Release(imalloc); | |
} | |
} | |
-void ConditionalExit(HWND hWnd) { | |
- if (MessageBox(hWnd,"This will exit without installing any new software on " | |
+void ConditionalExit(HWND hWnd) | |
+{ | |
+ if (MessageBox(hWnd, | |
+ "This will exit without installing any new software on " | |
"your machine.\nAre you sure you want to quit?\n\n(You can " | |
"continue the installation at a\nlater date simply by " | |
- "running this program again.)","Exit Install", | |
- MB_YESNO|MB_ICONQUESTION)==IDYES) { | |
+ "running this program again.)", "Exit Install", | |
+ MB_YESNO | MB_ICONQUESTION) == IDYES) { | |
PostQuitMessage(0); | |
} | |
} | |
-void UpdateStartMenuFolder(void) { | |
+void UpdateStartMenuFolder(void) | |
+{ | |
char *buf; | |
HWND folderlist; | |
LRESULT lres; | |
int selind; | |
- folderlist = GetDlgItem(mainDlg[DL_SHORTCUTS],LB_FOLDLIST); | |
- if (!folderlist) return; | |
+ folderlist = GetDlgItem(mainDlg[DL_SHORTCUTS], LB_FOLDLIST); | |
+ if (!folderlist) | |
+ return; | |
- lres=SendMessage(folderlist,LB_GETCURSEL,0,0); | |
- if (lres==LB_ERR) return; | |
+ lres = SendMessage(folderlist, LB_GETCURSEL, 0, 0); | |
+ if (lres == LB_ERR) | |
+ return; | |
- selind=(int)lres; | |
- lres=SendMessage(folderlist,LB_GETTEXTLEN,(WPARAM)selind,0); | |
- if (lres==LB_ERR) return; | |
+ selind = (int)lres; | |
+ lres = SendMessage(folderlist, LB_GETTEXTLEN, (WPARAM)selind, 0); | |
+ if (lres == LB_ERR) | |
+ return; | |
- buf = bmalloc(lres+1); | |
- lres=SendMessage(folderlist,LB_GETTEXT,(WPARAM)selind,(LPARAM)buf); | |
- if (lres!=LB_ERR) { | |
- SendDlgItemMessage(mainDlg[DL_SHORTCUTS],ED_FOLDER,WM_SETTEXT, | |
- 0,(LPARAM)buf); | |
+ buf = bmalloc(lres + 1); | |
+ lres = SendMessage(folderlist, LB_GETTEXT, (WPARAM)selind, (LPARAM)buf); | |
+ if (lres != LB_ERR) { | |
+ SendDlgItemMessage(mainDlg[DL_SHORTCUTS], ED_FOLDER, WM_SETTEXT, | |
+ 0, (LPARAM)buf); | |
} | |
bfree(buf); | |
} | |
-BOOL CALLBACK MainDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { | |
- switch(msg) { | |
- case WM_INITDIALOG: | |
- return TRUE; | |
- case WM_COMMAND: | |
- if (HIWORD(wParam)==BN_CLICKED && lParam) { | |
- switch(LOWORD(wParam)) { | |
- case BT_CANCEL: ConditionalExit(hWnd); break; | |
- case BT_NEXT: ShowNewDialog(CurrentDialog+1); break; | |
- case BT_BACK: ShowNewDialog(CurrentDialog-1); break; | |
- case BT_FINISH: PostQuitMessage(0); break; | |
- case BT_BROWSE: SelectInstDir(hWnd); break; | |
- } | |
- } else if (HIWORD(wParam)==LBN_SELCHANGE && lParam && | |
- LOWORD(wParam)==LB_FOLDLIST) { | |
- UpdateStartMenuFolder(); | |
+BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, | |
+ LPARAM lParam) | |
+{ | |
+ switch (msg) { | |
+ case WM_INITDIALOG: | |
+ return TRUE; | |
+ case WM_COMMAND: | |
+ if (HIWORD(wParam) == BN_CLICKED && lParam) { | |
+ switch (LOWORD(wParam)) { | |
+ case BT_CANCEL: | |
+ ConditionalExit(hWnd); | |
+ break; | |
+ case BT_NEXT: | |
+ ShowNewDialog(CurrentDialog + 1); | |
+ break; | |
+ case BT_BACK: | |
+ ShowNewDialog(CurrentDialog - 1); | |
+ break; | |
+ case BT_FINISH: | |
+ PostQuitMessage(0); | |
+ break; | |
+ case BT_BROWSE: | |
+ SelectInstDir(hWnd); | |
+ break; | |
} | |
- break; | |
- case WM_CLOSE: | |
- ConditionalExit(hWnd); | |
- return TRUE; | |
+ } else if (HIWORD(wParam) == LBN_SELCHANGE && lParam && | |
+ LOWORD(wParam) == LB_FOLDLIST) { | |
+ UpdateStartMenuFolder(); | |
+ } | |
+ break; | |
+ case WM_CLOSE: | |
+ ConditionalExit(hWnd); | |
+ return TRUE; | |
} | |
return FALSE; | |
} | |
-LPVOID GetResource(LPCTSTR resname,LPCTSTR restype) { | |
+LPVOID GetResource(LPCTSTR resname, LPCTSTR restype) | |
+{ | |
HRSRC hrsrc; | |
HGLOBAL hglobal; | |
LPVOID respt; | |
- hrsrc = FindResource(NULL,resname,restype); | |
- if (!hrsrc) DisplayError("Could not find resource",TRUE,TRUE); | |
+ hrsrc = FindResource(NULL, resname, restype); | |
+ if (!hrsrc) | |
+ DisplayError("Could not find resource", TRUE, TRUE); | |
- hglobal = LoadResource(NULL,hrsrc); | |
- if (!hglobal) DisplayError("Could not load resource",TRUE,TRUE); | |
+ hglobal = LoadResource(NULL, hrsrc); | |
+ if (!hglobal) | |
+ DisplayError("Could not load resource", TRUE, TRUE); | |
respt = LockResource(hglobal); | |
- if (!respt) DisplayError("Could not lock resource",TRUE,TRUE); | |
+ if (!respt) | |
+ DisplayError("Could not lock resource", TRUE, TRUE); | |
return respt; | |
} | |
-InstData *ReadInstData() { | |
- InstFiles *lastinst=NULL,*lastextra=NULL,*lastkeep=NULL; | |
- InstLink *lastmenu=NULL,*lastdesktop=NULL; | |
- char *instdata,*pt,*filename,*line2,*line3,*line4; | |
+InstData *ReadInstData() | |
+{ | |
+ InstFiles *lastinst = NULL, *lastextra = NULL, *lastkeep = NULL; | |
+ InstLink *lastmenu = NULL, *lastdesktop = NULL; | |
+ char *instdata, *pt, *filename, *line2, *line3, *line4; | |
DWORD filesize; | |
InstData *idata; | |
- instdata = GetResource(MAKEINTRESOURCE(0),"INSTLIST"); | |
- if (!instdata) return NULL; | |
+ instdata = GetResource(MAKEINTRESOURCE(0), "INSTLIST"); | |
+ if (!instdata) | |
+ return NULL; | |
- pt=instdata; | |
+ pt = instdata; | |
idata = bmalloc(sizeof(InstData)); | |
idata->flags = 0; | |
idata->service = NULL; | |
idata->totalsize = atol(pt); | |
- pt += strlen(pt)+1; | |
+ pt += strlen(pt) + 1; | |
idata->product = bstrdup(pt); | |
- pt += strlen(pt)+1; | |
+ pt += strlen(pt) + 1; | |
idata->installdir = bstrdup(pt); | |
- pt += strlen(pt)+1; | |
+ pt += strlen(pt) + 1; | |
idata->startmenudir = bstrdup(pt); | |
- pt += strlen(pt)+1; | |
+ pt += strlen(pt) + 1; | |
while (1) { | |
- filename=pt; | |
- pt += strlen(pt)+1; | |
+ filename = pt; | |
+ pt += strlen(pt) + 1; | |
if (filename[0]) { | |
- filesize=atol(pt); | |
- pt += strlen(pt)+1; | |
- AddInstFiles(filename,filesize,&lastinst,&idata->instfiles); | |
- } else break; | |
+ filesize = atol(pt); | |
+ pt += strlen(pt) + 1; | |
+ AddInstFiles(filename, filesize, &lastinst, &idata->instfiles); | |
+ } else | |
+ break; | |
} | |
while (1) { | |
- filename=pt; | |
- pt += strlen(pt)+1; | |
+ filename = pt; | |
+ pt += strlen(pt) + 1; | |
if (filename[0]) { | |
- filesize=atol(pt); | |
- pt += strlen(pt)+1; | |
- AddInstFiles(filename,filesize,&lastextra,&idata->extrafiles); | |
- } else break; | |
+ filesize = atol(pt); | |
+ pt += strlen(pt) + 1; | |
+ AddInstFiles(filename, filesize, &lastextra, &idata->extrafiles); | |
+ } else | |
+ break; | |
} | |
while (1) { | |
- filename=pt; | |
- pt += strlen(pt)+1; | |
+ filename = pt; | |
+ pt += strlen(pt) + 1; | |
if (filename[0]) { | |
- line2=pt; pt += strlen(pt)+1; | |
- line3=pt; pt += strlen(pt)+1; | |
- AddInstLink(filename,line2,line3,&lastmenu,&idata->startmenu); | |
- } else break; | |
+ line2 = pt; | |
+ pt += strlen(pt) + 1; | |
+ line3 = pt; | |
+ pt += strlen(pt) + 1; | |
+ AddInstLink(filename, line2, line3, &lastmenu, &idata->startmenu); | |
+ } else | |
+ break; | |
} | |
while (1) { | |
- filename=pt; | |
- pt += strlen(pt)+1; | |
+ filename = pt; | |
+ pt += strlen(pt) + 1; | |
if (filename[0]) { | |
- line2=pt; pt += strlen(pt)+1; | |
- line3=pt; pt += strlen(pt)+1; | |
- AddInstLink(filename,line2,line3,&lastdesktop,&idata->desktop); | |
- } else break; | |
+ line2 = pt; | |
+ pt += strlen(pt) + 1; | |
+ line3 = pt; | |
+ pt += strlen(pt) + 1; | |
+ AddInstLink(filename, line2, line3, &lastdesktop, &idata->desktop); | |
+ } else | |
+ break; | |
} | |
- filename=pt; pt += strlen(pt)+1; | |
+ filename = pt; | |
+ pt += strlen(pt) + 1; | |
if (filename[0]) { | |
- line2=pt; pt += strlen(pt)+1; | |
- line3=pt; pt += strlen(pt)+1; | |
- line4=pt; pt += strlen(pt)+1; | |
- AddServiceDetails(filename,line2,line3,line4,&idata->service); | |
+ line2 = pt; | |
+ pt += strlen(pt) + 1; | |
+ line3 = pt; | |
+ pt += strlen(pt) + 1; | |
+ line4 = pt; | |
+ pt += strlen(pt) + 1; | |
+ AddServiceDetails(filename, line2, line3, line4, &idata->service); | |
} | |
while (1) { | |
- filename=pt; | |
- pt += strlen(pt)+1; | |
+ filename = pt; | |
+ pt += strlen(pt) + 1; | |
if (filename[0]) { | |
- filesize=atol(pt); | |
- pt += strlen(pt)+1; | |
- AddInstFiles(filename,filesize,&lastkeep,&idata->keepfiles); | |
- } else break; | |
+ filesize = atol(pt); | |
+ pt += strlen(pt) + 1; | |
+ AddInstFiles(filename, filesize, &lastkeep, &idata->keepfiles); | |
+ } else | |
+ break; | |
} | |
return idata; | |
t@@ -369,19 +424,22 @@ InstData *ReadInstData() { | |
#define BUFFER_SIZE (32*1024) | |
-char *GetFirstFile(InstFiles *filelist,DWORD totalsize) { | |
+char *GetFirstFile(InstFiles *filelist, DWORD totalsize) | |
+{ | |
DWORD bufsiz; | |
- char *inbuf,*outbuf; | |
+ char *inbuf, *outbuf; | |
int status; | |
z_stream z; | |
- if (!filelist) return NULL; | |
+ if (!filelist) | |
+ return NULL; | |
- inbuf = GetResource(MAKEINTRESOURCE(1),"INSTFILE"); | |
- if (!inbuf) return NULL; | |
+ inbuf = GetResource(MAKEINTRESOURCE(1), "INSTFILE"); | |
+ if (!inbuf) | |
+ return NULL; | |
bufsiz = filelist->filesize; | |
- outbuf = bmalloc(bufsiz+1); | |
+ outbuf = bmalloc(bufsiz + 1); | |
z.zalloc = Z_NULL; | |
z.zfree = Z_NULL; | |
t@@ -394,390 +452,428 @@ char *GetFirstFile(InstFiles *filelist,DWORD totalsize… | |
z.avail_out = bufsiz; | |
while (1) { | |
- status = inflate(&z,Z_SYNC_FLUSH); | |
- if ((status!=Z_OK && status!=Z_STREAM_END) || z.avail_out==0) break; | |
+ status = inflate(&z, Z_SYNC_FLUSH); | |
+ if ((status != Z_OK && status != Z_STREAM_END) || z.avail_out == 0) | |
+ break; | |
} | |
inflateEnd(&z); | |
- outbuf[bufsiz]='\0'; | |
+ outbuf[bufsiz] = '\0'; | |
return outbuf; | |
} | |
-BOOL OpenNextOutput(HANDLE *fout,InstFiles *filelist,InstFiles *keepfiles, | |
- InstFiles **listpt,DWORD *fileleft,HANDLE logf, | |
- BOOL *skipfile) { | |
- char *filename,*sep; | |
+BOOL OpenNextOutput(HANDLE *fout, InstFiles *filelist, | |
+ InstFiles *keepfiles, InstFiles **listpt, | |
+ DWORD *fileleft, HANDLE logf, BOOL *skipfile) | |
+{ | |
+ char *filename, *sep; | |
bstr *str; | |
InstFiles *keeppt; | |
DWORD bytes_written; | |
- *skipfile=FALSE; | |
+ *skipfile = FALSE; | |
- if (*fout) CloseHandle(*fout); | |
+ if (*fout) | |
+ CloseHandle(*fout); | |
*fout = INVALID_HANDLE_VALUE; | |
- str=bstr_new(); | |
+ str = bstr_new(); | |
if (*listpt) { | |
- if (!WriteFile(logf,(*listpt)->filename,strlen((*listpt)->filename)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile | |
+ (logf, (*listpt)->filename, strlen((*listpt)->filename) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- bstr_setlength(str,0); | |
- bstr_append_long(str,(*listpt)->filesize); | |
- if (!WriteFile(logf,str->text,str->length+1,&bytes_written,NULL)) { | |
+ bstr_setlength(str, 0); | |
+ bstr_append_long(str, (*listpt)->filesize); | |
+ if (!WriteFile(logf, str->text, str->length + 1, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- *listpt=(*listpt)->next; | |
- } else *listpt = filelist; | |
+ *listpt = (*listpt)->next; | |
+ } else | |
+ *listpt = filelist; | |
if (*listpt) { | |
filename = (*listpt)->filename; | |
- sep = strrchr(filename,'\\'); | |
+ sep = strrchr(filename, '\\'); | |
if (sep) { | |
*sep = '\0'; | |
CreateWholeDirectory(filename); | |
*sep = '\\'; | |
} | |
keeppt = keepfiles; | |
- while (keeppt && strcmp(keeppt->filename,filename)!=0) keeppt=keeppt->next; | |
+ while (keeppt && strcmp(keeppt->filename, filename) != 0) | |
+ keeppt = keeppt->next; | |
-/* If the file is already installed (filesize!=0), then skip it */ | |
- if (keeppt && keeppt->filesize!=0) { | |
- *fout = INVALID_HANDLE_VALUE+1; /* Make sure the handle is valid */ | |
+ /* If the file is already installed (filesize!=0), then skip it */ | |
+ if (keeppt && keeppt->filesize != 0) { | |
+ *fout = INVALID_HANDLE_VALUE + 1; /* Make sure the handle is valid */ | |
*skipfile = TRUE; | |
} else { | |
- *fout = CreateFile(filename,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL); | |
- bstr_assign(str,"Installing file: "); | |
- bstr_append(str,filename); | |
- bstr_append(str," (size "); | |
- bstr_append_long(str,(*listpt)->filesize); | |
- bstr_append(str,")"); | |
- SendDlgItemMessage(mainDlg[DL_DOINSTALL],ST_FILELIST, | |
- WM_SETTEXT,0,(LPARAM)str->text); | |
- if (*fout==INVALID_HANDLE_VALUE) { | |
- bstr_assign(str,"Cannot create file "); | |
- bstr_append(str,filename); | |
- DisplayError(str->text,TRUE,FALSE); | |
+ *fout = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, | |
+ 0, NULL); | |
+ bstr_assign(str, "Installing file: "); | |
+ bstr_append(str, filename); | |
+ bstr_append(str, " (size "); | |
+ bstr_append_long(str, (*listpt)->filesize); | |
+ bstr_append(str, ")"); | |
+ SendDlgItemMessage(mainDlg[DL_DOINSTALL], ST_FILELIST, | |
+ WM_SETTEXT, 0, (LPARAM)str->text); | |
+ if (*fout == INVALID_HANDLE_VALUE) { | |
+ bstr_assign(str, "Cannot create file "); | |
+ bstr_append(str, filename); | |
+ DisplayError(str->text, TRUE, FALSE); | |
} | |
} | |
*fileleft = (*listpt)->filesize; | |
} | |
- bstr_free(str,TRUE); | |
+ bstr_free(str, TRUE); | |
- return (*fout!=INVALID_HANDLE_VALUE); | |
+ return (*fout != INVALID_HANDLE_VALUE); | |
} | |
-HRESULT CreateLink(LPCSTR origPath,LPSTR linkArgs,LPSTR workDir, | |
- LPSTR linkPath,LPSTR linkDesc) { | |
+HRESULT CreateLink(LPCSTR origPath, LPSTR linkArgs, LPSTR workDir, | |
+ LPSTR linkPath, LPSTR linkDesc) | |
+{ | |
HRESULT hres; | |
IShellLink *psl; | |
IPersistFile *ppf; | |
WORD wsz[MAX_PATH]; | |
- hres = CoCreateInstance(&CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER, | |
- &IID_IShellLink,(void **)&psl); | |
+ hres = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, | |
+ &IID_IShellLink, (void **)&psl); | |
if (SUCCEEDED(hres)) { | |
- psl->lpVtbl->SetPath(psl,origPath); | |
- if (workDir) psl->lpVtbl->SetWorkingDirectory(psl,workDir); | |
- if (linkDesc) psl->lpVtbl->SetDescription(psl,linkDesc); | |
- if (linkArgs) psl->lpVtbl->SetArguments(psl,linkArgs); | |
- hres = psl->lpVtbl->QueryInterface(psl,&IID_IPersistFile,(void **)&ppf); | |
+ psl->lpVtbl->SetPath(psl, origPath); | |
+ if (workDir) | |
+ psl->lpVtbl->SetWorkingDirectory(psl, workDir); | |
+ if (linkDesc) | |
+ psl->lpVtbl->SetDescription(psl, linkDesc); | |
+ if (linkArgs) | |
+ psl->lpVtbl->SetArguments(psl, linkArgs); | |
+ hres = psl->lpVtbl->QueryInterface(psl, &IID_IPersistFile, (void **)&ppf); | |
if (SUCCEEDED(hres)) { | |
- MultiByteToWideChar(CP_ACP,0,linkPath,-1,wsz,MAX_PATH); | |
- hres = ppf->lpVtbl->Save(ppf,wsz,TRUE); | |
+ MultiByteToWideChar(CP_ACP, 0, linkPath, -1, wsz, MAX_PATH); | |
+ hres = ppf->lpVtbl->Save(ppf, wsz, TRUE); | |
ppf->lpVtbl->Release(ppf); | |
} else { | |
- DisplayError("Cannot write shortcut",FALSE,FALSE); | |
+ DisplayError("Cannot write shortcut", FALSE, FALSE); | |
} | |
psl->lpVtbl->Release(psl); | |
} else { | |
- DisplayError("Cannot create shortcut",FALSE,FALSE); | |
+ DisplayError("Cannot create shortcut", FALSE, FALSE); | |
} | |
return hres; | |
} | |
-void GetWinText(char **text,HWND hWnd) { | |
+void GetWinText(char **text, HWND hWnd) | |
+{ | |
int textlen; | |
- bfree(*text); | |
- *text=NULL; | |
- if (!hWnd) return; | |
- textlen=GetWindowTextLength(hWnd)+1; | |
- if (!textlen) return; | |
- | |
- *text=bmalloc(textlen); | |
- if (!GetWindowText(hWnd,*text,textlen)) { | |
- bfree(*text); *text=NULL; | |
+ bfree(*text); | |
+ *text = NULL; | |
+ if (!hWnd) | |
+ return; | |
+ | |
+ textlen = GetWindowTextLength(hWnd) + 1; | |
+ if (!textlen) | |
+ return; | |
+ | |
+ *text = bmalloc(textlen); | |
+ if (!GetWindowText(hWnd, *text, textlen)) { | |
+ bfree(*text); | |
+ *text = NULL; | |
} | |
} | |
-void CreateLinks(char *linkdir,InstLink *linkpt) { | |
- bstr *linkpath,*origfile; | |
+void CreateLinks(char *linkdir, InstLink *linkpt) | |
+{ | |
+ bstr *linkpath, *origfile; | |
- linkpath=bstr_new(); | |
- origfile=bstr_new(); | |
+ linkpath = bstr_new(); | |
+ origfile = bstr_new(); | |
- for (;linkpt;linkpt=linkpt->next) { | |
- bstr_assign(linkpath,linkdir); | |
- bstr_appendpath(linkpath,linkpt->linkfile); | |
+ for (; linkpt; linkpt = linkpt->next) { | |
+ bstr_assign(linkpath, linkdir); | |
+ bstr_appendpath(linkpath, linkpt->linkfile); | |
- bstr_assign(origfile,idata->installdir); | |
- bstr_appendpath(origfile,linkpt->origfile); | |
+ bstr_assign(origfile, idata->installdir); | |
+ bstr_appendpath(origfile, linkpt->origfile); | |
- CreateLink(origfile->text,linkpt->args,idata->installdir, | |
- linkpath->text,NULL); | |
+ CreateLink(origfile->text, linkpt->args, idata->installdir, | |
+ linkpath->text, NULL); | |
} | |
} | |
-void SetupShortcuts(HANDLE fout) { | |
- char *startmenu,*desktop; | |
+void SetupShortcuts(HANDLE fout) | |
+{ | |
+ char *startmenu, *desktop; | |
BOOL dodesktop; | |
startmenu = GetStartMenuDir(install_all_users, idata); | |
desktop = GetDesktopDir(); | |
- dodesktop=(IsDlgButtonChecked(mainDlg[DL_SHORTCUTS],CB_DESKTOP)==BST_CHECKED… | |
+ dodesktop = | |
+ (IsDlgButtonChecked(mainDlg[DL_SHORTCUTS], CB_DESKTOP) == | |
+ BST_CHECKED); | |
if (startmenu) { | |
- if (CreateDirectory(startmenu,NULL)) { | |
- CreateLinks(startmenu,idata->startmenu); | |
- WriteLinkList(fout,idata->startmenu); | |
+ if (CreateDirectory(startmenu, NULL)) { | |
+ CreateLinks(startmenu, idata->startmenu); | |
+ WriteLinkList(fout, idata->startmenu); | |
} else { | |
- DisplayError("Could not create Start Menu directory",TRUE,FALSE); | |
- WriteLinkList(fout,NULL); | |
+ DisplayError("Could not create Start Menu directory", TRUE, FALSE); | |
+ WriteLinkList(fout, NULL); | |
} | |
} else { | |
- WriteLinkList(fout,NULL); | |
+ WriteLinkList(fout, NULL); | |
} | |
if (dodesktop && desktop) { | |
- CreateLinks(desktop,idata->desktop); | |
- WriteLinkList(fout,idata->desktop); | |
+ CreateLinks(desktop, idata->desktop); | |
+ WriteLinkList(fout, idata->desktop); | |
} else { | |
- WriteLinkList(fout,NULL); | |
+ WriteLinkList(fout, NULL); | |
} | |
- bfree(startmenu); bfree(desktop); | |
+ bfree(startmenu); | |
+ bfree(desktop); | |
} | |
-void SetupUninstall() { | |
+void SetupUninstall() | |
+{ | |
HKEY key; | |
DWORD disp; | |
- bstr *str,*uninstexe,*link; | |
- BOOL haveuninstall=FALSE; | |
+ bstr *str, *uninstexe, *link; | |
+ BOOL haveuninstall = FALSE; | |
char *startmenu; | |
InstFiles *listpt; | |
- for (listpt=idata->instfiles;listpt;listpt=listpt->next) { | |
- if (strcmp(listpt->filename,"uninstall.exe")==0) { | |
- haveuninstall=TRUE; | |
+ for (listpt = idata->instfiles; listpt; listpt = listpt->next) { | |
+ if (strcmp(listpt->filename, "uninstall.exe") == 0) { | |
+ haveuninstall = TRUE; | |
break; | |
} | |
} | |
- if (!haveuninstall) return; | |
+ if (!haveuninstall) | |
+ return; | |
+ | |
+ str = bstr_new(); | |
+ uninstexe = bstr_new(); | |
+ link = bstr_new(); | |
- str=bstr_new(); | |
- uninstexe=bstr_new(); | |
- link=bstr_new(); | |
+ bstr_assign(str, UninstallKey); | |
+ bstr_appendpath(str, idata->product); | |
- bstr_assign(str,UninstallKey); | |
- bstr_appendpath(str,idata->product); | |
- | |
- if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,str->text,0,NULL,0, | |
- KEY_WRITE,NULL,&key,&disp)==ERROR_SUCCESS) { | |
- RegSetValueEx(key,"DisplayName",0,REG_SZ,idata->product, | |
+ if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, str->text, 0, NULL, 0, | |
+ KEY_WRITE, NULL, &key, &disp) == ERROR_SUCCESS) { | |
+ RegSetValueEx(key, "DisplayName", 0, REG_SZ, idata->product, | |
strlen(idata->product)); | |
bstr_assign_windir(str); | |
- bstr_appendpath(str,UninstallEXE); | |
- bstr_append_c(str,' '); | |
- bstr_append(str,idata->product); | |
- RegSetValueEx(key,"UninstallString",0,REG_SZ,str->text,str->length); | |
- bstr_assign(str,idata->installdir); | |
- RegSetValueEx(key,"InstallDirectory",0,REG_SZ,str->text,str->length); | |
+ bstr_appendpath(str, UninstallEXE); | |
+ bstr_append_c(str, ' '); | |
+ bstr_append(str, idata->product); | |
+ RegSetValueEx(key, "UninstallString", 0, REG_SZ, str->text, | |
+ str->length); | |
+ bstr_assign(str, idata->installdir); | |
+ RegSetValueEx(key, "InstallDirectory", 0, REG_SZ, str->text, | |
+ str->length); | |
RegCloseKey(key); | |
} else { | |
- DisplayError("Cannot create registry key for uninstall",TRUE,FALSE); | |
+ DisplayError("Cannot create registry key for uninstall", TRUE, FALSE); | |
} | |
bstr_assign_windir(str); | |
- bstr_appendpath(str,"bw-uninstall.exe"); | |
+ bstr_appendpath(str, "bw-uninstall.exe"); | |
DeleteFile(str->text); | |
- bstr_assign(uninstexe,idata->installdir); | |
- bstr_appendpath(uninstexe,"uninstall.exe"); | |
+ bstr_assign(uninstexe, idata->installdir); | |
+ bstr_appendpath(uninstexe, "uninstall.exe"); | |
- if (!MoveFile(uninstexe->text,str->text)) { | |
- DisplayError("Unable to create uninstall program",TRUE,FALSE); | |
+ if (!MoveFile(uninstexe->text, str->text)) { | |
+ DisplayError("Unable to create uninstall program", TRUE, FALSE); | |
} | |
DeleteFile(uninstexe->text); | |
startmenu = GetStartMenuDir(install_all_users, idata); | |
- bstr_assign(link,startmenu); | |
- bstr_appendpath(link,"Uninstall "); | |
- bstr_append(link,idata->product); | |
- bstr_append(link,".LNK"); | |
+ bstr_assign(link, startmenu); | |
+ bstr_appendpath(link, "Uninstall "); | |
+ bstr_append(link, idata->product); | |
+ bstr_append(link, ".LNK"); | |
- CreateLink(str->text,idata->product,NULL,link->text,NULL); | |
+ CreateLink(str->text, idata->product, NULL, link->text, NULL); | |
- bstr_free(link,TRUE); | |
- bstr_free(uninstexe,TRUE); | |
- bstr_free(str,TRUE); | |
+ bstr_free(link, TRUE); | |
+ bstr_free(uninstexe, TRUE); | |
+ bstr_free(str, TRUE); | |
bfree(startmenu); | |
} | |
-void StartRemoveOldVersion(char *oldversion,InstData *idata, | |
- InstData **oldidata,HWND hwnd) { | |
+void StartRemoveOldVersion(char *oldversion, InstData *idata, | |
+ InstData **oldidata, HWND hwnd) | |
+{ | |
InstData *old; | |
bstr *str; | |
- char *oldidir,*startmenu,*desktop; | |
+ char *oldidir, *startmenu, *desktop; | |
HANDLE fin; | |
- *oldidata=NULL; | |
+ *oldidata = NULL; | |
- if (!oldversion) return; | |
+ if (!oldversion) | |
+ return; | |
oldidir = GetInstallDir(oldversion); | |
if (!SetCurrentDirectory(oldidir)) { | |
- str=bstr_new(); | |
- bstr_assign(str,"Could not access old version's install directory "); | |
- bstr_append(str,oldidir); | |
- DisplayError(str->text,TRUE,TRUE); | |
+ str = bstr_new(); | |
+ bstr_assign(str, "Could not access old version's install directory "); | |
+ bstr_append(str, oldidir); | |
+ DisplayError(str->text, TRUE, TRUE); | |
} | |
- fin = CreateFile("install.log",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | |
+ fin = CreateFile("install.log", GENERIC_READ, 0, NULL, OPEN_EXISTING, | |
+ 0, NULL); | |
if (fin) { | |
- old = ReadOldInstData(fin,oldversion,oldidir); | |
+ old = ReadOldInstData(fin, oldversion, oldidir); | |
CloseHandle(fin); | |
DeleteFile("install.log"); | |
RemoveService(old->service); | |
- DeleteFileList(old->instfiles,hwnd,idata->keepfiles); | |
- DeleteFileList(old->extrafiles,hwnd,idata->keepfiles); | |
+ DeleteFileList(old->instfiles, hwnd, idata->keepfiles); | |
+ DeleteFileList(old->extrafiles, hwnd, idata->keepfiles); | |
startmenu = GetStartMenuDir(old->flags & IF_ALLUSERS, old); | |
desktop = GetDesktopDir(); | |
- DeleteLinkList(startmenu,old->startmenu,hwnd); | |
- DeleteLinkList(desktop,old->desktop,hwnd); | |
+ DeleteLinkList(startmenu, old->startmenu, hwnd); | |
+ DeleteLinkList(desktop, old->desktop, hwnd); | |
- RemoveUninstall(startmenu,oldversion,FALSE); | |
+ RemoveUninstall(startmenu, oldversion, FALSE); | |
- bfree(startmenu); bfree(desktop); | |
+ bfree(startmenu); | |
+ bfree(desktop); | |
*oldidata = old; | |
} | |
} | |
-void FinishRemoveOldVersion(char *oldversion,InstData *idata, | |
- InstData *oldidata) { | |
+void FinishRemoveOldVersion(char *oldversion, InstData *idata, | |
+ InstData *oldidata) | |
+{ | |
InstFiles *keeppt; | |
bstr *str; | |
- char *desktop,*startmenu; | |
- if (!oldidata) return; | |
+ char *desktop, *startmenu; | |
+ | |
+ if (!oldidata) | |
+ return; | |
desktop = GetDesktopDir(); | |
str = bstr_new(); | |
-/* If we're installing into a different directory, move config. files etc. | |
- from the old directory to the new one */ | |
- if (strcmp(oldidata->installdir,idata->installdir)!=0 && | |
+ /* If we're installing into a different directory, move config. files | |
+ * etc. from the old directory to the new one */ | |
+ if (strcmp(oldidata->installdir, idata->installdir) != 0 && | |
SetCurrentDirectory(oldidata->installdir)) { | |
- for (keeppt = idata->keepfiles;keeppt;keeppt=keeppt->next) { | |
- if (keeppt->filesize!=0) { | |
- bstr_assign(str,idata->installdir); | |
- bstr_appendpath(str,keeppt->filename); | |
- if (CopyFile(keeppt->filename,str->text,FALSE)) { | |
+ for (keeppt = idata->keepfiles; keeppt; keeppt = keeppt->next) { | |
+ if (keeppt->filesize != 0) { | |
+ bstr_assign(str, idata->installdir); | |
+ bstr_appendpath(str, keeppt->filename); | |
+ if (CopyFile(keeppt->filename, str->text, FALSE)) { | |
DeleteFile(keeppt->filename); | |
} | |
} | |
} | |
- SetCurrentDirectory(desktop); /* Make sure we're not in the install dir */ | |
+ SetCurrentDirectory(desktop); /* Make sure we're not in the | |
+ * install dir */ | |
if (!RemoveWholeDirectory(oldidata->installdir)) { | |
- bstr_assign(str,"Could not remove old install directory:\n"); | |
- bstr_append(str,oldidata->installdir); | |
- bstr_append(str,"\nYou may wish to manually remove it later."); | |
- DisplayError(str->text,FALSE,FALSE); | |
+ bstr_assign(str, "Could not remove old install directory:\n"); | |
+ bstr_append(str, oldidata->installdir); | |
+ bstr_append(str, "\nYou may wish to manually remove it later."); | |
+ DisplayError(str->text, FALSE, FALSE); | |
} | |
} | |
- if (strcmp(idata->startmenudir,oldidata->startmenudir)!=0) { | |
- SetCurrentDirectory(desktop); /* Make sure we're not in the menu dir */ | |
+ if (strcmp(idata->startmenudir, oldidata->startmenudir) != 0) { | |
+ SetCurrentDirectory(desktop); /* Make sure we're not in the menu | |
+ * dir */ | |
startmenu = GetStartMenuDir(oldidata->flags & IF_ALLUSERS, oldidata); | |
if (!RemoveWholeDirectory(startmenu)) { | |
- bstr_assign(str,"Could not remove old Start Menu directory:\n"); | |
- bstr_append(str,startmenu); | |
- bstr_append(str,"\nYou may wish to manually remove it later."); | |
- DisplayError(str->text,FALSE,FALSE); | |
+ bstr_assign(str, "Could not remove old Start Menu directory:\n"); | |
+ bstr_append(str, startmenu); | |
+ bstr_append(str, "\nYou may wish to manually remove it later."); | |
+ DisplayError(str->text, FALSE, FALSE); | |
} | |
bfree(startmenu); | |
} | |
-/* Remove the old registry key */ | |
- bstr_assign(str,UninstallKey); | |
- bstr_appendpath(str,oldversion); | |
- RegDeleteKey(HKEY_LOCAL_MACHINE,str->text); | |
+ /* Remove the old registry key */ | |
+ bstr_assign(str, UninstallKey); | |
+ bstr_appendpath(str, oldversion); | |
+ RegDeleteKey(HKEY_LOCAL_MACHINE, str->text); | |
bfree(desktop); | |
- bstr_free(str,TRUE); | |
- | |
- FreeInstData(oldidata,TRUE); | |
- oldversion=NULL; /* This is freed by FreeInstData */ | |
+ bstr_free(str, TRUE); | |
+ | |
+ FreeInstData(oldidata, TRUE); | |
+ oldversion = NULL; /* This is freed by FreeInstData */ | |
} | |
-DWORD WINAPI DoInstall(LPVOID lpParam) { | |
- HANDLE fout,logf,fin; | |
- DWORD bytes_written,fileleft; | |
+DWORD WINAPI DoInstall(LPVOID lpParam) | |
+{ | |
+ HANDLE fout, logf, fin; | |
+ DWORD bytes_written, fileleft; | |
BOOL skipfile, service_installed; | |
- char *inbuf,*outbuf; | |
- int status,count; | |
+ char *inbuf, *outbuf; | |
+ int status, count; | |
z_stream z; | |
InstFiles *listpt; | |
InstData *oldidata; | |
-/* Steal the filesize attribute to mark that these files are not | |
- already installed */ | |
- for (listpt=idata->keepfiles;listpt;listpt=listpt->next) { | |
- listpt->filesize=0; | |
+ /* Steal the filesize attribute to mark that these files are not already | |
+ * installed */ | |
+ for (listpt = idata->keepfiles; listpt; listpt = listpt->next) { | |
+ listpt->filesize = 0; | |
} | |
- StartRemoveOldVersion(oldversion,idata,&oldidata, | |
- GetDlgItem(mainDlg[DL_DOINSTALL],ST_FILELIST)); | |
+ StartRemoveOldVersion(oldversion, idata, &oldidata, | |
+ GetDlgItem(mainDlg[DL_DOINSTALL], ST_FILELIST)); | |
- inbuf = GetResource(MAKEINTRESOURCE(1),"INSTFILE"); | |
- if (!inbuf) return 0; | |
+ inbuf = GetResource(MAKEINTRESOURCE(1), "INSTFILE"); | |
+ if (!inbuf) | |
+ return 0; | |
- GetWinText(&idata->startmenudir,GetDlgItem(mainDlg[DL_SHORTCUTS],ED_FOLDER)); | |
+ GetWinText(&idata->startmenudir, | |
+ GetDlgItem(mainDlg[DL_SHORTCUTS], ED_FOLDER)); | |
if (!SetCurrentDirectory(idata->installdir)) { | |
- DisplayError("Cannot access install directory",TRUE,TRUE); | |
+ DisplayError("Cannot access install directory", TRUE, TRUE); | |
} | |
-/* Check for already-installed files */ | |
- for (listpt=idata->keepfiles;listpt;listpt=listpt->next) { | |
- fin = CreateFile(listpt->filename,GENERIC_READ,0,NULL,OPEN_EXISTING, | |
- 0,NULL); | |
+ /* Check for already-installed files */ | |
+ for (listpt = idata->keepfiles; listpt; listpt = listpt->next) { | |
+ fin = CreateFile(listpt->filename, GENERIC_READ, 0, NULL, | |
+ OPEN_EXISTING, 0, NULL); | |
if (fin != INVALID_HANDLE_VALUE) { | |
CloseHandle(fin); | |
- listpt->filesize=1; | |
+ listpt->filesize = 1; | |
} | |
} | |
- logf = CreateFile("install.log",GENERIC_WRITE,0,NULL, | |
- CREATE_ALWAYS,0,NULL); | |
+ logf = CreateFile("install.log", GENERIC_WRITE, 0, NULL, | |
+ CREATE_ALWAYS, 0, NULL); | |
- if (!WriteFile(logf,idata->startmenudir,strlen(idata->startmenudir)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile(logf, idata->startmenudir, | |
+ strlen(idata->startmenudir) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
fout = INVALID_HANDLE_VALUE; | |
- listpt=NULL; | |
- OpenNextOutput(&fout,idata->instfiles,idata->keepfiles, | |
- &listpt,&fileleft,logf,&skipfile); | |
+ listpt = NULL; | |
+ OpenNextOutput(&fout, idata->instfiles, idata->keepfiles, | |
+ &listpt, &fileleft, logf, &skipfile); | |
outbuf = bmalloc(BUFFER_SIZE); | |
t@@ -792,49 +888,53 @@ DWORD WINAPI DoInstall(LPVOID lpParam) { | |
z.avail_out = BUFFER_SIZE; | |
while (1) { | |
- status = inflate(&z,Z_SYNC_FLUSH); | |
- if (status==Z_OK || status==Z_STREAM_END) { | |
+ status = inflate(&z, Z_SYNC_FLUSH); | |
+ if (status == Z_OK || status == Z_STREAM_END) { | |
count = BUFFER_SIZE - z.avail_out; | |
z.next_out = outbuf; | |
while (count >= fileleft) { | |
- if (fileleft && !skipfile && | |
- !WriteFile(fout,z.next_out,fileleft,&bytes_written,NULL)) { | |
+ if (fileleft && !skipfile | |
+ && !WriteFile(fout, z.next_out, fileleft, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- count-=fileleft; | |
- z.next_out+=fileleft; | |
- if (!OpenNextOutput(&fout,idata->instfiles,idata->keepfiles, | |
- &listpt,&fileleft,logf,&skipfile)) break; | |
+ count -= fileleft; | |
+ z.next_out += fileleft; | |
+ if (!OpenNextOutput(&fout, idata->instfiles, idata->keepfiles, | |
+ &listpt, &fileleft, logf, &skipfile)) | |
+ break; | |
} | |
- if (fout==INVALID_HANDLE_VALUE) break; | |
- if (count && !skipfile && | |
- !WriteFile(fout,z.next_out,count,&bytes_written,NULL)) { | |
+ if (fout == INVALID_HANDLE_VALUE) | |
+ break; | |
+ if (count && !skipfile | |
+ && !WriteFile(fout, z.next_out, count, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- fileleft-=count; | |
+ fileleft -= count; | |
z.next_out = outbuf; | |
z.avail_out = BUFFER_SIZE; | |
} | |
- if (status!=Z_OK) break; | |
+ if (status != Z_OK) | |
+ break; | |
} | |
inflateEnd(&z); | |
- if (!skipfile) CloseHandle(fout); | |
+ if (!skipfile) | |
+ CloseHandle(fout); | |
- outbuf[0]='\0'; | |
- if (!WriteFile(logf,outbuf,1,&bytes_written,NULL)) { | |
+ outbuf[0] = '\0'; | |
+ if (!WriteFile(logf, outbuf, 1, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
bfree(outbuf); | |
- WriteFileList(logf,idata->extrafiles); | |
+ WriteFileList(logf, idata->extrafiles); | |
- FinishRemoveOldVersion(oldversion,idata,oldidata); | |
+ FinishRemoveOldVersion(oldversion, idata, oldidata); | |
if (services_supported) { | |
service_installed = InstallService(idata); | |
} else { | |
- service_installed = FALSE; | |
+ service_installed = FALSE; | |
} | |
if (service_installed) { | |
t@@ -845,7 +945,7 @@ DWORD WINAPI DoInstall(LPVOID lpParam) { | |
"you turn on your computer, see the \"Services\" application\n" | |
"from Control Panel. You can also run an interactive server " | |
"by using\nthe \"dopewars server\" shortcut from the desktop " | |
- "and/or Start Menu.","Service Installed",MB_OK); | |
+ "and/or Start Menu.", "Service Installed", MB_OK); | |
} | |
CoInitialize(NULL); | |
t@@ -853,7 +953,7 @@ DWORD WINAPI DoInstall(LPVOID lpParam) { | |
SetupUninstall(); | |
CoUninitialize(); | |
- WriteServiceDetails(logf,service_installed ? idata->service : NULL); | |
+ WriteServiceDetails(logf, service_installed ? idata->service : NULL); | |
if (install_all_users) { | |
idata->flags |= IF_ALLUSERS; | |
t@@ -862,111 +962,119 @@ DWORD WINAPI DoInstall(LPVOID lpParam) { | |
CloseHandle(logf); | |
- SetFileAttributes("install.log",FILE_ATTRIBUTE_HIDDEN); | |
+ SetFileAttributes("install.log", FILE_ATTRIBUTE_HIDDEN); | |
- ShowWindow(GetDlgItem(mainDlg[DL_DOINSTALL],ST_COMPLETE),SW_SHOW); | |
- ShowWindow(GetDlgItem(mainDlg[DL_DOINSTALL],ST_EXIT),SW_SHOW); | |
- EnableWindow(GetDlgItem(mainDlg[DL_DOINSTALL],BT_FINISH),TRUE); | |
+ ShowWindow(GetDlgItem(mainDlg[DL_DOINSTALL], ST_COMPLETE), SW_SHOW); | |
+ ShowWindow(GetDlgItem(mainDlg[DL_DOINSTALL], ST_EXIT), SW_SHOW); | |
+ EnableWindow(GetDlgItem(mainDlg[DL_DOINSTALL], BT_FINISH), TRUE); | |
return 0; | |
} | |
-void FillFolderList(void) { | |
+void FillFolderList(void) | |
+{ | |
HANDLE findfile; | |
WIN32_FIND_DATA finddata; | |
bstr *str; | |
char *startdir; | |
HWND folderlist; | |
- folderlist = GetDlgItem(mainDlg[DL_SHORTCUTS],LB_FOLDLIST); | |
- if (!folderlist) return; | |
+ folderlist = GetDlgItem(mainDlg[DL_SHORTCUTS], LB_FOLDLIST); | |
+ if (!folderlist) | |
+ return; | |
- SendMessage(folderlist,LB_RESETCONTENT,0,0); | |
+ SendMessage(folderlist, LB_RESETCONTENT, 0, 0); | |
- str=bstr_new(); | |
+ str = bstr_new(); | |
- startdir=GetStartMenuTopDir(install_all_users); | |
- bstr_assign(str,startdir); | |
+ startdir = GetStartMenuTopDir(install_all_users); | |
+ bstr_assign(str, startdir); | |
bfree(startdir); | |
- bstr_appendpath(str,"Programs\\*"); | |
- | |
- findfile = FindFirstFile(str->text,&finddata); | |
- if (findfile!=INVALID_HANDLE_VALUE) { | |
- while(1) { | |
- if (finddata.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY && | |
- strcmp(finddata.cFileName,".")!=0 && | |
- strcmp(finddata.cFileName,"..")!=0) { | |
- SendMessage(folderlist,LB_ADDSTRING,0,(LPARAM)finddata.cFileName); | |
+ bstr_appendpath(str, "Programs\\*"); | |
+ | |
+ findfile = FindFirstFile(str->text, &finddata); | |
+ if (findfile != INVALID_HANDLE_VALUE) { | |
+ while (1) { | |
+ if (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY | |
+ && strcmp(finddata.cFileName, ".") != 0 | |
+ && strcmp(finddata.cFileName, "..") != 0) { | |
+ SendMessage(folderlist, LB_ADDSTRING, 0, | |
+ (LPARAM)finddata.cFileName); | |
} | |
- if (!FindNextFile(findfile,&finddata)) break; | |
+ if (!FindNextFile(findfile, &finddata)) | |
+ break; | |
} | |
FindClose(findfile); | |
} | |
- bstr_free(str,TRUE); | |
+ bstr_free(str, TRUE); | |
} | |
-BOOL CheckAdminRights(void) { | |
- return (!services_supported || have_admin_rights || | |
- MessageBox(NULL, | |
- "To successfully install all components of this " | |
- "program Administrator\nrights are required, and you " | |
- "do not appear to have them. Do you want\nto attempt " | |
- "to continue the installation anyway?", | |
- "Administrator rights not found", | |
- MB_YESNO | MB_DEFBUTTON2)==IDYES); | |
+BOOL CheckAdminRights(void) | |
+{ | |
+ return (!services_supported || have_admin_rights | |
+ || MessageBox(NULL, | |
+ "To successfully install all components of this " | |
+ "program Administrator\nrights are required, and you " | |
+ "do not appear to have them. Do you want\nto attempt " | |
+ "to continue the installation anyway?", | |
+ "Administrator rights not found", | |
+ MB_YESNO | MB_DEFBUTTON2) == IDYES); | |
} | |
-BOOL CheckExistingInstall(InstData *idata) { | |
+BOOL CheckExistingInstall(InstData *idata) | |
+{ | |
bstr *str; | |
- char *sep,*prodname,*prodversion; | |
+ char *sep, *prodname, *prodversion; | |
char *subkey; | |
int sublen; | |
DWORD sublencp; | |
HKEY key; | |
DWORD ind; | |
FILETIME ftime; | |
- BOOL retval=TRUE; | |
+ BOOL retval = TRUE; | |
+ | |
+ str = bstr_new(); | |
+ bstr_assign(str, UninstallKey); | |
+ bstr_appendpath(str, idata->product); | |
- str=bstr_new(); | |
- bstr_assign(str,UninstallKey); | |
- bstr_appendpath(str,idata->product); | |
+ /* Split product into name and version */ | |
+ sep = strrchr(idata->product, '-'); | |
-/* Split product into name and version */ | |
- sep = strrchr(idata->product,'-'); | |
- | |
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,str->text,0,KEY_READ,&key) | |
- ==ERROR_SUCCESS) { | |
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, str->text, 0, KEY_READ, &key) == | |
+ ERROR_SUCCESS) { | |
RegCloseKey(key); | |
- if (MessageBox(NULL,"This program appears to already be installed.\n" | |
+ if (MessageBox(NULL, "This program appears to already be installed.\n" | |
"Are you sure you want to go ahead and install it anyway?", | |
- idata->product,MB_YESNO)==IDNO) retval=FALSE; | |
+ idata->product, MB_YESNO) == IDNO) | |
+ retval = FALSE; | |
} else if (sep) { | |
- *sep='\0'; | |
- prodversion = sep+1; | |
+ *sep = '\0'; | |
+ prodversion = sep + 1; | |
prodname = bstrdup(idata->product); | |
- *sep='-'; | |
- sublencp=sublen=strlen(idata->product)+30; | |
+ *sep = '-'; | |
+ sublencp = sublen = strlen(idata->product) + 30; | |
subkey = bmalloc(sublen); | |
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,UninstallKey,0,KEY_READ,&key) | |
- ==ERROR_SUCCESS) { | |
- ind=0; | |
- while (RegEnumKeyEx(key,ind++,subkey,&sublencp, | |
- NULL,NULL,NULL,&ftime)==ERROR_SUCCESS) { | |
- sublencp=sublen; | |
- sep=strrchr(subkey,'-'); | |
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, UninstallKey, 0, | |
+ KEY_READ, &key) == ERROR_SUCCESS) { | |
+ ind = 0; | |
+ while (RegEnumKeyEx(key, ind++, subkey, &sublencp, | |
+ NULL, NULL, NULL, &ftime) == ERROR_SUCCESS) { | |
+ sublencp = sublen; | |
+ sep = strrchr(subkey, '-'); | |
if (sep) { | |
- *sep='\0'; | |
- if (strcmp(subkey,prodname)==0) { | |
- bstr_assign(str,"You are trying to install "); | |
- bstr_append(str,idata->product); | |
- bstr_append(str,".\nHowever, version "); | |
- bstr_append(str,sep+1); | |
- bstr_append(str," appears to already be installed.\n" | |
+ *sep = '\0'; | |
+ if (strcmp(subkey, prodname) == 0) { | |
+ bstr_assign(str, "You are trying to install "); | |
+ bstr_append(str, idata->product); | |
+ bstr_append(str, ".\nHowever, version "); | |
+ bstr_append(str, sep + 1); | |
+ bstr_append(str, " appears to already be installed.\n" | |
"Do you want to replace the existing version with " | |
"this one?\n(If you answer \"No\", and continue, " | |
"both versions will be installed.)"); | |
- if (MessageBox(NULL,str->text,"Existing version",MB_YESNO)==IDYES)… | |
- *sep='-'; | |
- oldversion=bstrdup(subkey); | |
+ if (MessageBox(NULL, str->text, "Existing version", | |
+ MB_YESNO) == IDYES) { | |
+ *sep = '-'; | |
+ oldversion = bstrdup(subkey); | |
} | |
break; | |
} | |
t@@ -977,11 +1085,12 @@ BOOL CheckExistingInstall(InstData *idata) { | |
bfree(prodname); | |
bfree(subkey); | |
} | |
- bstr_free(str,TRUE); | |
+ bstr_free(str, TRUE); | |
return retval; | |
} | |
-BOOL SetDefaultInstall(void) { | |
+BOOL SetDefaultInstall(void) | |
+{ | |
HWND dlg; | |
dlg = mainDlg[DL_INTRO]; | |
t@@ -997,8 +1106,9 @@ BOOL SetDefaultInstall(void) { | |
return have_admin_rights; | |
} | |
-int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, | |
- LPSTR lpszCmdParam,int nCmdShow) { | |
+int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, | |
+ LPSTR lpszCmdParam, int nCmdShow) | |
+{ | |
MSG msg; | |
int i; | |
BOOL Handled; | |
t@@ -1008,47 +1118,50 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPr… | |
hInst = hInstance; | |
- if (!hPrevInstance) RegisterSepClass(hInstance); | |
+ if (!hPrevInstance) | |
+ RegisterSepClass(hInstance); | |
- for (i=0;i<DL_NUM;i++) { | |
- mainDlg[i] = CreateDialog(hInst,MAKEINTRESOURCE(i+1),NULL,MainDlgProc); | |
+ for (i = 0; i < DL_NUM; i++) { | |
+ mainDlg[i] = | |
+ CreateDialog(hInst, MAKEINTRESOURCE(i + 1), NULL, MainDlgProc); | |
} | |
- ServiceCheck(&services_supported,&have_admin_rights); | |
+ ServiceCheck(&services_supported, &have_admin_rights); | |
install_all_users = SetDefaultInstall(); | |
- CheckDlgButton(mainDlg[DL_SHORTCUTS],CB_DESKTOP,BST_CHECKED); | |
- EnableWindow(GetDlgItem(mainDlg[DL_DOINSTALL],BT_FINISH),FALSE); | |
+ CheckDlgButton(mainDlg[DL_SHORTCUTS], CB_DESKTOP, BST_CHECKED); | |
+ EnableWindow(GetDlgItem(mainDlg[DL_DOINSTALL], BT_FINISH), FALSE); | |
+ | |
+ ShowWindow(GetDlgItem(mainDlg[DL_DOINSTALL], ST_COMPLETE), SW_HIDE); | |
+ ShowWindow(GetDlgItem(mainDlg[DL_DOINSTALL], ST_EXIT), SW_HIDE); | |
- ShowWindow(GetDlgItem(mainDlg[DL_DOINSTALL],ST_COMPLETE),SW_HIDE); | |
- ShowWindow(GetDlgItem(mainDlg[DL_DOINSTALL],ST_EXIT),SW_HIDE); | |
+ idata = ReadInstData(); | |
- idata=ReadInstData(); | |
+ SendDlgItemMessage(mainDlg[DL_SHORTCUTS], ED_FOLDER, WM_SETTEXT, | |
+ 0, (LPARAM)idata->startmenudir); | |
+ SendDlgItemMessage(mainDlg[DL_INSTALLDIR], ED_INSTDIR, WM_SETTEXT, | |
+ 0, (LPARAM)idata->installdir); | |
- SendDlgItemMessage(mainDlg[DL_SHORTCUTS],ED_FOLDER,WM_SETTEXT, | |
- 0,(LPARAM)idata->startmenudir); | |
- SendDlgItemMessage(mainDlg[DL_INSTALLDIR],ED_INSTDIR,WM_SETTEXT, | |
- 0,(LPARAM)idata->installdir); | |
- | |
- licence=GetFirstFile(idata->instfiles,idata->totalsize); | |
+ licence = GetFirstFile(idata->instfiles, idata->totalsize); | |
if (licence) { | |
- SendDlgItemMessage(mainDlg[DL_LICENCE],ED_LICENCE,WM_SETTEXT, | |
- 0,(LPARAM)licence); | |
+ SendDlgItemMessage(mainDlg[DL_LICENCE], ED_LICENCE, WM_SETTEXT, | |
+ 0, (LPARAM)licence); | |
bfree(licence); | |
} | |
- for (i=0;i<DL_NUM;i++) SetGuiFont(mainDlg[i]); | |
+ for (i = 0; i < DL_NUM; i++) | |
+ SetGuiFont(mainDlg[i]); | |
if (CheckAdminRights() && CheckExistingInstall(idata)) { | |
- CurrentDialog=DL_NUM; | |
+ CurrentDialog = DL_NUM; | |
ShowNewDialog(DL_INTRO); | |
- while (GetMessage(&msg,NULL,0,0)) { | |
- Handled=FALSE; | |
- for (i=0;i<DL_NUM && !Handled;i++) { | |
- Handled=IsDialogMessage(mainDlg[i],&msg); | |
+ while (GetMessage(&msg, NULL, 0, 0)) { | |
+ Handled = FALSE; | |
+ for (i = 0; i < DL_NUM && !Handled; i++) { | |
+ Handled = IsDialogMessage(mainDlg[i], &msg); | |
} | |
if (!Handled) { | |
TranslateMessage(&msg); | |
t@@ -1056,7 +1169,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrev… | |
} | |
} | |
} | |
- FreeInstData(idata,FALSE); | |
+ FreeInstData(idata, FALSE); | |
return 0; | |
} | |
diff --git a/win32/uninstall.c b/win32/uninstall.c | |
t@@ -1,22 +1,24 @@ | |
-/* uninstall.c Simple Win32 uninstaller for dopewars */ | |
-/* Copyright (C) 2001 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. */ | |
+/************************************************************************ | |
+ * uninstall.c Simple Win32 uninstaller for dopewars * | |
+ * Copyright (C) 2001-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. * | |
+ ************************************************************************/ | |
#include <windows.h> | |
#include <stdio.h> | |
t@@ -30,144 +32,161 @@ HINSTANCE hInst; | |
HWND mainDlg; | |
char *product; | |
-char *GetProduct(void) { | |
+char *GetProduct(void) | |
+{ | |
char *product; | |
- product = strrchr(GetCommandLine(),' '); | |
- if (product && strlen(product+1)>0) return bstrdup(++product); | |
+ | |
+ product = strrchr(GetCommandLine(), ' '); | |
+ if (product && strlen(product + 1) > 0) | |
+ return bstrdup(++product); | |
else { | |
- DisplayError("This program should be called with a product ID",FALSE,TRUE); | |
+ DisplayError("This program should be called with a product ID", | |
+ FALSE, TRUE); | |
ExitProcess(1); | |
} | |
} | |
-DWORD WINAPI DoUninstall(LPVOID lpParam) { | |
+DWORD WINAPI DoUninstall(LPVOID lpParam) | |
+{ | |
InstData *idata; | |
HANDLE fin; | |
HWND delstat; | |
bstr *str; | |
- char *startmenu,*desktop,*installdir; | |
+ char *startmenu, *desktop, *installdir; | |
- installdir=GetInstallDir(product); | |
+ installdir = GetInstallDir(product); | |
if (!SetCurrentDirectory(installdir)) { | |
- str=bstr_new(); | |
- bstr_assign(str,"Could not access install directory "); | |
- bstr_append(str,installdir); | |
- DisplayError(str->text,TRUE,TRUE); | |
-/* Pointless to try to free the bstr, since DisplayError ends the process */ | |
+ str = bstr_new(); | |
+ bstr_assign(str, "Could not access install directory "); | |
+ bstr_append(str, installdir); | |
+ DisplayError(str->text, TRUE, TRUE); | |
+ /* Pointless to try to free the bstr, since DisplayError ends the | |
+ * process */ | |
} | |
- fin = CreateFile("install.log",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); | |
+ fin = CreateFile("install.log", GENERIC_READ, 0, NULL, | |
+ OPEN_EXISTING, 0, NULL); | |
if (fin) { | |
- idata = ReadOldInstData(fin,product,installdir); | |
+ idata = ReadOldInstData(fin, product, installdir); | |
CloseHandle(fin); | |
DeleteFile("install.log"); | |
RemoveService(idata->service); | |
- delstat = GetDlgItem(mainDlg,ST_DELSTAT); | |
- DeleteFileList(idata->instfiles,delstat,NULL); | |
- DeleteFileList(idata->extrafiles,delstat,NULL); | |
+ delstat = GetDlgItem(mainDlg, ST_DELSTAT); | |
+ DeleteFileList(idata->instfiles, delstat, NULL); | |
+ DeleteFileList(idata->extrafiles, delstat, NULL); | |
startmenu = GetStartMenuDir(idata->flags & IF_ALLUSERS, idata); | |
desktop = GetDesktopDir(); | |
- DeleteLinkList(startmenu,idata->startmenu,delstat); | |
- DeleteLinkList(desktop,idata->desktop,delstat); | |
+ DeleteLinkList(startmenu, idata->startmenu, delstat); | |
+ DeleteLinkList(desktop, idata->desktop, delstat); | |
- RemoveUninstall(startmenu,product,TRUE); | |
+ RemoveUninstall(startmenu, product, TRUE); | |
- SetCurrentDirectory(desktop); /* Just make sure we're not in the install | |
- directory any more */ | |
+ SetCurrentDirectory(desktop); /* Just make sure we're not in the | |
+ * install directory any more */ | |
- str=bstr_new(); | |
+ str = bstr_new(); | |
if (!RemoveWholeDirectory(installdir)) { | |
- bstr_assign(str,"Could not remove install directory:\n"); | |
- bstr_append(str,installdir); | |
- bstr_append(str,"\nYou may wish to manually remove it later."); | |
- DisplayError(str->text,FALSE,FALSE); | |
+ bstr_assign(str, "Could not remove install directory:\n"); | |
+ bstr_append(str, installdir); | |
+ bstr_append(str, "\nYou may wish to manually remove it later."); | |
+ DisplayError(str->text, FALSE, FALSE); | |
} | |
if (!RemoveWholeDirectory(startmenu)) { | |
- bstr_assign(str,"Could not remove Start Menu directory:\n"); | |
- bstr_append(str,startmenu); | |
- bstr_append(str,"\nYou may wish to manually remove it later."); | |
- DisplayError(str->text,FALSE,FALSE); | |
+ bstr_assign(str, "Could not remove Start Menu directory:\n"); | |
+ bstr_append(str, startmenu); | |
+ bstr_append(str, "\nYou may wish to manually remove it later."); | |
+ DisplayError(str->text, FALSE, FALSE); | |
} | |
- bstr_assign(str,UninstallKey); | |
- bstr_appendpath(str,product); | |
- RegDeleteKey(HKEY_LOCAL_MACHINE,str->text); | |
- bstr_free(str,TRUE); | |
+ bstr_assign(str, UninstallKey); | |
+ bstr_appendpath(str, product); | |
+ RegDeleteKey(HKEY_LOCAL_MACHINE, str->text); | |
+ bstr_free(str, TRUE); | |
- bfree(startmenu); bfree(desktop); | |
- FreeInstData(idata,TRUE); | |
+ bfree(startmenu); | |
+ bfree(desktop); | |
+ FreeInstData(idata, TRUE); | |
} else { | |
- bfree(product); bfree(installdir); /* Normally FreeInstData frees these */ | |
- str=bstr_new(); | |
- bstr_assign(str,"Could not read install.log from "); | |
- bstr_append(str,installdir); | |
- DisplayError(str->text,TRUE,TRUE); | |
-/* Pointless to try to free the bstr, since DisplayError ends the process */ | |
+ bfree(product); | |
+ bfree(installdir); /* Normally FreeInstData frees these */ | |
+ str = bstr_new(); | |
+ bstr_assign(str, "Could not read install.log from "); | |
+ bstr_append(str, installdir); | |
+ DisplayError(str->text, TRUE, TRUE); | |
+ /* Pointless to try to free the bstr, since DisplayError ends the | |
+ * process */ | |
} | |
- ShowWindow(GetDlgItem(mainDlg,ST_DELDONE),SW_SHOW); | |
- EnableWindow(GetDlgItem(mainDlg,BT_DELOK),TRUE); | |
- SetFocus(GetDlgItem(mainDlg,BT_DELOK)); | |
+ ShowWindow(GetDlgItem(mainDlg, ST_DELDONE), SW_SHOW); | |
+ EnableWindow(GetDlgItem(mainDlg, BT_DELOK), TRUE); | |
+ SetFocus(GetDlgItem(mainDlg, BT_DELOK)); | |
return 0; | |
} | |
-BOOL CALLBACK MainDlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { | |
+BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, | |
+ LPARAM lParam) | |
+{ | |
HANDLE hThread; | |
DWORD threadID; | |
- static BOOL startedun=FALSE; | |
- switch(msg) { | |
- case WM_INITDIALOG: | |
- return TRUE; | |
- case WM_SHOWWINDOW: | |
- if (wParam && !startedun) { | |
- startedun=TRUE; | |
- hThread = CreateThread(NULL,0,DoUninstall,NULL,0,&threadID); | |
- } | |
- return TRUE; | |
- case WM_COMMAND: | |
- if (HIWORD(wParam)==BN_CLICKED && LOWORD(wParam)==BT_DELOK && lParam) { | |
- PostQuitMessage(0); | |
- return TRUE; | |
- } | |
- break; | |
- case WM_CLOSE: | |
+ static BOOL startedun = FALSE; | |
+ | |
+ switch (msg) { | |
+ case WM_INITDIALOG: | |
+ return TRUE; | |
+ case WM_SHOWWINDOW: | |
+ if (wParam && !startedun) { | |
+ startedun = TRUE; | |
+ hThread = CreateThread(NULL, 0, DoUninstall, NULL, 0, &threadID); | |
+ } | |
+ return TRUE; | |
+ case WM_COMMAND: | |
+ if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == BT_DELOK | |
+ && lParam) { | |
PostQuitMessage(0); | |
return TRUE; | |
+ } | |
+ break; | |
+ case WM_CLOSE: | |
+ PostQuitMessage(0); | |
+ return TRUE; | |
} | |
return FALSE; | |
} | |
-int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, | |
- LPSTR lpszCmdParam,int nCmdShow) { | |
+int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, | |
+ LPSTR lpszCmdParam, int nCmdShow) | |
+{ | |
MSG msg; | |
bstr *str; | |
- product=GetProduct(); | |
+ product = GetProduct(); | |
- str=bstr_new(); | |
- bstr_assign(str,"Are you sure you want to uninstall "); | |
- bstr_append(str,product); | |
- bstr_append(str," ?"); | |
- if (MessageBox(NULL,str->text,"Uninstall",MB_YESNO)==IDNO) return(1); | |
- bstr_free(str,TRUE); | |
+ str = bstr_new(); | |
+ bstr_assign(str, "Are you sure you want to uninstall "); | |
+ bstr_append(str, product); | |
+ bstr_append(str, " ?"); | |
+ if (MessageBox(NULL, str->text, "Uninstall", MB_YESNO) == IDNO) | |
+ return (1); | |
+ bstr_free(str, TRUE); | |
hInst = hInstance; | |
- if (!hPrevInstance) RegisterSepClass(hInstance); | |
+ if (!hPrevInstance) | |
+ RegisterSepClass(hInstance); | |
- mainDlg = CreateDialog(hInstance,MAKEINTRESOURCE(1),NULL,MainDlgProc); | |
+ mainDlg = CreateDialog(hInstance, MAKEINTRESOURCE(1), NULL, MainDlgProc); | |
SetGuiFont(mainDlg); | |
- EnableWindow(GetDlgItem(mainDlg,BT_DELOK),FALSE); | |
- ShowWindow(mainDlg,SW_SHOW); | |
- ShowWindow(GetDlgItem(mainDlg,ST_DELDONE),SW_HIDE); | |
+ EnableWindow(GetDlgItem(mainDlg, BT_DELOK), FALSE); | |
+ ShowWindow(mainDlg, SW_SHOW); | |
+ ShowWindow(GetDlgItem(mainDlg, ST_DELDONE), SW_HIDE); | |
- while (GetMessage(&msg,NULL,0,0)) { | |
- if (!IsDialogMessage(mainDlg,&msg)) { | |
+ while (GetMessage(&msg, NULL, 0, 0)) { | |
+ if (!IsDialogMessage(mainDlg, &msg)) { | |
TranslateMessage(&msg); | |
DispatchMessage(&msg); | |
} | |
diff --git a/win32/util.c b/win32/util.c | |
t@@ -1,22 +1,24 @@ | |
-/* util.c Shared functions for Win32 installer programs */ | |
-/* Copyright (C) 2001 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. */ | |
+/************************************************************************ | |
+ * util.c Shared functions for Win32 installer programs * | |
+ * Copyright (C) 2001-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. * | |
+ ************************************************************************/ | |
#include <windows.h> | |
#include <stdio.h> | |
t@@ -24,203 +26,240 @@ | |
#include <shlobj.h> | |
#include "util.h" | |
-const char *UninstallKey= | |
- "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; | |
-const char *UninstallEXE="bw-uninstall.exe"; | |
+const char *UninstallKey = | |
+ "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; | |
+const char *UninstallEXE = "bw-uninstall.exe"; | |
-static void bstr_append_dir(bstr *str,BOOL windir); | |
+static void bstr_append_dir(bstr *str, BOOL windir); | |
-void *bmalloc(UINT numbytes) { | |
+void *bmalloc(UINT numbytes) | |
+{ | |
HLOCAL localpt; | |
- if (numbytes<=0) numbytes=1; | |
+ if (numbytes <= 0) | |
+ numbytes = 1; | |
- localpt = LocalAlloc(LMEM_FIXED,numbytes); | |
- if (localpt) return (void *)localpt; | |
+ localpt = LocalAlloc(LMEM_FIXED, numbytes); | |
+ if (localpt) | |
+ return (void *)localpt; | |
else { | |
- DisplayError("Could not allocate memory: ",TRUE,TRUE); | |
+ DisplayError("Could not allocate memory: ", TRUE, TRUE); | |
ExitProcess(1); | |
} | |
} | |
-void bfree(void *pt) { | |
- if (!pt) return; | |
- if (LocalFree((HLOCAL)pt)) { | |
- DisplayError("Could not free memory: ",TRUE,TRUE); | |
+void bfree(void *pt) | |
+{ | |
+ if (!pt) | |
+ return; | |
+ if (LocalFree((HLOCAL) pt)) { | |
+ DisplayError("Could not free memory: ", TRUE, TRUE); | |
} | |
} | |
-void *brealloc(void *pt,UINT numbytes) { | |
+void *brealloc(void *pt, UINT numbytes) | |
+{ | |
UINT numcp; | |
void *newpt; | |
- if (!pt && numbytes) return bmalloc(numbytes); | |
+ | |
+ if (!pt && numbytes) | |
+ return bmalloc(numbytes); | |
else if (pt && !numbytes) { | |
bfree(pt); | |
} else if (pt && numbytes) { | |
- newpt=bmalloc(numbytes); | |
- memset(newpt,0,numbytes); | |
- numcp = LocalSize((HLOCAL)pt); | |
- if (numbytes < numcp) numcp = numbytes; | |
- memcpy((char *)newpt,(char *)pt,numcp); | |
+ newpt = bmalloc(numbytes); | |
+ memset(newpt, 0, numbytes); | |
+ numcp = LocalSize((HLOCAL) pt); | |
+ if (numbytes < numcp) | |
+ numcp = numbytes; | |
+ memcpy((char *)newpt, (char *)pt, numcp); | |
bfree(pt); | |
return newpt; | |
} | |
return NULL; | |
} | |
-char *bstrdup(char *str) { | |
+char *bstrdup(char *str) | |
+{ | |
char *newstr; | |
+ | |
if (str) { | |
- newstr = bmalloc(strlen(str)+1); | |
- strcpy(newstr,str); | |
+ newstr = bmalloc(strlen(str) + 1); | |
+ strcpy(newstr, str); | |
} else { | |
newstr = bmalloc(1); | |
- newstr[0]='\0'; | |
+ newstr[0] = '\0'; | |
} | |
return newstr; | |
} | |
-bstr *bstr_new(void) { | |
+bstr *bstr_new(void) | |
+{ | |
bstr *str; | |
str = bmalloc(sizeof(bstr)); | |
- str->bufsiz=64; | |
- str->length=0; | |
- str->text= bmalloc(str->bufsiz); | |
- str->text[0]='\0'; | |
+ str->bufsiz = 64; | |
+ str->length = 0; | |
+ str->text = bmalloc(str->bufsiz); | |
+ str->text[0] = '\0'; | |
return str; | |
} | |
-void bstr_free(bstr *str,BOOL free_text) { | |
- if (free_text) bfree(str->text); | |
+void bstr_free(bstr *str, BOOL free_text) | |
+{ | |
+ if (free_text) | |
+ bfree(str->text); | |
bfree(str); | |
} | |
-void bstr_expandby(bstr *str,unsigned extralength) { | |
- if (str->bufsiz >= str->length+1+extralength) return; | |
+void bstr_expandby(bstr *str, unsigned extralength) | |
+{ | |
+ if (str->bufsiz >= str->length + 1 + extralength) | |
+ return; | |
- while (str->bufsiz < str->length+1+extralength) str->bufsiz*=2; | |
- str->text = brealloc(str->text,str->bufsiz); | |
+ while (str->bufsiz < str->length + 1 + extralength) | |
+ str->bufsiz *= 2; | |
+ str->text = brealloc(str->text, str->bufsiz); | |
} | |
-void bstr_setlength(bstr *str,unsigned length) { | |
+void bstr_setlength(bstr *str, unsigned length) | |
+{ | |
if (length <= str->length) { | |
str->length = length; | |
- str->text[length]='\0'; | |
+ str->text[length] = '\0'; | |
} else { | |
- bstr_expandby(str,length-str->length); | |
+ bstr_expandby(str, length - str->length); | |
} | |
} | |
-void bstr_assign(bstr *str,const char *text) { | |
+void bstr_assign(bstr *str, const char *text) | |
+{ | |
if (text) { | |
- bstr_setlength(str,strlen(text)); | |
- strcpy(str->text,text); | |
- str->length=strlen(text); | |
+ bstr_setlength(str, strlen(text)); | |
+ strcpy(str->text, text); | |
+ str->length = strlen(text); | |
} else { | |
- bstr_setlength(str,0); | |
+ bstr_setlength(str, 0); | |
} | |
} | |
-void bstr_append(bstr *str,const char *text) { | |
- if (!text) return; | |
- bstr_expandby(str,strlen(text)); | |
- strcat(str->text,text); | |
- str->length+=strlen(text); | |
+void bstr_append(bstr *str, const char *text) | |
+{ | |
+ if (!text) | |
+ return; | |
+ bstr_expandby(str, strlen(text)); | |
+ strcat(str->text, text); | |
+ str->length += strlen(text); | |
} | |
-void bstr_appendpath(bstr *str,const char *text) { | |
- if (str->length && str->text[str->length-1]!='\\') { | |
- bstr_append_c(str,'\\'); | |
+void bstr_appendpath(bstr *str, const char *text) | |
+{ | |
+ if (str->length && str->text[str->length - 1] != '\\') { | |
+ bstr_append_c(str, '\\'); | |
} | |
- bstr_append(str,text); | |
+ bstr_append(str, text); | |
} | |
-void bstr_append_c(bstr *str,char ch) { | |
- bstr_expandby(str,1); | |
- str->text[str->length]=ch; | |
+void bstr_append_c(bstr *str, char ch) | |
+{ | |
+ bstr_expandby(str, 1); | |
+ str->text[str->length] = ch; | |
str->length++; | |
- str->text[str->length]='\0'; | |
+ str->text[str->length] = '\0'; | |
} | |
/* We can be pretty confident that this is enough space for an integer */ | |
#define MAX_LENGTH_INT 80 | |
-void bstr_append_long(bstr *str,long val) { | |
+void bstr_append_long(bstr *str, long val) | |
+{ | |
char tmpbuf[MAX_LENGTH_INT]; | |
- sprintf(tmpbuf,"%ld",val); | |
- bstr_append(str,tmpbuf); | |
+ | |
+ sprintf(tmpbuf, "%ld", val); | |
+ bstr_append(str, tmpbuf); | |
} | |
-void bstr_append_windir(bstr *str) { | |
- bstr_append_dir(str,TRUE); | |
+void bstr_append_windir(bstr *str) | |
+{ | |
+ bstr_append_dir(str, TRUE); | |
} | |
-void bstr_append_curdir(bstr *str) { | |
- bstr_append_dir(str,FALSE); | |
+void bstr_append_curdir(bstr *str) | |
+{ | |
+ bstr_append_dir(str, FALSE); | |
} | |
-void bstr_assign_windir(bstr *str) { | |
- bstr_setlength(str,0); | |
+void bstr_assign_windir(bstr *str) | |
+{ | |
+ bstr_setlength(str, 0); | |
bstr_append_windir(str); | |
} | |
-void bstr_assign_curdir(bstr *str) { | |
- bstr_setlength(str,0); | |
+void bstr_assign_curdir(bstr *str) | |
+{ | |
+ bstr_setlength(str, 0); | |
bstr_append_curdir(str); | |
} | |
-void bstr_append_dir(bstr *str,BOOL windir) { | |
+void bstr_append_dir(bstr *str, BOOL windir) | |
+{ | |
unsigned spaceleft; | |
UINT retval; | |
int tries; | |
- spaceleft = str->bufsiz-str->length; /* spaceleft includes the null */ | |
+ spaceleft = str->bufsiz - str->length; /* spaceleft includes the | |
+ * null */ | |
- for (tries=0;tries<5;tries++) { | |
+ for (tries = 0; tries < 5; tries++) { | |
if (windir) { | |
- retval = GetWindowsDirectory(str->text+str->length,spaceleft); | |
+ retval = GetWindowsDirectory(str->text + str->length, spaceleft); | |
} else { | |
- retval = GetCurrentDirectory(spaceleft,str->text+str->length); | |
+ retval = GetCurrentDirectory(spaceleft, str->text + str->length); | |
} | |
- if (retval==0) DisplayError("Cannot get directory: ",TRUE,TRUE); | |
- if (retval <= spaceleft-1) { | |
+ if (retval == 0) | |
+ DisplayError("Cannot get directory: ", TRUE, TRUE); | |
+ if (retval <= spaceleft - 1) { | |
str->length += retval; | |
break; | |
} | |
- bstr_expandby(str,retval); /* Let's err on the side of caution */ | |
- spaceleft = str->bufsiz-str->length; | |
+ bstr_expandby(str, retval); /* Let's err on the side of caution */ | |
+ spaceleft = str->bufsiz - str->length; | |
} | |
- if (tries>=5) DisplayError("Cannot get directory: ",TRUE,TRUE); | |
+ if (tries >= 5) | |
+ DisplayError("Cannot get directory: ", TRUE, TRUE); | |
} | |
-void DisplayError(const char *errtext,BOOL addsyserr,BOOL fatal) { | |
+void DisplayError(const char *errtext, BOOL addsyserr, BOOL fatal) | |
+{ | |
DWORD syserr; | |
bstr *str; | |
LPTSTR lpMsgBuf; | |
- syserr=GetLastError(); | |
+ syserr = GetLastError(); | |
- str=bstr_new(); | |
- bstr_assign(str,errtext); | |
+ str = bstr_new(); | |
+ bstr_assign(str, errtext); | |
if (addsyserr) { | |
- bstr_append(str,"; "); | |
- bstr_append_long(str,syserr); | |
- bstr_append(str,": "); | |
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, | |
- NULL,syserr,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), | |
- (LPTSTR)&lpMsgBuf,0,NULL); | |
- bstr_append(str,lpMsgBuf); | |
+ bstr_append(str, "; "); | |
+ bstr_append_long(str, syserr); | |
+ bstr_append(str, ": "); | |
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | | |
+ FORMAT_MESSAGE_FROM_SYSTEM, NULL, syserr, | |
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | |
+ (LPTSTR)&lpMsgBuf, 0, NULL); | |
+ bstr_append(str, lpMsgBuf); | |
LocalFree(lpMsgBuf); | |
} | |
- MessageBox(NULL,str->text,fatal ? "Fatal Error" : "Error", | |
+ MessageBox(NULL, str->text, fatal ? "Fatal Error" : "Error", | |
MB_OK | MB_ICONSTOP); | |
- if (fatal) ExitProcess(1); | |
+ if (fatal) | |
+ ExitProcess(1); | |
} | |
-void AddInstFiles(char *filename,DWORD filesize,InstFiles **lastpt, | |
- InstFiles **firstpt) { | |
+void AddInstFiles(char *filename, DWORD filesize, InstFiles **lastpt, | |
+ InstFiles **firstpt) | |
+{ | |
InstFiles *newpt; | |
newpt = bmalloc(sizeof(InstFiles)); | |
t@@ -230,13 +269,14 @@ void AddInstFiles(char *filename,DWORD filesize,InstFile… | |
*firstpt = newpt; | |
} | |
*lastpt = newpt; | |
- newpt->next=NULL; | |
- newpt->filename=filename; | |
- newpt->filesize=filesize; | |
+ newpt->next = NULL; | |
+ newpt->filename = filename; | |
+ newpt->filesize = filesize; | |
} | |
-void AddInstLink(char *linkfile,char *origfile,char *args,InstLink **lastpt, | |
- InstLink **firstpt) { | |
+void AddInstLink(char *linkfile, char *origfile, char *args, | |
+ InstLink **lastpt, InstLink **firstpt) | |
+{ | |
InstLink *newpt; | |
newpt = bmalloc(sizeof(InstLink)); | |
t@@ -246,18 +286,19 @@ void AddInstLink(char *linkfile,char *origfile,char *arg… | |
*firstpt = newpt; | |
} | |
*lastpt = newpt; | |
- newpt->next=NULL; | |
- newpt->linkfile=linkfile; | |
- newpt->origfile=origfile; | |
- newpt->args=args; | |
+ newpt->next = NULL; | |
+ newpt->linkfile = linkfile; | |
+ newpt->origfile = origfile; | |
+ newpt->args = args; | |
} | |
-void FreeLinkList(InstLink *linklist,BOOL freepts) { | |
- InstLink *thispt,*nextpt; | |
+void FreeLinkList(InstLink *linklist, BOOL freepts) | |
+{ | |
+ InstLink *thispt, *nextpt; | |
- thispt=linklist; | |
+ thispt = linklist; | |
while (thispt) { | |
- nextpt=thispt->next; | |
+ nextpt = thispt->next; | |
if (freepts) { | |
bfree(thispt->linkfile); | |
t@@ -266,27 +307,30 @@ void FreeLinkList(InstLink *linklist,BOOL freepts) { | |
} | |
bfree(thispt); | |
- thispt=nextpt; | |
+ thispt = nextpt; | |
} | |
} | |
-void FreeFileList(InstFiles *filelist,BOOL freepts) { | |
- InstFiles *thispt,*nextpt; | |
+void FreeFileList(InstFiles *filelist, BOOL freepts) | |
+{ | |
+ InstFiles *thispt, *nextpt; | |
- thispt=filelist; | |
+ thispt = filelist; | |
while (thispt) { | |
- nextpt=thispt->next; | |
+ nextpt = thispt->next; | |
- if (freepts) bfree(thispt->filename); | |
+ if (freepts) | |
+ bfree(thispt->filename); | |
bfree(thispt); | |
- thispt=nextpt; | |
+ thispt = nextpt; | |
} | |
} | |
-void AddServiceDetails(char *servicename,char *servicedisp, | |
- char *servicedesc,char *serviceexe, | |
- NTService **service) { | |
+void AddServiceDetails(char *servicename, char *servicedisp, | |
+ char *servicedesc, char *serviceexe, | |
+ NTService **service) | |
+{ | |
*service = bmalloc(sizeof(NTService)); | |
(*service)->name = servicename; | |
(*service)->display = servicedisp; | |
t@@ -294,8 +338,10 @@ void AddServiceDetails(char *servicename,char *servicedis… | |
(*service)->exe = serviceexe; | |
} | |
-void FreeServiceDetails(NTService *service,BOOL freepts) { | |
- if (!service) return; | |
+void FreeServiceDetails(NTService *service, BOOL freepts) | |
+{ | |
+ if (!service) | |
+ return; | |
if (freepts) { | |
bfree(service->name); | |
t@@ -306,15 +352,16 @@ void FreeServiceDetails(NTService *service,BOOL freepts)… | |
bfree(service); | |
} | |
-void FreeInstData(InstData *idata,BOOL freepts) { | |
- FreeFileList(idata->instfiles,freepts); | |
- FreeFileList(idata->extrafiles,freepts); | |
- FreeFileList(idata->keepfiles,freepts); | |
+void FreeInstData(InstData *idata, BOOL freepts) | |
+{ | |
+ FreeFileList(idata->instfiles, freepts); | |
+ FreeFileList(idata->extrafiles, freepts); | |
+ FreeFileList(idata->keepfiles, freepts); | |
- FreeLinkList(idata->startmenu,freepts); | |
- FreeLinkList(idata->desktop,freepts); | |
+ FreeLinkList(idata->startmenu, freepts); | |
+ FreeLinkList(idata->desktop, freepts); | |
- FreeServiceDetails(idata->service,freepts); | |
+ FreeServiceDetails(idata->service, freepts); | |
bfree(idata->product); | |
bfree(idata->installdir); | |
t@@ -323,203 +370,230 @@ void FreeInstData(InstData *idata,BOOL freepts) { | |
bfree(idata); | |
} | |
-void WriteInstFlags(HANDLE fout, InstFlags flags) { | |
+void WriteInstFlags(HANDLE fout, InstFlags flags) | |
+{ | |
DWORD bytes_written; | |
char str[3]; | |
str[0] = (char)flags; | |
- if (!WriteFile(fout,str,1,&bytes_written,NULL)) { | |
+ if (!WriteFile(fout, str, 1, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
} | |
-void WriteServiceDetails(HANDLE fout,NTService *service) { | |
+void WriteServiceDetails(HANDLE fout, NTService *service) | |
+{ | |
DWORD bytes_written; | |
- char str[]=""; | |
+ char str[] = ""; | |
if (!service) { | |
- if (!WriteFile(fout,str,strlen(str)+1,&bytes_written,NULL)) { | |
+ if (!WriteFile(fout, str, strlen(str) + 1, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
} else { | |
- if (!WriteFile(fout,service->name,strlen(service->name)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile(fout, service->name, strlen(service->name) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- if (!WriteFile(fout,service->display,strlen(service->display)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile(fout, service->display, strlen(service->display) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- if (!WriteFile(fout,service->description,strlen(service->description)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile | |
+ (fout, service->description, strlen(service->description) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- if (!WriteFile(fout,service->exe,strlen(service->exe)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile(fout, service->exe, strlen(service->exe) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
} | |
} | |
-void WriteLinkList(HANDLE fout,InstLink *listpt) { | |
- char str[]=""; | |
+void WriteLinkList(HANDLE fout, InstLink *listpt) | |
+{ | |
+ char str[] = ""; | |
DWORD bytes_written; | |
- for (;listpt;listpt=listpt->next) { | |
- if (!WriteFile(fout,listpt->linkfile,strlen(listpt->linkfile)+1, | |
- &bytes_written,NULL)) { | |
+ | |
+ for (; listpt; listpt = listpt->next) { | |
+ if (!WriteFile(fout, listpt->linkfile, strlen(listpt->linkfile) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- if (!WriteFile(fout,listpt->origfile,strlen(listpt->origfile)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile(fout, listpt->origfile, strlen(listpt->origfile) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- if (!WriteFile(fout,listpt->args,strlen(listpt->args)+1, | |
- &bytes_written,NULL)) { | |
+ if (!WriteFile(fout, listpt->args, strlen(listpt->args) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
} | |
- if (!WriteFile(fout,str,strlen(str)+1,&bytes_written,NULL)) { | |
+ if (!WriteFile(fout, str, strlen(str) + 1, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
} | |
-void WriteFileList(HANDLE fout,InstFiles *listpt) { | |
+void WriteFileList(HANDLE fout, InstFiles *listpt) | |
+{ | |
bstr *str; | |
DWORD bytes_written; | |
- str=bstr_new(); | |
- for (;listpt;listpt=listpt->next) { | |
- if (!WriteFile(fout,listpt->filename,strlen(listpt->filename)+1, | |
- &bytes_written,NULL)) { | |
+ str = bstr_new(); | |
+ | |
+ for (; listpt; listpt = listpt->next) { | |
+ if (!WriteFile(fout, listpt->filename, strlen(listpt->filename) + 1, | |
+ &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- bstr_setlength(str,0); | |
- bstr_append_long(str,listpt->filesize); | |
- if (!WriteFile(fout,str->text,str->length+1,&bytes_written,NULL)) { | |
+ bstr_setlength(str, 0); | |
+ bstr_append_long(str, listpt->filesize); | |
+ if (!WriteFile(fout, str->text, str->length + 1, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
} | |
- bstr_assign(str,""); | |
- if (!WriteFile(fout,str->text,str->length+1,&bytes_written,NULL)) { | |
+ bstr_assign(str, ""); | |
+ if (!WriteFile(fout, str->text, str->length + 1, &bytes_written, NULL)) { | |
printf("Write error\n"); | |
} | |
- bstr_free(str,TRUE); | |
+ bstr_free(str, TRUE); | |
} | |
-static char *GetSpecialDir(int dirtype) { | |
+static char *GetSpecialDir(int dirtype) | |
+{ | |
LPITEMIDLIST pidl; | |
LPMALLOC pmalloc; | |
char szDir[MAX_PATH]; | |
- BOOL doneOK=FALSE; | |
+ BOOL doneOK = FALSE; | |
if (SUCCEEDED(SHGetMalloc(&pmalloc))) { | |
- if (SUCCEEDED(SHGetSpecialFolderLocation(NULL,dirtype,&pidl))) { | |
- if (SHGetPathFromIDList(pidl,szDir)) doneOK=TRUE; | |
- pmalloc->lpVtbl->Free(pmalloc,pidl); | |
+ if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, dirtype, &pidl))) { | |
+ if (SHGetPathFromIDList(pidl, szDir)) | |
+ doneOK = TRUE; | |
+ pmalloc->lpVtbl->Free(pmalloc, pidl); | |
} | |
pmalloc->lpVtbl->Release(pmalloc); | |
} | |
return (doneOK ? bstrdup(szDir) : NULL); | |
} | |
-char *GetStartMenuTopDir(BOOL AllUsers) { | |
- return GetSpecialDir(AllUsers ? CSIDL_COMMON_STARTMENU : CSIDL_STARTMENU); | |
+char *GetStartMenuTopDir(BOOL AllUsers) | |
+{ | |
+ return GetSpecialDir(AllUsers ? CSIDL_COMMON_STARTMENU : | |
+ CSIDL_STARTMENU); | |
} | |
-char *GetDesktopDir(void) { | |
+char *GetDesktopDir(void) | |
+{ | |
return GetSpecialDir(CSIDL_DESKTOPDIRECTORY); | |
} | |
-char *GetStartMenuDir(BOOL AllUsers, InstData *idata) { | |
+char *GetStartMenuDir(BOOL AllUsers, InstData *idata) | |
+{ | |
bstr *str; | |
- char *topdir,*retval; | |
+ char *topdir, *retval; | |
- topdir=GetStartMenuTopDir(AllUsers); | |
+ topdir = GetStartMenuTopDir(AllUsers); | |
str = bstr_new(); | |
- | |
- bstr_assign(str,topdir); | |
+ | |
+ bstr_assign(str, topdir); | |
bfree(topdir); | |
- bstr_appendpath(str,"Programs"); | |
- bstr_appendpath(str,idata->startmenudir); | |
+ bstr_appendpath(str, "Programs"); | |
+ bstr_appendpath(str, idata->startmenudir); | |
retval = str->text; | |
- bstr_free(str,FALSE); | |
+ bstr_free(str, FALSE); | |
return retval; | |
} | |
-BOOL CreateWholeDirectory(char *path) { | |
+BOOL CreateWholeDirectory(char *path) | |
+{ | |
char *pt; | |
- if (!path) return FALSE; | |
-/* We may as well try the easy way first */ | |
- if (CreateDirectory(path,NULL)) return TRUE; | |
+ if (!path) | |
+ return FALSE; | |
+ | |
+ /* We may as well try the easy way first */ | |
+ if (CreateDirectory(path, NULL)) | |
+ return TRUE; | |
/* \\machine\share notation */ | |
- if (strlen(path)>2 && path[0]=='\\' && path[1]=='\\') { | |
- pt=&path[2]; /* Skip initial "\\" */ | |
- while (*pt && *pt!='\\') pt++; /* Skip the machine name */ | |
- /* X: notation */ | |
- } else if (strlen(path)>2 && path[1]==':') { | |
- pt=&path[2]; /* Skip the X: part */ | |
+ if (strlen(path) > 2 && path[0] == '\\' && path[1] == '\\') { | |
+ pt = &path[2]; /* Skip initial "\\" */ | |
+ while (*pt && *pt != '\\') | |
+ pt++; /* Skip the machine name */ | |
+ /* X: notation */ | |
+ } else if (strlen(path) > 2 && path[1] == ':') { | |
+ pt = &path[2]; /* Skip the X: part */ | |
} else { | |
- pt=path; | |
+ pt = path; | |
} | |
while (*pt) { | |
pt++; | |
- if (*pt=='\\') { | |
- *pt='\0'; | |
- if (!CreateDirectory(path,NULL) && GetLastError()!=ERROR_ALREADY_EXISTS)… | |
- *pt='\\'; return FALSE; | |
+ if (*pt == '\\') { | |
+ *pt = '\0'; | |
+ if (!CreateDirectory(path, NULL) | |
+ && GetLastError() != ERROR_ALREADY_EXISTS) { | |
+ *pt = '\\'; | |
+ return FALSE; | |
} | |
- *pt='\\'; | |
+ *pt = '\\'; | |
} | |
} | |
- return (CreateDirectory(path,NULL) || GetLastError()==ERROR_ALREADY_EXISTS); | |
+ return (CreateDirectory(path, NULL) | |
+ || GetLastError() == ERROR_ALREADY_EXISTS); | |
} | |
-BOOL RemoveWholeDirectory(char *path) { | |
+BOOL RemoveWholeDirectory(char *path) | |
+{ | |
char *pt; | |
BOOL retval; | |
- if (!path || !RemoveDirectory(path)) return FALSE; | |
- | |
- for (pt=&path[strlen(path)-2];pt>path;pt--) { | |
- if (*pt=='\\') { | |
- *pt='\0'; | |
- retval=RemoveDirectory(path); | |
- *pt='\\'; | |
- if (!retval) break; | |
+ | |
+ if (!path || !RemoveDirectory(path)) | |
+ return FALSE; | |
+ | |
+ for (pt = &path[strlen(path) - 2]; pt > path; pt--) { | |
+ if (*pt == '\\') { | |
+ *pt = '\0'; | |
+ retval = RemoveDirectory(path); | |
+ *pt = '\\'; | |
+ if (!retval) | |
+ break; | |
} | |
} | |
return TRUE; | |
} | |
-void RemoveService(NTService *service) { | |
- SC_HANDLE scManager,scService; | |
+void RemoveService(NTService *service) | |
+{ | |
+ SC_HANDLE scManager, scService; | |
SERVICE_STATUS status; | |
- if (!service) return; | |
+ if (!service) | |
+ return; | |
- scManager = OpenSCManager(NULL,NULL,GENERIC_READ); | |
+ scManager = OpenSCManager(NULL, NULL, GENERIC_READ); | |
if (!scManager) { | |
- DisplayError("Cannot connect to service manager",TRUE,FALSE); | |
+ DisplayError("Cannot connect to service manager", TRUE, FALSE); | |
return; | |
} | |
- scService = OpenService(scManager,service->name,DELETE|SERVICE_STOP); | |
+ scService = OpenService(scManager, service->name, DELETE | SERVICE_STOP); | |
if (!scService) { | |
- DisplayError("Cannot open service",TRUE,FALSE); | |
+ DisplayError("Cannot open service", TRUE, FALSE); | |
} else { | |
- if (!ControlService(scService,SERVICE_CONTROL_STOP,&status) && | |
- GetLastError()!=ERROR_SERVICE_NOT_ACTIVE) { | |
- DisplayError("Cannot stop service",TRUE,FALSE); | |
+ if (!ControlService(scService, SERVICE_CONTROL_STOP, &status) && | |
+ GetLastError() != ERROR_SERVICE_NOT_ACTIVE) { | |
+ DisplayError("Cannot stop service", TRUE, FALSE); | |
} | |
if (!DeleteService(scService)) { | |
- DisplayError("Cannot delete service",TRUE,FALSE); | |
+ DisplayError("Cannot delete service", TRUE, FALSE); | |
} | |
CloseServiceHandle(scService); | |
} | |
t@@ -527,67 +601,83 @@ void RemoveService(NTService *service) { | |
CloseServiceHandle(scManager); | |
} | |
-char *read_line0(HANDLE hin) { | |
+char *read_line0(HANDLE hin) | |
+{ | |
char *buf; | |
- int bufsize=32,strind=0; | |
+ int bufsize = 32, strind = 0; | |
DWORD bytes_read; | |
+ | |
buf = bmalloc(bufsize); | |
while (1) { | |
- if (!ReadFile(hin,&buf[strind],1,&bytes_read,NULL)) { | |
- printf("Read error\n"); break; | |
+ if (!ReadFile(hin, &buf[strind], 1, &bytes_read, NULL)) { | |
+ printf("Read error\n"); | |
+ break; | |
} | |
- if (bytes_read==0) { buf[strind]='\0'; break; } | |
- else if (buf[strind]=='\0') break; | |
+ if (bytes_read == 0) { | |
+ buf[strind] = '\0'; | |
+ break; | |
+ } else if (buf[strind] == '\0') | |
+ break; | |
else { | |
strind++; | |
- if (strind>=bufsize) { | |
- bufsize*=2; | |
- buf = brealloc(buf,bufsize); | |
+ if (strind >= bufsize) { | |
+ bufsize *= 2; | |
+ buf = brealloc(buf, bufsize); | |
} | |
} | |
} | |
- if (strind==0) { bfree(buf); return NULL; } | |
- else return buf; | |
+ if (strind == 0) { | |
+ bfree(buf); | |
+ return NULL; | |
+ } else | |
+ return buf; | |
} | |
-InstLink *ReadLinkList(HANDLE fin) { | |
- InstLink *first=NULL,*listpt=NULL,*newpt; | |
- char *linkfile,*origfile,*args; | |
+InstLink *ReadLinkList(HANDLE fin) | |
+{ | |
+ InstLink *first = NULL, *listpt = NULL, *newpt; | |
+ char *linkfile, *origfile, *args; | |
while (1) { | |
- linkfile=read_line0(fin); | |
- if (!linkfile) break; | |
- origfile=read_line0(fin); | |
- args=read_line0(fin); | |
- if (!origfile) DisplayError("Corrupt install.log",FALSE,TRUE); | |
+ linkfile = read_line0(fin); | |
+ if (!linkfile) | |
+ break; | |
+ origfile = read_line0(fin); | |
+ args = read_line0(fin); | |
+ if (!origfile) | |
+ DisplayError("Corrupt install.log", FALSE, TRUE); | |
newpt = bmalloc(sizeof(InstLink)); | |
- if (listpt) listpt->next = newpt; | |
- else first = newpt; | |
+ if (listpt) | |
+ listpt->next = newpt; | |
+ else | |
+ first = newpt; | |
listpt = newpt; | |
- newpt->next=NULL; | |
- newpt->linkfile=linkfile; | |
- newpt->origfile=origfile; | |
- newpt->args=args; | |
+ newpt->next = NULL; | |
+ newpt->linkfile = linkfile; | |
+ newpt->origfile = origfile; | |
+ newpt->args = args; | |
} | |
return first; | |
} | |
-InstFlags ReadInstFlags(HANDLE fin) { | |
+InstFlags ReadInstFlags(HANDLE fin) | |
+{ | |
DWORD bytes_read; | |
char buf[3]; | |
buf[0] = 0; | |
- if (!ReadFile(fin,buf,1,&bytes_read,NULL)) { | |
+ if (!ReadFile(fin, buf, 1, &bytes_read, NULL)) { | |
printf("Read error\n"); | |
} | |
return (InstFlags)buf[0]; | |
} | |
-NTService *ReadServiceDetails(HANDLE fin) { | |
- NTService *service=NULL; | |
- char *name,*disp,*desc,*exe; | |
+NTService *ReadServiceDetails(HANDLE fin) | |
+{ | |
+ NTService *service = NULL; | |
+ char *name, *disp, *desc, *exe; | |
name = read_line0(fin); | |
if (name) { | |
t@@ -595,75 +685,82 @@ NTService *ReadServiceDetails(HANDLE fin) { | |
desc = read_line0(fin); | |
exe = read_line0(fin); | |
if (!disp || !desc || !exe) { | |
- DisplayError("Corrupt install.log",FALSE,TRUE); | |
+ DisplayError("Corrupt install.log", FALSE, TRUE); | |
} else { | |
- AddServiceDetails(name,disp,desc,exe,&service); | |
+ AddServiceDetails(name, disp, desc, exe, &service); | |
} | |
} | |
return service; | |
} | |
-InstFiles *ReadFileList(HANDLE fin) { | |
- InstFiles *first=NULL,*listpt=NULL,*newpt; | |
- char *filename,*filesize; | |
+InstFiles *ReadFileList(HANDLE fin) | |
+{ | |
+ InstFiles *first = NULL, *listpt = NULL, *newpt; | |
+ char *filename, *filesize; | |
while (1) { | |
- filename=read_line0(fin); | |
- if (!filename) break; | |
- filesize=read_line0(fin); | |
- if (!filesize) DisplayError("Corrupt install.log",FALSE,TRUE); | |
+ filename = read_line0(fin); | |
+ if (!filename) | |
+ break; | |
+ filesize = read_line0(fin); | |
+ if (!filesize) | |
+ DisplayError("Corrupt install.log", FALSE, TRUE); | |
newpt = bmalloc(sizeof(InstFiles)); | |
- if (listpt) listpt->next = newpt; | |
- else first = newpt; | |
+ if (listpt) | |
+ listpt->next = newpt; | |
+ else | |
+ first = newpt; | |
listpt = newpt; | |
- newpt->next=NULL; | |
- newpt->filename=filename; | |
- newpt->filesize=atol(filesize); | |
+ newpt->next = NULL; | |
+ newpt->filename = filename; | |
+ newpt->filesize = atol(filesize); | |
bfree(filesize); | |
} | |
return first; | |
} | |
-char *GetInstallDir(char *product) { | |
+char *GetInstallDir(char *product) | |
+{ | |
HKEY key; | |
bstr *str; | |
- DWORD keytype,keylen; | |
+ DWORD keytype, keylen; | |
char *installdir; | |
- str=bstr_new(); | |
- bstr_assign(str,UninstallKey); | |
- bstr_appendpath(str,product); | |
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,str->text,0, | |
- KEY_ALL_ACCESS,&key)!=ERROR_SUCCESS) { | |
- DisplayError("Could not open registry",FALSE,TRUE); | |
+ str = bstr_new(); | |
+ bstr_assign(str, UninstallKey); | |
+ bstr_appendpath(str, product); | |
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, str->text, 0, | |
+ KEY_ALL_ACCESS, &key) != ERROR_SUCCESS) { | |
+ DisplayError("Could not open registry", FALSE, TRUE); | |
} | |
- if (RegQueryValueEx(key,"InstallDirectory",NULL, | |
- &keytype,NULL,&keylen)!=ERROR_SUCCESS || | |
- keytype!=REG_SZ) { | |
- DisplayError("Could not query registry key",FALSE,TRUE); | |
+ if (RegQueryValueEx(key, "InstallDirectory", NULL, | |
+ &keytype, NULL, &keylen) != ERROR_SUCCESS || | |
+ keytype != REG_SZ) { | |
+ DisplayError("Could not query registry key", FALSE, TRUE); | |
} | |
installdir = bmalloc(keylen); | |
- if (RegQueryValueEx(key,"InstallDirectory",NULL, | |
- &keytype,installdir,&keylen)!=ERROR_SUCCESS) { | |
- DisplayError("Could not get registry key value",FALSE,TRUE); | |
+ if (RegQueryValueEx(key, "InstallDirectory", NULL, | |
+ &keytype, installdir, &keylen) != ERROR_SUCCESS) { | |
+ DisplayError("Could not get registry key value", FALSE, TRUE); | |
} | |
- bstr_free(str,TRUE); | |
+ bstr_free(str, TRUE); | |
return installdir; | |
} | |
-InstData *ReadOldInstData(HANDLE fin,char *product,char *installdir) { | |
+InstData *ReadOldInstData(HANDLE fin, char *product, char *installdir) | |
+{ | |
InstData *idata; | |
- idata=bmalloc(sizeof(InstData)); | |
+ idata = bmalloc(sizeof(InstData)); | |
- idata->product=product; | |
- idata->installdir=installdir; | |
- idata->startmenudir=read_line0(fin); | |
+ idata->product = product; | |
+ idata->installdir = installdir; | |
+ idata->startmenudir = read_line0(fin); | |
idata->instfiles = ReadFileList(fin); | |
idata->extrafiles = ReadFileList(fin); | |
t@@ -679,80 +776,85 @@ InstData *ReadOldInstData(HANDLE fin,char *product,char … | |
return idata; | |
} | |
-void DeleteFileList(InstFiles *listpt,HWND hwnd,InstFiles *keepfiles) { | |
+void DeleteFileList(InstFiles *listpt, HWND hwnd, InstFiles *keepfiles) | |
+{ | |
bstr *str; | |
char *sep; | |
InstFiles *keeppt; | |
- str=bstr_new(); | |
- for (;listpt;listpt=listpt->next) { | |
+ str = bstr_new(); | |
+ for (; listpt; listpt = listpt->next) { | |
keeppt = keepfiles; | |
- while (keeppt && strcmp(keeppt->filename,listpt->filename)!=0) { | |
+ while (keeppt && strcmp(keeppt->filename, listpt->filename) != 0) { | |
keeppt = keeppt->next; | |
} | |
if (keeppt) { | |
- keeppt->filesize=1; /* Mark that this file is already installed */ | |
+ keeppt->filesize = 1; /* Mark that this file is already | |
+ * installed */ | |
} else { | |
- bstr_assign(str,"Deleting file: "); | |
- bstr_append(str,listpt->filename); | |
- SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)str->text); | |
+ bstr_assign(str, "Deleting file: "); | |
+ bstr_append(str, listpt->filename); | |
+ SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)str->text); | |
DeleteFile(listpt->filename); | |
- sep = strrchr(listpt->filename,'\\'); | |
+ sep = strrchr(listpt->filename, '\\'); | |
if (sep) { | |
*sep = '\0'; | |
RemoveWholeDirectory(listpt->filename); | |
- *sep = '\\'; | |
+ *sep = '\\'; | |
} | |
} | |
} | |
- bstr_free(str,TRUE); | |
+ bstr_free(str, TRUE); | |
} | |
-void DeleteLinkList(char *dir,InstLink *listpt,HWND hwnd) { | |
+void DeleteLinkList(char *dir, InstLink *listpt, HWND hwnd) | |
+{ | |
bstr *str; | |
- str=bstr_new(); | |
+ | |
+ str = bstr_new(); | |
if (SetCurrentDirectory(dir)) { | |
- for (;listpt;listpt=listpt->next) { | |
- bstr_assign(str,"Deleting shortcut: "); | |
- bstr_append(str,listpt->linkfile); | |
- SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)str->text); | |
+ for (; listpt; listpt = listpt->next) { | |
+ bstr_assign(str, "Deleting shortcut: "); | |
+ bstr_append(str, listpt->linkfile); | |
+ SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)str->text); | |
DeleteFile(listpt->linkfile); | |
} | |
} else { | |
- bstr_assign(str,"Could not find shortcut directory "); | |
- bstr_append(str,dir); | |
- DisplayError(str->text,TRUE,FALSE); | |
+ bstr_assign(str, "Could not find shortcut directory "); | |
+ bstr_append(str, dir); | |
+ DisplayError(str->text, TRUE, FALSE); | |
} | |
- bstr_free(str,TRUE); | |
+ bstr_free(str, TRUE); | |
} | |
-void RemoveUninstall(char *startmenu,char *product,BOOL delexe) { | |
- bstr *inipath,*uninstpath,*uninstlink; | |
+void RemoveUninstall(char *startmenu, char *product, BOOL delexe) | |
+{ | |
+ bstr *inipath, *uninstpath, *uninstlink; | |
- inipath=bstr_new(); | |
- uninstpath=bstr_new(); | |
- uninstlink=bstr_new(); | |
+ inipath = bstr_new(); | |
+ uninstpath = bstr_new(); | |
+ uninstlink = bstr_new(); | |
- bstr_assign(uninstlink,startmenu); | |
- bstr_appendpath(uninstlink,"Uninstall "); | |
- bstr_append(uninstlink,product); | |
- bstr_append(uninstlink,".LNK"); | |
+ bstr_assign(uninstlink, startmenu); | |
+ bstr_appendpath(uninstlink, "Uninstall "); | |
+ bstr_append(uninstlink, product); | |
+ bstr_append(uninstlink, ".LNK"); | |
DeleteFile(uninstlink->text); | |
if (delexe) { | |
bstr_assign_windir(inipath); | |
- bstr_assign(uninstpath,inipath->text); | |
+ bstr_assign(uninstpath, inipath->text); | |
- bstr_appendpath(inipath,"wininit.ini"); | |
- bstr_appendpath(uninstpath,UninstallEXE); | |
+ bstr_appendpath(inipath, "wininit.ini"); | |
+ bstr_appendpath(uninstpath, UninstallEXE); | |
- if (!WritePrivateProfileString("Renane","NUL",uninstpath->text, | |
+ if (!WritePrivateProfileString("Renane", "NUL", uninstpath->text, | |
inipath->text)) { | |
- DisplayError("Cannot write to wininit.ini: ",TRUE,FALSE); | |
+ DisplayError("Cannot write to wininit.ini: ", TRUE, FALSE); | |
} | |
} | |
- bstr_free(uninstlink,TRUE); | |
- bstr_free(uninstpath,TRUE); | |
- bstr_free(inipath,TRUE); | |
+ bstr_free(uninstlink, TRUE); | |
+ bstr_free(uninstpath, TRUE); | |
+ bstr_free(inipath, TRUE); | |
} | |
diff --git a/win32/util.h b/win32/util.h | |
t@@ -1,29 +1,32 @@ | |
-/* util.h Shared functions for Win32 installer programs */ | |
-/* Copyright (C) 2001 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. */ | |
+/************************************************************************ | |
+ * util.h Shared functions for Win32 installer programs * | |
+ * Copyright (C) 2001-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. * | |
+ ************************************************************************/ | |
#include <windows.h> | |
typedef struct _bstr { | |
char *text; | |
- unsigned length; /* Length of current text, NOT including terminating null */ | |
- unsigned bufsiz; /* Size of the allocated memory buffer */ | |
+ unsigned length; /* Length of current text, NOT including | |
+ * terminating null */ | |
+ unsigned bufsiz; /* Size of the allocated memory buffer */ | |
} bstr; | |
typedef struct _InstFiles { | |
t@@ -52,7 +55,7 @@ typedef enum { | |
typedef struct _InstData { | |
char *product; | |
- char *installdir,*startmenudir; | |
+ char *installdir, *startmenudir; | |
DWORD totalsize; | |
NTService *service; | |
InstFiles *instfiles; | |
t@@ -68,47 +71,47 @@ extern const char *UninstallEXE; | |
void *bmalloc(UINT numbytes); | |
void bfree(void *pt); | |
-void *brealloc(void *pt,UINT numbytes); | |
+void *brealloc(void *pt, UINT numbytes); | |
char *bstrdup(char *str); | |
bstr *bstr_new(void); | |
-void bstr_free(bstr *str,BOOL free_text); | |
-void bstr_expandby(bstr *str,unsigned extralength); | |
-void bstr_setlength(bstr *str,unsigned length); | |
-void bstr_assign(bstr *str,const char *text); | |
-void bstr_append(bstr *str,const char *text); | |
-void bstr_appendpath(bstr *str,const char *text); | |
-void bstr_append_c(bstr *str,const char ch); | |
-void bstr_append_long(bstr *str,const long val); | |
+void bstr_free(bstr *str, BOOL free_text); | |
+void bstr_expandby(bstr *str, unsigned extralength); | |
+void bstr_setlength(bstr *str, unsigned length); | |
+void bstr_assign(bstr *str, const char *text); | |
+void bstr_append(bstr *str, const char *text); | |
+void bstr_appendpath(bstr *str, const char *text); | |
+void bstr_append_c(bstr *str, const char ch); | |
+void bstr_append_long(bstr *str, const long val); | |
void bstr_append_windir(bstr *str); | |
void bstr_append_curdir(bstr *str); | |
void bstr_assign_windir(bstr *str); | |
void bstr_assign_curdir(bstr *str); | |
-void DisplayError(const char *errtext,BOOL addsyserr,BOOL fatal); | |
-void AddInstFiles(char *filename,DWORD filesize,InstFiles **lastpt, | |
+void DisplayError(const char *errtext, BOOL addsyserr, BOOL fatal); | |
+void AddInstFiles(char *filename, DWORD filesize, InstFiles **lastpt, | |
InstFiles **firstpt); | |
-void AddInstLink(char *linkfile,char *origfile,char *args,InstLink **lastpt, | |
- InstLink **firstpt); | |
-void FreeLinkList(InstLink *linklist,BOOL freepts); | |
-void FreeFileList(InstFiles *filelist,BOOL freepts); | |
-void FreeInstData(InstData *idata,BOOL freepts); | |
-void AddServiceDetails(char *servicename,char *servicedisp, | |
- char *servicedesc,char *serviceexe, | |
+void AddInstLink(char *linkfile, char *origfile, char *args, | |
+ InstLink **lastpt, InstLink **firstpt); | |
+void FreeLinkList(InstLink *linklist, BOOL freepts); | |
+void FreeFileList(InstFiles *filelist, BOOL freepts); | |
+void FreeInstData(InstData *idata, BOOL freepts); | |
+void AddServiceDetails(char *servicename, char *servicedisp, | |
+ char *servicedesc, char *serviceexe, | |
NTService **service); | |
-void FreeServiceDetails(NTService *service,BOOL freepts); | |
-void WriteServiceDetails(HANDLE fout,NTService *service); | |
+void FreeServiceDetails(NTService *service, BOOL freepts); | |
+void WriteServiceDetails(HANDLE fout, NTService *service); | |
void WriteInstFlags(HANDLE fout, InstFlags flags); | |
-void WriteLinkList(HANDLE fout,InstLink *listpt); | |
-void WriteFileList(HANDLE fout,InstFiles *listpt); | |
+void WriteLinkList(HANDLE fout, InstLink *listpt); | |
+void WriteFileList(HANDLE fout, InstFiles *listpt); | |
char *GetStartMenuTopDir(BOOL AllUsers); | |
char *GetStartMenuDir(BOOL AllUsers, InstData *idata); | |
char *GetDesktopDir(void); | |
BOOL CreateWholeDirectory(char *path); | |
BOOL RemoveWholeDirectory(char *path); | |
-void DeleteLinkList(char *dir,InstLink *listpt,HWND hwnd); | |
-void DeleteFileList(InstFiles *listpt,HWND hwnd,InstFiles *keepfiles); | |
-InstData *ReadOldInstData(HANDLE fin,char *product,char *installdir); | |
+void DeleteLinkList(char *dir, InstLink *listpt, HWND hwnd); | |
+void DeleteFileList(InstFiles *listpt, HWND hwnd, InstFiles *keepfiles); | |
+InstData *ReadOldInstData(HANDLE fin, char *product, char *installdir); | |
char *GetInstallDir(char *product); | |
void RemoveService(NTService *service); | |
-void RemoveUninstall(char *startmenu,char *product,BOOL delexe); | |
+void RemoveUninstall(char *startmenu, char *product, BOOL delexe); |