From: james Date: Wed, 20 Feb 2008 20:16:07 +0000 (+0000) Subject: *** empty log message *** X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=sympathy.git;a=commitdiff_plain;h=6f9cbdaa434b4ff90158de4ae24cebfb8300b36a;hp=ece1299582523fd5a339398bdddb77f525e2a2fc *** empty log message *** --- diff --git a/apps/mainloop.c b/apps/mainloop.c index 3c7d01d..fd8f982 100644 --- a/apps/mainloop.c +++ b/apps/mainloop.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.7 2008/02/20 20:16:07 james + * *** empty log message *** + * * Revision 1.6 2008/02/20 19:44:37 james * @@ * @@ -419,7 +422,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); @@ -470,15 +473,18 @@ 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) { if (msg_from_server (ansi,client_socket->msg, &c)) - break; + one_shot++; + socket_consume_msg (client_socket); } + if (one_shot) break; } diff --git a/apps/sympathy.c b/apps/sympathy.c index df351f3..4ea7bf0 100644 --- a/apps/sympathy.c +++ b/apps/sympathy.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.11 2008/02/20 20:16:07 james + * *** empty log message *** + * * Revision 1.10 2008/02/20 19:44:37 james * @@ * @@ -468,15 +471,12 @@ main (int argc, char *argv[]) if (oflags['H']) { - fatal_moan ("fix a bug in HTML dispatcher before this works"); + ansi=ansi_new_html(stdout); } else { - ansi = (ANSI *) malloc (sizeof (ANSI)); - memset (ansi, 0, sizeof (ANSI)); - terminal_register_handlers (); - ansi->terminal = terminal_open (0, 1); + ansi=ansi_new_from_terminal(terminal_open(0,1)); ansi->reset(ansi, NULL); } } @@ -499,6 +499,7 @@ main (int argc, char *argv[]) if (client_socket) socket_free (client_socket); + if (!oflags['H']) printf ("you have now exited sympathy\n"); return 0; } diff --git a/src/ansi.c b/src/ansi.c index 8d4d640..905866b 100644 --- a/src/ansi.c +++ b/src/ansi.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.26 2008/02/20 20:16:07 james + * *** empty log message *** + * * Revision 1.25 2008/02/20 19:44:37 james * @@ * @@ -866,7 +869,7 @@ static void ansi_free(ANSI *a) } -ANSI *ansi_new_from_terminal(ANSI *a,TTY *t) +ANSI *ansi_new_from_terminal(TTY *t) { ANSI *ret; @@ -879,5 +882,7 @@ ret->update=ansi_update; ret->reset=ansi_reset; ret->terminal_reset=ansi_terminal_reset; ret->close=ansi_free; +ret->dispatch=ansi_dispatch; +return ret; } diff --git a/src/ansi.h b/src/ansi.h index b88b329..22c0bcd 100644 --- a/src/ansi.h +++ b/src/ansi.h @@ -12,6 +12,9 @@ /* * $Log$ + * Revision 1.11 2008/02/20 20:16:07 james + * *** empty log message *** + * * Revision 1.10 2008/02/20 19:44:37 james * @@ * @@ -76,8 +79,8 @@ typedef struct ANSI_struct int attr; int color; - int history_ptr; + FILE *file; int (*dispatch)(struct ANSI_struct *,struct Context_struct *); void (*update)(struct ANSI_struct *,struct Context_struct *); diff --git a/src/html.c b/src/html.c index db142a9..6aefce3 100644 --- a/src/html.c +++ b/src/html.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.3 2008/02/20 20:16:07 james + * *** empty log message *** + * * Revision 1.2 2008/02/04 02:05:06 james * *** empty log message *** * @@ -20,7 +23,32 @@ static char rcsid[] = "$Id$"; #include "project.h" -void + +#define V(i) (((i)==0)?0x80:(((i)==1)?0xc0:0xff)) +#define COLOR(r,g,b,i) ((((r)?(V(i)):0) << 0)| (((g)?(V(i)):0) << 8)| (((b)?(V(i)):0) << 16)) + +static int colormap[]= +{ +[CRT_COLOR_BLACK]=COLOR(0,0,0,0), +[CRT_COLOR_RED]=COLOR(0,0,1,0), +[CRT_COLOR_GREEN]=COLOR(0,1,0,0), +[CRT_COLOR_YELLOW]=COLOR(0,1,1,0), +[CRT_COLOR_BLUE]=COLOR(1,0,0,0), +[CRT_COLOR_MAGENTA]=COLOR(1,0,1,0), +[CRT_COLOR_CYAN]=COLOR(1,1,0,0), +[CRT_COLOR_WHITE]=COLOR(1,1,1,1), +[CRT_COLOR_BLACK|CRT_COLOR_INTENSITY]=COLOR(1,1,1,0), +[CRT_COLOR_RED|CRT_COLOR_INTENSITY]=COLOR(0,0,1,2), +[CRT_COLOR_GREEN|CRT_COLOR_INTENSITY]=COLOR(0,1,0,2), +[CRT_COLOR_YELLOW|CRT_COLOR_INTENSITY]=COLOR(0,1,1,2), +[CRT_COLOR_BLUE|CRT_COLOR_INTENSITY]=COLOR(1,0,0,2), +[CRT_COLOR_MAGENTA|CRT_COLOR_INTENSITY]=COLOR(1,0,1,2), +[CRT_COLOR_CYAN|CRT_COLOR_INTENSITY]=COLOR(1,1,0,2), +[CRT_COLOR_WHITE|CRT_COLOR_INTENSITY]=COLOR(1,1,1,2), +}; + + +static void html_entity (FILE * f, int c) { switch (c) @@ -42,17 +70,24 @@ html_entity (FILE * f, int c) } } -void +static void html_render (FILE * f, CRT_CA c) { +int fg,bg; + if (c.attr & CRT_ATTR_REVERSE) { - fprintf (f, ""); + fg=CRT_COLOR_BG(c.color); + bg=CRT_COLOR_FG(c.color); } else { - fprintf (f, ""); + fg=CRT_COLOR_FG(c.color); + bg=CRT_COLOR_BG(c.color); + if (c.attr & CRT_ATTR_BOLD) + fg|=CRT_COLOR_INTENSITY; } + fprintf (f, "",colormap[bg],colormap[fg]); if (c.attr & CRT_ATTR_UNDERLINE) fprintf (f, "
    "); @@ -77,7 +112,7 @@ html_render (FILE * f, CRT_CA c) fprintf (f, ""); } -void +static void html_draw (FILE * f, CRT * c) { CRT_Pos p; @@ -88,7 +123,7 @@ html_draw (FILE * f, CRT * c) { o = CRT_ADDR (p.y, 0); fprintf (f, ""); - for (p.x = 0; p.x < CRT_ROWS; ++p.x, ++o) + for (p.x = 0; p.x < CRT_COLS; ++p.x, ++o) { html_render (f, c->screen[o]); } @@ -96,3 +131,33 @@ html_draw (FILE * f, CRT * c) } fprintf (f, "\n"); } + + +static void html_one_shot(ANSI *a,CRT *c) +{ +html_draw(a->file,c); +} + + +static void ansi_free(ANSI *a) +{ +free(a); +} + +ANSI *ansi_new_html(FILE *f) +{ +ANSI *ret; + +ret=malloc(sizeof(ANSI)); +memset(ret,0,sizeof(ANSI)); + +ret->file=f; +ret->close=ansi_free; +ret->one_shot=html_one_shot; + +return ret; +} + + + + diff --git a/src/prototypes.h b/src/prototypes.h index 6dc0ca6..0f71766 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -1,6 +1,6 @@ /* ansi.c */ extern int ansi_dispatch(ANSI *a, Context *c); -extern ANSI *ansi_new_from_terminal(ANSI *a, TTY *t); +extern ANSI *ansi_new_from_terminal(TTY *t); /* crt.c */ extern void crt_erase(CRT *c, CRT_Pos s, CRT_Pos e, int ea); extern void crt_cls(CRT *c); @@ -9,9 +9,7 @@ extern void crt_scroll_down(CRT *c, CRT_Pos s, CRT_Pos e, int ea); extern void crt_reset(CRT *c); extern void crt_insert(CRT *c, CRT_CA ca); /* html.c */ -extern void html_entity(FILE *f, int c); -extern void html_render(FILE *f, CRT_CA c); -extern void html_draw(FILE *f, CRT *c); +extern ANSI *ansi_new_html(FILE *f); /* libsympathy.c */ /* render.c */ /* version.c */ diff --git a/test/test.c b/test/test.c index 8cb6be1..597a61e 100644 --- a/test/test.c +++ b/test/test.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * Revision 1.7 2008/02/20 20:16:07 james + * *** empty log message *** + * * Revision 1.6 2008/02/15 23:52:12 james * *** empty log message *** * @@ -46,6 +49,7 @@ static char rcsid[] = int main (int argc, char *argv[]) { +#if 0 fd_set rfds, wfds; ANSI a = { 0 }; Context c; @@ -89,4 +93,6 @@ main (int argc, char *argv[]) ansi_terminal_reset (&a); terminal_atexit (); printf ("QUAT\n"); +#endif +return 0; }