Post-release destabilisation! Completely remove the struct type
[u/mdw/putty] / terminal.c
index 73ab393..9865355 100644 (file)
@@ -989,7 +989,7 @@ static void resizeline(Terminal *term, termline *line, int cols)
 static int sblines(Terminal *term)
 {
     int sblines = count234(term->scrollback);
-    if (term->cfg.erase_to_scrollback &&
+    if (term->erase_to_scrollback &&
        term->alt_which && term->alt_screen) {
            sblines += term->alt_sblines;
     }
@@ -1015,7 +1015,7 @@ static termline *lineptr(Terminal *term, int y, int lineno, int screen)
 
        assert(!screen);
 
-       if (term->cfg.erase_to_scrollback &&
+       if (term->erase_to_scrollback &&
            term->alt_which && term->alt_screen) {
            altlines = term->alt_sblines;
        }
@@ -1133,7 +1133,7 @@ static void term_schedule_tblink(Terminal *term)
  */
 static void term_schedule_cblink(Terminal *term)
 {
-    if (term->cfg.blink_cur && term->has_focus) {
+    if (term->blink_cur && term->has_focus) {
        if (!term->cblink_pending)
            term->next_cblink = schedule_timer(CBLINK_DELAY, term_timer, term);
        term->cblink_pending = TRUE;
@@ -1197,11 +1197,11 @@ static void power_on(Terminal *term, int clear)
        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 = conf_get_int(term->conf, CONF_dec_om);
     term->alt_ins = term->insert = FALSE;
     term->alt_wnext = term->wrapnext =
         term->save_wnext = term->alt_save_wnext = FALSE;
-    term->alt_wrap = term->wrap = term->cfg.wrap_mode;
+    term->alt_wrap = term->wrap = conf_get_int(term->conf, CONF_wrap_mode);
     term->alt_cset = term->cset = term->save_cset = term->alt_save_cset = 0;
     term->alt_utf = term->utf = term->save_utf = term->alt_save_utf = 0;
     term->utf_state = 0;
@@ -1216,10 +1216,10 @@ static void power_on(Terminal *term, int clear)
     term->default_attr = term->save_attr =
        term->alt_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 = conf_get_int(term->conf, CONF_app_cursor);
+    term->app_keypad_keys = conf_get_int(term->conf, CONF_app_keypad);
+    term->use_bce = conf_get_int(term->conf, CONF_bce);
+    term->blink_is_real = conf_get_int(term->conf, CONF_blinktext);
     term->erase_char = term->basic_erase_char;
     term->alt_which = 0;
     term_print_finish(term);
@@ -1228,7 +1228,7 @@ static void power_on(Terminal *term, int clear)
     {
        int i;
        for (i = 0; i < 256; i++)
-           term->wordness[i] = term->cfg.wordness[i];
+           term->wordness[i] = conf_get_int_int(term->conf, CONF_wordness, i);
     }
     if (term->screen) {
        swap_screen(term, 1, FALSE, FALSE);
@@ -1261,7 +1261,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->scroll_on_disp) {
            term->disptop = 0;         /* return to main screen */
            term->seen_disp_event = 0;
            need_sbar_update = TRUE;
@@ -1300,7 +1300,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->scroll_on_key) {
        term->disptop = 0;             /* return to main screen */
        seen_disp_event(term);
     }
@@ -1328,12 +1328,82 @@ static void set_erase_char(Terminal *term)
 }
 
 /*
+ * We copy a bunch of stuff out of the Conf structure into local
+ * fields in the Terminal structure, to avoid the repeated tree234
+ * lookups which would be involved in fetching them from the former
+ * every time.
+ */
+void term_copy_stuff_from_conf(Terminal *term)
+{
+    term->ansi_colour = conf_get_int(term->conf, CONF_ansi_colour);
+    term->arabicshaping = conf_get_int(term->conf, CONF_arabicshaping);
+    term->beep = conf_get_int(term->conf, CONF_beep);
+    term->bellovl = conf_get_int(term->conf, CONF_bellovl);
+    term->bellovl_n = conf_get_int(term->conf, CONF_bellovl_n);
+    term->bellovl_s = conf_get_int(term->conf, CONF_bellovl_s);
+    term->bellovl_t = conf_get_int(term->conf, CONF_bellovl_t);
+    term->bidi = conf_get_int(term->conf, CONF_bidi);
+    term->bksp_is_delete = conf_get_int(term->conf, CONF_bksp_is_delete);
+    term->blink_cur = conf_get_int(term->conf, CONF_blink_cur);
+    term->blinktext = conf_get_int(term->conf, CONF_blinktext);
+    term->cjk_ambig_wide = conf_get_int(term->conf, CONF_cjk_ambig_wide);
+    term->conf_height = conf_get_int(term->conf, CONF_height);
+    term->conf_width = conf_get_int(term->conf, CONF_width);
+    term->crhaslf = conf_get_int(term->conf, CONF_crhaslf);
+    term->erase_to_scrollback = conf_get_int(term->conf, CONF_erase_to_scrollback);
+    term->funky_type = conf_get_int(term->conf, CONF_funky_type);
+    term->lfhascr = conf_get_int(term->conf, CONF_lfhascr);
+    term->logflush = conf_get_int(term->conf, CONF_logflush);
+    term->logtype = conf_get_int(term->conf, CONF_logtype);
+    term->mouse_override = conf_get_int(term->conf, CONF_mouse_override);
+    term->nethack_keypad = conf_get_int(term->conf, CONF_nethack_keypad);
+    term->no_alt_screen = conf_get_int(term->conf, CONF_no_alt_screen);
+    term->no_applic_c = conf_get_int(term->conf, CONF_no_applic_c);
+    term->no_applic_k = conf_get_int(term->conf, CONF_no_applic_k);
+    term->no_dbackspace = conf_get_int(term->conf, CONF_no_dbackspace);
+    term->no_mouse_rep = conf_get_int(term->conf, CONF_no_mouse_rep);
+    term->no_remote_charset = conf_get_int(term->conf, CONF_no_remote_charset);
+    term->no_remote_resize = conf_get_int(term->conf, CONF_no_remote_resize);
+    term->no_remote_wintitle = conf_get_int(term->conf, CONF_no_remote_wintitle);
+    term->rawcnp = conf_get_int(term->conf, CONF_rawcnp);
+    term->rect_select = conf_get_int(term->conf, CONF_rect_select);
+    term->remote_qtitle_action = conf_get_int(term->conf, CONF_remote_qtitle_action);
+    term->rxvt_homeend = conf_get_int(term->conf, CONF_rxvt_homeend);
+    term->scroll_on_disp = conf_get_int(term->conf, CONF_scroll_on_disp);
+    term->scroll_on_key = conf_get_int(term->conf, CONF_scroll_on_key);
+    term->xterm_256_colour = conf_get_int(term->conf, CONF_xterm_256_colour);
+
+    /*
+     * Parse the control-character escapes in the configured
+     * answerback string.
+     */
+    {
+       char *answerback = conf_get_str(term->conf, CONF_answerback);
+       int maxlen = strlen(answerback);
+
+       term->answerback = snewn(maxlen, char);
+       term->answerbacklen = 0;
+
+       while (*answerback) {
+           char *n;
+           char c = ctrlparse(answerback, &n);
+           if (n) {
+               term->answerback[term->answerbacklen++] = c;
+               answerback = n;
+           } else {
+               term->answerback[term->answerbacklen++] = *answerback++;
+           }
+       }
+    }
+}
+
+/*
  * When the user reconfigures us, we need to check the forbidden-
  * alternate-screen config option, disable raw mouse mode if the
  * user has disabled mouse reporting, and abandon a print job if
  * the user has disabled printing.
  */
-void term_reconfig(Terminal *term, Config *cfg)
+void term_reconfig(Terminal *term, Conf *conf)
 {
     /*
      * Before adopting the new config, check all those terminal
@@ -1345,21 +1415,28 @@ void term_reconfig(Terminal *term, Config *cfg)
     int reset_wrap, reset_decom, reset_bce, reset_tblink, 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_tblink = (term->cfg.blinktext != cfg->blinktext);
+    reset_wrap = (conf_get_int(term->conf, CONF_wrap_mode) !=
+                 conf_get_int(conf, CONF_wrap_mode));
+    reset_decom = (conf_get_int(term->conf, CONF_dec_om) !=
+                  conf_get_int(conf, CONF_dec_om));
+    reset_bce = (conf_get_int(term->conf, CONF_bce) !=
+                conf_get_int(conf, CONF_bce));
+    reset_tblink = (conf_get_int(term->conf, CONF_blinktext) !=
+                   conf_get_int(conf, CONF_blinktext));
     reset_charclass = 0;
-    for (i = 0; i < lenof(term->cfg.wordness); i++)
-       if (term->cfg.wordness[i] != cfg->wordness[i])
+    for (i = 0; i < 256; i++)
+       if (conf_get_int_int(term->conf, CONF_wordness, i) !=
+           conf_get_int_int(conf, CONF_wordness, i))
            reset_charclass = 1;
 
     /*
      * If the bidi or shaping settings have changed, flush the bidi
      * cache completely.
      */
-    if (term->cfg.arabicshaping != cfg->arabicshaping ||
-       term->cfg.bidi != cfg->bidi) {
+    if (conf_get_int(term->conf, CONF_arabicshaping) !=
+       conf_get_int(conf, CONF_arabicshaping) ||
+       conf_get_int(term->conf, CONF_bidi) !=
+       conf_get_int(conf, CONF_bidi)) {
        for (i = 0; i < term->bidi_cache_size; i++) {
            sfree(term->pre_bidi_cache[i].chars);
            sfree(term->post_bidi_cache[i].chars);
@@ -1370,39 +1447,41 @@ void term_reconfig(Terminal *term, Config *cfg)
        }
     }
 
-    term->cfg = *cfg;                 /* STRUCTURE COPY */
+    conf_free(term->conf);
+    term->conf = conf_copy(conf);
 
     if (reset_wrap)
-       term->alt_wrap = term->wrap = term->cfg.wrap_mode;
+       term->alt_wrap = term->wrap = conf_get_int(term->conf, CONF_wrap_mode);
     if (reset_decom)
-       term->alt_om = term->dec_om = term->cfg.dec_om;
+       term->alt_om = term->dec_om = conf_get_int(term->conf, CONF_dec_om);
     if (reset_bce) {
-       term->use_bce = term->cfg.bce;
+       term->use_bce = conf_get_int(term->conf, CONF_bce);
        set_erase_char(term);
     }
     if (reset_tblink) {
-       term->blink_is_real = term->cfg.blinktext;
+       term->blink_is_real = conf_get_int(term->conf, CONF_blinktext);
     }
     if (reset_charclass)
        for (i = 0; i < 256; i++)
-           term->wordness[i] = term->cfg.wordness[i];
+           term->wordness[i] = conf_get_int_int(term->conf, CONF_wordness, i);
 
-    if (term->cfg.no_alt_screen)
+    if (conf_get_int(term->conf, CONF_no_alt_screen))
        swap_screen(term, 0, FALSE, FALSE);
-    if (term->cfg.no_mouse_rep) {
+    if (conf_get_int(term->conf, CONF_no_mouse_rep)) {
        term->xterm_mouse = 0;
        set_raw_mouse_mode(term->frontend, 0);
     }
-    if (term->cfg.no_remote_charset) {
+    if (conf_get_int(term->conf, CONF_no_remote_charset)) {
        term->cset_attr[0] = term->cset_attr[1] = CSET_ASCII;
        term->sco_acs = term->alt_sco_acs = 0;
        term->utf = 0;
     }
-    if (!*term->cfg.printer) {
+    if (!conf_get_str(term->conf, CONF_printer)) {
        term_print_finish(term);
     }
     term_schedule_tblink(term);
     term_schedule_cblink(term);
+    term_copy_stuff_from_conf(term);
 }
 
 /*
@@ -1423,7 +1502,7 @@ void term_clrsb(Terminal *term)
 /*
  * Initialise the terminal.
  */
-Terminal *term_init(Config *mycfg, struct unicode_data *ucsdata,
+Terminal *term_init(Conf *myconf, struct unicode_data *ucsdata,
                    void *frontend)
 {
     Terminal *term;
@@ -1435,7 +1514,7 @@ Terminal *term_init(Config *mycfg, struct unicode_data *ucsdata,
     term = snew(Terminal);
     term->frontend = frontend;
     term->ucsdata = ucsdata;
-    term->cfg = *mycfg;                       /* STRUCTURE COPY */
+    term->conf = conf_copy(myconf);
     term->logctx = NULL;
     term->compatibility_level = TM_PUTTY;
     strcpy(term->id_string, "\033[?6c");
@@ -1497,6 +1576,8 @@ Terminal *term_init(Config *mycfg, struct unicode_data *ucsdata,
     term->basic_erase_char.cc_next = 0;
     term->erase_char = term->basic_erase_char;
 
+    term_copy_stuff_from_conf(term);
+
     return term;
 }
 
@@ -1543,6 +1624,8 @@ void term_free(Terminal *term)
 
     expire_timer_context(term);
 
+    conf_free(term->conf);
+
     sfree(term);
 }
 
@@ -2243,7 +2326,7 @@ static void erase_lots(Terminal *term,
     if (start.y == 0 && start.x == 0 && end.x == 0 && erase_lattr)
        erasing_lines_from_top = 1;
 
-    if (term->cfg.erase_to_scrollback && erasing_lines_from_top) {
+    if (term->erase_to_scrollback && erasing_lines_from_top) {
        /* If it's a whole number of lines, starting at the top, and
         * we're fully erasing them, erase by scrolling and keep the
         * lines in the scrollback. */
@@ -2334,13 +2417,13 @@ 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->blinktext;
            }
            term_schedule_tblink(term);
            break;
          case 3:                      /* DECCOLM: 80/132 columns */
            deselect(term);
-           if (!term->cfg.no_remote_resize)
+           if (!term->no_remote_resize)
                request_resize(term->frontend, state ? 132 : 80, term->rows);
            term->reset_132 = state;
            term->alt_t = term->marg_t = 0;
@@ -2387,7 +2470,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->no_alt_screen ? 0 : state, FALSE, FALSE);
            term->disptop = 0;
            break;
          case 1000:                   /* xterm mouse 1 (normal) */
@@ -2401,22 +2484,22 @@ 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->no_alt_screen ? 0 : state, TRUE, TRUE);
            term->disptop = 0;
            break;
          case 1048:                   /* save/restore cursor */
-           if (!term->cfg.no_alt_screen)
+           if (!term->no_alt_screen)
                 save_cursor(term, state);
            if (!state) seen_disp_event(term);
            break;
          case 1049:                   /* cursor & alternate screen */
-           if (state && !term->cfg.no_alt_screen)
+           if (state && !term->no_alt_screen)
                save_cursor(term, state);
            if (!state) seen_disp_event(term);
            compatibility(OTHER);
            deselect(term);
-           swap_screen(term, term->cfg.no_alt_screen ? 0 : state, TRUE, FALSE);
-           if (!state && !term->cfg.no_alt_screen)
+           swap_screen(term, term->no_alt_screen ? 0 : state, TRUE, FALSE);
+           if (!state && !term->no_alt_screen)
                save_cursor(term, state);
            term->disptop = 0;
            break;
@@ -2454,14 +2537,14 @@ static void do_osc(Terminal *term)
        switch (term->esc_args[0]) {
          case 0:
          case 1:
-           if (!term->cfg.no_remote_wintitle)
+           if (!term->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->no_remote_wintitle)
                set_title(term->frontend, term->osc_string);
            break;
        }
@@ -2471,10 +2554,10 @@ static void do_osc(Terminal *term)
 /*
  * ANSI printing routines.
  */
-static void term_print_setup(Terminal *term)
+static void term_print_setup(Terminal *term, char *printer)
 {
     bufchain_clear(&term->printer_buf);
-    term->print_job = printer_start_job(term->cfg.printer);
+    term->print_job = printer_start_job(printer);
 }
 static void term_print_flush(Terminal *term)
 {
@@ -2549,7 +2632,7 @@ static 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->logtype == LGTYP_DEBUG && term->logctx)
                logtraffic(term->logctx, (unsigned char) c, LGTYP_DEBUG);
        } else {
            c = unget;
@@ -2741,7 +2824,7 @@ static void term_out(Terminal *term)
                term->curs.x--;
            term->wrapnext = FALSE;
            /* destructive backspace might be disabled */
-           if (!term->cfg.no_dbackspace) {
+           if (!term->no_dbackspace) {
                check_boundary(term, term->curs.x, term->curs.y);
                check_boundary(term, term->curs.x+1, term->curs.y);
                copy_termchar(scrlineptr(term->curs.y),
@@ -2761,19 +2844,8 @@ static void term_out(Terminal *term)
                 */
                compatibility(ANSIMIN);
                if (term->ldisc) {
-                   char abuf[lenof(term->cfg.answerback)], *s, *d;
-                   for (s = term->cfg.answerback, d = abuf; *s;) {
-                       char *n;
-                       char c = ctrlparse(s, &n);
-                       if (n) {
-                           *d++ = c;
-                           s = n;
-                       } else {
-                           *d++ = *s++;
-                       }
-                   }
                    lpage_send(term->ldisc, DEFAULT_CODEPAGE,
-                              abuf, d - abuf, 0);
+                              term->answerback, term->answerbacklen, 0);
                }
                break;
              case '\007':            /* BEL: Bell */
@@ -2800,7 +2872,7 @@ static void term_out(Terminal *term)
                     * t seconds ago.
                     */
                    while (term->beephead &&
-                          term->beephead->ticks < ticks - term->cfg.bellovl_t) {
+                          term->beephead->ticks < ticks - term->bellovl_t) {
                        struct beeptime *tmp = term->beephead;
                        term->beephead = tmp->next;
                        sfree(tmp);
@@ -2809,16 +2881,16 @@ static void term_out(Terminal *term)
                        term->nbeeps--;
                    }
 
-                   if (term->cfg.bellovl && term->beep_overloaded &&
-                       ticks - term->lastbeep >= (unsigned)term->cfg.bellovl_s) {
+                   if (term->bellovl && term->beep_overloaded &&
+                       ticks - term->lastbeep >= (unsigned)term->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->bellovl && !term->beep_overloaded &&
+                              term->nbeeps >= term->bellovl_n) {
                        /*
                         * Now, if we have n or more beeps
                         * remaining in the queue, go into overload
@@ -2831,10 +2903,10 @@ static void term_out(Terminal *term)
                    /*
                     * Perform an actual beep if we're not overloaded.
                     */
-                   if (!term->cfg.bellovl || !term->beep_overloaded) {
-                       do_beep(term->frontend, term->cfg.beep);
+                   if (!term->bellovl || !term->beep_overloaded) {
+                       do_beep(term->frontend, term->beep);
 
-                       if (term->cfg.beep == BELL_VISUAL) {
+                       if (term->beep == BELL_VISUAL) {
                            term_schedule_vbell(term, FALSE, 0);
                        }
                    }
@@ -2876,12 +2948,12 @@ static void term_out(Terminal *term)
                seen_disp_event(term);
                term->paste_hold = 0;
 
-        if (term->cfg.crhaslf) {  
-                 if (term->curs.y == term->marg_b)
-                   scroll(term, term->marg_t, term->marg_b, 1, TRUE);
-                 else if (term->curs.y < term->rows - 1)
-                   term->curs.y++;
-        }
+               if (term->crhaslf) {
+                   if (term->curs.y == term->marg_b)
+                       scroll(term, term->marg_t, term->marg_b, 1, TRUE);
+                   else if (term->curs.y < term->rows - 1)
+                       term->curs.y++;
+               }
                if (term->logctx)
                    logtraffic(term->logctx, (unsigned char) c, LGTYP_ASCII);
                break;
@@ -2901,7 +2973,7 @@ static 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->lfhascr)
                    term->curs.x = 0;
                term->wrapnext = FALSE;
                seen_disp_event(term);
@@ -2943,7 +3015,7 @@ static void term_out(Terminal *term)
                    if (DIRECT_CHAR(c))
                        width = 1;
                    if (!width)
-                       width = (term->cfg.cjk_ambig_wide ?
+                       width = (term->cjk_ambig_wide ?
                                 mk_wcwidth_cjk((wchar_t) c) :
                                 mk_wcwidth((wchar_t) c));
 
@@ -3166,7 +3238,7 @@ static 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->no_remote_resize)
                            request_resize(term->frontend, 80, term->rows);
                        term->reset_132 = 0;
                    }
@@ -3231,55 +3303,55 @@ static void term_out(Terminal *term)
                  /* GZD4: G0 designate 94-set */
                  case ANSI('A', '('):
                    compatibility(VT100);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->cset_attr[0] = CSET_GBCHR;
                    break;
                  case ANSI('B', '('):
                    compatibility(VT100);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->cset_attr[0] = CSET_ASCII;
                    break;
                  case ANSI('0', '('):
                    compatibility(VT100);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->cset_attr[0] = CSET_LINEDRW;
                    break;
                  case ANSI('U', '('): 
                    compatibility(OTHER);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->cset_attr[0] = CSET_SCOACS; 
                    break;
                  /* G1D4: G1-designate 94-set */
                  case ANSI('A', ')'):
                    compatibility(VT100);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->cset_attr[1] = CSET_GBCHR;
                    break;
                  case ANSI('B', ')'):
                    compatibility(VT100);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->cset_attr[1] = CSET_ASCII;
                    break;
                  case ANSI('0', ')'):
                    compatibility(VT100);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->cset_attr[1] = CSET_LINEDRW;
                    break;
                  case ANSI('U', ')'): 
                    compatibility(OTHER);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->cset_attr[1] = CSET_SCOACS; 
                    break;
                  /* DOCS: Designate other coding system */
                  case ANSI('8', '%'):  /* Old Linux code */
                  case ANSI('G', '%'):
                    compatibility(OTHER);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->utf = 1;
                    break;
                  case ANSI('@', '%'):
                    compatibility(OTHER);
-                   if (!term->cfg.no_remote_charset)
+                   if (!term->no_remote_charset)
                        term->utf = 0;
                    break;
                }
@@ -3463,12 +3535,15 @@ static void term_out(Terminal *term)
                      case ANSI_QUE('i'):
                        compatibility(VT100);
                        {
+                           char *printer;
                            if (term->esc_nargs != 1) break;
-                           if (term->esc_args[0] == 5 && *term->cfg.printer) {
+                           if (term->esc_args[0] == 5 && 
+                               (printer = conf_get_str(term->conf,
+                                                       CONF_printer))[0]) {
                                term->printing = TRUE;
                                term->only_printing = !term->esc_query;
                                term->print_state = 0;
-                               term_print_setup(term);
+                               term_print_setup(term, printer);
                            } else if (term->esc_args[0] == 4 &&
                                       term->printing) {
                                term_print_finish(term);
@@ -3591,15 +3666,15 @@ static void term_out(Terminal *term)
                                    break;
                                  case 10:      /* SCO acs off */
                                    compatibility(SCOANSI);
-                                   if (term->cfg.no_remote_charset) break;
+                                   if (term->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->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->no_remote_charset) break;
                                    term->sco_acs = 2; break;
                                  case 22:      /* disable bold */
                                    compatibility2(OTHER, VT220);
@@ -3722,7 +3797,7 @@ static 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->no_remote_resize)
                                request_resize(term->frontend, term->cols,
                                               def(term->esc_args[0], 24));
                            deselect(term);
@@ -3742,7 +3817,7 @@ static void term_out(Terminal *term)
                                break;
                              case 3:
                                if (term->esc_nargs >= 3) {
-                                   if (!term->cfg.no_remote_resize)
+                                   if (!term->no_remote_resize)
                                        move_window(term->frontend,
                                                    def(term->esc_args[1], 0),
                                                    def(term->esc_args[2], 0));
@@ -3767,10 +3842,10 @@ static void term_out(Terminal *term)
                                break;
                              case 8:
                                if (term->esc_nargs >= 3) {
-                                   if (!term->cfg.no_remote_resize)
+                                   if (!term->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->conf_width),
+                                                      def(term->esc_args[1], term->conf_height));
                                }
                                break;
                              case 9:
@@ -3825,8 +3900,8 @@ static void term_out(Terminal *term)
                                break;
                              case 20:
                                if (term->ldisc &&
-                                   term->cfg.remote_qtitle_action != TITLE_NONE) {
-                                   if(term->cfg.remote_qtitle_action == TITLE_REAL)
+                                   term->remote_qtitle_action != TITLE_NONE) {
+                                   if(term->remote_qtitle_action == TITLE_REAL)
                                        p = get_window_title(term->frontend, TRUE);
                                    else
                                        p = EMPTY_WINDOW_TITLE;
@@ -3838,8 +3913,8 @@ static void term_out(Terminal *term)
                                break;
                              case 21:
                                if (term->ldisc &&
-                                   term->cfg.remote_qtitle_action != TITLE_NONE) {
-                                   if(term->cfg.remote_qtitle_action == TITLE_REAL)
+                                   term->remote_qtitle_action != TITLE_NONE) {
+                                   if(term->remote_qtitle_action == TITLE_REAL)
                                        p = get_window_title(term->frontend, FALSE);
                                    else
                                        p = EMPTY_WINDOW_TITLE;
@@ -3875,10 +3950,10 @@ static 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->no_remote_resize)
                                request_resize(term->frontend, term->cols,
                                               def(term->esc_args[0],
-                                                  term->cfg.height));
+                                                  term->conf_height));
                            deselect(term);
                        }
                        break;
@@ -3890,10 +3965,11 @@ static void term_out(Terminal *term)
                         */
                        compatibility(VT340TEXT);
                        if (term->esc_nargs <= 1) {
-                           if (!term->cfg.no_remote_resize)
+                           if (!term->no_remote_resize)
                                request_resize(term->frontend,
                                               def(term->esc_args[0],
-                                                  term->cfg.width), term->rows);
+                                                  term->conf_width),
+                                              term->rows);
                            deselect(term);
                        }
                        break;
@@ -4095,7 +4171,7 @@ static 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->no_remote_resize) {
                                if (term->reset_132)
                                    request_resize(132, 24);
                                else
@@ -4330,7 +4406,7 @@ static void term_out(Terminal *term)
                     *     emulation.
                     */
                    term->vt52_mode = FALSE;
-                   term->blink_is_real = term->cfg.blinktext;
+                   term->blink_is_real = term->blinktext;
                    term_schedule_tblink(term);
                    break;
 #if 0
@@ -4474,7 +4550,7 @@ static void term_out(Terminal *term)
     }
 
     term_print_flush(term);
-    if (term->cfg.logflush)
+    if (term->logflush)
        logflush(term->logctx);
 }
 
@@ -4577,7 +4653,7 @@ static termchar *term_bidi_line(Terminal *term, struct termline *ldata,
     int it;
 
     /* Do Arabic shaping and bidi. */
-    if(!term->cfg.bidi || !term->cfg.arabicshaping) {
+    if(!term->bidi || !term->arabicshaping) {
 
        if (!term_bidi_cache_hit(term, scr_y, ldata->chars, term->cols)) {
 
@@ -4595,7 +4671,7 @@ static termchar *term_bidi_line(Terminal *term, struct termline *ldata,
 
                switch (uc & CSET_MASK) {
                  case CSET_LINEDRW:
-                   if (!term->cfg.rawcnp) {
+                   if (!term->rawcnp) {
                        uc = term->ucsdata->unitab_xterm[uc & 0xFF];
                        break;
                    }
@@ -4620,15 +4696,15 @@ static termchar *term_bidi_line(Terminal *term, struct termline *ldata,
                term->wcFrom[it].index = it;
            }
 
-           if(!term->cfg.bidi)
+           if(!term->bidi)
                do_bidi(term->wcFrom, term->cols);
 
            /* this is saved iff done from inside the shaping */
-           if(!term->cfg.bidi && term->cfg.arabicshaping)
+           if(!term->bidi && term->arabicshaping)
                for(it=0; it<term->cols; it++)
                    term->wcTo[it] = term->wcFrom[it];
 
-           if(!term->cfg.arabicshaping)
+           if(!term->arabicshaping)
                do_shape(term->wcFrom, term->wcTo, term->cols);
 
            if (term->ltemp_size < ldata->size) {
@@ -4690,14 +4766,14 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
     /* Depends on:
      * screen array, disptop, scrtop,
      * selection, rv, 
-     * cfg.blinkpc, blink_is_real, tblinker, 
-     * curs.y, curs.x, cblinker, cfg.blink_cur, cursor_on, has_focus, wrapnext
+     * blinkpc, blink_is_real, tblinker, 
+     * curs.y, curs.x, cblinker, blink_cur, cursor_on, has_focus, wrapnext
      */
 
     /* Has the cursor position or type changed ? */
     if (term->cursor_on) {
        if (term->has_focus) {
-           if (term->cblinker || !term->cfg.blink_cur)
+           if (term->cblinker || !term->blink_cur)
                cursor = TATTR_ACTCURS;
            else
                cursor = 0;
@@ -4805,11 +4881,11 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
            tchar = d->chr;
            tattr = d->attr;
 
-            if (!term->cfg.ansi_colour)
+            if (!term->ansi_colour)
                 tattr = (tattr & ~(ATTR_FGMASK | ATTR_BGMASK)) | 
                 ATTR_DEFFG | ATTR_DEFBG;
 
-           if (!term->cfg.xterm_256_colour) {
+           if (!term->xterm_256_colour) {
                int colour;
                colour = (tattr & ATTR_FGMASK) >> ATTR_FGSHIFT;
                if (colour >= 16 && colour < 256)
@@ -5265,7 +5341,7 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel)
 
                switch (uc & CSET_MASK) {
                  case CSET_LINEDRW:
-                   if (!term->cfg.rawcnp) {
+                   if (!term->rawcnp) {
                        uc = term->ucsdata->unitab_xterm[uc & 0xFF];
                        break;
                    }
@@ -5647,8 +5723,8 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
     pos selpoint;
     termline *ldata;
     int raw_mouse = (term->xterm_mouse &&
-                    !term->cfg.no_mouse_rep &&
-                    !(term->cfg.mouse_override && shift));
+                    !term->no_mouse_rep &&
+                    !(term->mouse_override && shift));
     int default_seltype;
 
     if (y < 0) {
@@ -5755,7 +5831,7 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
      * 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->rect_select)
        default_seltype = RECTANGULAR;
     else
        default_seltype = LEXICOGRAPHIC;
@@ -5875,7 +5951,7 @@ int format_arrow_key(char *buf, Terminal *term, int xkey, int ctrl)
     if (term->vt52_mode)
        p += sprintf((char *) p, "\x1B%c", xkey);
     else {
-       int app_flg = (term->app_cursor_keys && !term->cfg.no_applic_c);
+       int app_flg = (term->app_cursor_keys && !term->no_applic_c);
 #if 0
        /*
         * RDB: VT100 & VT102 manuals both state the app cursor
@@ -5992,7 +6068,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
     }
 
     /* Nethack keypad */
-    if (term->cfg.nethack_keypad) {
+    if (term->nethack_keypad) {
        char c = 0;
        switch (keysym) {
          case PK_KP1: c = 'b'; break;
@@ -6026,10 +6102,10 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
         * In VT400 mode, PFn always emits an escape sequence.  In
         * Linux and tilde modes, this only happens in app keypad mode.
         */
-       if (term->cfg.funky_type == FUNKY_VT400 ||
-           ((term->cfg.funky_type == FUNKY_LINUX ||
-             term->cfg.funky_type == FUNKY_TILDE) &&
-            term->app_keypad_keys && !term->cfg.no_applic_k)) {
+       if (term->funky_type == FUNKY_VT400 ||
+           ((term->funky_type == FUNKY_LINUX ||
+             term->funky_type == FUNKY_TILDE) &&
+            term->app_keypad_keys && !term->no_applic_k)) {
            switch (keysym) {
              case PK_PF1: xkey = 'P'; break;
              case PK_PF2: xkey = 'Q'; break;
@@ -6038,7 +6114,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
              default: break; /* else gcc warns `enum value not used' */
            }
        }
-       if (term->app_keypad_keys && !term->cfg.no_applic_k) {
+       if (term->app_keypad_keys && !term->no_applic_k) {
            switch (keysym) {
              case PK_KP0: xkey = 'p'; break;
              case PK_KP1: xkey = 'q'; break;
@@ -6054,7 +6130,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
              case PK_KPENTER: xkey = 'M'; break;
              default: break; /* else gcc warns `enum value not used' */
            }
-           if (term->cfg.funky_type == FUNKY_XTERM && tlen > 0) {
+           if (term->funky_type == FUNKY_XTERM && tlen > 0) {
                /*
                 * xterm can't see the layout of the keypad, so it has
                 * to rely on the X keysyms returned by the keys.
@@ -6126,10 +6202,10 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
        goto done;
       case PK_BACKSPACE:
            if (modifiers == 0)
-               *p++ = (term->cfg.bksp_is_delete ? 0x7F : 0x08);
+               *p++ = (term->bksp_is_delete ? 0x7F : 0x08);
            else if (modifiers == PKM_SHIFT)
                /* We do the opposite of what is configured */
-               *p++ = (term->cfg.bksp_is_delete ? 0x08 : 0x7F);
+               *p++ = (term->bksp_is_delete ? 0x08 : 0x7F);
            else break;
            goto done;
       case PK_TAB:
@@ -6157,7 +6233,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
     }
 
     /* SCO function keys and editing keys */
-    if (term->cfg.funky_type == FUNKY_SCO) {
+    if (term->funky_type == FUNKY_SCO) {
        if (PK_ISFKEY(keysym) && keysym <= PK_F12) {
            static char const codes[] =
                "MNOPQRSTUVWX" "YZabcdefghij" "klmnopqrstuv" "wxyz@[\\]^_`{";
@@ -6187,7 +6263,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
     if (PK_ISEDITING(keysym) && (modifiers & PKM_SHIFT) == 0) {
        int code;
 
-       if (term->cfg.funky_type == FUNKY_XTERM) {
+       if (term->funky_type == FUNKY_XTERM) {
            /* Xterm shuffles these keys, apparently. */
            switch (keysym) {
              case PK_HOME:     keysym = PK_INSERT;   break;
@@ -6201,7 +6277,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
        }
 
        /* RXVT Home/End */
-       if (term->cfg.rxvt_homeend &&
+       if (term->rxvt_homeend &&
            (keysym == PK_HOME || keysym == PK_END)) {
            p += sprintf((char *) p, keysym == PK_HOME ? "\x1B[H" : "\x1BOw");
            goto done;
@@ -6244,7 +6320,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
        /* Map Shift+F1-F10 to F11-F20 */
        if (keysym >= PK_F1 && keysym <= PK_F10 && (modifiers & PKM_SHIFT))
            keysym += 10;
-       if ((term->vt52_mode || term->cfg.funky_type == FUNKY_VT100P) &&
+       if ((term->vt52_mode || term->funky_type == FUNKY_VT100P) &&
            keysym <= PK_F14) {
            /* XXX This overrides the XTERM/VT52 mode below */
            int offt = 0;
@@ -6254,11 +6330,11 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
                         'P' + keysym - PK_F1 - offt);
            goto done;
        }
-       if (term->cfg.funky_type == FUNKY_LINUX && keysym <= PK_F5) {
+       if (term->funky_type == FUNKY_LINUX && keysym <= PK_F5) {
            p += sprintf((char *) p, "\x1B[[%c", 'A' + keysym - PK_F1);
            goto done;
        }
-       if (term->cfg.funky_type == FUNKY_XTERM && keysym <= PK_F4) {
+       if (term->funky_type == FUNKY_XTERM && keysym <= PK_F4) {
            if (term->vt52_mode)
                p += sprintf((char *) p, "\x1B%c", 'P' + keysym - PK_F1);
            else
@@ -6478,9 +6554,9 @@ char *term_get_ttymode(Terminal *term, const char *mode)
 {
     char *val = NULL;
     if (strcmp(mode, "ERASE") == 0) {
-       val = term->cfg.bksp_is_delete ? "^?" : "^H";
+       val = term->bksp_is_delete ? "^?" : "^H";
     }
-    /* FIXME: perhaps we should set ONLCR based on cfg.lfhascr as well? */
+    /* FIXME: perhaps we should set ONLCR based on lfhascr as well? */
     /* FIXME: or ECHO and friends based on local echo state? */
     return dupstr(val);
 }