X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=sympathy.git;a=blobdiff_plain;f=apps%2Fmainloop.c;h=9737bd29439f545c8a3ebc162708715bf74615a0;hp=fd2947f8af97729d5fa382f988cb4eba0e69d43c;hb=3e72a1f6fc28777c26e4fb109867bd2a3c7b89b0;hpb=e1ec8d900bb563b46145bc7a53abd8990b76e902 diff --git a/apps/mainloop.c b/apps/mainloop.c index fd2947f..9737bd2 100644 --- a/apps/mainloop.c +++ b/apps/mainloop.c @@ -6,10 +6,56 @@ * */ -static char rcsid[] = "$Id$"; +static char rcsid[] = + "$Id$"; /* * $Log$ + * Revision 1.20 2008/02/28 16:57:51 james + * *** empty log message *** + * + * Revision 1.19 2008/02/28 16:37:16 james + * *** empty log message *** + * + * Revision 1.18 2008/02/28 11:27:48 james + * *** empty log message *** + * + * Revision 1.17 2008/02/27 09:42:53 james + * *** empty log message *** + * + * Revision 1.16 2008/02/27 09:42:21 james + * *** empty log message *** + * + * Revision 1.15 2008/02/27 01:31:38 james + * *** empty log message *** + * + * Revision 1.14 2008/02/27 01:31:14 james + * *** empty log message *** + * + * Revision 1.13 2008/02/26 23:56:12 james + * *** empty log message *** + * + * Revision 1.12 2008/02/26 23:23:16 james + * *** empty log message *** + * + * Revision 1.11 2008/02/24 00:43:55 james + * *** empty log message *** + * + * Revision 1.10 2008/02/23 13:05:57 staffcvs + * *** empty log message *** + * + * Revision 1.9 2008/02/23 11:48:51 james + * *** empty log message *** + * + * Revision 1.8 2008/02/22 23:39:30 james + * *** empty log message *** + * + * Revision 1.7 2008/02/20 20:16:07 james + * *** empty log message *** + * + * Revision 1.6 2008/02/20 19:44:37 james + * @@ + * * Revision 1.5 2008/02/20 18:31:44 james * *** empty log message *** * @@ -69,6 +115,8 @@ static char rcsid[] = "$Id$"; #include "clients.h" +Context *context; + typedef struct { int nclients; @@ -291,8 +339,29 @@ check_status (Context * c, Clients * cs) sprintf (ptr, ", %d client%s", status.nclients, (status.nclients == 1) ? "" : "s"); + if (c->tp->biterrs) + { + + ptr += + sprintf (ptr, ", %d err%s", c->tp->biterrs, + (c->tp->biterrs == 1) ? "" : "s"); + + if (c->tp->guessed_baud == -1) + { + ptr += sprintf (ptr, " try higher"); + } + else if (c->tp->guessed_baud > 0) + { + ptr += sprintf (ptr, " try %db", c->tp->guessed_baud); + } + } + *ptr = 0; +#if 0 + log_f (c->l, "%s:%d %s", __FILE__, __LINE__, buf); +#endif + if (cs) send_status (cs, buf); else @@ -301,8 +370,8 @@ check_status (Context * c, Clients * cs) } -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) { @@ -320,10 +389,15 @@ 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; + } break; case IPC_MSG_TYPE_TERM: - vt102_parse (c, m->term.term, m->term.len); + tty_parse (c, m->term.term, m->term.len); break; case IPC_MSG_TYPE_STATUS: cmd_new_status (c->d, c, m->status.status); @@ -331,19 +405,24 @@ 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 * ansi, Log * log, int nhistory) + ANSI * ansi, Log * log, int nhistory, CRT_Pos * size) { fd_set rfds, wfds; Context c = { 0 }; Clients *clients; + context = &c; + + c.tp = tty_parser_new (); + c.u = utf8_new (); - c.v = vt102_new (); + c.v = vt102_new (size); c.h = history_new (nhistory); c.l = log; /* are we being fed by a tty or a socket */ @@ -373,6 +452,9 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, } + vt102_reset (&c); + + if (server_socket) { if (client_socket) @@ -386,7 +468,7 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, for (;;) { - struct timeval tv = { 1, 0 }; + struct timeval tv = { 0, 250000 }; if ((c.d) && (c.d->disconnect)) break; @@ -410,7 +492,7 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, if (client_socket) socket_pre_select (client_socket, &rfds, &wfds); - if (ansi) + if (ansi && ansi->terminal) tty_pre_select (ansi->terminal, &rfds, &wfds); select (FD_SETSIZE, &rfds, &wfds, NULL, &tv); @@ -452,7 +534,7 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, { if (clients) send_output (clients, buf, red); - vt102_parse (&c, buf, red); + tty_parse (&c, buf, red); } } @@ -461,24 +543,30 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, /*any data from the server */ if (client_socket) { + int one_shot; if (socket_post_select (client_socket, &rfds, &wfds)) break; while (client_socket->msg) { - msg_from_server (client_socket->msg, &c); + if (msg_from_server (ansi, client_socket->msg, &c)) + one_shot++; + socket_consume_msg (client_socket); } + if (one_shot) + break; } /*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); } }