chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / ansi.c
index e029c25d9cdc748412630d924eb872249984c421..408efd4429f27ce72e0e1ddf41cd29cc2dc41835 100644 (file)
@@ -10,6 +10,12 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.34  2008/02/27 09:42:53  james
+ * *** empty log message ***
+ *
+ * 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 +508,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 +528,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 +544,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 +570,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 +577,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 +611,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 +632,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 +662,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 +675,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 +684,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 +719,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);