chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / vt102.c
index d74437f25758299097efaa448b8adf6cff1cefa1..292e15cf1ebfb51252ae51b692cb9e1964fa26f7 100644 (file)
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.31  2008/02/22 17:07:00  james
+ * *** empty log message ***
+ *
  * Revision 1.30  2008/02/22 14:51:54  james
  * *** empty log message ***
  *
@@ -416,7 +419,7 @@ vt102_cursor_advance_line (Context * c)
 
       vt102_history (c, v->top_margin, v->bottom_margin);
 
-      crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1);
+      crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1, v->color);
       return;
     }
 
@@ -473,7 +476,7 @@ vt102_cursor_advance (Context * c)
       return;
     }
   v->pending_wrap++;
-  if (c->v->xn_glitch)
+  if (!c->v->xn_glitch)
        vt102_do_pending_wrap(c);
 }
 
@@ -911,7 +914,7 @@ vt102_parse_esc (Context * c, int ch)
         {
           vt102_log_line (c, v->pos.y);
           vt102_history (c, v->top_margin, v->bottom_margin);
-          crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1);
+          crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1,v->color);
         }
       else
         {
@@ -924,7 +927,7 @@ vt102_parse_esc (Context * c, int ch)
     case 'M':
       if (v->pos.y == v->top_margin.y)
         {
-          crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1);
+          crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1,v->color);
         }
       else
         {
@@ -1035,13 +1038,13 @@ vt102_parse_csi (Context * c, char *buf, int len)
           switch (narg)
             {
             case 0:
-              crt_erase (&v->crt, v->pos, v->screen_end, 1);
+              crt_erase (&v->crt, v->pos, v->screen_end, 1,v->color);
               break;
             case 1:
-              crt_erase (&v->crt, v->screen_start, v->pos, 1);
+              crt_erase (&v->crt, v->screen_start, v->pos, 1,v->color);
               break;
             case 2:
-              crt_erase (&v->crt, v->screen_start, v->screen_end, 1);
+              crt_erase (&v->crt, v->screen_start, v->screen_end, 1,v->color);
               break;
             }
           break;
@@ -1055,13 +1058,13 @@ vt102_parse_csi (Context * c, char *buf, int len)
             switch (narg)
               {
               case 0:
-                crt_erase (&v->crt, v->pos, le, 1);
+                crt_erase (&v->crt, v->pos, le, 1,v->color);
                 break;
               case 1:
-                crt_erase (&v->crt, ls, v->pos, 1);
+                crt_erase (&v->crt, ls, v->pos, 1,v->color);
                 break;
               case 2:
-                crt_erase (&v->crt, ls, le, 1);
+                crt_erase (&v->crt, ls, le, 1,v->color);
                 break;
               }
           }
@@ -1072,7 +1075,7 @@ vt102_parse_csi (Context * c, char *buf, int len)
               && (v->pos.y <= v->bottom_margin.y))
             {
               while (narg--)
-                crt_scroll_down (&v->crt, v->pos, v->bottom_margin, 1);
+                crt_scroll_down (&v->crt, v->pos, v->bottom_margin, 1,v->color);
             }
           break;
 
@@ -1083,7 +1086,7 @@ vt102_parse_csi (Context * c, char *buf, int len)
               while (narg--)
                 {
                   vt102_history (c, v->pos, v->bottom_margin);
-                  crt_scroll_up (&v->crt, v->pos, v->bottom_margin, 1);
+                  crt_scroll_up (&v->crt, v->pos, v->bottom_margin, 1,v->color);
                 }
             }
           break;
@@ -1098,12 +1101,12 @@ vt102_parse_csi (Context * c, char *buf, int len)
           while (narg--)
             {
               vt102_history (c, v->top_margin, v->bottom_margin);
-              crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1);
+              crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1,v->color);
             }
           break;
         case 'T':
           while (narg--)
-            crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1);
+            crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1,v->color);
           break;
         case 'X':
           {
@@ -1114,7 +1117,7 @@ vt102_parse_csi (Context * c, char *buf, int len)
             if (end.x > v->bottom_margin.x)
               end.x = v->bottom_margin.x;
 
-            crt_erase (&v->crt, v->pos, end, 1);
+            crt_erase (&v->crt, v->pos, end, 1,v->color);
           }
           break;
         case 'Z':
@@ -1237,10 +1240,28 @@ vt102_parse_char (Context * c, int ch)
   VT102_parser *p = &v->parser;
 
 #if 1
-  log_f (c->l, "char %3d %c pc %d %d     %2d %2d %d",ch,safe_ch(ch),
-           p->in_csi, p->in_escape, v->pos.x, v->pos.y,v->pending_wrap);
+  log_f (c->l, "char %3d %c pc %d %d %d     %2d %2d %d",ch,safe_ch(ch),
+           p->in_utf8,p->in_escape, p->in_csi, v->pos.x, v->pos.y,v->pending_wrap);
 #endif
-  if (p->in_csi)
+
+  if ((ch>=0xc0) && (ch<0xe0)) /*Start of two byte unicode sequence*/
+  {
+       p->in_utf8=2;
+  } else if ((ch>=0xe0) && (ch<0xf0)) /*Start of three byte unicode sequence*/
+  {
+       p->in_utf8=3;
+  } else if ((ch>=0xf0) && (ch<0xf7)) /*Start of four byte unicode sequence*/
+       p->in_utf8=4;
+  }
+
+  if (p->utf_8) {
+       p->in_utf8--;
+       ch='?';
+  }  
+
+  if (p->utf_8) {
+       /*Not first or last byte in sequence*/
+  }else if (p->in_csi)
     {
       p->csi_buf[p->csi_ptr++] = ch;
       if (csi_ender (ch) || (p->csi_ptr == VT102_CSI_LEN))
@@ -1275,6 +1296,12 @@ vt102_parse_char (Context * c, int ch)
           vt102_parse_esc (c, ch);
         }
     }
+  else if (ch==0x9b) /*One byte CSI*/
+    {
+          p->csi_ptr = 0;
+         p->csi_buf[p->csi_ptr++] = '[';
+          p->in_csi++;
+   }
   else
     {
 
@@ -1582,7 +1609,6 @@ vt102_reset (VT102 * v)
 
   v->last_reg_char = ' ';
 
-  v->xn_glitch=0;
 
 }
 
@@ -1630,6 +1656,7 @@ vt102_new (void)
   VT102 *v;
 
   v = (VT102 *) malloc (sizeof (VT102));
+  v->xn_glitch=1;
 
   vt102_reset (v);
 
@@ -1637,6 +1664,11 @@ vt102_new (void)
   return v;
 }
 
+void vt102_set_ansi(VT102 *v,int ansi)
+{
+v->xn_glitch=ansi ? 0:1;
+}
+
 void
 vt102_free (VT102 * v)
 {