From: james Date: Wed, 6 Feb 2008 17:53:28 +0000 (+0000) Subject: *** empty log message *** X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=sympathy.git;a=commitdiff_plain;h=47c08dfed55445da7ef0e2c15133822e3cad76af *** empty log message *** --- diff --git a/src/ansi.c b/src/ansi.c index bdc3a56..3e925c5 100644 --- a/src/ansi.c +++ b/src/ansi.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.6 2008/02/06 17:53:28 james + * *** empty log message *** + * * Revision 1.5 2008/02/06 15:53:22 james * *** empty log message *** * @@ -216,6 +219,7 @@ ansi_set_attr (ANSI * a, int attr) } else { + ansi_write (a, "\033[21m", 5); ansi_write (a, "\033[22m", 5); } } @@ -267,8 +271,10 @@ ansi_draw (ANSI * a, CRT * c) { CRT_Pos p; int o; + int hidden_cursor=0; + + - ansi_showhide_cursor (a, 1); for (p.y = 0; p.y < CRT_ROWS; ++p.y) { @@ -281,6 +287,7 @@ ansi_draw (ANSI * a, CRT * c) continue; if (crt_ca_cmp (a->crt.screen[o], c->screen[o])) { + ansi_showhide_cursor (a, 1); a->crt.screen[o] = c->screen[o]; ansi_move (a, p); @@ -289,6 +296,27 @@ ansi_draw (ANSI * a, CRT * c) } } + + if ((CRT_COLS>a->size.x) || (CRT_ROWS>a->size.y)) { + char msg[]="Window is too small"; + p.x=0; + p.y=0; + + ansi_showhide_cursor (a, 1); + ansi_set_attr (a, CRT_ATTR_REVERSE); + ansi_move(a,p); + + ansi_write (a, msg, sizeof(msg)); + a->pos.x = ANSI_INVAL; + } + + + if ((c->pos.x>=a->size.x) + || (c->pos.y>=a->size.y)) { + ansi_showhide_cursor (a, 1); + return; + } + a->crt.pos = c->pos; ansi_move (a, a->crt.pos); diff --git a/src/libsympathy.c b/src/libsympathy.c index e86c088..d8eb76f 100644 --- a/src/libsympathy.c +++ b/src/libsympathy.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * Revision 1.5 2008/02/06 17:53:28 james + * *** empty log message *** + * * Revision 1.4 2008/02/04 20:23:55 james * *** empty log message *** * @@ -29,14 +32,19 @@ static char rcsid[] = #include "project.h" struct termios old = { 0 }; +static int had_winch=0; -static void -foo (int not) +static void quit (int not) { tcsetattr (0, TCSANOW, &old); exit (1); } +static void winch (int not) +{ + had_winch++; +} + void testy (void) @@ -49,7 +57,15 @@ testy (void) char c; - signal (SIGINT, foo); + signal (SIGINT, quit); +{ +struct sigaction sa={0}; + +sa.sa_handler=winch; +sa.sa_flags=SA_RESTART; +sigaction(SIGWINCH,&sa,NULL); +} + tcgetattr (0, &old); tcgetattr (0, &raw); @@ -69,10 +85,12 @@ testy (void) for (;;) { + struct timeval tv={0,100000}; + FD_SET (fd, &rfd); FD_SET (0, &rfd); - if (select (fd + 1, &rfd, NULL, NULL, NULL) <= 0) - continue; + if (select (fd + 1, &rfd, NULL, NULL, &tv)<0) continue; + if (FD_ISSET (0, &rfd)) { if ((read (0, &c, 1) <= 0) || (c == 3)) @@ -88,6 +106,12 @@ testy (void) vt102_parse_char (&v, c); ansi_draw (&a, &v.crt); } + if (had_winch) { + had_winch=0; + ansi_getsize(&a); + ansi_reset(&a); + ansi_draw (&a, &v.crt); + } } tcsetattr (0, TCSANOW, &old); printf ("QUAT\n"); diff --git a/src/testtty.c b/src/testtty.c index dbdc918..11d3ac2 100644 --- a/src/testtty.c +++ b/src/testtty.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.3 2008/02/06 17:53:28 james + * *** empty log message *** + * * Revision 1.2 2008/02/04 02:05:06 james * *** empty log message *** * @@ -63,8 +66,8 @@ open_fd_to_bash (void) /*thump */ default_termios (&termios); - winsize.ws_row = CRT_ROWS; - winsize.ws_col = CRT_COLS; + winsize.ws_row = VT102_ROWS; + winsize.ws_col = VT102_COLS; child = forkpty (&fd, NULL, &termios, &winsize); diff --git a/src/vt102.c b/src/vt102.c index 84b544a..9f32ce0 100644 --- a/src/vt102.c +++ b/src/vt102.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.10 2008/02/06 17:53:28 james + * *** empty log message *** + * * Revision 1.9 2008/02/06 15:53:22 james * *** empty log message *** * @@ -186,9 +189,16 @@ in_margins (VT102 * v, CRT_Pos p) void vt102_log_line (VT102 * v, int line) { + static FILE *log; CRT_Pos e = { VT102_COLS - 1, line }; CRT_Pos p = { 0, line }; + if (!log) + log=fopen("log","a+"); + + if (!log) return; + + for (; e.x > 0; --e.x) { if (v->crt.screen[CRT_ADDR_POS (&e)].chr != ' ') @@ -202,9 +212,9 @@ vt102_log_line (VT102 * v, int line) c = ' '; if (c > 126) c = ' '; - fputc (c, stderr); + fputc (c, log); } - fputc ('\n', stderr); + fputc ('\n', log); } void @@ -355,6 +365,7 @@ vt102_cursor_home (VT102 * v) v->pos = v->top_margin; vt102_cursor_normalize (v); v->pending_wrap = 0; + } vt102_cursor_absolute (VT102 * v, int x, int y) @@ -534,6 +545,7 @@ vt102_change_attr (VT102 * v, char *na) case 1: v->attr |= CRT_ATTR_BOLD; break; + case 21: case 22: v->attr &= ~CRT_ATTR_BOLD; break; @@ -556,7 +568,10 @@ vt102_change_attr (VT102 * v, char *na) v->attr &= ~CRT_ATTR_REVERSE; break; default: + ; +#if 0 fprintf (stderr, "unhandled SGR %d\n", a); +#endif } } @@ -601,12 +616,51 @@ vt102_parse_attr_string (VT102 * v, char *buf, int len) vt102_change_attr (v, &num[o]); } +void vt102_save_state(VT102 *v) +{ +v->saved.pos=v->pos; +v->saved.attr=v->attr; +v->saved.origin_mode=v->private_modes[VT102_PRIVATE_MODE_ORIGIN_MODE]; +} + +void vt102_restore_state(VT102 *v) +{ +v->pos=v->saved.pos; +v->attr=v->saved.attr; +v->private_modes[VT102_PRIVATE_MODE_ORIGIN_MODE]=v->saved.origin_mode; +vt102_cursor_normalize(v); +v->pending_wrap = 0; +} + void vt102_parse_esc (VT102 * v, int c) { - switch (c) { +case 'E': + if(v->pos.y==v->bottom_margin.y) { + vt102_log_line (v, v->pos.y); + crt_scroll_up (&v->crt, v->top_margin, v->bottom_margin, 1); + } else { + vt102_cursor_relative(v,0,1); + } + break; +case 'H': + v->tabs[v->pos.x]++; + break; +case 'M': + if(v->pos.y==v->top_margin.y) { + crt_scroll_down (&v->crt, v->top_margin, v->bottom_margin, 1); + } else { + vt102_cursor_relative(v,0,-1); + } + break; +case '7': + vt102_save_state(v); + break; +case '8': + vt102_restore_state(v); + break; #if 0 case '=': case '>': @@ -618,8 +672,11 @@ vt102_parse_esc (VT102 * v, int c) break; #endif default: +#if 0 fprintf (stderr, "unhandled ESC \\033 \\%03o (ESC %c)\n", c, (c < 32) ? '?' : c); +#endif + ; } } void @@ -663,7 +720,19 @@ vt102_parse_csi (VT102 * v, char *buf, int len) case 'D': vt102_cursor_relative (v, -narg, 0); break; + case 'E': + vt102_cursor_relative (v, 0, narg); + vt102_cursor_carriage_return (v); + break; + case 'F': + vt102_cursor_relative (v, 0, -narg); + vt102_cursor_carriage_return (v); + break; + case 'G': + vt102_cursor_absolute (v, narg-1, v->pos.y); + break; case 'H': + case 'f': { int x, y; @@ -778,13 +847,27 @@ vt102_parse_csi (VT102 * v, char *buf, int len) vt102_cursor_home (v); break; + case 's': + v->saved.pos=v->pos; + break; + case 'u': + v->pos=v->saved.pos; + vt102_cursor_normalize(v); + v->pending_wrap = 0; + break; default: +#if 0 fprintf (stderr, "unhandled CSI \\033%s\n", buf, buf[0]); +#endif + ; } break; default: +#if 0 fprintf (stderr, "unhandled CSI \\033%s\n", buf, buf[0]); +#endif + ; } @@ -815,7 +898,7 @@ vt102_parse_char (VT102 * v, int c) VT102_parser *p = &v->parser; #if 0 - fprintf (stderr, "%c pc %d %d %d %d %d\n", (c < 32) ? 32 : c, c, + fprintf (stderr, "char %c pc %d %d %d %d %d\n", (c < 32) ? 32 : c, c, p->in_csi, p->in_escape, v->pos.x, v->pos.y); #endif if (p->in_csi) @@ -852,7 +935,10 @@ vt102_parse_char (VT102 * v, int c) /*STX*/ case 2: /*ETX*/ case 3: /*EOT*/ case 4: + break; /*ENQ*/ case 5: + /*FIXME: Should send ack*/ + break; /*ACK*/ case 6: /*BEL*/ case 7: break; @@ -907,6 +993,7 @@ vt102_parse_char (VT102 * v, int c) } v->crt.pos = v->pos; + v->crt.hide_cursor=v->private_modes[VT102_PRIVATE_MODE_SHOW_CURSOR] ? 0:1; if (v->current_line.y != v->pos.y) { @@ -951,9 +1038,39 @@ vt102_reset (VT102 * v) v->private_modes[VT102_PRIVATE_MODE_AUTO_WRAP] = 1; v->private_modes[VT102_PRIVATE_MODE_AUTO_REPEAT] = 1; + v->private_modes[VT102_PRIVATE_MODE_SHOW_CURSOR] = 1; vt102_cursor_home (v); vt102_reset_tabs (v); v->current_line = v->pos; + vt102_save_state(v); + +#if 0 +{ +char buf[3]; +int i; + for (i=0;i<200;++i) { + sprintf(buf,"%3d",i); + vt102_parse_char (v,buf[0]); + vt102_parse_char (v,buf[1]); + vt102_parse_char (v,buf[2]); + vt102_parse_char (v,13); + vt102_parse_char (v,27); + vt102_parse_char (v,'M'); + } + vt102_parse_char(v,'f'); + vt102_parse_char (v,13); + for (i=0;i<23;++i) { + vt102_parse_char (v,27); + vt102_parse_char (v,'M'); + } + vt102_parse_char(v,'b'); + vt102_parse_char (v,13); +} +#endif + + + vt102_status_line (v, "VT102 foo bar baz I'm the urban spaceman baby"); + } diff --git a/src/vt102.h b/src/vt102.h index 1a23dd5..081f802 100644 --- a/src/vt102.h +++ b/src/vt102.h @@ -12,6 +12,9 @@ /* * $Log$ + * Revision 1.6 2008/02/06 17:53:28 james + * *** empty log message *** + * * Revision 1.5 2008/02/06 15:53:22 james * *** empty log message *** * @@ -48,6 +51,13 @@ typedef struct char csi_buf[VT102_CSI_LEN]; } VT102_parser; +typedef struct { + CRT_Pos pos; + int attr; + int origin_mode; +} VT102_State; + + typedef struct { CRT_Pos top_margin, bottom_margin; @@ -59,8 +69,7 @@ typedef struct int pending_wrap; CRT_Pos pos,current_line; - - + VT102_State saved; uint8_t modes[VT102_NMODES]; uint8_t private_modes[VT102_NMODES]; @@ -77,6 +86,7 @@ typedef struct #define VT102_PRIVATE_MODE_ORIGIN_MODE 6 #define VT102_PRIVATE_MODE_AUTO_WRAP 7 #define VT102_PRIVATE_MODE_AUTO_REPEAT 8 +#define VT102_PRIVATE_MODE_SHOW_CURSOR 25 #define VT102_MODE_KEYBOARD_DISABLE 2 #define VT102_MODE_INSERT 4 diff --git a/test/xn.c b/test/xn.c new file mode 100644 index 0000000..a470daf --- /dev/null +++ b/test/xn.c @@ -0,0 +1,61 @@ +#include +#include + +void +putat (int i) +{ + while (i--) + putchar ('@'); +} + +int +main (int argc, char *argv[]) +{ + struct termios raw, old; + + tcgetattr (0, &old); + tcgetattr (0, &raw); + cfmakeraw (&raw); + tcsetattr (0, TCSANOW, &raw); + + + fputs ("\033[H\033[2J", stdout); + putat (80); + fputs ("\r\n", stdout); + fputs ("*", stdout); + fputs ("\r\n\n", stdout); + + putat (80); + fputs ("a", stdout); + fputs ("\r\n", stdout); + fputs ("*", stdout); + fputs ("\r\n\n", stdout); + + putat (80); + fputs ("\rb\n", stdout); + fputs ("*", stdout); + fputs ("\r\n\n", stdout); + + putat (80); + fputs ("\nc\n", stdout); + fputs ("*", stdout); + fputs ("\r\n\n", stdout); + + putat (80); + fputs ("\033[Cd", stdout); + fputs ("\r\n", stdout); + fputs ("*", stdout); + fputs ("\r\n\n", stdout); + + + putat (80); + fputs ("\033[De", stdout); + fputs ("\r\n", stdout); + fputs ("*", stdout); + fputs ("\r\n\n", stdout); + + + tcsetattr (0, TCSANOW, &old); + + return 0; +}