From 9e84f0195255337d98bf9615e6b589448cd9b907 Mon Sep 17 00:00:00 2001 From: james Date: Thu, 7 Feb 2008 13:19:48 +0000 Subject: [PATCH] *** empty log message *** --- src/ansi.c | 80 ++++++++++++++++++++++++++- src/crt.c | 17 +++--- src/libsympathy.c | 20 ++++--- src/prototypes.h | 134 +++++++++++++++++++++++----------------------- src/vt102.c | 110 ++++++++++++++++++++----------------- 5 files changed, 230 insertions(+), 131 deletions(-) diff --git a/src/ansi.c b/src/ansi.c index f70a2d5..d575f62 100644 --- a/src/ansi.c +++ b/src/ansi.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.15 2008/02/07 13:19:48 james + * *** empty log message *** + * * Revision 1.14 2008/02/07 12:21:16 james * *** empty log message *** * @@ -347,7 +350,7 @@ ansi_render (ANSI * a, CRT_CA ca) /*Can't easily wrap round here as don't know size of destination screen*/ /*so invalidate the cached cursor position*/ - if (a->pos.x >= CRT_COLS) + if (a->pos.x >= a->size.x) a->pos.x = ANSI_INVAL; } @@ -367,6 +370,77 @@ ansi_cls (ANSI * a) a->pos.x = ANSI_INVAL; } +int ansi_scroll_up(ANSI *a,CRT_Pos s,CRT_Pos e) +{ +char buf[16]; +int i; +if (s.x) return -1; +if (e.x!=(CRT_COLS-1)) return -1; +if (s.y) return -1; +if (s.y>=a->size.y) return -1; + +ansi_showhide_cursor (a, 1); +i=sprintf(buf,"\033[%d;%dr",s.y+1,e.y+1); +ansi_write(a,buf,i); +i=sprintf(buf,"\033[%d;%dH",e.y+1,0); +ansi_write(a,buf,i); +ansi_write (a, "\033D",2); +ansi_write(a,"\033[r", 3); + +a->pos.x=ANSI_INVAL; + +return 0; +} + + +void ansi_spot_scroll_up(ANSI * a, CRT * c) +{ +int l,n,p; + + l = c->sh.e.x - c->sh.s.x; + l++; + l *= sizeof (CRT_CA); + + n = c->sh.e.y - c->sh.s.y; + p = CRT_ADDR_POS (&c->sh.s); + + while (n--) + { + if (memcmp (&c->screen[p], &a->crt.screen[p + CRT_COLS], l)) + return; + p += CRT_COLS; + } + + if (ansi_scroll_up(a,c->sh.s,c->sh.e)) return; + + n = c->sh.e.y - c->sh.s.y; + p = CRT_ADDR_POS (&c->sh.s); + + while (n--) + { + memcpy (&a->crt.screen[p], &a->crt.screen[p + CRT_COLS], l); + p += CRT_COLS; + } + +c->sh.dir=0; //FIXME: horrid hack + +} + +void ansi_spot_scroll(ANSI * a, CRT * c) +{ + + switch(c->sh.dir) { +case -1: +/*we only care about up for the moment */ +ansi_spot_scroll_up(a,c); +break; +} + +return; +} + + + void ansi_draw (ANSI * a, CRT * c) @@ -375,6 +449,8 @@ ansi_draw (ANSI * a, CRT * c) int o; int hidden_cursor = 0; + ansi_spot_scroll(a,c); + for (p.y = 0; p.y < CRT_ROWS; ++p.y) { if (p.y >= a->size.y) @@ -439,6 +515,8 @@ ansi_reset (ANSI * a) ansi_cls (a); ansi_write (a, "\033=", 2); + ansi_write (a, "\033[?6l", 5); + ansi_write (a, "\033[r", 3); ansi_draw (a, &a->crt); } diff --git a/src/crt.c b/src/crt.c index b3d13f5..67d8835 100644 --- a/src/crt.c +++ b/src/crt.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.8 2008/02/07 13:19:48 james + * *** empty log message *** + * * Revision 1.7 2008/02/07 12:41:06 james * *** empty log message *** * @@ -70,13 +73,14 @@ crt_scroll_up (CRT * c, CRT_Pos s, CRT_Pos e, int ea) int l, n; int p; - c->sh.s=s; - c->sh.e=e; - c->sh.dir=-1; s.x = 0; e.x = CRT_COLS - 1; + c->sh.s=s; + c->sh.e=e; + c->sh.dir=-1; + l = e.x - s.x; l++; l *= sizeof (CRT_CA); @@ -103,14 +107,13 @@ crt_scroll_down (CRT * c, CRT_Pos s, CRT_Pos e, int ea) int l, n; int p; + s.x = 0; + e.x = CRT_COLS - 1; + c->sh.s=s; c->sh.e=e; c->sh.dir=1; - - s.x = 0; - e.x = CRT_COLS - 1; - l = e.x - s.x; l++; l *= sizeof (CRT_CA); diff --git a/src/libsympathy.c b/src/libsympathy.c index ac2f621..cf70750 100644 --- a/src/libsympathy.c +++ b/src/libsympathy.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * Revision 1.11 2008/02/07 13:22:51 james + * *** empty log message *** + * * Revision 1.10 2008/02/07 11:32:41 james * *** empty log message *** * @@ -112,20 +115,21 @@ testy (void) { } #endif - - switch (ansi_dispatch (&a, v,t)) { - case -1: - break; - case 1: + + switch (ansi_dispatch (&a, v, t)) + { + case -1: + break; + case 1: ansi_getsize (&a); ansi_reset (&a); ansi_draw (&a, &v->crt); - break; - } + break; + } if (FD_ISSET (t->fd, &rfd)) { - if (vt102_dispatch (v,t)) + if (vt102_dispatch (v, t)) break; } diff --git a/src/prototypes.h b/src/prototypes.h index 085006b..7ffe3b2 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -1,76 +1,76 @@ /* ansi.c */ -int ansi_read(ANSI *a, void *buf, int n); -void ansi_write(ANSI *a, char *buf, int n); -void ansi_getsize(ANSI *a); -void ansi_move(ANSI *a, CRT_Pos p); -void ansi_showhide_cursor(ANSI *a, int hide); -void ansi_force_attr_normal(ANSI *a); -void ansi_set_color(ANSI *a, int color); -void ansi_set_attr(ANSI *a, int attr); -void ansi_render(ANSI *a, CRT_CA ca); -void ansi_cls(ANSI *a); -void ansi_draw(ANSI *a, CRT *c); -void ansi_reset(ANSI *a); -void ansi_flush_escape(ANSI *a, VT102 *v, TTY *t); -void ansi_parse_deckey(ANSI *a, VT102 *v, TTY *t); -void ansi_parse_ansikey(ANSI *a, VT102 *v, TTY *t); -void ansi_parse_escape(ANSI *a, VT102 *v, TTY *t); -void ansi_check_escape(ANSI *a, VT102 *v, TTY *t); -void ansi_parse_char(ANSI *a, int c, VT102 *v, TTY *t); -void ansi_parse(ANSI *a, char *buf, int len, VT102 *v, TTY *t); -int ansi_dispatch(ANSI *a, VT102 *v, TTY *t); +int ansi_read (ANSI * a, void *buf, int n); +void ansi_write (ANSI * a, char *buf, int n); +void ansi_getsize (ANSI * a); +void ansi_move (ANSI * a, CRT_Pos p); +void ansi_showhide_cursor (ANSI * a, int hide); +void ansi_force_attr_normal (ANSI * a); +void ansi_set_color (ANSI * a, int color); +void ansi_set_attr (ANSI * a, int attr); +void ansi_render (ANSI * a, CRT_CA ca); +void ansi_cls (ANSI * a); +void ansi_draw (ANSI * a, CRT * c); +void ansi_reset (ANSI * a); +void ansi_flush_escape (ANSI * a, VT102 * v, TTY * t); +void ansi_parse_deckey (ANSI * a, VT102 * v, TTY * t); +void ansi_parse_ansikey (ANSI * a, VT102 * v, TTY * t); +void ansi_parse_escape (ANSI * a, VT102 * v, TTY * t); +void ansi_check_escape (ANSI * a, VT102 * v, TTY * t); +void ansi_parse_char (ANSI * a, int c, VT102 * v, TTY * t); +void ansi_parse (ANSI * a, char *buf, int len, VT102 * v, TTY * t); +int ansi_dispatch (ANSI * a, VT102 * v, TTY * t); /* crt.c */ -void crt_erase(CRT *c, CRT_Pos s, CRT_Pos e, int ea); -void crt_cls(CRT *c); -void crt_scroll_up(CRT *c, CRT_Pos s, CRT_Pos e, int ea); -void crt_scroll_down(CRT *c, CRT_Pos s, CRT_Pos e, int ea); -void crt_reset(CRT *c); -void crt_insert(CRT *c, CRT_CA ca); +void crt_erase (CRT * c, CRT_Pos s, CRT_Pos e, int ea); +void crt_cls (CRT * c); +void crt_scroll_up (CRT * c, CRT_Pos s, CRT_Pos e, int ea); +void crt_scroll_down (CRT * c, CRT_Pos s, CRT_Pos e, int ea); +void crt_reset (CRT * c); +void crt_insert (CRT * c, CRT_CA ca); /* html.c */ -void html_entity(FILE *f, int c); -void html_render(FILE *f, CRT_CA c); -void html_draw(FILE *f, CRT *c); +void html_entity (FILE * f, int c); +void html_render (FILE * f, CRT_CA c); +void html_draw (FILE * f, CRT * c); /* libsympathy.c */ struct termios old; -void testy(void); +void testy (void); /* render.c */ /* version.c */ /* vt102.c */ -void vt102_log_line(VT102 *v, int line); -void vt102_clip_cursor(VT102 *v, CRT_Pos tl, CRT_Pos br); -void vt102_cursor_normalize(VT102 *v); -void vt102_cursor_carriage_return(VT102 *v); -void vt102_cursor_advance_line(VT102 *v); -void vt102_cursor_advance(VT102 *v); -void vt102_do_pending_wrap(VT102 *v); -void vt102_cursor_retard(VT102 *v); -void vt102_reset_tabs(VT102 *v); -void vt102_cursor_advance_tab(VT102 *v); -int vt102_cursor_home(VT102 *v); -int vt102_cursor_absolute(VT102 *v, int x, int y); -int vt102_cursor_relative(VT102 *v, int x, int y); -void vt102_delete_from_line(VT102 *v, CRT_Pos p); -void vt102_insert_into_line(VT102 *v, CRT_Pos p); -void vt102_change_mode(VT102 *v, int private, char *ns, int set); -void vt102_parse_mode_string(VT102 *v, char *buf, int len); -void vt102_change_attr(VT102 *v, char *na); -void vt102_parse_attr_string(VT102 *v, char *buf, int len); -void vt102_save_state(VT102 *v); -void vt102_restore_state(VT102 *v); -void vt102_scs(VT102 *c, int g, int s); -void vt102_parse_esc(VT102 *v, int c); -void vt102_parse_csi(VT102 *v, char *buf, int len); -void vt102_status_line(VT102 *v, char *str); -void vt102_parse_char(VT102 *v, int c, TTY *tty); -int vt102_parse(VT102 *v, char *buf, int len, TTY *t); -void vt102_parser_reset(VT102_parser *p); -void vt102_send(VT102 *v, uint8_t key, TTY *tty); -void vt102_reset(VT102 *v); -int vt102_dispatch(VT102 *v, TTY *tty); -VT102 *vt102_new(void); -void vt102_free(VT102 *v); +void vt102_log_line (VT102 * v, int line); +void vt102_clip_cursor (VT102 * v, CRT_Pos tl, CRT_Pos br); +void vt102_cursor_normalize (VT102 * v); +void vt102_cursor_carriage_return (VT102 * v); +void vt102_cursor_advance_line (VT102 * v); +void vt102_cursor_advance (VT102 * v); +void vt102_do_pending_wrap (VT102 * v); +void vt102_cursor_retard (VT102 * v); +void vt102_reset_tabs (VT102 * v); +void vt102_cursor_advance_tab (VT102 * v); +int vt102_cursor_home (VT102 * v); +int vt102_cursor_absolute (VT102 * v, int x, int y); +int vt102_cursor_relative (VT102 * v, int x, int y); +void vt102_delete_from_line (VT102 * v, CRT_Pos p); +void vt102_insert_into_line (VT102 * v, CRT_Pos p); +void vt102_change_mode (VT102 * v, int private, char *ns, int set); +void vt102_parse_mode_string (VT102 * v, char *buf, int len); +void vt102_change_attr (VT102 * v, char *na); +void vt102_parse_attr_string (VT102 * v, char *buf, int len); +void vt102_save_state (VT102 * v); +void vt102_restore_state (VT102 * v); +void vt102_scs (VT102 * c, int g, int s); +void vt102_parse_esc (VT102 * v, int c); +void vt102_parse_csi (VT102 * v, char *buf, int len); +void vt102_status_line (VT102 * v, char *str); +void vt102_parse_char (VT102 * v, int c, TTY * tty); +int vt102_parse (VT102 * v, char *buf, int len, TTY * t); +void vt102_parser_reset (VT102_parser * p); +void vt102_send (VT102 * v, uint8_t key, TTY * tty); +void vt102_reset (VT102 * v); +int vt102_dispatch (VT102 * v, TTY * tty); +VT102 *vt102_new (void); +void vt102_free (VT102 * v); /* tty.c */ -TTY *tty_new_test(void); -int tty_read(TTY *t, void *buf, int len); -int tty_write(TTY *t, void *buf, int len); -void tty_free(TTY *t); +TTY *tty_new_test (void); +int tty_read (TTY * t, void *buf, int len); +int tty_write (TTY * t, void *buf, int len); +void tty_free (TTY * t); diff --git a/src/vt102.c b/src/vt102.c index 2cae51d..f120d32 100644 --- a/src/vt102.c +++ b/src/vt102.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.22 2008/02/07 13:22:51 james + * *** empty log message *** + * * Revision 1.21 2008/02/07 12:21:16 james * *** empty log message *** * @@ -504,7 +507,7 @@ vt102_change_mode (VT102 * v, int private, char *ns, int set) v->private_modes[m] = 0; #if 0 fprintf (stderr, "APPLICATION CURSOR MODE %d wanted %d\n", - v->private_modes[m],set); + v->private_modes[m], set); #endif break; case VT102_PRIVATE_MODE_ORIGIN_MODE: @@ -589,7 +592,7 @@ vt102_change_attr (VT102 * v, char *na) { case 0: v->attr = CRT_ATTR_NORMAL; - v->color= CRT_COLOR_NORMAL; + v->color = CRT_COLOR_NORMAL; break; case 1: v->attr |= CRT_ATTR_BOLD; @@ -624,9 +627,9 @@ vt102_change_attr (VT102 * v, char *na) case 35: case 36: case 37: - v->color &= ~CRT_COLOR_FG_MASK; - v->color |= ((a-30) << CRT_COLOR_FG_SHIFT) & CRT_COLOR_FG_MASK; - break; + v->color &= ~CRT_COLOR_FG_MASK; + v->color |= ((a - 30) << CRT_COLOR_FG_SHIFT) & CRT_COLOR_FG_MASK; + break; case 90: case 91: case 92: @@ -635,14 +638,18 @@ vt102_change_attr (VT102 * v, char *na) case 95: case 96: case 97: - v->color &= ~CRT_COLOR_FG_MASK; - v->color |= (((a-90)|CRT_COLOR_INTENSITY) << CRT_COLOR_FG_SHIFT) & CRT_COLOR_FG_MASK; - break; + v->color &= ~CRT_COLOR_FG_MASK; + v->color |= + (((a - + 90) | CRT_COLOR_INTENSITY) << CRT_COLOR_FG_SHIFT) & + CRT_COLOR_FG_MASK; + break; case 39: case 99: - v->color &= ~CRT_COLOR_FG_MASK; - v->color |= (CRT_FGCOLOR_NORMAL << CRT_COLOR_FG_SHIFT) & CRT_COLOR_FG_MASK; - break; + v->color &= ~CRT_COLOR_FG_MASK; + v->color |= + (CRT_FGCOLOR_NORMAL << CRT_COLOR_FG_SHIFT) & CRT_COLOR_FG_MASK; + break; case 40: case 41: case 42: @@ -651,9 +658,9 @@ vt102_change_attr (VT102 * v, char *na) case 45: case 46: case 47: - v->color &= ~CRT_COLOR_BG_MASK; - v->color |= ((a-40) << CRT_COLOR_BG_SHIFT) & CRT_COLOR_BG_MASK; - break; + v->color &= ~CRT_COLOR_BG_MASK; + v->color |= ((a - 40) << CRT_COLOR_BG_SHIFT) & CRT_COLOR_BG_MASK; + break; case 100: case 101: case 102: @@ -662,15 +669,19 @@ vt102_change_attr (VT102 * v, char *na) case 105: case 106: case 107: - v->color &= ~CRT_COLOR_BG_MASK; - v->color |= (((a-100)|CRT_COLOR_INTENSITY) << CRT_COLOR_BG_SHIFT) & CRT_COLOR_BG_MASK; - break; + v->color &= ~CRT_COLOR_BG_MASK; + v->color |= + (((a - + 100) | CRT_COLOR_INTENSITY) << CRT_COLOR_BG_SHIFT) & + CRT_COLOR_BG_MASK; + break; case 49: case 109: - v->color &= ~CRT_COLOR_BG_MASK; - v->color |= (CRT_BGCOLOR_NORMAL << CRT_COLOR_BG_SHIFT) & CRT_COLOR_BG_MASK; - break; - + v->color &= ~CRT_COLOR_BG_MASK; + v->color |= + (CRT_BGCOLOR_NORMAL << CRT_COLOR_BG_SHIFT) & CRT_COLOR_BG_MASK; + break; + default: ; #if 0 @@ -725,7 +736,7 @@ vt102_save_state (VT102 * v) { v->saved.pos = v->pos; v->saved.attr = v->attr; - v->saved.color= v->color; + v->saved.color = v->color; v->saved.origin_mode = v->private_modes[VT102_PRIVATE_MODE_ORIGIN_MODE]; } @@ -734,13 +745,14 @@ vt102_restore_state (VT102 * v) { v->pos = v->saved.pos; v->attr = v->saved.attr; - v->color= v->saved.color; + v->color = v->saved.color; v->private_modes[VT102_PRIVATE_MODE_ORIGIN_MODE] = v->saved.origin_mode; vt102_cursor_normalize (v); v->pending_wrap = 0; } -void vt102_scs(VT102 *c,int g,int s) +void +vt102_scs (VT102 * c, int g, int s) { /*Ignoring charsets*/ } @@ -998,7 +1010,7 @@ vt102_status_line (VT102 * v, char *str) while (i--) { ca->attr = CRT_ATTR_REVERSE; - ca->color=CRT_COLOR_NORMAL; + ca->color = CRT_COLOR_NORMAL; ca->chr = *str; if (*str) str++; @@ -1009,7 +1021,7 @@ vt102_status_line (VT102 * v, char *str) void -vt102_parse_char (VT102 * v, int c,TTY *tty) +vt102_parse_char (VT102 * v, int c, TTY * tty) { VT102_parser *p = &v->parser; @@ -1036,20 +1048,22 @@ vt102_parse_char (VT102 * v, int c,TTY *tty) p->in_csi++; p->in_escape = 0; } - else if (scs_starter(c)) { - p->in_scs=c; - p->in_escape = 0; - } + else if (scs_starter (c)) + { + p->in_scs = c; + p->in_escape = 0; + } else { p->in_escape = 0; vt102_parse_esc (v, c); } } - else if (p->in_scs) { - vt102_scs(v,p->in_scs,c); - p->in_scs=0; - } + else if (p->in_scs) + { + vt102_scs (v, p->in_scs, c); + p->in_scs = 0; + } else { @@ -1083,13 +1097,13 @@ vt102_parse_char (VT102 * v, int c,TTY *tty) vt102_cursor_carriage_return (v); break; /*SO*/ case 14: - /*select G1*/ - /*Ignoring charsets*/ - break; + /*select G1 */ + /*Ignoring charsets */ + break; /*SI*/ case 15: - /*select G0*/ - /*Ignoring charsets*/ - break; + /*select G0 */ + /*Ignoring charsets */ + break; /*DLE*/ case 16: /*DC1 */ case 17: /*DC2 */ case 18: @@ -1137,10 +1151,10 @@ vt102_parse_char (VT102 * v, int c,TTY *tty) vt102_status_line (v, "VT102 foo bar baz I'm the urban spaceman baby"); } -vt102_parse (VT102 * v, char *buf, int len,TTY *t) +vt102_parse (VT102 * v, char *buf, int len, TTY * t) { while (len--) - vt102_parse_char (v, *(buf++),t); + vt102_parse_char (v, *(buf++), t); } @@ -1150,12 +1164,12 @@ vt102_parser_reset (VT102_parser * p) p->in_csi = 0; p->in_escape = 0; p->csi_ptr = 0; - p->in_scs=0; + p->in_scs = 0; } void -vt102_send (VT102 * v, uint8_t key,TTY *tty) +vt102_send (VT102 * v, uint8_t key, TTY * tty) { uint8_t c; #if 0 @@ -1326,8 +1340,8 @@ vt102_reset (VT102 * v) vt102_parser_reset (p); crt_cls (&v->crt); - v->attr=CRT_ATTR_NORMAL; - v->color=CRT_COLOR_NORMAL; + v->attr = CRT_ATTR_NORMAL; + v->color = CRT_COLOR_NORMAL; v->application_keypad_mode = 0; @@ -1361,7 +1375,7 @@ vt102_reset (VT102 * v) } int -vt102_dispatch (VT102 * v,TTY *tty) +vt102_dispatch (VT102 * v, TTY * tty) { char buf[1024]; int red; @@ -1374,7 +1388,7 @@ vt102_dispatch (VT102 * v,TTY *tty) return 0; - vt102_parse (v, buf, red,tty); + vt102_parse (v, buf, red, tty); return 0; } -- 2.30.2