mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-22 14:39:24 -05:00
Thanks to Richard B for pointing out that xterm has its own variants
of the alternate-screen and save-cursor control sequences, with subtly different semantics and entertaining interactions with the usual ones. No thanks to xterm for doing so in the first place :-( This checkin should sort it all out. [originally from svn r2112]
This commit is contained in:
parent
d32e06c1fe
commit
bf0e8374f2
81
terminal.c
81
terminal.c
@ -205,7 +205,7 @@ static int paste_len, paste_pos, paste_hold;
|
|||||||
*/
|
*/
|
||||||
static void do_paint(Context, int);
|
static void do_paint(Context, int);
|
||||||
static void erase_lots(int, int, int);
|
static void erase_lots(int, int, int);
|
||||||
static void swap_screen(int);
|
static void swap_screen(int, int, int);
|
||||||
static void update_sbar(void);
|
static void update_sbar(void);
|
||||||
static void deselect(void);
|
static void deselect(void);
|
||||||
static void term_print_finish(void);
|
static void term_print_finish(void);
|
||||||
@ -312,9 +312,9 @@ static void power_on(void)
|
|||||||
wordness[i] = cfg.wordness[i];
|
wordness[i] = cfg.wordness[i];
|
||||||
}
|
}
|
||||||
if (screen) {
|
if (screen) {
|
||||||
swap_screen(1);
|
swap_screen(1, FALSE, FALSE);
|
||||||
erase_lots(FALSE, TRUE, TRUE);
|
erase_lots(FALSE, TRUE, TRUE);
|
||||||
swap_screen(0);
|
swap_screen(0, FALSE, FALSE);
|
||||||
erase_lots(FALSE, TRUE, TRUE);
|
erase_lots(FALSE, TRUE, TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -393,7 +393,7 @@ void term_pwron(void)
|
|||||||
void term_reconfig(void)
|
void term_reconfig(void)
|
||||||
{
|
{
|
||||||
if (cfg.no_alt_screen)
|
if (cfg.no_alt_screen)
|
||||||
swap_screen(0);
|
swap_screen(0, FALSE, FALSE);
|
||||||
if (cfg.no_mouse_rep) {
|
if (cfg.no_mouse_rep) {
|
||||||
xterm_mouse = 0;
|
xterm_mouse = 0;
|
||||||
set_raw_mouse_mode(0);
|
set_raw_mouse_mode(0);
|
||||||
@ -454,7 +454,7 @@ void term_size(int newrows, int newcols, int newsavelines)
|
|||||||
return; /* nothing to do */
|
return; /* nothing to do */
|
||||||
|
|
||||||
deselect();
|
deselect();
|
||||||
swap_screen(0);
|
swap_screen(0, FALSE, FALSE);
|
||||||
|
|
||||||
alt_t = marg_t = 0;
|
alt_t = marg_t = 0;
|
||||||
alt_b = marg_b = newrows - 1;
|
alt_b = marg_b = newrows - 1;
|
||||||
@ -557,7 +557,7 @@ void term_size(int newrows, int newcols, int newsavelines)
|
|||||||
savelines = newsavelines;
|
savelines = newsavelines;
|
||||||
fix_cpos;
|
fix_cpos;
|
||||||
|
|
||||||
swap_screen(save_alt_which);
|
swap_screen(save_alt_which, FALSE, FALSE);
|
||||||
|
|
||||||
update_sbar();
|
update_sbar();
|
||||||
term_update();
|
term_update();
|
||||||
@ -565,55 +565,75 @@ void term_size(int newrows, int newcols, int newsavelines)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Swap screens.
|
* Swap screens. If `reset' is TRUE and we have been asked to
|
||||||
|
* switch to the alternate screen, we must bring most of its
|
||||||
|
* configuration from the main screen and erase the contents of the
|
||||||
|
* alternate screen completely. (This is even true if we're already
|
||||||
|
* on it! Blame xterm.)
|
||||||
*/
|
*/
|
||||||
static void swap_screen(int which)
|
static void swap_screen(int which, int reset, int keep_cur_pos)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
tree234 *ttr;
|
tree234 *ttr;
|
||||||
|
|
||||||
if (which == alt_which)
|
if (!which)
|
||||||
return;
|
reset = FALSE; /* do no weird resetting if which==0 */
|
||||||
|
|
||||||
|
if (which != alt_which) {
|
||||||
alt_which = which;
|
alt_which = which;
|
||||||
|
|
||||||
ttr = alt_screen;
|
ttr = alt_screen;
|
||||||
alt_screen = screen;
|
alt_screen = screen;
|
||||||
screen = ttr;
|
screen = ttr;
|
||||||
t = curs.x;
|
t = curs.x;
|
||||||
|
if (!reset && !keep_cur_pos)
|
||||||
curs.x = alt_x;
|
curs.x = alt_x;
|
||||||
alt_x = t;
|
alt_x = t;
|
||||||
t = curs.y;
|
t = curs.y;
|
||||||
|
if (!reset && !keep_cur_pos)
|
||||||
curs.y = alt_y;
|
curs.y = alt_y;
|
||||||
alt_y = t;
|
alt_y = t;
|
||||||
t = marg_t;
|
t = marg_t;
|
||||||
marg_t = alt_t;
|
if (!reset) marg_t = alt_t;
|
||||||
alt_t = t;
|
alt_t = t;
|
||||||
t = marg_b;
|
t = marg_b;
|
||||||
marg_b = alt_b;
|
if (!reset) marg_b = alt_b;
|
||||||
alt_b = t;
|
alt_b = t;
|
||||||
t = dec_om;
|
t = dec_om;
|
||||||
dec_om = alt_om;
|
if (!reset) dec_om = alt_om;
|
||||||
alt_om = t;
|
alt_om = t;
|
||||||
t = wrap;
|
t = wrap;
|
||||||
wrap = alt_wrap;
|
if (!reset) wrap = alt_wrap;
|
||||||
alt_wrap = t;
|
alt_wrap = t;
|
||||||
t = wrapnext;
|
t = wrapnext;
|
||||||
wrapnext = alt_wnext;
|
if (!reset) wrapnext = alt_wnext;
|
||||||
alt_wnext = t;
|
alt_wnext = t;
|
||||||
t = insert;
|
t = insert;
|
||||||
insert = alt_ins;
|
if (!reset) insert = alt_ins;
|
||||||
alt_ins = t;
|
alt_ins = t;
|
||||||
t = cset;
|
t = cset;
|
||||||
cset = alt_cset;
|
if (!reset) cset = alt_cset;
|
||||||
alt_cset = t;
|
alt_cset = t;
|
||||||
t = utf;
|
t = utf;
|
||||||
utf = alt_utf;
|
if (!reset) utf = alt_utf;
|
||||||
alt_utf = t;
|
alt_utf = t;
|
||||||
t = sco_acs;
|
t = sco_acs;
|
||||||
sco_acs = alt_sco_acs;
|
if (!reset) sco_acs = alt_sco_acs;
|
||||||
alt_sco_acs = t;
|
alt_sco_acs = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reset && screen) {
|
||||||
|
/*
|
||||||
|
* Yes, this _is_ supposed to honour background-colour-erase.
|
||||||
|
*/
|
||||||
|
erase_lots(FALSE, TRUE, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This might not be possible if we're called during
|
||||||
|
* initialisation.
|
||||||
|
*/
|
||||||
|
if (screen)
|
||||||
fix_cpos;
|
fix_cpos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -988,7 +1008,7 @@ static void toggle_mode(int mode, int query, int state)
|
|||||||
case 47: /* alternate screen */
|
case 47: /* alternate screen */
|
||||||
compatibility(OTHER);
|
compatibility(OTHER);
|
||||||
deselect();
|
deselect();
|
||||||
swap_screen(cfg.no_alt_screen ? 0 : state);
|
swap_screen(cfg.no_alt_screen ? 0 : state, FALSE, FALSE);
|
||||||
disptop = 0;
|
disptop = 0;
|
||||||
break;
|
break;
|
||||||
case 1000: /* xterm mouse 1 */
|
case 1000: /* xterm mouse 1 */
|
||||||
@ -999,6 +1019,27 @@ static void toggle_mode(int mode, int query, int state)
|
|||||||
xterm_mouse = state ? 2 : 0;
|
xterm_mouse = state ? 2 : 0;
|
||||||
set_raw_mouse_mode(state);
|
set_raw_mouse_mode(state);
|
||||||
break;
|
break;
|
||||||
|
case 1047: /* alternate screen */
|
||||||
|
compatibility(OTHER);
|
||||||
|
deselect();
|
||||||
|
swap_screen(cfg.no_alt_screen ? 0 : state, TRUE, TRUE);
|
||||||
|
disptop = 0;
|
||||||
|
break;
|
||||||
|
case 1048: /* save/restore cursor */
|
||||||
|
save_cursor(state);
|
||||||
|
if (!state) seen_disp_event = TRUE;
|
||||||
|
break;
|
||||||
|
case 1049: /* cursor & alternate screen */
|
||||||
|
if (state)
|
||||||
|
save_cursor(state);
|
||||||
|
if (!state) seen_disp_event = TRUE;
|
||||||
|
compatibility(OTHER);
|
||||||
|
deselect();
|
||||||
|
swap_screen(cfg.no_alt_screen ? 0 : state, TRUE, FALSE);
|
||||||
|
if (!state)
|
||||||
|
save_cursor(state);
|
||||||
|
disptop = 0;
|
||||||
|
break;
|
||||||
} else
|
} else
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case 4: /* set insert mode */
|
case 4: /* set insert mode */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user