From 3a7636ff0f3eed214a847edbfb3bd8007128d49a Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 25 Oct 2009 21:11:21 +0000 Subject: [PATCH] Remove the -d flag to tmux and just use op/AX to detect default colours. Irritatingly, although op can be used to tell if a terminal supports default colours, it can't be used to set them because in some terminfo descriptions it resets attributes as a side-effect (acts as sgr0) and in others it doesn't, so it is not possible to determine reliably what the terminal state will be afterwards. So if AX is missing and op is present, tmux just sends sgr0. Anyone using -d for a terminal who finds they actually needed it can replace it using terminal-overrides, but please let me know as it is probably an omission from terminfo. --- server-client.c | 2 -- tmux.c | 5 +---- tmux.h | 8 +++----- tty-term.c | 11 ----------- tty.c | 37 +++++++++++++++++++++++-------------- 5 files changed, 27 insertions(+), 36 deletions(-) diff --git a/server-client.c b/server-client.c index ec08ed0e..3c096e12 100644 --- a/server-client.c +++ b/server-client.c @@ -703,8 +703,6 @@ server_client_msg_identify( c->tty.term_flags |= TERM_256COLOURS; else if (data->flags & IDENTIFY_88COLOURS) c->tty.term_flags |= TERM_88COLOURS; - if (data->flags & IDENTIFY_HASDEFAULTS) - c->tty.term_flags |= TERM_HASDEFAULTS; tty_resize(&c->tty); diff --git a/tmux.c b/tmux.c index d15b3fe1..add7289e 100644 --- a/tmux.c +++ b/tmux.c @@ -62,7 +62,7 @@ __dead void usage(void) { fprintf(stderr, - "usage: %s [-28dlquv] [-c shell-command] [-f file] [-L socket-name]\n" + "usage: %s [-28lquv] [-c shell-command] [-f file] [-L socket-name]\n" " [-S socket-path] [command [flags]]\n", __progname); exit(1); @@ -317,9 +317,6 @@ main(int argc, char **argv) xfree(shellcmd); shellcmd = xstrdup(optarg); break; - case 'd': - flags |= IDENTIFY_HASDEFAULTS; - break; case 'f': if (cfg_file != NULL) xfree(cfg_file); diff --git a/tmux.h b/tmux.h index 42badd33..430470d4 100644 --- a/tmux.h +++ b/tmux.h @@ -346,7 +346,6 @@ struct msg_identify_data { #define IDENTIFY_UTF8 0x1 #define IDENTIFY_256COLOURS 0x2 #define IDENTIFY_88COLOURS 0x4 -#define IDENTIFY_HASDEFAULTS 0x8 int flags; }; @@ -908,10 +907,9 @@ struct tty_term { struct tty_code codes[NTTYCODE]; -#define TERM_HASDEFAULTS 0x1 -#define TERM_256COLOURS 0x2 -#define TERM_88COLOURS 0x4 -#define TERM_EARLYWRAP 0x8 +#define TERM_256COLOURS 0x1 +#define TERM_88COLOURS 0x2 +#define TERM_EARLYWRAP 0x4 int flags; SLIST_ENTRY(tty_term) entry; diff --git a/tty-term.c b/tty-term.c index 7add7cab..8a592b31 100644 --- a/tty-term.c +++ b/tty-term.c @@ -348,17 +348,6 @@ tty_term_find(char *name, int fd, const char *overrides, char **cause) goto error; } - /* - * Figure out if terminal support default colours. AX is a screen - * extension which indicates this. Also check if op (orig_pair) uses - * the default colours - if it does, this is a good indication the - * terminal supports them. - */ - if (tty_term_flag(term, TTYC_AX)) - term->flags |= TERM_HASDEFAULTS; - if (strcmp(tty_term_string(term, TTYC_OP), "\033[39;49m") == 0) - term->flags |= TERM_HASDEFAULTS; - /* Figure out if we have 256 or 88 colours. */ if (tty_term_number(term, TTYC_COLORS) == 256) term->flags |= TERM_256COLOURS; diff --git a/tty.c b/tty.c index 596779e1..d329e15b 100644 --- a/tty.c +++ b/tty.c @@ -1236,13 +1236,21 @@ tty_attributes_fg(struct tty *tty, const struct grid_cell *gc) tty_reset(tty); } - if (fg == 8 && - !(tty->term->flags & TERM_HASDEFAULTS) && - !(tty->term_flags & TERM_HASDEFAULTS)) - fg = 7; - if (fg == 8) - tty_puts(tty, "\033[39m"); - else + if (fg == 8) { + if (tty_term_has(tty->term, TTYC_AX)) { + /* AX is an extension that means \033[39m works. */ + tty_puts(tty, "\033[39m"); + } else if (tty_term_has(tty->term, TTYC_OP)) { + /* + * op can be used to look for default colours but there + * is no point in using it - with some terminals it + * does SGR0 and others not, so SGR0 is needed anyway + * to put the terminal into a known state. + */ + tty_reset(tty); + } else + tty_putcode1(tty, TTYC_SETAF, 7); + } else tty_putcode1(tty, TTYC_SETAF, fg); } @@ -1262,12 +1270,13 @@ tty_attributes_bg(struct tty *tty, const struct grid_cell *gc) bg &= 7; } - if (bg == 8 && - !(tty->term->flags & TERM_HASDEFAULTS) && - !(tty->term_flags & TERM_HASDEFAULTS)) - bg = 0; - if (bg == 8) - tty_puts(tty, "\033[49m"); - else + if (bg == 8) { + if (tty_term_has(tty->term, TTYC_AX)) { + tty_puts(tty, "\033[49m"); + } else if (tty_term_has(tty->term, TTYC_OP)) + tty_reset(tty); + else + tty_putcode1(tty, TTYC_SETAB, 0); + } else tty_putcode1(tty, TTYC_SETAB, bg); }