1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-25 01:02:24 +00:00

term->cfg is now a full copy of the Config structure, not a pointer;

and term_reconfig() now passes in a new structure which is copied
over the top. This means that the old and new structures can be
compared, and the _current_ as well as default states of auto wrap
mode, DEC origin mode, BCE, blinking text and character classes can
be conveniently reconfigured in mid-session without requiring a
terminal reset.

[originally from svn r2557]
This commit is contained in:
Simon Tatham 2003-01-12 14:30:02 +00:00
parent c81fa2ff24
commit 10eb26a7dd
5 changed files with 136 additions and 91 deletions

View File

@ -1,4 +1,4 @@
\versionid $Id: config.but,v 1.48 2003/01/12 14:11:38 simon Exp $ \versionid $Id: config.but,v 1.49 2003/01/12 14:30:02 simon Exp $
\C{config} Configuring PuTTY \C{config} Configuring PuTTY
@ -214,10 +214,11 @@ find the screen scrolling up when it looks as if it shouldn't, you
could try turning this option off. could try turning this option off.
Auto wrap mode can be turned on and off by control sequences sent by Auto wrap mode can be turned on and off by control sequences sent by
the server. This configuration option only controls the \e{default} the server. This configuration option controls the \e{default}
state. If you modify this option in mid-session using \q{Change state, which will be restored when you reset the terminal (see
Settings}, you will need to reset the terminal (see \k{reset-terminal}). However, if you modify this option in
\k{reset-terminal}) before the change takes effect. mid-session using \q{Change Settings}, it will take effect
immediately.
\S{config-decom} \q{DEC Origin Mode initially on} \S{config-decom} \q{DEC Origin Mode initially on}
@ -243,10 +244,11 @@ like the wrong part of the screen, you could try turning DEC Origin
Mode on to see whether that helps. Mode on to see whether that helps.
DEC Origin Mode can be turned on and off by control sequences sent DEC Origin Mode can be turned on and off by control sequences sent
by the server. This configuration option only controls the by the server. This configuration option controls the \e{default}
\e{default} state. If you modify this option in mid-session using state, which will be restored when you reset the terminal (see
\q{Change Settings}, you will need to reset the terminal (see \k{reset-terminal}). However, if you modify this option in
\k{reset-terminal}) before the change takes effect. mid-session using \q{Change Settings}, it will take effect
immediately.
\S{config-crlf} \q{Implicit CR in every LF} \S{config-crlf} \q{Implicit CR in every LF}
@ -291,10 +293,11 @@ default background colour. With this option enabled, it is done in
the \e{current} background colour. the \e{current} background colour.
Background-colour erase can be turned on and off by control Background-colour erase can be turned on and off by control
sequences sent by the server. This configuration option only sequences sent by the server. This configuration option controls the
controls the \e{default} state. If you modify this option in \e{default} state, which will be restored when you reset the
mid-session using \q{Change Settings}, you will need to reset the terminal (see \k{reset-terminal}). However, if you modify this
terminal (see \k{reset-terminal}) before the change takes effect. option in mid-session using \q{Change Settings}, it will take effect
immediately.
\S{config-blink} \q{Enable blinking text} \S{config-blink} \q{Enable blinking text}
@ -309,10 +312,11 @@ text blink, PuTTY will instead display the text with a bolded
background colour. background colour.
Blinking text can be turned on and off by control sequences sent by Blinking text can be turned on and off by control sequences sent by
the server. This configuration option only controls the \e{default} the server. This configuration option controls the \e{default}
state. If you modify this option in mid-session using \q{Change state, which will be restored when you reset the terminal (see
Settings}, you will need to reset the terminal (see \k{reset-terminal}). However, if you modify this option in
\k{reset-terminal}) before the change takes effect. mid-session using \q{Change Settings}, it will take effect
immediately.
\S{config-answerback} \q{Answerback to ^E} \S{config-answerback} \q{Answerback to ^E}
@ -1224,10 +1228,11 @@ This mechanism currently only covers ASCII characters, because it
isn't feasible to expand the list to cover the whole of Unicode. isn't feasible to expand the list to cover the whole of Unicode.
Character class definitions can be modified by control sequences Character class definitions can be modified by control sequences
sent by the server. This configuration option only controls the sent by the server. This configuration option controls the
\e{default} state. If you modify this option in mid-session using \e{default} state, which will be restored when you reset the
\q{Change Settings}, you will need to reset the terminal (see terminal (see \k{reset-terminal}). However, if you modify this
\k{reset-terminal}) before the change takes effect. option in mid-session using \q{Change Settings}, it will take effect
immediately.
\H{config-colours} The Colours panel \H{config-colours} The Colours panel

