tGraphical server added - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 118b9d08742be23909ab43e0016cdbec8517152c
 (DIR) parent 77dac8e5d09edd00cafc3553dc81f837d13f6887
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sat, 28 Apr 2001 17:48:05 +0000
       
       Graphical server added
       
       
       Diffstat:
         M src/dopewars.h                      |       1 +
         M src/serverside.c                    |     178 ++++++++++++++++++++++++++++++-
         M src/serverside.h                    |       5 ++++-
         M src/winmain.c                       |       5 +++++
       
       4 files changed, 186 insertions(+), 3 deletions(-)
       ---
 (DIR) diff --git a/src/dopewars.h b/src/dopewars.h
       t@@ -295,6 +295,7 @@ struct PLAYER_T {
           Player *OnBehalfOf;
           ConnBuf ReadBuf,WriteBuf;
           Abilities Abil;
       +   gint InputTag;
           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
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -44,6 +44,10 @@
        #include <fcntl.h>
        #endif
        
       +#ifdef GUI_SERVER
       +#include "gtkport.h"
       +#endif
       +
        #ifndef SD_SEND
        #define SD_SEND 1
        #endif
       t@@ -488,11 +492,13 @@ void ServerHelp() {
              } else {
                 g_string_assign(VarName,Globals[i].Name);
              }
       -      g_print("%-26s %s\n",VarName->str,_(Globals[i].Help));
       +      g_print("%-26s\t%s\n",VarName->str,_(Globals[i].Help));
              Lines++;
       +#ifndef GUI_SERVER
              if (Lines%24==0) {
                 g_print(_("--More--")); bgetch(); g_print("\n");
              }
       +#endif
           }
           g_string_free(VarName,TRUE);
        #else
       t@@ -566,7 +572,9 @@ gboolean ReadServerKey(GString *LineBuf,gboolean *EndOfLine) {
        
        void StartServer() {
           struct sockaddr_in ServerAddr;
       +#ifndef CYGWIN
           struct sigaction sact;
       +#endif
        
           Scanner=g_scanner_new(&ScannerConfig);
           Scanner->input_name="(stdin)";
       t@@ -686,7 +694,7 @@ gboolean HandleServerCommand(char *string) {
           return FALSE;
        }
        
       -void HandleNewConnection() {
       +Player *HandleNewConnection() {
           int cadsize;
           int ClientSock;
           struct sockaddr_in ClientAddr;
       t@@ -703,6 +711,7 @@ void HandleNewConnection() {
           if (ConnectTimeout) {
              tmp->ConnectTimeout=time(NULL)+(time_t)ConnectTimeout;
           }
       +   return tmp;
        }
        
        void StopServer() {
       t@@ -825,6 +834,171 @@ void ServerLoop() {
           StopServer();
           g_string_free(LineBuf,TRUE);
        }
       +
       +#ifdef GUI_SERVER
       +static GtkWidget *TextOutput;
       +static gint ListenTag=0;
       +static void SetSocketWriteTest(Player *Play,gboolean WriteTest);
       +static void GuiSetTimeouts();
       +static time_t NextTimeout=0;
       +static guint TimeoutTag=-1;
       +
       +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=-1;
       +   NextTimeout=0;
       +
       +   FirstServer=HandleTimeouts(FirstServer);
       +   GuiSetTimeouts();
       +   return FALSE;
       +}
       +
       +void GuiSetTimeouts() {
       +   int MinTimeout;
       +   time_t TimeNow;
       +   TimeNow=time(NULL);
       +   MinTimeout=GetMinimumTimeout(FirstServer);
       +   if (TimeNow+MinTimeout < NextTimeout || NextTimeout<TimeNow) {
       +      if (TimeoutTag!=-1) gtk_timeout_remove(TimeoutTag);
       +      TimeoutTag = -1;
       +      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 GuiServerLogMessage(const gchar *log_domain,
       +                                GLogLevelFlags log_level,const gchar *message,
       +                                gpointer user_data) {
       +   gchar *text;
       +   text = g_strdup_printf("Message: %s\n",message);
       +   GuiServerPrintFunc(text);
       +   g_free(text);
       +}
       +
       +static void GuiQuitServer() {
       +   gtk_main_quit();
       +   StopServer();
       +}
       +
       +static void GuiDoCommand(GtkWidget *widget,gpointer data) {
       +   gchar *text;
       +   gboolean retval;
       +   text=gtk_editable_get_chars(GTK_EDITABLE(widget),0,-1);
       +   gtk_editable_delete_text(GTK_EDITABLE(widget),0,-1);
       +   retval=HandleServerCommand(text);
       +   g_free(text);
       +   if (retval) GuiQuitServer();
       +}
       +
       +static void GuiHandleSocket(gpointer data,gint socket,
       +                            GdkInputCondition condition) {
       +   Player *Play;
       +   Play = (Player *)data;
       +
       +   /* Sanity check - is the player still around? */
       +   if (!g_slist_find(FirstServer,(gpointer)Play)) return;
       +
       +   if (condition&GDK_INPUT_WRITE) {
       +      if (!WriteConnectionBufferToWire(Play)) {
       +         if (RemovePlayerFromServer(Play,WantQuit)) GuiQuitServer();
       +      } else if (Play->WriteBuf.DataPresent==0) {
       +         SetSocketWriteTest(Play,FALSE);
       +      }
       +   }
       +   if (condition&GDK_INPUT_READ) {
       +      if (!ReadConnectionBufferFromWire(Play)) {
       +         if (RemovePlayerFromServer(Play,WantQuit)) GuiQuitServer();
       +      } else {
       +         HandleServerPlayer(Play);
       +         GuiSetTimeouts();  /* We may have set some new timeouts */
       +      }
       +   }
       +}
       +
       +void SetSocketWriteTest(Player *Play,gboolean WriteTest) {
       +   if (Play->InputTag) gdk_input_remove(Play->InputTag);
       +   Play->InputTag=gdk_input_add(Play->fd,
       +                      GDK_INPUT_READ|(WriteTest ? GDK_INPUT_WRITE : 0),
       +                      GuiHandleSocket,(gpointer)Play);
       +}
       +
       +static void GuiNewConnect(gpointer data,gint socket,
       +                          GdkInputCondition condition) {
       +   Player *Play;
       +   if (condition&GDK_INPUT_READ) {
       +      Play=HandleNewConnection();
       +      Play->InputTag=0;
       +      SetSocketWriteTest(Play,TRUE);
       +   }
       +}
       +
       +static gboolean TriedPoliteShutdown=FALSE;
       +
       +static gint GuiRequestDelete(GtkWidget *widget,GdkEvent *event,gpointer data) {
       +   if (TriedPoliteShutdown) {
       +      GuiQuitServer();
       +   } else {
       +      TriedPoliteShutdown=TRUE;
       +      if (HandleServerCommand("quit")) GuiQuitServer();
       +   }
       +   return TRUE; /* Never allow automatic deletion - we handle it manually */
       +}
       +
       +void GuiServerLoop() {
       +   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);
       +   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);
       +
       +   g_set_print_handler(GuiServerPrintFunc);
       +   g_log_set_handler(NULL,G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING,
       +                     GuiServerLogMessage,NULL);
       +   StartServer();
       +
       +   SocketWriteTestPt = SetSocketWriteTest;
       +   ListenTag=gdk_input_add(ListenSock,GDK_INPUT_READ,GuiNewConnect,NULL);
       +   gtk_main();
       +}
       +#endif /* GUI_SERVER */
       +
        #endif /* NETWORKING */
        
        void FinishGame(Player *Play,char *Message) {
 (DIR) diff --git a/src/serverside.h b/src/serverside.h
       t@@ -44,7 +44,7 @@ void ClientLeftServer(Player *Play);
        void StartServer();
        void StopServer();
        gboolean HandleServerCommand(char *string);
       -void HandleNewConnection();
       +Player *HandleNewConnection();
        void ServerLoop();
        void HandleServerPlayer(Player *Play);
        void HandleServerMessage(gchar *buf,Player *ReallyFrom);
       t@@ -77,5 +77,8 @@ void RunFromCombat(Player *Play,int ToLocation);
        gboolean CanPlayerFire(Player *Play);
        gboolean CanRunHere(Player *Play);
        Player *GetNextShooter(Player *Play);
       +#ifdef GUI_SERVER
       +void GuiServerLoop();
       +#endif
        
        #endif
 (DIR) diff --git a/src/winmain.c b/src/winmain.c
       t@@ -119,6 +119,10 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
              } else {
                 StartNetworking();
                 if (Server) {
       +#ifdef GUI_SERVER
       +            win32_init(hInstance,hPrevInstance);
       +            GuiServerLoop();
       +#else
                    AllocConsole();
                    SetConsoleTitle(_("dopewars server"));
                    g_log_set_handler(NULL,G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING,
       t@@ -126,6 +130,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                    g_set_print_handler(ServerPrintFunc);
                    newterm(NULL,NULL,NULL);
                    ServerLoop();
       +#endif
                 } else if (AIPlayer) {
                    AllocConsole();
                    SetConsoleTitle(_("dopewars AI"));