mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-02-04 06:02:24 +00:00
SCO ACS patch from RDB. Apparently required for the Linux console
terminfo. [originally from svn r1137]
This commit is contained in:
parent
793aa91bf7
commit
26d63c3a96
2
putty.h
2
putty.h
@ -54,6 +54,7 @@
|
|||||||
/* These are internal use overlapping with the UTF-16 surrogates */
|
/* These are internal use overlapping with the UTF-16 surrogates */
|
||||||
#define ATTR_ASCII 0x0000D800UL /* normal ASCII charset ESC ( B */
|
#define ATTR_ASCII 0x0000D800UL /* normal ASCII charset ESC ( B */
|
||||||
#define ATTR_LINEDRW 0x0000D900UL /* line drawing charset ESC ( 0 */
|
#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 ATTR_GBCHR 0x0000DB00UL /* UK variant charset ESC ( A */
|
||||||
#define CSET_MASK 0x0000FF00UL /* Character set mask; MUST be 0xFF00 */
|
#define CSET_MASK 0x0000FF00UL /* Character set mask; MUST be 0xFF00 */
|
||||||
|
|
||||||
@ -120,6 +121,7 @@ GLOBAL int dbcs_screenfont;
|
|||||||
GLOBAL int font_codepage;
|
GLOBAL int font_codepage;
|
||||||
GLOBAL int kbd_codepage;
|
GLOBAL int kbd_codepage;
|
||||||
GLOBAL int line_codepage;
|
GLOBAL int line_codepage;
|
||||||
|
GLOBAL WCHAR unitab_scoacs[256];
|
||||||
GLOBAL WCHAR unitab_line[256];
|
GLOBAL WCHAR unitab_line[256];
|
||||||
GLOBAL WCHAR unitab_font[256];
|
GLOBAL WCHAR unitab_font[256];
|
||||||
GLOBAL WCHAR unitab_xterm[256];
|
GLOBAL WCHAR unitab_xterm[256];
|
||||||
|
45
terminal.c
45
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 blink_is_real; /* Actually blink blinking text */
|
||||||
static int term_echoing; /* Does terminal want local echo? */
|
static int term_echoing; /* Does terminal want local echo? */
|
||||||
static int term_editing; /* Does terminal want local edit? */
|
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 vt52_bold; /* Force bold on non-bold colours */
|
||||||
static int utf_state; /* Is there a pending UTF-8 character */
|
static int utf_state; /* Is there a pending UTF-8 character */
|
||||||
static int utf_char; /* and what is it so far. */
|
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.
|
* 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_t, alt_b;
|
||||||
static int alt_which;
|
static int alt_which;
|
||||||
|
|
||||||
@ -278,6 +279,7 @@ static void power_on(void)
|
|||||||
alt_wnext = wrapnext = alt_ins = insert = FALSE;
|
alt_wnext = wrapnext = alt_ins = insert = FALSE;
|
||||||
alt_wrap = wrap = cfg.wrap_mode;
|
alt_wrap = wrap = cfg.wrap_mode;
|
||||||
alt_cset = cset = 0;
|
alt_cset = cset = 0;
|
||||||
|
alt_sco_acs = sco_acs = 0;
|
||||||
cset_attr[0] = cset_attr[1] = ATTR_ASCII;
|
cset_attr[0] = cset_attr[1] = ATTR_ASCII;
|
||||||
rvideo = 0;
|
rvideo = 0;
|
||||||
in_vbell = FALSE;
|
in_vbell = FALSE;
|
||||||
@ -536,6 +538,9 @@ static void swap_screen(int which)
|
|||||||
t = cset;
|
t = cset;
|
||||||
cset = alt_cset;
|
cset = alt_cset;
|
||||||
alt_cset = t;
|
alt_cset = t;
|
||||||
|
t = sco_acs;
|
||||||
|
sco_acs = alt_sco_acs;
|
||||||
|
alt_sco_acs = t;
|
||||||
|
|
||||||
fix_cpos;
|
fix_cpos;
|
||||||
}
|
}
|
||||||
@ -690,6 +695,7 @@ static void save_cursor(int save)
|
|||||||
save_attr = curr_attr;
|
save_attr = curr_attr;
|
||||||
save_cset = cset;
|
save_cset = cset;
|
||||||
save_csattr = cset_attr[cset];
|
save_csattr = cset_attr[cset];
|
||||||
|
save_sco_acs = sco_acs;
|
||||||
} else {
|
} else {
|
||||||
curs = savecurs;
|
curs = savecurs;
|
||||||
/* Make sure the window hasn't shrunk since the save */
|
/* Make sure the window hasn't shrunk since the save */
|
||||||
@ -701,6 +707,7 @@ static void save_cursor(int save)
|
|||||||
curr_attr = save_attr;
|
curr_attr = save_attr;
|
||||||
cset = save_cset;
|
cset = save_cset;
|
||||||
cset_attr[cset] = save_csattr;
|
cset_attr[cset] = save_csattr;
|
||||||
|
sco_acs = save_sco_acs;
|
||||||
fix_cpos;
|
fix_cpos;
|
||||||
if (use_bce)
|
if (use_bce)
|
||||||
erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK)));
|
erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK)));
|
||||||
@ -1024,6 +1031,13 @@ void term_out(void)
|
|||||||
if (c >= 0x10000)
|
if (c >= 0x10000)
|
||||||
c = 0xFFFD;
|
c = 0xFFFD;
|
||||||
break;
|
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 {
|
} else {
|
||||||
evil_jump:;
|
evil_jump:;
|
||||||
switch (cset_attr[cset]) {
|
switch (cset_attr[cset]) {
|
||||||
@ -1052,6 +1066,9 @@ void term_out(void)
|
|||||||
else
|
else
|
||||||
c = ((unsigned char) c) | ATTR_ASCII;
|
c = ((unsigned char) c) | ATTR_ASCII;
|
||||||
break;
|
break;
|
||||||
|
case ATTR_SCOACS:
|
||||||
|
if (c>=' ') c = ((unsigned char)c) | ATTR_SCOACS;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1483,6 +1500,10 @@ void term_out(void)
|
|||||||
compatibility(VT100);
|
compatibility(VT100);
|
||||||
cset_attr[0] = ATTR_LINEDRW;
|
cset_attr[0] = ATTR_LINEDRW;
|
||||||
break;
|
break;
|
||||||
|
case ANSI('U', '('):
|
||||||
|
compatibility(OTHER);
|
||||||
|
cset_attr[0] = ATTR_SCOACS;
|
||||||
|
break;
|
||||||
|
|
||||||
case ANSI('A', ')'):
|
case ANSI('A', ')'):
|
||||||
compatibility(VT100);
|
compatibility(VT100);
|
||||||
@ -1496,6 +1517,10 @@ void term_out(void)
|
|||||||
compatibility(VT100);
|
compatibility(VT100);
|
||||||
cset_attr[1] = ATTR_LINEDRW;
|
cset_attr[1] = ATTR_LINEDRW;
|
||||||
break;
|
break;
|
||||||
|
case ANSI('U', ')'):
|
||||||
|
compatibility(OTHER);
|
||||||
|
cset_attr[1] = ATTR_SCOACS;
|
||||||
|
break;
|
||||||
|
|
||||||
case ANSI('8', '%'): /* Old Linux code */
|
case ANSI('8', '%'): /* Old Linux code */
|
||||||
case ANSI('G', '%'):
|
case ANSI('G', '%'):
|
||||||
@ -1763,6 +1788,15 @@ void term_out(void)
|
|||||||
case 7: /* enable reverse video */
|
case 7: /* enable reverse video */
|
||||||
curr_attr |= ATTR_REVERSE;
|
curr_attr |= ATTR_REVERSE;
|
||||||
break;
|
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 */
|
case 22: /* disable bold */
|
||||||
compatibility2(OTHER, VT220);
|
compatibility2(OTHER, VT220);
|
||||||
curr_attr &= ~ATTR_BOLD;
|
curr_attr &= ~ATTR_BOLD;
|
||||||
@ -2499,6 +2533,9 @@ static void do_paint(Context ctx, int may_optimise)
|
|||||||
case ATTR_LINEDRW:
|
case ATTR_LINEDRW:
|
||||||
tchar = unitab_xterm[tchar & 0xFF];
|
tchar = unitab_xterm[tchar & 0xFF];
|
||||||
break;
|
break;
|
||||||
|
case ATTR_SCOACS:
|
||||||
|
tchar = unitab_scoacs[tchar&0xFF];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
tattr |= (tchar & CSET_MASK);
|
tattr |= (tchar & CSET_MASK);
|
||||||
tchar &= CHAR_MASK;
|
tchar &= CHAR_MASK;
|
||||||
@ -2733,6 +2770,9 @@ static void clipme(pos top, pos bottom)
|
|||||||
case ATTR_ASCII:
|
case ATTR_ASCII:
|
||||||
uc = unitab_line[uc & 0xFF];
|
uc = unitab_line[uc & 0xFF];
|
||||||
break;
|
break;
|
||||||
|
case ATTR_SCOACS:
|
||||||
|
uc = unitab_scoacs[uc&0xFF];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch (uc & CSET_MASK) {
|
switch (uc & CSET_MASK) {
|
||||||
case ATTR_ACP:
|
case ATTR_ACP:
|
||||||
@ -2893,6 +2933,9 @@ static int wordtype(int uc)
|
|||||||
case ATTR_ASCII:
|
case ATTR_ASCII:
|
||||||
uc = unitab_line[uc & 0xFF];
|
uc = unitab_line[uc & 0xFF];
|
||||||
break;
|
break;
|
||||||
|
case ATTR_SCOACS:
|
||||||
|
uc = unitab_scoacs[uc&0xFF];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch (uc & CSET_MASK) {
|
switch (uc & CSET_MASK) {
|
||||||
case ATTR_ACP:
|
case ATTR_ACP:
|
||||||
|
16
unicode.c
16
unicode.c
@ -74,6 +74,12 @@ void init_ucs_tables(void)
|
|||||||
/* Collect OEMCP ucs table */
|
/* Collect OEMCP ucs table */
|
||||||
get_unitab(CP_OEMCP, unitab_oemcp, 1);
|
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 */
|
/* Collect line set ucs table */
|
||||||
if (line_codepage == font_codepage &&
|
if (line_codepage == font_codepage &&
|
||||||
(dbcs_screenfont || cfg.vtmode == VT_POORMAN)) {
|
(dbcs_screenfont || cfg.vtmode == VT_POORMAN)) {
|
||||||
@ -143,7 +149,11 @@ void init_ucs_tables(void)
|
|||||||
unitab_ctrl[i] = 0xFF;
|
unitab_ctrl[i] = 0xFF;
|
||||||
|
|
||||||
/* Generate line->screen direct conversion links. */
|
/* 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_line, unitab_font, ATTR_ACP);
|
||||||
|
link_font(unitab_scoacs, unitab_font, ATTR_ACP);
|
||||||
link_font(unitab_xterm, unitab_font, ATTR_ACP);
|
link_font(unitab_xterm, unitab_font, ATTR_ACP);
|
||||||
|
|
||||||
if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS) {
|
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. */
|
/* Last chance, if !unicode then try poorman links. */
|
||||||
if (cfg.vtmode != VT_UNICODE) {
|
if (cfg.vtmode != VT_UNICODE) {
|
||||||
|
static char poorman_scoacs[] =
|
||||||
|
"CueaaaaceeeiiiAAE**ooouuyOUc$YPsaiounNao?++**!<>###||||++||++++++--|-+||++--|-+----++++++++##||#aBTPEsyt******EN=+><++-=... n2* ";
|
||||||
static char poorman_latin1[] =
|
static char poorman_latin1[] =
|
||||||
" !cL.Y|S\"Ca<--R~o+23'u|.,1o>///?AAAAAAACEEEEIIIIDNOOOOOxOUUUUYPBaaaaaaaceeeeiiiionooooo/ouuuuypy";
|
" !cL.Y|S\"Ca<--R~o+23'u|.,1o>///?AAAAAAACEEEEIIIIDNOOOOOxOUUUUYPBaaaaaaaceeeeiiiionooooo/ouuuuypy";
|
||||||
static char poorman_vt100[] = "*#****o~**+++++-----++++|****L.";
|
static char poorman_vt100[] = "*#****o~**+++++-----++++|****L.";
|
||||||
@ -167,6 +179,10 @@ void init_ucs_tables(void)
|
|||||||
if (!DIRECT_FONT(unitab_xterm[i]))
|
if (!DIRECT_FONT(unitab_xterm[i]))
|
||||||
unitab_xterm[i] =
|
unitab_xterm[i] =
|
||||||
(WCHAR) (ATTR_ACP + poorman_vt100[i - 96]);
|
(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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user