term->cfg is now a full copy of the Config structure, not a pointer;
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 12 Jan 2003 14:30:02 +0000 (14:30 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 12 Jan 2003 14:30:02 +0000 (14:30 +0000)
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.

git-svn-id: svn://svn.tartarus.org/sgt/putty@2557 cda61777-01e9-0310-a592-d414129be87e

doc/config.but
putty.h
terminal.c
terminal.h
window.c

index 71cee3e..a5efcc3 100644 (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
 
@@ -214,10 +214,11 @@ find the screen scrolling up when it looks as if it shouldn't, you
 could try turning this option off.
 
 Auto wrap mode can be turned on and off by control sequences sent by
-the server. This configuration option only controls the \e{default}
-state. If you modify this option in mid-session using \q{Change
-Settings}, you will need to reset the terminal (see
-\k{reset-terminal}) before the change takes effect.
+the server. This configuration option controls the \e{default}
+state, which will be restored when you reset the terminal (see
+\k{reset-terminal}). However, if you modify this option in
+mid-session using \q{Change Settings}, it will take effect
+immediately.
 
 \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.
 
 DEC Origin Mode can be turned on and off by control sequences sent
-by the server. This configuration option only controls the
-\e{default} state. If you modify this option in mid-session using
-\q{Change Settings}, you will need to reset the terminal (see
-\k{reset-terminal}) before the change takes effect.
+by the server. This configuration option controls the \e{default}
+state, which will be restored when you reset the terminal (see
+\k{reset-terminal}). However, if you modify this option in
+mid-session using \q{Change Settings}, it will take effect
+immediately.
 
 \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.
 
 Background-colour erase can be turned on and off by control
-sequences sent by the server. This configuration option only
-controls the \e{default} state. If you modify this option in
-mid-session using \q{Change Settings}, you will need to reset the
-terminal (see \k{reset-terminal}) before the change takes effect.
+sequences sent by the server. This configuration option controls the
+\e{default} state, which will be restored when you reset the
+terminal (see \k{reset-terminal}). However, if you modify this
+option in mid-session using \q{Change Settings}, it will take effect
+immediately.
 
 \S{config-blink} \q{Enable blinking text}
 
@@ -309,10 +312,11 @@ text blink, PuTTY will instead display the text with a bolded
 background colour.
 
 Blinking text can be turned on and off by control sequences sent by
-the server. This configuration option only controls the \e{default}
-state. If you modify this option in mid-session using \q{Change
-Settings}, you will need to reset the terminal (see
-\k{reset-terminal}) before the change takes effect.
+the server. This configuration option controls the \e{default}
+state, which will be restored when you reset the terminal (see
+\k{reset-terminal}). However, if you modify this option in
+mid-session using \q{Change Settings}, it will take effect
+immediately.
 
 \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.
 
 Character class definitions can be modified by control sequences
-sent by the server. This configuration option only controls the
-\e{default} state. If you modify this option in mid-session using
-\q{Change Settings}, you will need to reset the terminal (see
-\k{reset-terminal}) before the change takes effect.
+sent by the server. This configuration option controls the
+\e{default} state, which will be restored when you reset the
+terminal (see \k{reset-terminal}). However, if you modify this
+option in mid-session using \q{Change Settings}, it will take effect
+immediately.
 
 \H{config-colours} The Colours panel
 
diff --git a/putty.h b/putty.h
index 80643c7..19000fc 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -516,7 +516,7 @@ void term_paste(Terminal *);
 void term_nopaste(Terminal *);
 int term_ldisc(Terminal *, int option);
 void term_copyall(Terminal *);
-void term_reconfig(Terminal *);
+void term_reconfig(Terminal *, Config *);
 void term_seen_key_event(Terminal *); 
 int from_backend(void *, int is_stderr, char *data, int len);
 void term_provide_resize_fn(Terminal *term,
index 1cdf098..ba5e14e 100644 (file)
@@ -162,10 +162,10 @@ static void power_on(Terminal *term)
        for (i = 0; i < term->cols; i++)
            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_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_utf = term->utf = term->save_utf = 0;
     term->utf_state = 0;
@@ -177,17 +177,17 @@ static void power_on(Terminal *term)
     term->big_cursor = 0;
     term->save_attr = term->curr_attr = ATTR_DEFAULT;
     term->term_editing = term->term_echoing = FALSE;
-    term->app_cursor_keys = term->cfg->app_cursor;
-    term->app_keypad_keys = term->cfg->app_keypad;
-    term->use_bce = term->cfg->bce;
-    term->blink_is_real = term->cfg->blinktext;
+    term->app_cursor_keys = term->cfg.app_cursor;
+    term->app_keypad_keys = term->cfg.app_keypad;
+    term->use_bce = term->cfg.bce;
+    term->blink_is_real = term->cfg.blinktext;
     term->erase_char = ERASE_CHAR;
     term->alt_which = 0;
     term_print_finish(term);
     {
        int i;
        for (i = 0; i < 256; i++)
-           term->wordness[i] = term->cfg->wordness[i];
+           term->wordness[i] = term->cfg.wordness[i];
     }
     if (term->screen) {
        swap_screen(term, 1, FALSE, FALSE);
@@ -206,7 +206,7 @@ void term_update(Terminal *term)
     ctx = get_ctx(term->frontend);
     if (ctx) {
        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->seen_disp_event = 0;
            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.
      */
-    if (term->cfg->scroll_on_key) {
+    if (term->cfg.scroll_on_key) {
        term->disptop = 0;             /* return to main screen */
        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
  * 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);
-    if (term->cfg->no_mouse_rep) {
+    if (term->cfg.no_mouse_rep) {
        term->xterm_mouse = 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->sco_acs = term->alt_sco_acs = 0;
        term->utf = 0;
     }
-    if (!*term->cfg->printer) {
+    if (!*term->cfg.printer) {
        term_print_finish(term);
     }
 }
@@ -314,7 +347,7 @@ Terminal *term_init(Config *mycfg, void *frontend)
      */
     term = smalloc(sizeof(Terminal));
     term->frontend = frontend;
-    term->cfg = mycfg;
+    term->cfg = *mycfg;                       /* STRUCTURE COPY */
     term->logctx = NULL;
     term->compatibility_level = TM_PUTTY;
     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->vt52_bold = FALSE;
            } else {
-               term->blink_is_real = term->cfg->blinktext;
+               term->blink_is_real = term->cfg.blinktext;
            }
            break;
          case 3:                      /* 80/132 columns */
            deselect(term);
-           if (!term->cfg->no_remote_resize)
+           if (!term->cfg.no_remote_resize)
                request_resize(term->frontend, state ? 132 : 80, term->rows);
            term->reset_132 = state;
            break;
@@ -1030,7 +1063,7 @@ static void toggle_mode(Terminal *term, int mode, int query, int state)
          case 47:                     /* alternate screen */
            compatibility(OTHER);
            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;
            break;
          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 */
            compatibility(OTHER);
            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;
            break;
          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;
            compatibility(OTHER);
            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)
                save_cursor(term, state);
            term->disptop = 0;
@@ -1096,14 +1129,14 @@ static void do_osc(Terminal *term)
        switch (term->esc_args[0]) {
          case 0:
          case 1:
-           if (!term->cfg->no_remote_wintitle)
+           if (!term->cfg.no_remote_wintitle)
                set_icon(term->frontend, term->osc_string);
            if (term->esc_args[0] == 1)
                break;
            /* fall through: parameter 0 means set both */
          case 2:
          case 21:
-           if (!term->cfg->no_remote_wintitle)
+           if (!term->cfg.no_remote_wintitle)
                set_title(term->frontend, term->osc_string);
            break;
        }
@@ -1116,7 +1149,7 @@ static void do_osc(Terminal *term)
 static void term_print_setup(Terminal *term)
 {
     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)
 {
@@ -1190,7 +1223,7 @@ void term_out(Terminal *term)
             * Optionally log the session traffic to a file. Useful for
             * 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);
        } else {
            c = unget;
@@ -1378,7 +1411,7 @@ void term_out(Terminal *term)
                term->curs.x--;
            term->wrapnext = FALSE;
            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);
        } else
            /* Or normal C0 controls. */
@@ -1397,7 +1430,7 @@ void term_out(Terminal *term)
                if (term->ldisc) {
                    char abuf[256], *s, *d;
                    int state = 0;
-                   for (s = term->cfg->answerback, d = abuf; *s; s++) {
+                   for (s = term->cfg.answerback, d = abuf; *s; s++) {
                        if (state) {
                            if (*s >= 'a' && *s <= 'z')
                                *d++ = (*s - ('a' - 1));
@@ -1440,7 +1473,7 @@ void term_out(Terminal *term)
                     * t seconds ago.
                     */
                    while (term->beephead &&
-                          term->beephead->ticks < ticks - term->cfg->bellovl_t) {
+                          term->beephead->ticks < ticks - term->cfg.bellovl_t) {
                        struct beeptime *tmp = term->beephead;
                        term->beephead = tmp->next;
                        sfree(tmp);
@@ -1449,16 +1482,16 @@ void term_out(Terminal *term)
                        term->nbeeps--;
                    }
 
-                   if (term->cfg->bellovl && term->beep_overloaded &&
-                       ticks - term->lastbeep >= (unsigned)term->cfg->bellovl_s) {
+                   if (term->cfg.bellovl && term->beep_overloaded &&
+                       ticks - term->lastbeep >= (unsigned)term->cfg.bellovl_s) {
                        /*
                         * If we're currently overloaded and the
                         * last beep was more than s seconds ago,
                         * leave overload mode.
                         */
                        term->beep_overloaded = FALSE;
-                   } else if (term->cfg->bellovl && !term->beep_overloaded &&
-                              term->nbeeps >= term->cfg->bellovl_n) {
+                   } else if (term->cfg.bellovl && !term->beep_overloaded &&
+                              term->nbeeps >= term->cfg.bellovl_n) {
                        /*
                         * Now, if we have n or more beeps
                         * 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.
                     */
-                   if (!term->cfg->bellovl || !term->beep_overloaded) {
-                       beep(term->frontend, term->cfg->beep);
-                       if (term->cfg->beep == BELL_VISUAL) {
+                   if (!term->cfg.bellovl || !term->beep_overloaded) {
+                       beep(term->frontend, term->cfg.beep);
+                       if (term->cfg.beep == BELL_VISUAL) {
                            term->in_vbell = TRUE;
                            term->vbell_startpoint = ticks;
                            term_update(term);
@@ -1537,7 +1570,7 @@ void term_out(Terminal *term)
                    scroll(term, term->marg_t, term->marg_b, 1, TRUE);
                else if (term->curs.y < term->rows - 1)
                    term->curs.y++;
-               if (term->cfg->lfhascr)
+               if (term->cfg.lfhascr)
                    term->curs.x = 0;
                fix_cpos;
                term->wrapnext = FALSE;
@@ -1764,7 +1797,7 @@ void term_out(Terminal *term)
                    if (term->ldisc)   /* cause ldisc to notice changes */
                        ldisc_send(term->ldisc, NULL, 0, 0);
                    if (term->reset_132) {
-                       if (!term->cfg->no_remote_resize)
+                       if (!term->cfg.no_remote_resize)
                            request_resize(term->frontend, 80, term->rows);
                        term->reset_132 = 0;
                    }
@@ -1829,55 +1862,55 @@ void term_out(Terminal *term)
 
                  case ANSI('A', '('):
                    compatibility(VT100);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->cset_attr[0] = ATTR_GBCHR;
                    break;
                  case ANSI('B', '('):
                    compatibility(VT100);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->cset_attr[0] = ATTR_ASCII;
                    break;
                  case ANSI('0', '('):
                    compatibility(VT100);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->cset_attr[0] = ATTR_LINEDRW;
                    break;
                  case ANSI('U', '('): 
                    compatibility(OTHER);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->cset_attr[0] = ATTR_SCOACS; 
                    break;
 
                  case ANSI('A', ')'):
                    compatibility(VT100);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->cset_attr[1] = ATTR_GBCHR;
                    break;
                  case ANSI('B', ')'):
                    compatibility(VT100);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->cset_attr[1] = ATTR_ASCII;
                    break;
                  case ANSI('0', ')'):
                    compatibility(VT100);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->cset_attr[1] = ATTR_LINEDRW;
                    break;
                  case ANSI('U', ')'): 
                    compatibility(OTHER);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->cset_attr[1] = ATTR_SCOACS; 
                    break;
 
                  case ANSI('8', '%'):  /* Old Linux code */
                  case ANSI('G', '%'):
                    compatibility(OTHER);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->utf = 1;
                    break;
                  case ANSI('@', '%'):
                    compatibility(OTHER);
-                   if (!term->cfg->no_remote_charset)
+                   if (!term->cfg.no_remote_charset)
                        term->utf = 0;
                    break;
                }
@@ -2057,7 +2090,7 @@ void term_out(Terminal *term)
                        compatibility(VT100);
                        {
                            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->only_printing = !term->esc_query;
                                term->print_state = 0;
@@ -2179,15 +2212,15 @@ void term_out(Terminal *term)
                                    break;
                                  case 10:      /* SCO acs off */
                                    compatibility(SCOANSI);
-                                   if (term->cfg->no_remote_charset) break;
+                                   if (term->cfg.no_remote_charset) break;
                                    term->sco_acs = 0; break;
                                  case 11:      /* SCO acs on */
                                    compatibility(SCOANSI);
-                                   if (term->cfg->no_remote_charset) break;
+                                   if (term->cfg.no_remote_charset) break;
                                    term->sco_acs = 1; break;
                                  case 12:      /* SCO acs on, |0x80 */
                                    compatibility(SCOANSI);
-                                   if (term->cfg->no_remote_charset) break;
+                                   if (term->cfg.no_remote_charset) break;
                                    term->sco_acs = 2; break;
                                  case 22:      /* disable bold */
                                    compatibility2(OTHER, VT220);
@@ -2266,7 +2299,7 @@ void term_out(Terminal *term)
                            && (term->esc_args[0] < 1 ||
                                term->esc_args[0] >= 24)) {
                            compatibility(VT340TEXT);
-                           if (!term->cfg->no_remote_resize)
+                           if (!term->cfg.no_remote_resize)
                                request_resize(term->frontend, term->cols,
                                               def(term->esc_args[0], 24));
                            deselect(term);
@@ -2286,7 +2319,7 @@ void term_out(Terminal *term)
                                break;
                              case 3:
                                if (term->esc_nargs >= 3) {
-                                   if (!term->cfg->no_remote_resize)
+                                   if (!term->cfg.no_remote_resize)
                                        move_window(term->frontend,
                                                    def(term->esc_args[1], 0),
                                                    def(term->esc_args[2], 0));
@@ -2311,10 +2344,10 @@ void term_out(Terminal *term)
                                break;
                              case 8:
                                if (term->esc_nargs >= 3) {
-                                   if (!term->cfg->no_remote_resize)
+                                   if (!term->cfg.no_remote_resize)
                                        request_resize(term->frontend,
-                                                      def(term->esc_args[2], term->cfg->width),
-                                                      def(term->esc_args[1], term->cfg->height));
+                                                      def(term->esc_args[2], term->cfg.width),
+                                                      def(term->esc_args[1], term->cfg.height));
                                }
                                break;
                              case 9:
@@ -2412,10 +2445,10 @@ void term_out(Terminal *term)
                         */
                        compatibility(VT420);
                        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,
                                               def(term->esc_args[0],
-                                                  term->cfg->height));
+                                                  term->cfg.height));
                            deselect(term);
                        }
                        break;
@@ -2426,10 +2459,10 @@ void term_out(Terminal *term)
                         */
                        compatibility(VT340TEXT);
                        if (term->esc_nargs <= 1) {
-                           if (!term->cfg->no_remote_resize)
+                           if (!term->cfg.no_remote_resize)
                                request_resize(term->frontend,
                                               def(term->esc_args[0],
-                                                  term->cfg->width), term->rows);
+                                                  term->cfg.width), term->rows);
                            deselect(term);
                        }
                        break;
@@ -2563,7 +2596,7 @@ void term_out(Terminal *term)
                         * Well we should do a soft reset at this point ...
                         */
                        if (!has_compat(VT420) && has_compat(VT100)) {
-                           if (!term->cfg->no_remote_resize) {
+                           if (!term->cfg.no_remote_resize) {
                                if (term->reset_132)
                                    request_resize(132, 24);
                                else
@@ -2799,7 +2832,7 @@ void term_out(Terminal *term)
                     *     emulation.
                     */
                    term->vt52_mode = FALSE;
-                   term->blink_is_real = term->cfg->blinktext;
+                   term->blink_is_real = term->cfg.blinktext;
                    break;
 #if 0
                  case '^':
@@ -3012,7 +3045,7 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
     /* Has the cursor position or type changed ? */
     if (term->cursor_on) {
        if (term->has_focus) {
-           if (term->blinker || !term->cfg->blink_cur)
+           if (term->blinker || !term->cfg.blink_cur)
                cursor = TATTR_ACTCURS;
            else
                cursor = 0;
@@ -3380,7 +3413,7 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect)
 
            switch (uc & CSET_MASK) {
              case ATTR_LINEDRW:
-               if (!term->cfg->rawcnp) {
+               if (!term->cfg.rawcnp) {
                    uc = unitab_xterm[uc & 0xFF];
                    break;
                }
@@ -3744,8 +3777,8 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
     pos selpoint;
     unsigned long *ldata;
     int raw_mouse = (term->xterm_mouse &&
-                    !term->cfg->no_mouse_rep &&
-                    !(term->cfg->mouse_override && shift));
+                    !term->cfg.no_mouse_rep &&
+                    !(term->cfg.mouse_override && shift));
     int default_seltype;
 
     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
      * of a selection attempt, from the state of Alt.
      */
-    if (!alt ^ !term->cfg->rect_select)
+    if (!alt ^ !term->cfg.rect_select)
        default_seltype = RECTANGULAR;
     else
        default_seltype = LEXICOGRAPHIC;
index b6b5a06..72c8f87 100644 (file)
@@ -171,7 +171,14 @@ struct terminal_tag {
 
     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)
index cea9d5c..272a527 100644 (file)
--- a/window.c
+++ b/window.c
@@ -1779,8 +1779,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                cfgtopalette();
                init_palette();
 
-               /* Give terminal a heads-up on miscellaneous stuff */
-               term_reconfig(term);
+               /* Pass new config data to the terminal */
+               term_reconfig(term, &cfg);
 
                /* Screen size changed ? */
                if (cfg.height != prev_cfg.height ||