~mdw
/
sgt
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
SCO ACS patch from RDB. Apparently required for the Linux console
[sgt/putty]
/
terminal.c
diff --git
a/terminal.c
b/terminal.c
index
9f623e5
..
391f0d2
100644
(file)
--- 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 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. */
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.
*/
/*
* 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;
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_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;
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 = cset;
cset = alt_cset;
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_cset = cset;
save_csattr = cset_attr[cset];
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 */
} 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;
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)));
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;
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]) {
} else {
evil_jump:;
switch (cset_attr[cset]) {
@@
-1052,6
+1066,9
@@
void term_out(void)
else
c = ((unsigned char) c) | ATTR_ASCII;
break;
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;
compatibility(VT100);
cset_attr[0] = ATTR_LINEDRW;
break;
+ case ANSI('U', '('):
+ compatibility(OTHER);
+ cset_attr[0] = ATTR_SCOACS;
+ break;
case ANSI('A', ')'):
compatibility(VT100);
case ANSI('A', ')'):
compatibility(VT100);
@@
-1496,6
+1517,10
@@
void term_out(void)
compatibility(VT100);
cset_attr[1] = ATTR_LINEDRW;
break;
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', '%'):
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 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;
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_LINEDRW:
tchar = unitab_xterm[tchar & 0xFF];
break;
+ case ATTR_SCOACS:
+ tchar = unitab_scoacs[tchar&0xFF];
+ break;
}
tattr |= (tchar & CSET_MASK);
tchar &= CHAR_MASK;
}
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_ASCII:
uc = unitab_line[uc & 0xFF];
break;
+ case ATTR_SCOACS:
+ uc = unitab_scoacs[uc&0xFF];
+ break;
}
switch (uc & CSET_MASK) {
case ATTR_ACP:
}
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_ASCII:
uc = unitab_line[uc & 0xFF];
break;
+ case ATTR_SCOACS:
+ uc = unitab_scoacs[uc&0xFF];
+ break;
}
switch (uc & CSET_MASK) {
case ATTR_ACP:
}
switch (uc & CSET_MASK) {
case ATTR_ACP: