aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan de Boyne Pollard <J.deBoynePollard-newsgroups@NTLWorld.com>2017-05-28 12:42:22 +0100
committerJonathan de Boyne Pollard <J.deBoynePollard-newsgroups@NTLWorld.com>2017-06-03 18:53:28 +0100
commit5265ac500064eecba3317ad8152cab14e9950db7 (patch)
treebeb35d8519a9b21b53b124feaee276b1669fc5ff /src
parent5377de33ac4adea54c9c9980c7a6bc8cc70c0c7a (diff)
downloadrneovim-5265ac500064eecba3317ad8152cab14e9950db7.tar.gz
rneovim-5265ac500064eecba3317ad8152cab14e9950db7.tar.bz2
rneovim-5265ac500064eecba3317ad8152cab14e9950db7.zip
tui: Change terminal family recognition to avoid '+' entries.
The terminfo commentary states that these are not standalone entries suitable for end-use.
Diffstat (limited to 'src')
-rw-r--r--src/nvim/tui/tui.c63
1 files changed, 35 insertions, 28 deletions
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 5ea46c5ab7..d0ed3af897 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -48,6 +48,12 @@
#define TMUX_WRAP(is_tmux,seq) ((is_tmux) ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
#define LINUXRESETC "\x1b[?0c"
+// Per the commentary in terminfo, only a minus sign is a true suffix
+// separator.
+#define TERMINAL_FAMILY(term, prefix) ((term) \
+ && (0 == memcmp((term), (prefix), sizeof(prefix) - 1)) \
+ && ('\0' == (term)[sizeof(prefix) - 1] || '-' == (term)[sizeof(prefix) - 1]))
+
typedef struct {
int top, bot, left, right;
} Rect;
@@ -186,7 +192,7 @@ static void terminfo_start(UI *ui)
!!unibi_get_str(data->ut, unibi_set_left_margin_parm)
&& !!unibi_get_str(data->ut, unibi_set_right_margin_parm);
data->immediate_wrap_after_last_column =
- term && STARTS_WITH(term, "interix");
+ TERMINAL_FAMILY(term, "interix");
// Set 't_Co' from the result of unibilium & fix_terminfo.
t_colors = unibi_get_num(data->ut, unibi_max_colors);
// Enter alternate screen and clear
@@ -2344,23 +2350,23 @@ static const char ansi_terminfo[] = {
/// behave as much like an external terminfo database as possible.
static unibi_term *load_builtin_terminfo(const char * term)
{
- if (term && STARTS_WITH(term, "xterm")) {
+ if (TERMINAL_FAMILY(term, "xterm")) {
return unibi_from_mem(xterm_256colour_terminfo, sizeof xterm_256colour_terminfo);
- } else if (term && STARTS_WITH(term, "screen")) {
+ } else if (TERMINAL_FAMILY(term, "screen")) {
return unibi_from_mem(screen_256colour_terminfo, sizeof screen_256colour_terminfo);
- } else if (term && STARTS_WITH(term, "tmux")) {
+ } else if (TERMINAL_FAMILY(term, "tmux")) {
return unibi_from_mem(tmux_256colour_terminfo, sizeof tmux_256colour_terminfo);
- } else if (term && STARTS_WITH(term, "rxvt")) {
+ } else if (TERMINAL_FAMILY(term, "rxvt")) {
return unibi_from_mem(rxvt_256colour_terminfo, sizeof rxvt_256colour_terminfo);
- } else if (term && STARTS_WITH(term, "putty")) {
+ } else if (TERMINAL_FAMILY(term, "putty")) {
return unibi_from_mem(putty_256colour_terminfo, sizeof putty_256colour_terminfo);
- } else if (term && STARTS_WITH(term, "linux")) {
+ } else if (TERMINAL_FAMILY(term, "linux")) {
return unibi_from_mem(linux_16colour_terminfo, sizeof linux_16colour_terminfo);
- } else if (term && STARTS_WITH(term, "interix")) {
+ } else if (TERMINAL_FAMILY(term, "interix")) {
return unibi_from_mem(interix_8colour_terminfo, sizeof interix_8colour_terminfo);
- } else if (term && (STARTS_WITH(term, "iterm") || STARTS_WITH(term, "iTerm"))) {
+ } else if (TERMINAL_FAMILY(term, "iterm") || TERMINAL_FAMILY(term, "iTerm.app")) {
return unibi_from_mem(iterm_16colour_terminfo, sizeof iterm_16colour_terminfo);
- } else if (term && STARTS_WITH(term, "st")) {
+ } else if (TERMINAL_FAMILY(term, "st")) {
return unibi_from_mem(st_256colour_terminfo, sizeof st_256colour_terminfo);
} else {
return unibi_from_mem(ansi_terminfo, sizeof ansi_terminfo);
@@ -2377,14 +2383,15 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
{
unibi_term *ut = data->ut;
bool true_xterm = !!os_getenv("XTERM_VERSION");
- bool xterm = term && STARTS_WITH(term, "xterm");
+ bool xterm = TERMINAL_FAMILY(term, "xterm");
bool mate = colorterm && strstr(colorterm, "mate-terminal");
bool gnome = colorterm && strstr(colorterm, "gnome-terminal");
- bool linuxvt = term && STARTS_WITH(term, "linux");
- bool rxvt = term && STARTS_WITH(term, "rxvt");
- bool teraterm = term && STARTS_WITH(term, "teraterm");
- bool putty = term && STARTS_WITH(term, "putty");
- bool screen = term && STARTS_WITH(term, "screen");
+ bool linuxvt = TERMINAL_FAMILY(term, "linux");
+ bool rxvt = TERMINAL_FAMILY(term, "rxvt");
+ bool teraterm = TERMINAL_FAMILY(term, "teraterm");
+ bool putty = TERMINAL_FAMILY(term, "putty");
+ bool screen = TERMINAL_FAMILY(term, "screen");
+ bool st = TERMINAL_FAMILY(term, "st");
char *fix_normal = (char *)unibi_get_str(ut, unibi_cursor_normal);
if (fix_normal) {
@@ -2432,16 +2439,16 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
} else if (screen) {
unibi_set_if_empty(ut, unibi_to_status_line, "\x1b_");
unibi_set_if_empty(ut, unibi_from_status_line, "\x1b\\");
- } else if (term && STARTS_WITH(term, "tmux")) {
+ } else if (TERMINAL_FAMILY(term, "tmux")) {
unibi_set_if_empty(ut, unibi_to_status_line, "\x1b_");
unibi_set_if_empty(ut, unibi_from_status_line, "\x1b\\");
- } else if (term && STARTS_WITH(term, "interix")) {
+ } else if (TERMINAL_FAMILY(term, "interix")) {
unibi_set_if_empty(ut, unibi_carriage_return, "\x0d");
} else if (linuxvt) {
// No deviations from the vanilla terminfo.
- } else if (term && STARTS_WITH(term, "putty")) {
+ } else if (TERMINAL_FAMILY(term, "putty")) {
// No deviations from the vanilla terminfo.
- } else if (term && (STARTS_WITH(term, "iterm") || STARTS_WITH(term, "iTerm"))) {
+ } else if (TERMINAL_FAMILY(term, "iterm") || TERMINAL_FAMILY(term, "iTerm.app")) {
// No deviations from the vanilla terminfo.
}
@@ -2576,14 +2583,14 @@ static void augment_terminfo(TUIData *data, const char *term,
{
unibi_term *ut = data->ut;
bool true_xterm = !!os_getenv("XTERM_VERSION");
- bool xterm = term && STARTS_WITH(term, "xterm");
- bool dtterm = term && STARTS_WITH(term, "dtterm");
- bool linuxvt = term && STARTS_WITH(term, "linux");
- bool rxvt = term && STARTS_WITH(term, "rxvt");
- bool teraterm = term && STARTS_WITH(term, "teraterm");
- bool putty = term && STARTS_WITH(term, "putty");
- bool screen = term && STARTS_WITH(term, "screen");
- bool st = term && STARTS_WITH(term, "st");
+ bool xterm = TERMINAL_FAMILY(term, "xterm");
+ bool dtterm = TERMINAL_FAMILY(term, "dtterm");
+ bool linuxvt = TERMINAL_FAMILY(term, "linux");
+ bool rxvt = TERMINAL_FAMILY(term, "rxvt");
+ bool teraterm = TERMINAL_FAMILY(term, "teraterm");
+ bool putty = TERMINAL_FAMILY(term, "putty");
+ bool screen = TERMINAL_FAMILY(term, "screen");
+ bool st = TERMINAL_FAMILY(term, "st");
bool tmux_wrap = screen && !!os_getenv("TMUX");
bool truecolor = colorterm
&& (0 == strcmp(colorterm, "truecolor") || 0 == strcmp(colorterm, "24bit"));