From d6c2a27d3304842fab285a4217518046b57b771b Mon Sep 17 00:00:00 2001 From: james <> Date: Wed, 27 Feb 2008 09:42:22 +0000 Subject: *** empty log message *** --- apps/mainloop.c | 7 +++-- apps/mainloop.h | 5 +++- apps/sympathy.c | 35 ++++++++++++++++++----- apps/usage.c | 6 ++++ src/ansi.c | 42 +++++++++++++++------------ src/crt.c | 6 +++- src/crt.h | 5 +++- src/html.c | 7 +++-- src/prototypes.h | 5 ++-- src/ptty.c | 9 ++++-- src/version.c | 7 +++-- src/vt102.c | 68 +++++++++++++++++++++++++++----------------- test/vttest-20071216.tar.gz | Bin 0 -> 155273 bytes version-files | 55 +++++++++++++++++++++++++++++++++-- 14 files changed, 190 insertions(+), 67 deletions(-) create mode 100644 test/vttest-20071216.tar.gz diff --git a/apps/mainloop.c b/apps/mainloop.c index d546ac5..146ebdd 100644 --- a/apps/mainloop.c +++ b/apps/mainloop.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * Revision 1.16 2008/02/27 09:42:21 james + * *** empty log message *** + * * Revision 1.15 2008/02/27 01:31:38 james * *** empty log message *** * @@ -397,7 +400,7 @@ msg_from_server (ANSI * a, IPC_Msg * m, Context * c) void mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, - ANSI * ansi, Log * log, int nhistory, int width) + ANSI * ansi, Log * log, int nhistory, CRT_Pos *size ) { fd_set rfds, wfds; Context c = { 0 }; @@ -408,7 +411,7 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, c.tp = tty_parser_new (); c.u = utf8_new (); - c.v = vt102_new (width); + c.v = vt102_new (size); c.h = history_new (nhistory); c.l = log; /* are we being fed by a tty or a socket */ diff --git a/apps/mainloop.h b/apps/mainloop.h index 5d347e7..cea139e 100644 --- a/apps/mainloop.h +++ b/apps/mainloop.h @@ -12,6 +12,9 @@ /* * $Log$ + * Revision 1.4 2008/02/27 09:42:21 james + * *** empty log message *** + * * Revision 1.3 2008/02/27 01:31:14 james * *** empty log message *** * @@ -30,6 +33,6 @@ extern void mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, ANSI * a, - Log * log, int nhistory, int width); + Log * log, int nhistory, CRT_Pos *size); #endif /* __MAINLOOP_H__ */ diff --git a/apps/sympathy.c b/apps/sympathy.c index a8dba28..e93c930 100644 --- a/apps/sympathy.c +++ b/apps/sympathy.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * Revision 1.17 2008/02/27 09:42:21 james + * *** empty log message *** + * * Revision 1.16 2008/02/27 01:31:38 james * *** empty log message *** * @@ -245,7 +248,7 @@ main (int argc, char *argv[]) int c; extern char *optarg; extern int optind, opterr, optopt; - int width = VT102_COLS_80; + CRT_Pos size={VT102_COLS_80,VT102_ROWS}; int oflags[128]; char *oargs[128]; @@ -262,7 +265,7 @@ main (int argc, char *argv[]) memset (oflags, 0, sizeof (oflags)); memset (oargs, 0, sizeof (oargs)); - while ((c = getopt (argc, argv, "w:utscr:lKHd:pb:fL:Fk:n:")) != EOF) + while ((c = getopt (argc, argv, "vw:utscr:lKHd:pb:fL:Fk:n:")) != EOF) { switch (c) { @@ -310,11 +313,16 @@ main (int argc, char *argv[]) sum += (oflags['s'] || oflags['c']) ? 1 : 0; sum += oflags['r']; sum += oflags['l']; + sum += oflags['v']; if (sum != 1) - fatal_moan ("specifiy exactly one of ( -c and or -s ), -t, -r and -l"); + fatal_moan ("specifiy exactly one of ( -c and or -s ), -t, -r, -l and -v"); } + if (oflags['v']) { + fprintf("Version: %s\n",libsympathy_version()); + return 0; + } if (oflags['l']) return list_sockets (); @@ -420,9 +428,22 @@ main (int argc, char *argv[]) if (oflags['w']) { - width = safe_atoi (oargs['w']); - if ((width > VT102_MAX_COLS) || (width < 1)) + char buf[128],*ptr; + strcpy(buf,oargs['w']); + ptr=index(buf,'x'); + if (ptr) { + *ptr=0; + ptr++; + size.y=safe_atoi(ptr); + } + size.x=safe_atoi(buf); + + if ((size.x > VT102_MAX_COLS) || (size.x < 1)) fatal_moan ("-w requires a width between 1 and %d\n", VT102_MAX_COLS); + + if ((size.y > VT102_ROWS) || (size.y < 1)) + fatal_moan ("-w requires a height between 1 and %d\n", VT102_MAX_COLS); + } if (oflags['s'] && !oflags['F']) @@ -443,7 +464,7 @@ main (int argc, char *argv[]) if (oflags['p']) { - tty = ptty_open (NULL, NULL, width); + tty = ptty_open (NULL, NULL, &size); if (!tty) fatal_moan ("unable to open a ptty"); } @@ -500,7 +521,7 @@ main (int argc, char *argv[]) } } - mainloop (tty, server_socket, client_socket, ansi, log, history, width); + mainloop (tty, server_socket, client_socket, ansi, log, history, &size); if (ansi) { diff --git a/apps/usage.c b/apps/usage.c index cf79d6d..598ccb7 100644 --- a/apps/usage.c +++ b/apps/usage.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.12 2008/02/27 09:42:21 james + * *** empty log message *** + * * Revision 1.11 2008/02/27 01:31:38 james * *** empty log message *** * @@ -61,6 +64,7 @@ usage (void) "sympathy -c [-H] [-u] -k skt\n" "sympathy -r id [-H] [-u]\n" "sympathy {-l|-ls}\n" + "sympathy -v\n" "sympathy -h\n" "\n" "Main mode:\n" @@ -75,6 +79,8 @@ usage (void) " -r id client mode: connect to server mode process on socket\n" " ~/.sympathy/id\n" " -l or -ls list active sockets in ~/.sympathy\n" + " -v show version\n" + " -h show help\n" "\n" "Options:\n" " -K lock the serial device. By default sympathy checks that no\n" 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); diff --git a/src/crt.c b/src/crt.c index 9d6606a..7e7c647 100644 --- a/src/crt.c +++ b/src/crt.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.15 2008/02/27 09:42:21 james + * *** empty log message *** + * * Revision 1.14 2008/02/27 00:27:21 james * *** empty log message *** * @@ -167,7 +170,8 @@ crt_reset (CRT * c) c->pos.x = 0; c->pos.y = 0; c->hide_cursor = 1; - c->width = CRT_COLS; + c->size.x = CRT_COLS; + c->size.y = CRT_ROWS; #if 0 c->sh.dir = 0; #endif diff --git a/src/crt.h b/src/crt.h index 5883c04..bc58a5d 100644 --- a/src/crt.h +++ b/src/crt.h @@ -12,6 +12,9 @@ /* * $Log$ + * Revision 1.13 2008/02/27 09:42:22 james + * *** empty log message *** + * * Revision 1.12 2008/02/26 23:23:17 james * *** empty log message *** * @@ -119,7 +122,7 @@ typedef struct CRT_struct CRT_CA screen[CRT_CELS]; CRT_Pos pos; int hide_cursor; - int width; + CRT_Pos size; } CRT; diff --git a/src/html.c b/src/html.c index 5a0bf4a..15ca782 100644 --- a/src/html.c +++ b/src/html.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.9 2008/02/27 09:42:22 james + * *** empty log message *** + * * Revision 1.8 2008/02/27 01:52:38 james * *** empty log message *** * @@ -156,13 +159,13 @@ html_draw (FILE * f, CRT * c) #else fprintf (f, "\n"); #endif - for (p.y = 0; p.y < CRT_ROWS; ++p.y) + for (p.y = 0; p.y < c->size.y; ++p.y) { o = CRT_ADDR (p.y, 0); #ifndef CSS fprintf (f, ""); #endif - for (p.x = 0; p.x < CRT_COLS; ++p.x, ++o) + for (p.x = 0; p.x < c->size.x; ++p.x, ++o) { html_render (f, c->screen[o]); } diff --git a/src/prototypes.h b/src/prototypes.h index dd7dfeb..d1de9a9 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -13,6 +13,7 @@ extern ANSI *ansi_new_html(FILE *f); /* libsympathy.c */ /* render.c */ /* version.c */ +extern char *libsympathy_version(void); /* vt102.c */ extern int vt102_cmd_length[128]; extern int vt102_cmd_termination[128]; @@ -51,7 +52,7 @@ extern void vt102_reset_state(VT102 *v); extern void vt102_parse_char(Context *c, int ch); extern void vt102_send(Context *c, uint8_t key); extern void vt102_reset(VT102 *v); -extern VT102 *vt102_new(int width); +extern VT102 *vt102_new(CRT_Pos *size); extern void vt102_set_ansi(VT102 *v, int ansi); extern void vt102_free(VT102 *v); /* tty.c */ @@ -81,7 +82,7 @@ extern int ring_space(Ring *r); extern int ring_bytes(Ring *r); extern Ring *ring_new(int n); /* ptty.c */ -extern TTY *ptty_open(char *path, char *argv[], int width); +extern TTY *ptty_open(char *path, char *argv[], CRT_Pos *size); /* terminal.c */ extern int terminal_winches; extern void terminal_atexit(void); diff --git a/src/ptty.c b/src/ptty.c index b2e5d0f..fba3202 100644 --- a/src/ptty.c +++ b/src/ptty.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.14 2008/02/27 09:42:22 james + * *** empty log message *** + * * Revision 1.13 2008/02/27 01:31:38 james * *** empty log message *** * @@ -143,7 +146,7 @@ ptty_write (TTY * _t, void *buf, int len) } TTY * -ptty_open (char *path, char *argv[], int width) +ptty_open (char *path, char *argv[], CRT_Pos *size) { PTTY *t; pid_t child; @@ -155,8 +158,8 @@ ptty_open (char *path, char *argv[], int width) client_termios (&ctermios); - winsize.ws_row = VT102_ROWS; - winsize.ws_col = width ? width : VT102_COLS_80; + winsize.ws_row = size ? size->y :VT102_ROWS; + winsize.ws_col = size ? size->x : VT102_COLS_80; child = forkpty (&fd, name, &ctermios, &winsize); diff --git a/src/version.c b/src/version.c index 651093d..e62a5f9 100644 --- a/src/version.c +++ b/src/version.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.3 2008/02/27 09:42:22 james + * *** empty log message *** + * * Revision 1.2 2008/02/04 02:05:06 james * *** empty log message *** * @@ -21,8 +24,8 @@ static char rcsid[] = "$Id$"; #include "version.h" -static char * -GetVersion (void) +char * +libsympathy_version (void) { return VERSION; } diff --git a/src/vt102.c b/src/vt102.c index 52f7fb9..1940dcf 100644 --- a/src/vt102.c +++ b/src/vt102.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.47 2008/02/27 09:42:22 james + * *** empty log message *** + * * Revision 1.46 2008/02/27 01:31:38 james * *** empty log message *** * @@ -391,7 +394,7 @@ in_margins (VT102 * v, CRT_Pos p) void vt102_log_line (Context * c, int line) { - CRT_Pos e = { c->v->current_width - 1, line }; + CRT_Pos e = { c->v->current_size.x - 1, line }; CRT_Pos p = { 0, line }; char logbuf[4 * (VT102_MAX_COLS + 1)], *logptr = logbuf; @@ -734,13 +737,16 @@ vt102_change_mode (VT102 * v, int private, char *ns, int set) case VT102_PRIVATE_MODE_132COLS: /* We don't implement 132 col mode - yet */ - v->current_width = + v->current_size.x = v-> private_modes[VT102_PRIVATE_MODE_132COLS] ? VT102_COLS_132 : VT102_COLS_80; - v->crt.width = v->current_width; - v->screen_end.x = v->current_width - 1; + v->crt.size = v->current_size; + v->crt.size.y++; + v->screen_end=v->current_size; + v->screen_end.x--; + v->screen_end.y--; v->top_margin = v->screen_start; v->bottom_margin = v->screen_end; vt102_cursor_home (v); @@ -1163,7 +1169,7 @@ vt102_parse_csi (Context * c, char *buf, int len) case 'K': { CRT_Pos ls = { 0, v->pos.y }; - CRT_Pos le = { v->current_width - 1, v->pos.y }; + CRT_Pos le = { v->current_size.x - 1, v->pos.y }; if (len == 2) narg = 0; /*Different default */ @@ -1405,7 +1411,7 @@ vt102_parse_esc (Context * c) break; case 'K': { - CRT_Pos le = { v->current_width - 1, v->pos.y }; + CRT_Pos le = { v->current_size.x - 1, v->pos.y }; crt_erase (&v->crt, v->pos, le, 1, v->color); } break; @@ -1545,10 +1551,10 @@ vt102_parse_esc (Context * c) void vt102_status_line (VT102 * v, char *str) { - int i = v->current_width - 1; - CRT_CA *ca = &v->crt.screen[CRT_ADDR (VT102_STATUS_ROW, 0)]; + int i; + CRT_CA *ca = &v->crt.screen[CRT_ADDR (v->current_size.y, 0)]; - for (i = 0; i < v->current_width; ++i) + for (i = 0; i < v->current_size.x; ++i) { ca->attr = CRT_ATTR_REVERSE; ca->color = CRT_COLOR_NORMAL; @@ -1589,9 +1595,12 @@ vt102_reset_state (VT102 * v) v->application_keypad_mode = 0; - v->current_width = VT102_COLS_80; - v->crt.width = v->current_width; - v->screen_end.x = v->current_width - 1; + v->current_size=v->original_size; + v->crt.size = v->current_size; + v->crt.size.y++; + v->screen_end = v->current_size; + v->screen_end.x--; + v->screen_end.y--; v->top_margin = v->screen_start; v->bottom_margin = v->screen_end; @@ -2005,10 +2014,12 @@ vt102_reset (VT102 * v) v->screen_start.x = 0; v->screen_start.y = 0; - v->current_width = VT102_COLS_80; - v->crt.width = v->current_width; - v->screen_end.x = v->current_width - 1; - v->screen_end.y = VT102_ROWS - 1; + v->current_size=v->original_size; + v->crt.size=v->current_size; + v->crt.size.y++; + v->screen_end=v->current_size; + v->screen_end.x--; + v->screen_end.y--; vt102_cursor_home (v); vt102_status_line (v, ""); @@ -2025,7 +2036,7 @@ vt102_reset (VT102 * v) } VT102 * -vt102_new (int width) +vt102_new (CRT_Pos *size) { VT102 *v; @@ -2033,18 +2044,23 @@ vt102_new (int width) v->xn_glitch = 1; - vt102_reset (v); + + if (size) { + v->original_size = *size; - if (width) - { - v->current_width = width; - v->crt.width = v->current_width; - v->screen_end.x = v->current_width - 1; - v->top_margin = v->screen_start; - v->bottom_margin = v->screen_end; - vt102_cursor_home (v); + if (v->original_size.x<1) v->original_size.x=1; + if (v->original_size.y<1) v->original_size.y=1; + + if (v->original_size.x>VT102_MAX_COLS) v->original_size.x=VT102_MAX_COLS; + if (v->original_size.y>VT102_ROWS) v->original_size.y=VT102_ROWS; + + } else { + v->original_size.x=VT102_COLS_80; + v->original_size.y=VT102_ROWS; } + vt102_reset (v); + return v; } diff --git a/test/vttest-20071216.tar.gz b/test/vttest-20071216.tar.gz new file mode 100644 index 0000000..e1d16ce Binary files /dev/null and b/test/vttest-20071216.tar.gz differ diff --git a/version-files b/version-files index c014e19..6d96d00 100644 --- a/version-files +++ b/version-files @@ -1,4 +1,55 @@ -src/sympathy.h.head.in +apps/clients.c +apps/clients.h +apps/mainloop.c +apps/mainloop.h +apps/Makefile.am +apps/sympathy.c +apps/usage.c +src/ansi.c +src/ansi.h +src/cmd.c +src/cmd.h +src/context.h +src/crt.c +src/crt.h +src/history.c +src/history.h +src/html.c +src/ipc.c +src/ipc.h +src/keydis.c +src/keydis.h +src/keys.h src/libsympathy.c -src/version.c +src/lockfile.c +src/lockfile.h +src/log.c +src/log.h +src/Makefile.am src/project.h +src/prototypes.h +src/ptty.c +src/render.c +src/ring.c +src/ring.h +src/serial.c +src/slide.c +src/slide.h +src/sympathy.h.head.in +src/sympathy.h.tail +src/symsocket.c +src/symsocket.h +src/terminal.c +src/tty.c +src/tty.h +src/utf8.c +src/utf8.h +src/util.c +src/version.c +src/vt102.c +src/vt102_charset.c +src/vt102_charset.h +src/vt102.h +test/Makefile.am +test/test.c +test/xn.c -- cgit v1.2.3