X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/7d5c3da43bebc28a85e3375767c03b3877248f3f..12ef307d711481d78cf498276f3a614fc99c5e48:/terminal.c diff --git a/terminal.c b/terminal.c index 23123f88..68363c0c 100644 --- a/terminal.c +++ b/terminal.c @@ -56,6 +56,8 @@ #define has_compat(x) ( ((CL_##x)&term->compatibility_level) != 0 ) +const char sco2ansicolour[] = { 0, 4, 2, 6, 1, 5, 3, 7 }; + #define sel_nl_sz (sizeof(sel_nl)/sizeof(wchar_t)) const wchar_t sel_nl[] = SEL_NL; @@ -1263,17 +1265,18 @@ static void toggle_mode(Terminal *term, int mode, int query, int state) term->disptop = 0; break; case 1048: /* save/restore cursor */ - save_cursor(term, state); + if (!term->cfg.no_alt_screen) + save_cursor(term, state); if (!state) term->seen_disp_event = TRUE; break; case 1049: /* cursor & alternate screen */ - if (state) + if (state && !term->cfg.no_alt_screen) save_cursor(term, state); if (!state) term->seen_disp_event = TRUE; compatibility(OTHER); deselect(term); swap_screen(term, term->cfg.no_alt_screen ? 0 : state, TRUE, FALSE); - if (!state) + if (!state && !term->cfg.no_alt_screen) save_cursor(term, state); term->disptop = 0; break; @@ -2389,6 +2392,11 @@ void term_out(Terminal *term) compatibility(VT100AVO); term->curr_attr |= ATTR_BLINK; break; + case 6: /* SCO light bkgrd */ + compatibility(SCOANSI); + term->blink_is_real = FALSE; + term->curr_attr |= ATTR_BLINK; + break; case 7: /* enable reverse video */ term->curr_attr |= ATTR_REVERSE; break; @@ -2725,8 +2733,71 @@ void term_out(Terminal *term) check_selection(term, old_curs, term->curs); } break; + case ANSI('c', '='): /* Hide or Show Cursor */ + compatibility(SCOANSI); + switch(term->esc_args[0]) { + case 0: /* hide cursor */ + term->cursor_on = FALSE; + break; + case 1: /* restore cursor */ + term->big_cursor = FALSE; + term->cursor_on = TRUE; + break; + case 2: /* block cursor */ + term->big_cursor = TRUE; + term->cursor_on = TRUE; + break; + } + break; + case ANSI('C', '='): + /* + * set cursor start on scanline esc_args[0] and + * end on scanline esc_args[1].If you set + * the bottom scan line to a value less than + * the top scan line, the cursor will disappear. + */ + compatibility(SCOANSI); + if (term->esc_nargs >= 2) { + if (term->esc_args[0] > term->esc_args[1]) + term->cursor_on = FALSE; + else + term->cursor_on = TRUE; + } + break; + case ANSI('D', '='): + compatibility(SCOANSI); + term->blink_is_real = FALSE; + if (term->esc_args[0]>=1) + term->curr_attr |= ATTR_BLINK; + else + term->curr_attr &= ~ATTR_BLINK; + break; + case ANSI('E', '='): + compatibility(SCOANSI); + term->blink_is_real = (term->esc_args[0] >= 1); + break; + case ANSI('F', '='): /* set normal foreground */ + compatibility(SCOANSI); + if (term->esc_args[0] >= 0 && term->esc_args[0] < 16) { + term->curr_attr &= ~ATTR_FGMASK; + term->curr_attr |= + (sco2ansicolour[term->esc_args[0] & 0x7] | + ((term->esc_args[0] & 0x8) << 1)) << + ATTR_FGSHIFT; + } + break; + case ANSI('G', '='): /* set normal background */ + compatibility(SCOANSI); + if (term->esc_args[0] >= 0 && term->esc_args[0] < 16) { + term->curr_attr &= ~ATTR_BGMASK; + term->curr_attr |= + (sco2ansicolour[term->esc_args[0] & 0x7] | + ((term->esc_args[0] & 0x8) << 1)) << + ATTR_BGSHIFT; + } + break; case ANSI('L', '='): - compatibility(OTHER); + compatibility(SCOANSI); term->use_bce = (term->esc_args[0] <= 0); term->erase_char = ERASE_CHAR; if (term->use_bce) @@ -2734,10 +2805,6 @@ void term_out(Terminal *term) (term->curr_attr & (ATTR_FGMASK | ATTR_BGMASK))); break; - case ANSI('E', '='): - compatibility(OTHER); - term->blink_is_real = (term->esc_args[0] >= 1); - break; case ANSI('p', '"'): /* * Allow the host to make this emulator a @@ -4520,7 +4587,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen, case PK_END: xkey = 'E'; break; case PK_PAGEUP: xkey = 'I'; break; case PK_PAGEDOWN: xkey = 'G'; break; - default: break; /* else gcc warns `enum value not used' */ + default: xkey=0; break; /* else gcc warns `enum value not used'*/ } p += sprintf((char *) p, "\x1B%c", xkey); goto done; @@ -4533,7 +4600,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen, case PK_END: code = 4; break; case PK_PAGEUP: code = 5; break; case PK_PAGEDOWN: code = 6; break; - default: break; /* else gcc warns `enum value not used' */ + default: code = 0; break; /* else gcc warns `enum value not used' */ } p += sprintf((char *) p, "\x1B[%d~", code); goto done; @@ -4577,7 +4644,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen, case PK_RIGHT: xkey = 'C'; break; case PK_LEFT: xkey = 'D'; break; case PK_REST: xkey = 'G'; break; /* centre key on number pad */ - default: break; /* else gcc warns `enum value not used' */ + default: xkey = 0; break; /* else gcc warns `enum value not used' */ } if (term->vt52_mode) p += sprintf((char *) p, "\x1B%c", xkey);