mirror of
https://github.com/neovim/neovim.git
synced 2024-12-31 17:13:26 -07:00
commit
b48efd9ba7
@ -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>
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user