1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-02 03:52:49 -05:00

Post-release destabilisation! Completely remove the struct type

'Config' in putty.h, which stores all PuTTY's settings and includes an
arbitrary length limit on every single one of those settings which is
stored in string form. In place of it is 'Conf', an opaque data type
everywhere outside the new file conf.c, which stores a list of (key,
value) pairs in which every key contains an integer identifying a
configuration setting, and for some of those integers the key also
contains extra parts (so that, for instance, CONF_environmt is a
string-to-string mapping). Everywhere that a Config was previously
used, a Conf is now; everywhere there was a Config structure copy,
conf_copy() is called; every lookup, adjustment, load and save
operation on a Config has been rewritten; and there's a mechanism for
serialising a Conf into a binary blob and back for use with Duplicate
Session.

User-visible effects of this change _should_ be minimal, though I
don't doubt I've introduced one or two bugs here and there which will
eventually be found. The _intended_ visible effects of this change are
that all arbitrary limits on configuration strings and lists (e.g.
limit on number of port forwardings) should now disappear; that list
boxes in the configuration will now be displayed in a sorted order
rather than the arbitrary order in which they were added to the list
(since the underlying data structure is now a sorted tree234 rather
than an ad-hoc comma-separated string); and one more specific change,
which is that local and dynamic port forwardings on the same port
number are now mutually exclusive in the configuration (putting 'D' in
the key rather than the value was a mistake in the first place).

One other reorganisation as a result of this is that I've moved all
the dialog.c standard handlers (dlg_stdeditbox_handler and friends)
out into config.c, because I can't really justify calling them generic
any more. When they took a pointer to an arbitrary structure type and
the offset of a field within that structure, they were independent of
whether that structure was a Config or something completely different,
but now they really do expect to talk to a Conf, which can _only_ be
used for PuTTY configuration, so I've renamed them all things like
conf_editbox_handler and moved them out of the nominally independent
dialog-box management module into the PuTTY-specific config.c.

[originally from svn r9214]
This commit is contained in:
Simon Tatham
2011-07-14 18:52:21 +00:00
parent 7aba365ca9
commit a1f3b7a358
64 changed files with 4443 additions and 3303 deletions

View 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);
}
@ -1327,13 +1327,83 @@ static void set_erase_char(Terminal *term)
(ATTR_FGMASK | ATTR_BGMASK));
}
/*
* 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);
}