#define ATTR_DEFAULT 0x00980000UL
#define ATTR_DEFFG 0x00080000UL
#define ATTR_DEFBG 0x00900000UL
-#define ERASE_CHAR (ATTR_DEFAULT | ' ')
+#define ERASE_CHAR (ATTR_DEFAULT | ATTR_ASCII | ' ')
#define ATTR_MASK 0xFFFFFF00UL
#define CHAR_MASK 0x000000FFUL
GLOBAL WCHAR unitab_xterm[256];
GLOBAL WCHAR unitab_oemcp[256];
GLOBAL unsigned char unitab_ctrl[256];
+#define in_utf (utf || line_codepage==CP_UTF8)
#define LGXF_OVR 1 /* existing logfile overwrite */
#define LGXF_APN 0 /* existing logfile append */
static int insert; /* insert-mode flag */
static int cset; /* 0 or 1: which char set */
static int save_cset, save_csattr; /* saved with cursor position */
+static int save_utf; /* saved with cursor position */
static int rvideo; /* global reverse video flag */
static int rvbell_timeout; /* for ESC[?5hESC[?5l vbell */
static int cursor_on; /* cursor enabled flag */
/*
* Saved settings on the alternate screen.
*/
-static int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins, alt_cset, alt_sco_acs;
+static int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins, alt_cset, alt_sco_acs, alt_utf;
static int alt_t, alt_b;
static int alt_which;
alt_wnext = wrapnext = alt_ins = insert = FALSE;
alt_wrap = wrap = cfg.wrap_mode;
alt_cset = cset = 0;
+ alt_utf = utf = 0;
alt_sco_acs = sco_acs = 0;
cset_attr[0] = cset_attr[1] = ATTR_ASCII;
rvideo = 0;
t = cset;
cset = alt_cset;
alt_cset = t;
+ t = utf;
+ utf = alt_utf;
+ alt_utf = t;
t = sco_acs;
sco_acs = alt_sco_acs;
alt_sco_acs = t;
savecurs = curs;
save_attr = curr_attr;
save_cset = cset;
+ save_utf = utf;
save_csattr = cset_attr[cset];
save_sco_acs = sco_acs;
} else {
curr_attr = save_attr;
cset = save_cset;
+ utf = save_utf;
cset_attr[cset] = save_csattr;
sco_acs = save_sco_acs;
fix_cpos;
if (use_bce)
- erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK)));
+ erase_char = (' ' | ATTR_ASCII |
+ (curr_attr & (ATTR_FGMASK | ATTR_BGMASK)));
}
}
/* First see about all those translations. */
if (termstate == TOPLEVEL) {
- if (utf)
+ if (in_utf)
switch (utf_state) {
case 0:
if (c < 0x80) {
- /* I know; gotos are evil. This one is really bad!
- * But before you try removing it follow the path of the
- * sequence "0x5F 0xC0 0x71" with UTF and VTGraphics on.
- */
- /*
- if (cfg.no_vt_graph_with_utf8) break;
- */
- goto evil_jump;
+ /* UTF-8 must be stateless so we ignore iso2022. */
+ if (unitab_ctrl[c] != 0xFF)
+ c = unitab_ctrl[c];
+ else c = ((unsigned char)c) | ATTR_ASCII;
+ break;
} else if ((c & 0xe0) == 0xc0) {
utf_size = utf_state = 1;
utf_char = (c & 0x1f);
if (sco_acs == 2) c ^= 0x80;
c |= ATTR_SCOACS;
} else {
- evil_jump:;
switch (cset_attr[cset]) {
/*
* Linedraw characters are different from 'ESC ( B'
break;
case ANSI('@', '%'):
compatibility(OTHER);
- if (line_codepage != CP_UTF8)
- utf = 0;
+ utf = 0;
break;
}
break;
}
}
if (use_bce)
- erase_char =
- (' ' |
- (curr_attr &
- (ATTR_FGMASK | ATTR_BGMASK |
- ATTR_BLINK)));
+ erase_char = (' ' | ATTR_ASCII |
+ (curr_attr &
+ (ATTR_FGMASK | ATTR_BGMASK)));
}
break;
case 's': /* save cursor */
use_bce = (esc_args[0] <= 0);
erase_char = ERASE_CHAR;
if (use_bce)
- erase_char =
- (' ' |
- (curr_attr &
- (ATTR_FGMASK | ATTR_BGMASK)));
+ erase_char = (' ' | ATTR_ASCII |
+ (curr_attr &
+ (ATTR_FGMASK | ATTR_BGMASK)));
break;
case ANSI('E', '='):
compatibility(OTHER);
vt52_bold = FALSE;
curr_attr = ATTR_DEFAULT;
if (use_bce)
- erase_char = (' ' |
- (curr_attr &
- (ATTR_FGMASK | ATTR_BGMASK |
- ATTR_BLINK)));
+ erase_char = (' ' | ATTR_ASCII |
+ (curr_attr &
+ (ATTR_FGMASK | ATTR_BGMASK)));
break;
case 'S':
/* compatibility(VI50) */
curr_attr |= ATTR_BOLD;
if (use_bce)
- erase_char = (' ' |
- (curr_attr &
- (ATTR_FGMASK | ATTR_BGMASK |
- ATTR_BLINK)));
+ erase_char = (' ' | ATTR_ASCII |
+ (curr_attr & (ATTR_FGMASK | ATTR_BGMASK)));
break;
case VT52_BG:
termstate = TOPLEVEL;
curr_attr |= ATTR_BLINK;
if (use_bce)
- erase_char = (' ' |
- (curr_attr &
- (ATTR_FGMASK | ATTR_BGMASK |
- ATTR_BLINK)));
+ erase_char = (' ' | ATTR_ASCII |
+ (curr_attr & (ATTR_FGMASK | ATTR_BGMASK)));
break;
#endif
default: break; /* placate gcc warning about enum use */
int i, j;
int used_dtf = 0;
char tbuf[256];
+ int old_codepage = line_codepage;
for (i = 0; i < 256; i++)
tbuf[i] = i;
/* Decide on the Line and Font codepages */
line_codepage = decode_codepage(cfg.line_codepage);
+ if (font_codepage <= 0) {
+ font_codepage=0;
+ dbcs_screenfont=0;
+ }
+
if (cfg.vtmode == VT_OEMONLY) {
font_codepage = 437;
dbcs_screenfont = 0;
line_codepage = GetACP();
} else if (line_codepage <= 0)
line_codepage = font_codepage;
- utf = (line_codepage == CP_UTF8);
/* Collect screen font ucs table */
- if (dbcs_screenfont) {
+ if (dbcs_screenfont || font_codepage == 0) {
get_unitab(font_codepage, unitab_font, 2);
for (i = 128; i < 256; i++)
unitab_font[i] = (WCHAR) (ATTR_ACP + i);
/* Collect line set ucs table */
if (line_codepage == font_codepage &&
- (dbcs_screenfont || cfg.vtmode == VT_POORMAN)) {
+ (dbcs_screenfont || cfg.vtmode == VT_POORMAN || font_codepage==0)) {
/* For DBCS and POOR fonts force direct to font */
used_dtf = 1;
{
static char *linebuffer = 0;
static int linesize = 0;
- int ratio = (utf) ? 3 : 1;
+ int ratio = (in_utf)?3:1;
int i;
char *p;
linesize = len * ratio * 2;
}
- if (utf) {
+ if (in_utf) {
/* UTF is a simple algorithm */
for (p = linebuffer, i = 0; i < len; i++) {
wchar_t ch = widebuf[i];
#ifdef SHOW_TOASCII_RESULT
if (r == 1 && !key_down) {
if (alt_sum) {
- if (utf || dbcs_screenfont)
+ if (in_utf || dbcs_screenfont)
debug((", (U+%04x)", alt_sum));
else
debug((", LCH(%d)", alt_sum));
if (!key_down) {
if (alt_sum) {
- if (utf || dbcs_screenfont) {
+ if (in_utf || dbcs_screenfont) {
keybuf = alt_sum;
luni_send(&keybuf, 1);
} else {
if (!left_alt)
keys[0] = 0;
/* If we will be using alt_sum fix the 256s */
- else if (keys[0] && (utf || dbcs_screenfont))
+ else if (keys[0] && (in_utf || dbcs_screenfont))
keys[0] = 10;
}