diff options
author | james <> | 2008-02-26 23:23:17 +0000 |
---|---|---|
committer | james <> | 2008-02-26 23:23:17 +0000 |
commit | f2b8bf1dc0714a6aacb11ec9634e856a8f4cab03 (patch) | |
tree | be3b4f30343a87fefbfdb6e7d433a97a7cea75ac /src/ansi.c | |
parent | 3aef93277df7fe073486ec406a5fe55d3a45e504 (diff) | |
download | sympathy-f2b8bf1dc0714a6aacb11ec9634e856a8f4cab03.tar.gz sympathy-f2b8bf1dc0714a6aacb11ec9634e856a8f4cab03.tar.bz2 sympathy-f2b8bf1dc0714a6aacb11ec9634e856a8f4cab03.zip |
*** empty log message ***
Diffstat (limited to 'src/ansi.c')
-rw-r--r-- | src/ansi.c | 80 |
1 files changed, 63 insertions, 17 deletions
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.31 2008/02/26 23:23:17 james + * *** empty log message *** + * * Revision 1.30 2008/02/24 00:42:53 james * *** empty log message *** * @@ -320,10 +323,41 @@ ansi_set_attr (ANSI * a, int attr) } static void -ansi_emit_noutf8 (TTY * t, uint32_t ch) +ascii_emit (TTY * t, uint32_t ch) { - uint8_t c = (ch > 0x7f) ? '?' : ch; +int i; + +/*Some quick obvious subsititons for quotation marks*/ +switch(ch) { +case 0x2018: + ch='`'; + break; +case 0x2019: + ch='\''; + break; +case 0x201c: +case 0x201d: + ch='"'; + break; +} + +/*Short cut the easy stuff*/ +if (ch<0x7f) { + uint8_t c = ch ; t->xmit (t, &c, 1); + return; +} + +for (i=0;i<VT102_CHARSET_SIZE;++i) { +if (vt102_charset_gl[i]==ch) { + uint8_t c[3] ={016,i,017}; + t->xmit (t, &c, 3); + return; +} +} + + t->xmit (t, "?", 1); + } static void @@ -331,9 +365,10 @@ ansi_render (ANSI * a, CRT_CA ca) { int dif; - if (ca.chr < 0x20) - ca.chr = ' '; - if ((ca.chr > 0x7e) && (ca.chr < 0xa0)) + if ((ca.chr < VT102_CHARSET_SIZE) && (vt102_charset_c0[ca.chr])) + ca.chr=vt102_charset_c0[ca.chr]; + + if ((ca.chr >= 0x80) && (ca.chr < 0xa0)) ca.chr = ' '; ansi_set_attr (a, ca.attr); @@ -342,7 +377,7 @@ ansi_render (ANSI * a, CRT_CA ca) if (a->utf8) utf8_emit (a->terminal, ca.chr); else - ansi_emit_noutf8 (a->terminal, ca.chr); + ascii_emit(a->terminal,ca.chr); a->pos.x++; @@ -460,7 +495,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 < CRT_COLS; ++p.x) + for (p.x = 0; p.x < a->crt.width; ++p.x) { if (p.x >= a->size.x) continue; @@ -480,11 +515,10 @@ ansi_draw_line (ANSI * a, CRT_CA * cap, int y) } static void -ansi_resize_check (ANSI * a) +ansi_resize_check (ANSI * a,int new_width) { - if (!crt_pos_cmp (a->terminal->size, a->size)) - return; + if ((new_width && (new_width != a->crt.width)) || crt_pos_cmp (a->terminal->size, a->size)) { terminal_getsize (a->terminal); @@ -495,15 +529,28 @@ ansi_resize_check (ANSI * a) crt_reset (&a->crt); + if (new_width) + a->crt.width=new_width; + // FIXME: -- echos back crap? // a->terminal->xmit (a->terminal, "\033[c", 3); +// maybe - issue 132 column command if we're 132? + ansi_cls (a); a->terminal->xmit (a->terminal, "\033=", 2); a->terminal->xmit (a->terminal, "\033[?6l", 5); a->terminal->xmit (a->terminal, "\033[r", 3); + if (a->utf8) { + a->terminal->xmit (a->terminal,"\033%G",3); + } else { + a->terminal->xmit (a->terminal,"\033(B",3); + a->terminal->xmit (a->terminal,"\033)0",3); + a->terminal->xmit (a->terminal,"\017",1); + } } +} #define HISTORY_GUESS_SCROLL 24 /*guess all 24 lines usually scroll */ /*if they haven't then ansi_draw will patch it up*/ @@ -517,9 +564,9 @@ ansi_history (ANSI * a, History * h) if (a->history_ptr == h->wptr) return; - ansi_resize_check (a); + ansi_resize_check (a,0); - if ((a->size.x < CRT_COLS) || (a->size.y < CRT_ROWS)) + if ((a->size.x < a->crt.width) || (a->size.y < CRT_ROWS)) return; ansi_force_attr_normal (a); @@ -568,7 +615,7 @@ ansi_history (ANSI * a, History * h) { memcpy (&a->crt.screen[CRT_ADDR_POS (&e)], &a->crt.screen[CRT_ADDR_POS (&s)], - sizeof (CRT_CA) * CRT_COLS); + sizeof (CRT_CA)*a->crt.width); } /* erase new line */ @@ -594,8 +641,7 @@ ansi_draw (ANSI * a, CRT * c) int o; int hidden_cursor = 0; - ansi_resize_check (a); - + ansi_resize_check (a,c->width); for (p.y = 0; p.y < CRT_ROWS; ++p.y) @@ -608,7 +654,7 @@ ansi_draw (ANSI * a, CRT * c) } - if ((CRT_COLS > a->size.x) || (CRT_ROWS > a->size.y)) + if ((c->width > a->size.x) || (CRT_ROWS > a->size.y)) { char msg[1024]; // = "Window is too small"; int i; @@ -617,7 +663,7 @@ ansi_draw (ANSI * a, CRT * c) i = sprintf (msg, "Window too small (%dx%d need %dx%d)", a->size.x, - a->size.y, CRT_COLS, CRT_ROWS); + a->size.y, c->width, CRT_ROWS); ansi_showhide_cursor (a, 1); ansi_set_attr (a, CRT_ATTR_REVERSE); |