View File

@ -516,7 +516,7 @@ void term_paste(Terminal *);
void term_nopaste(Terminal *); void term_nopaste(Terminal *);
int term_ldisc(Terminal *, int option); int term_ldisc(Terminal *, int option);
void term_copyall(Terminal *); void term_copyall(Terminal *);
void term_reconfig(Terminal *); void term_reconfig(Terminal *, Config *);
void term_seen_key_event(Terminal *); void term_seen_key_event(Terminal *);
int from_backend(void *, int is_stderr, char *data, int len); int from_backend(void *, int is_stderr, char *data, int len);
void term_provide_resize_fn(Terminal *term, void term_provide_resize_fn(Terminal *term,

View File

@ -162,10 +162,10 @@ static void power_on(Terminal *term)
for (i = 0; i < term->cols; i++) for (i = 0; i < term->cols; i++)
term->tabs[i] = (i % 8 == 0 ? TRUE : FALSE); term->tabs[i] = (i % 8 == 0 ? TRUE : FALSE);
} }
term->alt_om = term->dec_om = term->cfg->dec_om; term->alt_om = term->dec_om = term->cfg.dec_om;
term->alt_ins = term->insert = FALSE; term->alt_ins = term->insert = FALSE;
term->alt_wnext = term->wrapnext = term->save_wnext = FALSE; term->alt_wnext = term->wrapnext = term->save_wnext = FALSE;
term->alt_wrap = term->wrap = term->cfg->wrap_mode; term->alt_wrap = term->wrap = term->cfg.wrap_mode;
term->alt_cset = term->cset = term->save_cset = 0; term->alt_cset = term->cset = term->save_cset = 0;
term->alt_utf = term->utf = term->save_utf = 0; term->alt_utf = term->utf = term->save_utf = 0;
term->utf_state = 0; term->utf_state = 0;
@ -177,17 +177,17 @@ static void power_on(Terminal *term)
term->big_cursor = 0; term->big_cursor = 0;
term->save_attr = term->curr_attr = ATTR_DEFAULT; term->save_attr = term->curr_attr = ATTR_DEFAULT;
term->term_editing = term->term_echoing = FALSE; term->term_editing = term->term_echoing = FALSE;
term->app_cursor_keys = term->cfg->app_cursor; term->app_cursor_keys = term->cfg.app_cursor;
term->app_keypad_keys = term->cfg->app_keypad; term->app_keypad_keys = term->cfg.app_keypad;
term->use_bce = term->cfg->bce; term->use_bce = term->cfg.bce;
term->blink_is_real = term->cfg->blinktext; term->blink_is_real = term->cfg.blinktext;
term->erase_char = ERASE_CHAR; term->erase_char = ERASE_CHAR;
term->alt_which = 0; term->alt_which = 0;
term_print_finish(term); term_print_finish(term);
{ {
int i; int i;
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
term->wordness[i] = term->cfg->wordness[i]; term->wordness[i] = term->cfg.wordness[i];
} }
if (term->screen) { if (term->screen) {
swap_screen(term, 1, FALSE, FALSE); swap_screen(term, 1, FALSE, FALSE);
@ -206,7 +206,7 @@ void term_update(Terminal *term)
ctx = get_ctx(term->frontend); ctx = get_ctx(term->frontend);
if (ctx) { if (ctx) {
int need_sbar_update = term->seen_disp_event; int need_sbar_update = term->seen_disp_event;
if (term->seen_disp_event && term->cfg->scroll_on_disp) { if (term->seen_disp_event && term->cfg.scroll_on_disp) {
term->disptop = 0; /* return to main screen */ term->disptop = 0; /* return to main screen */
term->seen_disp_event = 0; term->seen_disp_event = 0;
need_sbar_update = TRUE; need_sbar_update = TRUE;
@ -244,7 +244,7 @@ void term_seen_key_event(Terminal *term)
/* /*
* Reset the scrollback on keypress, if we're doing that. * Reset the scrollback on keypress, if we're doing that.
*/ */
if (term->cfg->scroll_on_key) { if (term->cfg.scroll_on_key) {
term->disptop = 0; /* return to main screen */ term->disptop = 0; /* return to main screen */
term->seen_disp_event = 1; term->seen_disp_event = 1;
} }
@ -270,20 +270,53 @@ void term_pwron(Terminal *term)
* user has disabled mouse reporting, and abandon a print job if * user has disabled mouse reporting, and abandon a print job if
* the user has disabled printing. * the user has disabled printing.
*/ */
void term_reconfig(Terminal *term) void term_reconfig(Terminal *term, Config *cfg)
{ {
if (term->cfg->no_alt_screen) /*
* Before adopting the new config, check all those terminal
* settings which control power-on defaults; and if they've
* changed, we will modify the current state as well as the
* default one. The full list is: Auto wrap mode, DEC Origin
* Mode, BCE, blinking text, character classes.
*/
int reset_wrap, reset_decom, reset_bce, reset_blink, reset_charclass;
int i;
reset_wrap = (term->cfg.wrap_mode != cfg->wrap_mode);
reset_decom = (term->cfg.dec_om != cfg->dec_om);
reset_bce = (term->cfg.bce != cfg->bce);
reset_blink = (term->cfg.blinktext != cfg->blinktext);
reset_charclass = 0;
for (i = 0; i < lenof(term->cfg.wordness); i++)
if (term->cfg.wordness[i] != cfg->wordness[i])
reset_charclass = 1;
term->cfg = *cfg; /* STRUCTURE COPY */
if (reset_wrap)
term->alt_wrap = term->wrap = term->cfg.wrap_mode;
if (reset_decom)
term->alt_om = term->dec_om = term->cfg.dec_om;
if (reset_bce)
term->use_bce = term->cfg.bce;
if (reset_blink)
term->blink_is_real = term->cfg.blinktext;
if (reset_charclass)
for (i = 0; i < 256; i++)
term->wordness[i] = term->cfg.wordness[i];
if (term->cfg.no_alt_screen)
swap_screen(term, 0, FALSE, FALSE); swap_screen(term, 0, FALSE, FALSE);
if (term->cfg->no_mouse_rep) { if (term->cfg.no_mouse_rep) {
term->xterm_mouse = 0; term->xterm_mouse = 0;
set_raw_mouse_mode(term->frontend, 0); set_raw_mouse_mode(term->frontend, 0);
} }
if (term->cfg->no_remote_charset) { if (term->cfg.no_remote_charset) {
term->cset_attr[0] = term->cset_attr[1] = ATTR_ASCII; term->cset_attr[0] = term->cset_attr[1] = ATTR_ASCII;
term->sco_acs = term->alt_sco_acs = 0; term->sco_acs = term->alt_sco_acs = 0;
term->utf = 0; term->utf = 0;
} }
if (!*term->cfg->printer) { if (!*term->cfg.printer) {
term_print_finish(term); term_print_finish(term);
} }
} }
@ -314,7 +347,7 @@ Terminal *term_init(Config *mycfg, void *frontend)
*/ */
term = smalloc(sizeof(Terminal)); term = smalloc(sizeof(Terminal));
term->frontend = frontend; term->frontend = frontend;
term->cfg = mycfg; term->cfg = *mycfg; /* STRUCTURE COPY */
term->logctx = NULL; term->logctx = NULL;
term->compatibility_level = TM_PUTTY; term->compatibility_level = TM_PUTTY;
strcpy(term->id_string, "\033[?6c"); strcpy(term->id_string, "\033[?6c");
@ -970,12 +1003,12 @@ static void toggle_mode(Terminal *term, int mode, int query, int state)
term->blink_is_real = FALSE; term->blink_is_real = FALSE;
term->vt52_bold = FALSE; term->vt52_bold = FALSE;
} else { } else {
term->blink_is_real = term->cfg->blinktext; term->blink_is_real = term->cfg.blinktext;
} }
break; break;
case 3: /* 80/132 columns */ case 3: /* 80/132 columns */
deselect(term); deselect(term);
if (!term->cfg->no_remote_resize) if (!term->cfg.no_remote_resize)
request_resize(term->frontend, state ? 132 : 80, term->rows); request_resize(term->frontend, state ? 132 : 80, term->rows);
term->reset_132 = state; term->reset_132 = state;
break; break;
@ -1030,7 +1063,7 @@ static void toggle_mode(Terminal *term, int mode, int query, int state)
case 47: /* alternate screen */ case 47: /* alternate screen */
compatibility(OTHER); compatibility(OTHER);
deselect(term); deselect(term);
swap_screen(term, term->cfg->no_alt_screen ? 0 : state, FALSE, FALSE); swap_screen(term, term->cfg.no_alt_screen ? 0 : state, FALSE, FALSE);
term->disptop = 0; term->disptop = 0;
break; break;
case 1000: /* xterm mouse 1 */ case 1000: /* xterm mouse 1 */
@ -1044,7 +1077,7 @@ static void toggle_mode(Terminal *term, int mode, int query, int state)
case 1047: /* alternate screen */ case 1047: /* alternate screen */
compatibility(OTHER); compatibility(OTHER);
deselect(term); deselect(term);
swap_screen(term, term->cfg->no_alt_screen ? 0 : state, TRUE, TRUE); swap_screen(term, term->cfg.no_alt_screen ? 0 : state, TRUE, TRUE);
term->disptop = 0; term->disptop = 0;
break; break;
case 1048: /* save/restore cursor */ case 1048: /* save/restore cursor */
@ -1057,7 +1090,7 @@ static void toggle_mode(Terminal *term, int mode, int query, int state)
if (!state) term->seen_disp_event = TRUE; if (!state) term->seen_disp_event = TRUE;
compatibility(OTHER); compatibility(OTHER);
deselect(term); deselect(term);
swap_screen(term, term->cfg->no_alt_screen ? 0 : state, TRUE, FALSE); swap_screen(term, term->cfg.no_alt_screen ? 0 : state, TRUE, FALSE);
if (!state) if (!state)
save_cursor(term, state); save_cursor(term, state);
term->disptop = 0; term->disptop = 0;
@ -1096,14 +1129,14 @@ static void do_osc(Terminal *term)
switch (term->esc_args[0]) { switch (term->esc_args[0]) {
case 0: case 0:
case 1: case 1:
if (!term->cfg->no_remote_wintitle) if (!term->cfg.no_remote_wintitle)
set_icon(term->frontend, term->osc_string); set_icon(term->frontend, term->osc_string);
if (term->esc_args[0] == 1) if (term->esc_args[0] == 1)
break; break;
/* fall through: parameter 0 means set both */ /* fall through: parameter 0 means set both */
case 2: case 2:
case 21: case 21:
if (!term->cfg->no_remote_wintitle) if (!term->cfg.no_remote_wintitle)
set_title(term->frontend, term->osc_string); set_title(term->frontend, term->osc_string);
break; break;
} }
@ -1116,7 +1149,7 @@ static void do_osc(Terminal *term)
static void term_print_setup(Terminal *term) static void term_print_setup(Terminal *term)
{ {
bufchain_clear(&term->printer_buf); bufchain_clear(&term->printer_buf);
term->print_job = printer_start_job(term->cfg->printer); term->print_job = printer_start_job(term->cfg.printer);
} }
static void term_print_flush(Terminal *term) static void term_print_flush(Terminal *term)
{ {
@ -1190,7 +1223,7 @@ void term_out(Terminal *term)
* Optionally log the session traffic to a file. Useful for * Optionally log the session traffic to a file. Useful for
* debugging and possibly also useful for actual logging. * debugging and possibly also useful for actual logging.
*/ */
if (term->cfg->logtype == LGTYP_DEBUG && term->logctx) if (term->cfg.logtype == LGTYP_DEBUG && term->logctx)
logtraffic(term->logctx, (unsigned char) c, LGTYP_DEBUG); logtraffic(term->logctx, (unsigned char) c, LGTYP_DEBUG);
} else { } else {
c = unget; c = unget;
@ -1378,7 +1411,7 @@ void term_out(Terminal *term)
term->curs.x--; term->curs.x--;
term->wrapnext = FALSE; term->wrapnext = FALSE;
fix_cpos; fix_cpos;
if (!term->cfg->no_dbackspace) /* destructive bksp might be disabled */ if (!term->cfg.no_dbackspace) /* destructive bksp might be disabled */
*term->cpos = (' ' | term->curr_attr | ATTR_ASCII); *term->cpos = (' ' | term->curr_attr | ATTR_ASCII);
} else } else
/* Or normal C0 controls. */ /* Or normal C0 controls. */
@ -1397,7 +1430,7 @@ void term_out(Terminal *term)
if (term->ldisc) { if (term->ldisc) {
char abuf[256], *s, *d; char abuf[256], *s, *d;
int state = 0; int state = 0;
for (s = term->cfg->answerback, d = abuf; *s; s++) { for (s = term->cfg.answerback, d = abuf; *s; s++) {
if (state) { if (state) {
if (*s >= 'a' && *s <= 'z') if (*s >= 'a' && *s <= 'z')
*d++ = (*s - ('a' - 1)); *d++ = (*s - ('a' - 1));
@ -1440,7 +1473,7 @@ void term_out(Terminal *term)
* t seconds ago. * t seconds ago.
*/ */
while (term->beephead && while (term->beephead &&
term->beephead->ticks < ticks - term->cfg->bellovl_t) { term->beephead->ticks < ticks - term->cfg.bellovl_t) {
struct beeptime *tmp = term->beephead; struct beeptime *tmp = term->beephead;
term->beephead = tmp->next; term->beephead = tmp->next;
sfree(tmp); sfree(tmp);
@ -1449,16 +1482,16 @@ void term_out(Terminal *term)
term->nbeeps--; term->nbeeps--;
} }
if (term->cfg->bellovl && term->beep_overloaded && if (term->cfg.bellovl && term->beep_overloaded &&
ticks - term->lastbeep >= (unsigned)term->cfg->bellovl_s) { ticks - term->lastbeep >= (unsigned)term->cfg.bellovl_s) {
/* /*
* If we're currently overloaded and the * If we're currently overloaded and the
* last beep was more than s seconds ago, * last beep was more than s seconds ago,
* leave overload mode. * leave overload mode.
*/ */
term->beep_overloaded = FALSE; term->beep_overloaded = FALSE;
} else if (term->cfg->bellovl && !term->beep_overloaded && } else if (term->cfg.bellovl && !term->beep_overloaded &&
term->nbeeps >= term->cfg->bellovl_n) { term->nbeeps >= term->cfg.bellovl_n) {
/* /*
* Now, if we have n or more beeps * Now, if we have n or more beeps
* remaining in the queue, go into overload * remaining in the queue, go into overload
@ -1471,9 +1504,9 @@ void term_out(Terminal *term)
/* /*
* Perform an actual beep if we're not overloaded. * Perform an actual beep if we're not overloaded.
*/ */
if (!term->cfg->bellovl || !term->beep_overloaded) { if (!term->cfg.bellovl || !term->beep_overloaded) {
beep(term->frontend, term->cfg->beep); beep(term->frontend, term->cfg.beep);
if (term->cfg->beep == BELL_VISUAL) { if (term->cfg.beep == BELL_VISUAL) {
term->in_vbell = TRUE; term->in_vbell = TRUE;
term->vbell_startpoint = ticks; term->vbell_startpoint = ticks;
term_update(term); term_update(term);
@ -1537,7 +1570,7 @@ void term_out(Terminal *term)
scroll(term, term->marg_t, term->marg_b, 1, TRUE); scroll(term, term->marg_t, term->marg_b, 1, TRUE);
else if (term->curs.y < term->rows - 1) else if (term->curs.y < term->rows - 1)
term->curs.y++; term->curs.y++;
if (term->cfg->lfhascr) if (term->cfg.lfhascr)
term->curs.x = 0; term->curs.x = 0;
fix_cpos; fix_cpos;
term->wrapnext = FALSE; term->wrapnext = FALSE;
@ -1764,7 +1797,7 @@ void term_out(Terminal *term)
if (term->ldisc) /* cause ldisc to notice changes */ if (term->ldisc) /* cause ldisc to notice changes */
ldisc_send(term->ldisc, NULL, 0, 0); ldisc_send(term->ldisc, NULL, 0, 0);
if (term->reset_132) { if (term->reset_132) {
if (!term->cfg->no_remote_resize) if (!term->cfg.no_remote_resize)
request_resize(term->frontend, 80, term->rows); request_resize(term->frontend, 80, term->rows);
term->reset_132 = 0; term->reset_132 = 0;
} }
@ -1829,55 +1862,55 @@ void term_out(Terminal *term)
case ANSI('A', '('): case ANSI('A', '('):
compatibility(VT100); compatibility(VT100);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->cset_attr[0] = ATTR_GBCHR; term->cset_attr[0] = ATTR_GBCHR;
break; break;
case ANSI('B', '('): case ANSI('B', '('):
compatibility(VT100); compatibility(VT100);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->cset_attr[0] = ATTR_ASCII; term->cset_attr[0] = ATTR_ASCII;
break; break;
case ANSI('0', '('): case ANSI('0', '('):
compatibility(VT100); compatibility(VT100);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->cset_attr[0] = ATTR_LINEDRW; term->cset_attr[0] = ATTR_LINEDRW;
break; break;
case ANSI('U', '('): case ANSI('U', '('):
compatibility(OTHER); compatibility(OTHER);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->cset_attr[0] = ATTR_SCOACS; term->cset_attr[0] = ATTR_SCOACS;
break; break;
case ANSI('A', ')'): case ANSI('A', ')'):
compatibility(VT100); compatibility(VT100);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->cset_attr[1] = ATTR_GBCHR; term->cset_attr[1] = ATTR_GBCHR;
break; break;
case ANSI('B', ')'): case ANSI('B', ')'):
compatibility(VT100); compatibility(VT100);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->cset_attr[1] = ATTR_ASCII; term->cset_attr[1] = ATTR_ASCII;
break; break;
case ANSI('0', ')'): case ANSI('0', ')'):
compatibility(VT100); compatibility(VT100);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->cset_attr[1] = ATTR_LINEDRW; term->cset_attr[1] = ATTR_LINEDRW;
break; break;
case ANSI('U', ')'): case ANSI('U', ')'):
compatibility(OTHER); compatibility(OTHER);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->cset_attr[1] = ATTR_SCOACS; term->cset_attr[1] = ATTR_SCOACS;
break; break;
case ANSI('8', '%'): /* Old Linux code */ case ANSI('8', '%'): /* Old Linux code */
case ANSI('G', '%'): case ANSI('G', '%'):
compatibility(OTHER); compatibility(OTHER);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->utf = 1; term->utf = 1;
break; break;
case ANSI('@', '%'): case ANSI('@', '%'):
compatibility(OTHER); compatibility(OTHER);
if (!term->cfg->no_remote_charset) if (!term->cfg.no_remote_charset)
term->utf = 0; term->utf = 0;
break; break;
} }
@ -2057,7 +2090,7 @@ void term_out(Terminal *term)
compatibility(VT100); compatibility(VT100);
{ {
if (term->esc_nargs != 1) break; if (term->esc_nargs != 1) break;
if (term->esc_args[0] == 5 && *term->cfg->printer) { if (term->esc_args[0] == 5 && *term->cfg.printer) {
term->printing = TRUE; term->printing = TRUE;
term->only_printing = !term->esc_query; term->only_printing = !term->esc_query;
term->print_state = 0; term->print_state = 0;
@ -2179,15 +2212,15 @@ void term_out(Terminal *term)
break; break;
case 10: /* SCO acs off */ case 10: /* SCO acs off */
compatibility(SCOANSI); compatibility(SCOANSI);
if (term->cfg->no_remote_charset) break; if (term->cfg.no_remote_charset) break;
term->sco_acs = 0; break; term->sco_acs = 0; break;
case 11: /* SCO acs on */ case 11: /* SCO acs on */
compatibility(SCOANSI); compatibility(SCOANSI);
if (term->cfg->no_remote_charset) break; if (term->cfg.no_remote_charset) break;
term->sco_acs = 1; break; term->sco_acs = 1; break;
case 12: /* SCO acs on, |0x80 */ case 12: /* SCO acs on, |0x80 */
compatibility(SCOANSI); compatibility(SCOANSI);
if (term->cfg->no_remote_charset) break; if (term->cfg.no_remote_charset) break;
term->sco_acs = 2; break; term->sco_acs = 2; break;
case 22: /* disable bold */ case 22: /* disable bold */
compatibility2(OTHER, VT220); compatibility2(OTHER, VT220);
@ -2266,7 +2299,7 @@ void term_out(Terminal *term)
&& (term->esc_args[0] < 1 || && (term->esc_args[0] < 1 ||
term->esc_args[0] >= 24)) { term->esc_args[0] >= 24)) {
compatibility(VT340TEXT); compatibility(VT340TEXT);
if (!term->cfg->no_remote_resize) if (!term->cfg.no_remote_resize)
request_resize(term->frontend, term->cols, request_resize(term->frontend, term->cols,
def(term->esc_args[0], 24)); def(term->esc_args[0], 24));
deselect(term); deselect(term);
@ -2286,7 +2319,7 @@ void term_out(Terminal *term)
break; break;
case 3: case 3:
if (term->esc_nargs >= 3) { if (term->esc_nargs >= 3) {
if (!term->cfg->no_remote_resize) if (!term->cfg.no_remote_resize)
move_window(term->frontend, move_window(term->frontend,
def(term->esc_args[1], 0), def(term->esc_args[1], 0),
def(term->esc_args[2], 0)); def(term->esc_args[2], 0));
@ -2311,10 +2344,10 @@ void term_out(Terminal *term)
break; break;
case 8: case 8:
if (term->esc_nargs >= 3) { if (term->esc_nargs >= 3) {
if (!term->cfg->no_remote_resize) if (!term->cfg.no_remote_resize)
request_resize(term->frontend, request_resize(term->frontend,
def(term->esc_args[2], term->cfg->width), def(term->esc_args[2], term->cfg.width),
def(term->esc_args[1], term->cfg->height)); def(term->esc_args[1], term->cfg.height));
} }
break; break;
case 9: case 9:
@ -2412,10 +2445,10 @@ void term_out(Terminal *term)
*/ */
compatibility(VT420); compatibility(VT420);
if (term->esc_nargs == 1 && term->esc_args[0] > 0) { if (term->esc_nargs == 1 && term->esc_args[0] > 0) {
if (!term->cfg->no_remote_resize) if (!term->cfg.no_remote_resize)
request_resize(term->frontend, term->cols, request_resize(term->frontend, term->cols,
def(term->esc_args[0], def(term->esc_args[0],
term->cfg->height)); term->cfg.height));
deselect(term); deselect(term);
} }
break; break;
@ -2426,10 +2459,10 @@ void term_out(Terminal *term)
*/ */
compatibility(VT340TEXT); compatibility(VT340TEXT);
if (term->esc_nargs <= 1) { if (term->esc_nargs <= 1) {
if (!term->cfg->no_remote_resize) if (!term->cfg.no_remote_resize)
request_resize(term->frontend, request_resize(term->frontend,
def(term->esc_args[0], def(term->esc_args[0],
term->cfg->width), term->rows); term->cfg.width), term->rows);
deselect(term); deselect(term);
} }
break; break;
@ -2563,7 +2596,7 @@ void term_out(Terminal *term)
* Well we should do a soft reset at this point ... * Well we should do a soft reset at this point ...
*/ */
if (!has_compat(VT420) && has_compat(VT100)) { if (!has_compat(VT420) && has_compat(VT100)) {
if (!term->cfg->no_remote_resize) { if (!term->cfg.no_remote_resize) {
if (term->reset_132) if (term->reset_132)
request_resize(132, 24); request_resize(132, 24);
else else
@ -2799,7 +2832,7 @@ void term_out(Terminal *term)
* emulation. * emulation.
*/ */
term->vt52_mode = FALSE; term->vt52_mode = FALSE;
term->blink_is_real = term->cfg->blinktext; term->blink_is_real = term->cfg.blinktext;
break; break;
#if 0 #if 0
case '^': case '^':
@ -3012,7 +3045,7 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
/* Has the cursor position or type changed ? */ /* Has the cursor position or type changed ? */
if (term->cursor_on) { if (term->cursor_on) {
if (term->has_focus) { if (term->has_focus) {
if (term->blinker || !term->cfg->blink_cur) if (term->blinker || !term->cfg.blink_cur)
cursor = TATTR_ACTCURS; cursor = TATTR_ACTCURS;
else else
cursor = 0; cursor = 0;
@ -3380,7 +3413,7 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect)
switch (uc & CSET_MASK) { switch (uc & CSET_MASK) {
case ATTR_LINEDRW: case ATTR_LINEDRW:
if (!term->cfg->rawcnp) { if (!term->cfg.rawcnp) {
uc = unitab_xterm[uc & 0xFF]; uc = unitab_xterm[uc & 0xFF];
break; break;
} }
@ -3744,8 +3777,8 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
pos selpoint; pos selpoint;
unsigned long *ldata; unsigned long *ldata;
int raw_mouse = (term->xterm_mouse && int raw_mouse = (term->xterm_mouse &&
!term->cfg->no_mouse_rep && !term->cfg.no_mouse_rep &&
!(term->cfg->mouse_override && shift)); !(term->cfg.mouse_override && shift));
int default_seltype; int default_seltype;
if (y < 0) { if (y < 0) {
@ -3834,7 +3867,7 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
* Set the selection type (rectangular or normal) at the start * Set the selection type (rectangular or normal) at the start
* of a selection attempt, from the state of Alt. * of a selection attempt, from the state of Alt.
*/ */
if (!alt ^ !term->cfg->rect_select) if (!alt ^ !term->cfg.rect_select)
default_seltype = RECTANGULAR; default_seltype = RECTANGULAR;
else else
default_seltype = LEXICOGRAPHIC; default_seltype = LEXICOGRAPHIC;

View File

@ -171,7 +171,14 @@ struct terminal_tag {
void *logctx; void *logctx;
Config *cfg; /*
* We maintain a full _copy_ of a Config structure here, not
* merely a pointer to it. That way, when we're passed a new
* one for reconfiguration, we can check the differences and
* adjust the _current_ setting of (e.g.) auto wrap mode rather
* than only the default.
*/
Config cfg;
}; };
#define in_utf(term) ((term)->utf || line_codepage==CP_UTF8) #define in_utf(term) ((term)->utf || line_codepage==CP_UTF8)

View File

@ -1779,8 +1779,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
cfgtopalette(); cfgtopalette();
init_palette(); init_palette();
/* Give terminal a heads-up on miscellaneous stuff */ /* Pass new config data to the terminal */
term_reconfig(term); term_reconfig(term, &cfg);
/* Screen size changed ? */ /* Screen size changed ? */
if (cfg.height != prev_cfg.height || if (cfg.height != prev_cfg.height ||