chiark / gitweb /
@@
[sympathy.git] / apps / mainloop.c
index 851f2966af00ba191a1e60022b894aadedbb30c5..3c7d01da7d8088372f8d5014355447a323d77c59 100644 (file)
@@ -10,6 +10,12 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.6  2008/02/20 19:44:37  james
+ * @@
+ *
+ * Revision 1.5  2008/02/20 18:31:44  james
+ * *** empty log message ***
+ *
  * Revision 1.4  2008/02/20 17:18:33  james
  * *** empty log message ***
  *
@@ -62,8 +68,8 @@ static char rcsid[] = "$Id$";
 
 #include <sys/time.h>
 #include <sympathy.h>
+#include "mainloop.h"
 
-#include "client.h"
 #include "clients.h"
 
 typedef struct
@@ -233,11 +239,11 @@ check_status (Context * c, Clients * cs)
   status = get_status (c->t, cs);
   if (!memcmp (&status, &old_status, sizeof (status)))
     return;
-  old_status = status;
-
 
   log_line_changes (c, old_status.lines, status.lines);
 
+  old_status = status;
+
   ptr += sprintf (ptr, "CTRL-B ");
 
   t = c->t->name;
@@ -293,13 +299,13 @@ check_status (Context * c, Clients * cs)
   if (cs)
     send_status (cs, buf);
   else
-    cmd_new_status (c->d, c, m->status.status);
+    cmd_new_status (c->d, c, buf);
 
 }
 
 
-static void
-msg_from_server (IPC_Msg * m, Context * c)
+static int
+msg_from_server (ANSI *a,IPC_Msg * m, Context * c)
 {
   switch (m->hdr.type)
     {
@@ -317,7 +323,12 @@ msg_from_server (IPC_Msg * m, Context * c)
         abort ();
 
       *(c->v) = m->vt102.vt102;
-       //FIXME HTML hook
+
+      if (a->one_shot) {
+               a->one_shot(a,&c->v->crt);
+               return 1;
+       }
+      //FIXME HTML hook
       break;
     case IPC_MSG_TYPE_TERM:
       vt102_parse (c, m->term.term, m->term.len);
@@ -328,27 +339,27 @@ msg_from_server (IPC_Msg * m, Context * c)
     default:
       fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
     }
+return 0;
 }
 
 
 void
-mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, Ansi * a,
-          Log * log)
+mainloop (TTY * tty, Socket * server_socket, Socket * client_socket,
+          ANSI * ansi, Log * log, int nhistory)
 {
   fd_set rfds, wfds;
-  Context c={0};
+  Context c = { 0 };
   Clients *clients;
 
 
   c.v = vt102_new ();
-  c.h = history_new (200);
+  c.h = history_new (nhistory);
   c.l = log;
-    /* are we being fed by a tty or a socket */
-    if (client_socket)
+  /* are we being fed by a tty or a socket */
+  if (client_socket)
     {
       if (server_socket)
         abort ();
-      c.s = client_socket;
       c.k = keydis_ipc_new (client_socket);
     }
   else
@@ -386,8 +397,12 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, Ansi * a,
     {
       struct timeval tv = { 1, 0 };
 
-      /*update the status lines, locally or remotely*/
-      check_status (&c, clients);
+      if ((c.d) && (c.d->disconnect))
+        break;
+
+      /*update the status lines, locally or remotely */
+      if (c.t)
+        check_status (&c, clients);
 
       FD_ZERO (&rfds);
       FD_ZERO (&wfds);
@@ -414,7 +429,7 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, Ansi * a,
         {
           Socket *new_client_socket;
           if (FD_ISSET (server_socket->fd, &rfds)
-              && ((new_client_socket = socket_accept (s))))
+              && ((new_client_socket = socket_accept (server_socket))))
             {
               {
                 Client *new_client;
@@ -444,14 +459,15 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, Ansi * a,
 
           if (red)
             {
-              send_output (clients, buf, red);
+              if (clients)
+                send_output (clients, buf, red);
               vt102_parse (&c, buf, red);
             }
         }
 
 
 
-      /*any data from the server*/
+      /*any data from the server */
       if (client_socket)
         {
           if (socket_post_select (client_socket, &rfds, &wfds))
@@ -459,25 +475,24 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, Ansi * a,
 
           while (client_socket->msg)
             {
-              msg_from_server (client_socket->msg, &c);
+              if (msg_from_server (ansi,client_socket->msg, &c))
+               break;
               socket_consume_msg (client_socket);
             }
         }
 
 
-      /*update our local screen*/
+      /*update our local screen */
       if (ansi)
         {
-          if (ansi_dispatch (ansi, &c))
-            break;
+          if (ansi->dispatch)
+               ansi->dispatch (ansi, &c);
 
-          ansi_update (ansi, &c);
+         if (ansi->update)
+          ansi->update (ansi, &c);
         }
     }
 
   if (clients)
-    {
-      clients_shutdown (clients);
-    }
-  printf ("QUAT\n");
+    clients_shutdown (clients);
 }