chiark / gitweb /
*** empty log message ***
authorjames <james>
Thu, 7 Feb 2008 13:19:48 +0000 (13:19 +0000)
committerjames <james>
Thu, 7 Feb 2008 13:19:48 +0000 (13:19 +0000)
src/ansi.c
src/crt.c
src/libsympathy.c
src/prototypes.h
src/vt102.c

index f70a2d55e844c7a890579f7babad27e7f5a920fa..d575f62ae2b0c5e73848d0d297a90e3954aa3876 100644 (file)
@@ -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);
 }
 
index b3d13f5a885a43fef598d289a662fd2187ece7c4..67d883555a8bc3741abfcc5dedb14fdf4dfd7972 100644 (file)
--- 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);
index ac2f62112aaeee283722bfc6a77eaf8956c86e01..cf70750c446740fb37b7f27f07a76cbc000c0ed7 100644 (file)
@@ -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;
         }
 
index 085006b4d65d29653c434d82652a7edf6af9a819..7ffe3b2af89160a3745adb85fbaa7c2c5b3cbe14 100644 (file)
@@ -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);
index 2cae51d43cd3d5c70d9106dfe6a47935bc84efe0..f120d32167c8d40320e162e8ad3e28867f57cda1 100644 (file)
@@ -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;
 }