Merge #9347 from justinmk/tui-bsd

TUI: detect BSD vt console
This commit is contained in:
Justin M. Keyes 2018-12-16 14:28:17 +01:00 committed by GitHub
commit b48efd9ba7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 8 deletions

View File

@ -12,7 +12,7 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
// forkpty is not in POSIX, so headers are platform-specific // forkpty is not in POSIX, so headers are platform-specific
#if defined(__FreeBSD__) || defined (__DragonFly__) #if defined(__FreeBSD__) || defined(__DragonFly__)
# include <libutil.h> # include <libutil.h>
#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) #elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
# include <util.h> # include <util.h>

View File

@ -13,6 +13,7 @@
#include "nvim/memory.h" #include "nvim/memory.h"
#include "nvim/message.h" #include "nvim/message.h"
#include "nvim/option.h" #include "nvim/option.h"
#include "nvim/os/os.h"
#include "nvim/tui/terminfo.h" #include "nvim/tui/terminfo.h"
#include "nvim/tui/terminfo_defs.h" #include "nvim/tui/terminfo_defs.h"
@ -33,6 +34,24 @@ bool terminfo_is_term_family(const char *term, const char *family)
&& ('\0' == term[flen] || '-' == term[flen]); && ('\0' == term[flen] || '-' == term[flen]);
} }
bool terminfo_is_bsd_console(const char *term)
{
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) \
|| defined(__DragonFly__)
if (strequal(term, "vt220") // OpenBSD
|| strequal(term, "vt100")) { // NetBSD
return true;
}
# if defined(__FreeBSD__)
// FreeBSD console sets TERM=xterm, but it does not support xterm features
// like cursor-shaping. Assume that TERM=xterm is degraded. #8644
return strequal(term, "xterm") && !!os_getenv("XTERM_VERSION");
# endif
#else
return false;
#endif
}
/// Loads a built-in terminfo db when we (unibilium) failed to load a terminfo /// Loads a built-in terminfo db when we (unibilium) failed to load a terminfo
/// record from the environment (termcap systems, unrecognized $TERM, …). /// record from the environment (termcap systems, unrecognized $TERM, …).
/// We do not attempt to detect xterm pretenders here. /// We do not attempt to detect xterm pretenders here.

View File

@ -1468,7 +1468,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
long konsolev, bool iterm_env) long konsolev, bool iterm_env)
{ {
unibi_term *ut = data->ut; unibi_term *ut = data->ut;
const char * xterm_version = os_getenv("XTERM_VERSION"); const char *xterm_version = os_getenv("XTERM_VERSION");
#if 0 // We don't need to identify this specifically, for now. #if 0 // We don't need to identify this specifically, for now.
bool roxterm = !!os_getenv("ROXTERM_ID"); bool roxterm = !!os_getenv("ROXTERM_ID");
#endif #endif
@ -1477,6 +1477,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|| terminfo_is_term_family(term, "nsterm"); || terminfo_is_term_family(term, "nsterm");
bool kitty = terminfo_is_term_family(term, "xterm-kitty"); bool kitty = terminfo_is_term_family(term, "xterm-kitty");
bool linuxvt = terminfo_is_term_family(term, "linux"); bool linuxvt = terminfo_is_term_family(term, "linux");
bool bsdvt = terminfo_is_bsd_console(term);
bool rxvt = terminfo_is_term_family(term, "rxvt"); bool rxvt = terminfo_is_term_family(term, "rxvt");
bool teraterm = terminfo_is_term_family(term, "teraterm"); bool teraterm = terminfo_is_term_family(term, "teraterm");
bool putty = terminfo_is_term_family(term, "putty"); bool putty = terminfo_is_term_family(term, "putty");
@ -1497,7 +1498,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
&& strstr(colorterm, "gnome-terminal"); && strstr(colorterm, "gnome-terminal");
bool mate_pretending_xterm = xterm && colorterm bool mate_pretending_xterm = xterm && colorterm
&& strstr(colorterm, "mate-terminal"); && strstr(colorterm, "mate-terminal");
bool true_xterm = xterm && !!xterm_version; bool true_xterm = xterm && !!xterm_version && !bsdvt;
char *fix_normal = (char *)unibi_get_str(ut, unibi_cursor_normal); char *fix_normal = (char *)unibi_get_str(ut, unibi_cursor_normal);
if (fix_normal) { if (fix_normal) {
@ -1670,7 +1671,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
if (-1 == data->unibi_ext.set_cursor_style) { if (-1 == data->unibi_ext.set_cursor_style) {
// DECSCUSR (cursor shape) is widely supported. // DECSCUSR (cursor shape) is widely supported.
// https://github.com/gnachman/iTerm2/pull/92 // https://github.com/gnachman/iTerm2/pull/92
if ((!konsolev || konsolev >= 180770) if ((!bsdvt && (!konsolev || konsolev >= 180770))
&& ((xterm && !vte_version) // anything claiming xterm compat && ((xterm && !vte_version) // anything claiming xterm compat
// per MinTTY 0.4.3-1 release notes from 2009 // per MinTTY 0.4.3-1 release notes from 2009
|| putty || putty
@ -1684,7 +1685,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|| rxvt // per command.C || rxvt // per command.C
// per analysis of VT100Terminal.m // per analysis of VT100Terminal.m
|| iterm || iterm_pretending_xterm || iterm || iterm_pretending_xterm
|| teraterm // per TeraTerm "Supported Control Functions" doco || teraterm // per TeraTerm "Supported Control Functions" doco
|| alacritty // https://github.com/jwilm/alacritty/pull/608 || alacritty // https://github.com/jwilm/alacritty/pull/608
// Some linux-type terminals implement the xterm extension. // Some linux-type terminals implement the xterm extension.
// Example: console-terminal-emulator from the nosh toolset. // Example: console-terminal-emulator from the nosh toolset.
@ -1754,7 +1755,10 @@ static void augment_terminfo(TUIData *data, const char *term,
long konsolev, bool iterm_env) long konsolev, bool iterm_env)
{ {
unibi_term *ut = data->ut; unibi_term *ut = data->ut;
bool xterm = terminfo_is_term_family(term, "xterm"); bool xterm = terminfo_is_term_family(term, "xterm")
// Treat Terminal.app as generic xterm-like, for now.
|| terminfo_is_term_family(term, "nsterm");
bool bsdvt = terminfo_is_bsd_console(term);
bool dtterm = terminfo_is_term_family(term, "dtterm"); bool dtterm = terminfo_is_term_family(term, "dtterm");
bool rxvt = terminfo_is_term_family(term, "rxvt"); bool rxvt = terminfo_is_term_family(term, "rxvt");
bool teraterm = terminfo_is_term_family(term, "teraterm"); bool teraterm = terminfo_is_term_family(term, "teraterm");
@ -1769,8 +1773,8 @@ static void augment_terminfo(TUIData *data, const char *term,
// None of the following work over SSH; see :help TERM . // None of the following work over SSH; see :help TERM .
bool iterm_pretending_xterm = xterm && iterm_env; bool iterm_pretending_xterm = xterm && iterm_env;
const char * xterm_version = os_getenv("XTERM_VERSION"); const char *xterm_version = os_getenv("XTERM_VERSION");
bool true_xterm = xterm && !!xterm_version; bool true_xterm = xterm && !!xterm_version && !bsdvt;
// Only define this capability for terminal types that we know understand it. // Only define this capability for terminal types that we know understand it.
if (dtterm // originated this extension if (dtterm // originated this extension