From d3cb5465f5c608f1edb1edd56290d4fbcec2bb55 Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 19 May 2001 14:12:41 +0000 Subject: [PATCH] SCO ACS patch from RDB. Apparently required for the Linux console terminfo. git-svn-id: svn://svn.tartarus.org/sgt/putty@1137 cda61777-01e9-0310-a592-d414129be87e --- putty.h | 2 ++ terminal.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- unicode.c | 16 ++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/putty.h b/putty.h index 6170303f..cb77ac96 100644 --- a/putty.h +++ b/putty.h @@ -54,6 +54,7 @@ /* These are internal use overlapping with the UTF-16 surrogates */ #define ATTR_ASCII 0x0000D800UL /* normal ASCII charset ESC ( B */ #define ATTR_LINEDRW 0x0000D900UL /* line drawing charset ESC ( 0 */ +#define ATTR_SCOACS 0x0000DA00UL /* SCO Alternate charset */ #define ATTR_GBCHR 0x0000DB00UL /* UK variant charset ESC ( A */ #define CSET_MASK 0x0000FF00UL /* Character set mask; MUST be 0xFF00 */ @@ -120,6 +121,7 @@ GLOBAL int dbcs_screenfont; GLOBAL int font_codepage; GLOBAL int kbd_codepage; GLOBAL int line_codepage; +GLOBAL WCHAR unitab_scoacs[256]; GLOBAL WCHAR unitab_line[256]; GLOBAL WCHAR unitab_font[256]; GLOBAL WCHAR unitab_xterm[256]; diff --git a/terminal.c b/terminal.c index 9f623e55..391f0d2d 100644 --- a/terminal.c +++ b/terminal.c @@ -104,6 +104,7 @@ static int tblinker; /* When the blinking text is on */ static int blink_is_real; /* Actually blink blinking text */ static int term_echoing; /* Does terminal want local echo? */ static int term_editing; /* Does terminal want local edit? */ +static int sco_acs, save_sco_acs; /* CSI 10,11,12m -> OEM charset */ static int vt52_bold; /* Force bold on non-bold colours */ static int utf_state; /* Is there a pending UTF-8 character */ static int utf_char; /* and what is it so far. */ @@ -116,7 +117,7 @@ static unsigned long cset_attr[2]; /* * Saved settings on the alternate screen. */ -static int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins, alt_cset; +static int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins, alt_cset, alt_sco_acs; static int alt_t, alt_b; static int alt_which; @@ -278,6 +279,7 @@ static void power_on(void) alt_wnext = wrapnext = alt_ins = insert = FALSE; alt_wrap = wrap = cfg.wrap_mode; alt_cset = cset = 0; + alt_sco_acs = sco_acs = 0; cset_attr[0] = cset_attr[1] = ATTR_ASCII; rvideo = 0; in_vbell = FALSE; @@ -536,6 +538,9 @@ static void swap_screen(int which) t = cset; cset = alt_cset; alt_cset = t; + t = sco_acs; + sco_acs = alt_sco_acs; + alt_sco_acs = t; fix_cpos; } @@ -690,6 +695,7 @@ static void save_cursor(int save) save_attr = curr_attr; save_cset = cset; save_csattr = cset_attr[cset]; + save_sco_acs = sco_acs; } else { curs = savecurs; /* Make sure the window hasn't shrunk since the save */ @@ -701,6 +707,7 @@ static void save_cursor(int save) curr_attr = save_attr; cset = save_cset; cset_attr[cset] = save_csattr; + sco_acs = save_sco_acs; fix_cpos; if (use_bce) erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK))); @@ -1024,6 +1031,13 @@ void term_out(void) if (c >= 0x10000) c = 0xFFFD; break; + } + /* Are we in the nasty ACS mode? Note: no sco in utf mode. */ + else if(sco_acs && + (c!='\033' && c!='\n' && c!='\r' && c!='\b')) + { + if (sco_acs == 2) c ^= 0x80; + c |= ATTR_SCOACS; } else { evil_jump:; switch (cset_attr[cset]) { @@ -1052,6 +1066,9 @@ void term_out(void) else c = ((unsigned char) c) | ATTR_ASCII; break; + case ATTR_SCOACS: + if (c>=' ') c = ((unsigned char)c) | ATTR_SCOACS; + break; } } } @@ -1483,6 +1500,10 @@ void term_out(void) compatibility(VT100); cset_attr[0] = ATTR_LINEDRW; break; + case ANSI('U', '('): + compatibility(OTHER); + cset_attr[0] = ATTR_SCOACS; + break; case ANSI('A', ')'): compatibility(VT100); @@ -1496,6 +1517,10 @@ void term_out(void) compatibility(VT100); cset_attr[1] = ATTR_LINEDRW; break; + case ANSI('U', ')'): + compatibility(OTHER); + cset_attr[1] = ATTR_SCOACS; + break; case ANSI('8', '%'): /* Old Linux code */ case ANSI('G', '%'): @@ -1763,6 +1788,15 @@ void term_out(void) case 7: /* enable reverse video */ curr_attr |= ATTR_REVERSE; break; + case 10: /* SCO acs off */ + compatibility(SCOANSI); + sco_acs = 0; break; + case 11: /* SCO acs on */ + compatibility(SCOANSI); + sco_acs = 1; break; + case 12: /* SCO acs on flipped */ + compatibility(SCOANSI); + sco_acs = 2; break; case 22: /* disable bold */ compatibility2(OTHER, VT220); curr_attr &= ~ATTR_BOLD; @@ -2499,6 +2533,9 @@ static void do_paint(Context ctx, int may_optimise) case ATTR_LINEDRW: tchar = unitab_xterm[tchar & 0xFF]; break; + case ATTR_SCOACS: + tchar = unitab_scoacs[tchar&0xFF]; + break; } tattr |= (tchar & CSET_MASK); tchar &= CHAR_MASK; @@ -2733,6 +2770,9 @@ static void clipme(pos top, pos bottom) case ATTR_ASCII: uc = unitab_line[uc & 0xFF]; break; + case ATTR_SCOACS: + uc = unitab_scoacs[uc&0xFF]; + break; } switch (uc & CSET_MASK) { case ATTR_ACP: @@ -2893,6 +2933,9 @@ static int wordtype(int uc) case ATTR_ASCII: uc = unitab_line[uc & 0xFF]; break; + case ATTR_SCOACS: + uc = unitab_scoacs[uc&0xFF]; + break; } switch (uc & CSET_MASK) { case ATTR_ACP: diff --git a/unicode.c b/unicode.c index 1cafcc18..4703425b 100644 --- a/unicode.c +++ b/unicode.c @@ -74,6 +74,12 @@ void init_ucs_tables(void) /* Collect OEMCP ucs table */ get_unitab(CP_OEMCP, unitab_oemcp, 1); + /* Collect CP437 ucs table for SCO acs */ + if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS) + memcpy(unitab_scoacs, unitab_oemcp, sizeof(unitab_scoacs)); + else + get_unitab(437, unitab_scoacs, 1); + /* Collect line set ucs table */ if (line_codepage == font_codepage && (dbcs_screenfont || cfg.vtmode == VT_POORMAN)) { @@ -143,7 +149,11 @@ void init_ucs_tables(void) unitab_ctrl[i] = 0xFF; /* Generate line->screen direct conversion links. */ + if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS) + link_font(unitab_scoacs, unitab_oemcp, ATTR_OEMCP); + link_font(unitab_line, unitab_font, ATTR_ACP); + link_font(unitab_scoacs, unitab_font, ATTR_ACP); link_font(unitab_xterm, unitab_font, ATTR_ACP); if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS) { @@ -153,6 +163,8 @@ void init_ucs_tables(void) /* Last chance, if !unicode then try poorman links. */ if (cfg.vtmode != VT_UNICODE) { + static char poorman_scoacs[] = + "CueaaaaceeeiiiAAE**ooouuyOUc$YPsaiounNao?++**!<>###||||++||++++++--|-+||++--|-+----++++++++##||#aBTPEsyt******EN=+><++-=... n2* "; static char poorman_latin1[] = " !cL.Y|S\"Ca<--R~o+23'u|.,1o>///?AAAAAAACEEEEIIIIDNOOOOOxOUUUUYPBaaaaaaaceeeeiiiionooooo/ouuuuypy"; static char poorman_vt100[] = "*#****o~**+++++-----++++|****L."; @@ -167,6 +179,10 @@ void init_ucs_tables(void) if (!DIRECT_FONT(unitab_xterm[i])) unitab_xterm[i] = (WCHAR) (ATTR_ACP + poorman_vt100[i - 96]); + for(i=128;i<256;i++) + if (!DIRECT_FONT(unitab_scoacs[i])) + unitab_scoacs[i] = + (WCHAR) (ATTR_ACP + poorman_scoacs[i - 128]); } } -- 2.11.0