X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fansi.c;h=42f6a4c650476b752907670e96b36dbfcbc55c1d;hb=76292c6be7fcbabad9ab8687eb01f3af51568a9b;hp=e029c25d9cdc748412630d924eb872249984c421;hpb=8c545e672c902b0a6f1b0b525a6d568b2426b4ad;p=sympathy.git diff --git a/src/ansi.c b/src/ansi.c index e029c25..42f6a4c 100644 --- a/src/ansi.c +++ b/src/ansi.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.33 2008/02/27 09:42:21 james + * *** empty log message *** + * * Revision 1.32 2008/02/26 23:56:12 james * *** empty log message *** * @@ -502,7 +505,7 @@ ansi_draw_line (ANSI * a, CRT_CA * cap, int y) CRT_Pos p = { 0, y }; CRT_CA *acap = &a->crt.screen[CRT_ADDR_POS (&p)]; - for (p.x = 0; p.x < a->crt.width; ++p.x) + for (p.x = 0; p.x < a->crt.size.x; ++p.x) { if (p.x >= a->size.x) continue; @@ -522,10 +525,10 @@ ansi_draw_line (ANSI * a, CRT_CA * cap, int y) } static void -ansi_resize_check (ANSI * a, int new_width) +ansi_resize_check (ANSI * a, CRT_Pos *size) { - if ((new_width && (new_width != a->crt.width)) + if ((size && crt_pos_cmp(a->crt.size,*size)) || crt_pos_cmp (a->terminal->size, a->size)) { @@ -538,8 +541,8 @@ ansi_resize_check (ANSI * a, int new_width) crt_reset (&a->crt); - if (new_width) - a->crt.width = new_width; + if (size) + a->crt.size =*size; // FIXME: -- echos back crap? // a->terminal->xmit (a->terminal, "\033[c", 3); @@ -564,7 +567,6 @@ ansi_resize_check (ANSI * a, int new_width) } } -#define HISTORY_GUESS_SCROLL 24 /*guess all 24 lines usually scroll */ /*if they haven't then ansi_draw will patch it up*/ static void @@ -572,19 +574,23 @@ ansi_history (ANSI * a, History * h) { char buf[32]; int i; + int guess_scroll; /*Do we need to catch up on history?*/ if (a->history_ptr == h->wptr) return; - ansi_resize_check (a, 0); + ansi_resize_check (a, NULL); - if ((a->size.x < a->crt.width) || (a->size.y < CRT_ROWS)) + if ((a->size.x < a->crt.size.x) || (a->size.y < a->crt.size.y)) return; + guess_scroll=a->crt.size.y-1; /*Bototm line should be a status line*/ + + ansi_force_attr_normal (a); ansi_set_color (a, CRT_COLOR_NORMAL); - i = sprintf (buf, "\033[%d;%dr", 1, HISTORY_GUESS_SCROLL); + i = sprintf (buf, "\033[%d;%dr", 1, guess_scroll); a->terminal->xmit (a->terminal, buf, i); @@ -602,14 +608,14 @@ ansi_history (ANSI * a, History * h) ansi_draw_line (a, e->line, 0); - /*Roll HISTORY_GUESS_SCROLL lines up putting the top line into the xterm's history */ + /*Roll guess_scroll lines up putting the top line into the xterm's history */ /*Make extra lines a predictable colour */ ansi_set_color (a, CRT_COLOR_NORMAL); ansi_showhide_cursor (a, 1); - i = sprintf (buf, "\033[%d;%dH", HISTORY_GUESS_SCROLL, 1); + i = sprintf (buf, "\033[%d;%dH", guess_scroll, 1); a->terminal->xmit (a->terminal, buf, i); a->terminal->xmit (a->terminal, "\033D", 2); a->pos.x = ANSI_INVAL; @@ -623,11 +629,11 @@ ansi_history (ANSI * a, History * h) 0}; /*scroll lines up */ - for (s.y++; s.y < HISTORY_GUESS_SCROLL; s.y++, e.y++) + for (s.y++; s.y < guess_scroll; s.y++, e.y++) { memcpy (&a->crt.screen[CRT_ADDR_POS (&e)], &a->crt.screen[CRT_ADDR_POS (&s)], - sizeof (CRT_CA) * a->crt.width); + sizeof (CRT_CA) * a->crt.size.x); } /* erase new line */ @@ -653,10 +659,10 @@ ansi_draw (ANSI * a, CRT * c) int o; int hidden_cursor = 0; - ansi_resize_check (a, c->width); + ansi_resize_check (a, &c->size); - for (p.y = 0; p.y < CRT_ROWS; ++p.y) + for (p.y = 0; p.y < a->crt.size.y; ++p.y) { if (p.y >= a->size.y) continue; @@ -666,7 +672,7 @@ ansi_draw (ANSI * a, CRT * c) } - if ((c->width > a->size.x) || (CRT_ROWS > a->size.y)) + if ((c->size.x > a->size.x) || (c->size.y > a->size.y)) { char msg[1024]; // = "Window is too small"; int i; @@ -675,7 +681,7 @@ ansi_draw (ANSI * a, CRT * c) i = sprintf (msg, "Window too small (%dx%d need %dx%d)", a->size.x, - a->size.y, c->width, CRT_ROWS); + a->size.y, c->size.x, c->size.y); ansi_showhide_cursor (a, 1); ansi_set_attr (a, CRT_ATTR_REVERSE); @@ -710,7 +716,7 @@ ansi_reset (ANSI * a, CRT * c) static void ansi_terminal_reset (ANSI * a) { - CRT_Pos p = { 0, CRT_ROWS }; + CRT_Pos p = { 0, a->crt.size.y}; ansi_force_attr_normal (a); ansi_move (a, p);