mirror of
https://github.com/neovim/neovim.git
synced 2024-12-19 10:45:16 -07:00
refactor: format tui.c with uncrustify (#15640)
This commit is contained in:
parent
5fd21b8d3e
commit
0771504488
@ -1,4 +1,4 @@
|
||||
# Uncrustify-0.73.0-159-81b1bc77
|
||||
# Uncrustify-0.73.0-162-ac9b0f48
|
||||
|
||||
#
|
||||
# General options
|
||||
|
@ -4,47 +4,45 @@
|
||||
// Terminal UI functions. Invoked (by ui_bridge.c) on the TUI thread.
|
||||
|
||||
#include <assert.h>
|
||||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <uv.h>
|
||||
#include <unibilium.h>
|
||||
#include <uv.h>
|
||||
#if defined(HAVE_TERMIOS_H)
|
||||
# include <termios.h>
|
||||
#endif
|
||||
|
||||
#include "nvim/lib/kvec.h"
|
||||
|
||||
#include "nvim/ascii.h"
|
||||
#include "nvim/vim.h"
|
||||
#include "nvim/log.h"
|
||||
#include "nvim/ui.h"
|
||||
#include "nvim/highlight.h"
|
||||
#include "nvim/map.h"
|
||||
#include "nvim/main.h"
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/option.h"
|
||||
#include "nvim/api/vim.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/api/vim.h"
|
||||
#include "nvim/ascii.h"
|
||||
#include "nvim/event/loop.h"
|
||||
#include "nvim/event/signal.h"
|
||||
#include "nvim/highlight.h"
|
||||
#include "nvim/lib/kvec.h"
|
||||
#include "nvim/log.h"
|
||||
#include "nvim/main.h"
|
||||
#include "nvim/map.h"
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/option.h"
|
||||
#include "nvim/os/input.h"
|
||||
#include "nvim/os/os.h"
|
||||
#include "nvim/os/signal.h"
|
||||
#include "nvim/os/tty.h"
|
||||
#include "nvim/ui.h"
|
||||
#include "nvim/vim.h"
|
||||
#ifdef WIN32
|
||||
# include "nvim/os/os_win_console.h"
|
||||
#endif
|
||||
#include "nvim/strings.h"
|
||||
#include "nvim/syntax.h"
|
||||
#include "nvim/ui_bridge.h"
|
||||
#include "nvim/ugrid.h"
|
||||
#include "nvim/tui/input.h"
|
||||
#include "nvim/tui/tui.h"
|
||||
#include "nvim/tui/terminfo.h"
|
||||
#include "nvim/cursor_shape.h"
|
||||
#include "nvim/macros.h"
|
||||
#include "nvim/strings.h"
|
||||
#include "nvim/syntax.h"
|
||||
#include "nvim/tui/input.h"
|
||||
#include "nvim/tui/terminfo.h"
|
||||
#include "nvim/tui/tui.h"
|
||||
#include "nvim/ugrid.h"
|
||||
#include "nvim/ui_bridge.h"
|
||||
|
||||
// Space reserved in two output buffers to make the cursor normal or invisible
|
||||
// when flushing. No existing terminal will require 32 bytes to do that.
|
||||
@ -53,17 +51,17 @@
|
||||
|
||||
#define TOO_MANY_EVENTS 1000000
|
||||
#define STARTS_WITH(str, prefix) \
|
||||
(strlen(str) >= (sizeof(prefix) - 1) \
|
||||
&& 0 == memcmp((str), (prefix), sizeof(prefix) - 1))
|
||||
(strlen(str) >= (sizeof(prefix) - 1) \
|
||||
&& 0 == memcmp((str), (prefix), sizeof(prefix) - 1))
|
||||
#define TMUX_WRAP(is_tmux, seq) \
|
||||
((is_tmux) ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
|
||||
((is_tmux) ? "\x1bPtmux;\x1b" seq "\x1b\\" : seq)
|
||||
#define LINUXSET0C "\x1b[?0c"
|
||||
#define LINUXSET1C "\x1b[?1c"
|
||||
|
||||
#ifdef NVIM_UNIBI_HAS_VAR_FROM
|
||||
#define UNIBI_SET_NUM_VAR(var, num) \
|
||||
do { \
|
||||
(var) = unibi_var_from_num((num)); \
|
||||
(var) = unibi_var_from_num((num)); \
|
||||
} while (0)
|
||||
#else
|
||||
#define UNIBI_SET_NUM_VAR(var, num) (var).i = (num);
|
||||
@ -180,8 +178,7 @@ UI *tui_start(void)
|
||||
return ui_bridge_attach(ui, tui_main, tui_scheduler);
|
||||
}
|
||||
|
||||
static size_t unibi_pre_fmt_str(TUIData *data, unsigned int unibi_index,
|
||||
char * buf, size_t len)
|
||||
static size_t unibi_pre_fmt_str(TUIData *data, unsigned int unibi_index, char * buf, size_t len)
|
||||
{
|
||||
const char *str = unibi_get_str(data->ut, unibi_index);
|
||||
if (!str) {
|
||||
@ -263,10 +260,10 @@ static void terminfo_start(UI *ui)
|
||||
long vtev = vte_version_env ? strtol(vte_version_env, NULL, 10) : 0;
|
||||
bool iterm_env = termprg && strstr(termprg, "iTerm.app");
|
||||
bool nsterm = (termprg && strstr(termprg, "Apple_Terminal"))
|
||||
|| terminfo_is_term_family(term, "nsterm");
|
||||
|| terminfo_is_term_family(term, "nsterm");
|
||||
bool konsole = terminfo_is_term_family(term, "konsole")
|
||||
|| os_getenv("KONSOLE_PROFILE_NAME")
|
||||
|| os_getenv("KONSOLE_DBUS_SESSION");
|
||||
|| os_getenv("KONSOLE_PROFILE_NAME")
|
||||
|| os_getenv("KONSOLE_DBUS_SESSION");
|
||||
const char *konsolev_env = os_getenv("KONSOLE_VERSION");
|
||||
long konsolev = konsolev_env ? strtol(konsolev_env, NULL, 10)
|
||||
: (konsole ? 1 : 0);
|
||||
@ -508,15 +505,15 @@ static bool attrs_differ(UI *ui, int id1, int id2, bool rgb)
|
||||
|
||||
if (rgb) {
|
||||
return a1.rgb_fg_color != a2.rgb_fg_color
|
||||
|| a1.rgb_bg_color != a2.rgb_bg_color
|
||||
|| a1.rgb_ae_attr != a2.rgb_ae_attr
|
||||
|| a1.rgb_sp_color != a2.rgb_sp_color;
|
||||
|| a1.rgb_bg_color != a2.rgb_bg_color
|
||||
|| a1.rgb_ae_attr != a2.rgb_ae_attr
|
||||
|| a1.rgb_sp_color != a2.rgb_sp_color;
|
||||
} else {
|
||||
return a1.cterm_fg_color != a2.cterm_fg_color
|
||||
|| a1.cterm_bg_color != a2.cterm_bg_color
|
||||
|| a1.cterm_ae_attr != a2.cterm_ae_attr
|
||||
|| (a1.cterm_ae_attr & (HL_UNDERLINE|HL_UNDERCURL)
|
||||
&& a1.rgb_sp_color != a2.rgb_sp_color);
|
||||
|| a1.cterm_bg_color != a2.cterm_bg_color
|
||||
|| a1.cterm_ae_attr != a2.cterm_ae_attr
|
||||
|| (a1.cterm_ae_attr & (HL_UNDERLINE|HL_UNDERCURL)
|
||||
&& a1.rgb_sp_color != a2.rgb_sp_color);
|
||||
}
|
||||
}
|
||||
|
||||
@ -593,10 +590,10 @@ static void update_attrs(UI *ui, int attr_id)
|
||||
if ((undercurl || underline) && data->unibi_ext.set_underline_color != -1) {
|
||||
int color = attrs.rgb_sp_color;
|
||||
if (color != -1) {
|
||||
UNIBI_SET_NUM_VAR(data->params[0], (color >> 16) & 0xff); // red
|
||||
UNIBI_SET_NUM_VAR(data->params[1], (color >> 8) & 0xff); // green
|
||||
UNIBI_SET_NUM_VAR(data->params[2], color & 0xff); // blue
|
||||
unibi_out_ext(ui, data->unibi_ext.set_underline_color);
|
||||
UNIBI_SET_NUM_VAR(data->params[0], (color >> 16) & 0xff); // red
|
||||
UNIBI_SET_NUM_VAR(data->params[1], (color >> 8) & 0xff); // green
|
||||
UNIBI_SET_NUM_VAR(data->params[2], color & 0xff); // blue
|
||||
unibi_out_ext(ui, data->unibi_ext.set_underline_color);
|
||||
}
|
||||
}
|
||||
|
||||
@ -639,14 +636,14 @@ static void update_attrs(UI *ui, int attr_id)
|
||||
|
||||
|
||||
data->default_attr = fg == -1 && bg == -1
|
||||
&& !bold && !italic && !underline && !undercurl && !reverse && !standout
|
||||
&& !strikethrough;
|
||||
&& !bold && !italic && !underline && !undercurl && !reverse && !standout
|
||||
&& !strikethrough;
|
||||
|
||||
// Non-BCE terminals can't clear with non-default background color. Some BCE
|
||||
// terminals don't support attributes either, so don't rely on it. But assume
|
||||
// italic and bold has no effect if there is no text.
|
||||
data->can_clear_attr = !reverse && !standout && !underline && !undercurl
|
||||
&& !strikethrough && (data->bce || bg == -1);
|
||||
&& !strikethrough && (data->bce || bg == -1);
|
||||
}
|
||||
|
||||
static void final_column_wrap(UI *ui)
|
||||
@ -802,8 +799,7 @@ safe_move:
|
||||
ugrid_goto(grid, row, col);
|
||||
}
|
||||
|
||||
static void clear_region(UI *ui, int top, int bot, int left, int right,
|
||||
int attr_id)
|
||||
static void clear_region(UI *ui, int top, int bot, int left, int right, int attr_id)
|
||||
{
|
||||
TUIData *data = ui->data;
|
||||
UGrid *grid = &data->grid;
|
||||
@ -1006,7 +1002,7 @@ static void tui_mode_info_set(UI *ui, bool guicursor_enabled, Array args)
|
||||
|
||||
static void tui_update_menu(UI *ui)
|
||||
{
|
||||
// Do nothing; menus are for GUI only
|
||||
// Do nothing; menus are for GUI only
|
||||
}
|
||||
|
||||
static void tui_busy_start(UI *ui)
|
||||
@ -1096,10 +1092,14 @@ static void tui_set_mode(UI *ui, ModeShape mode)
|
||||
|
||||
int shape;
|
||||
switch (c.shape) {
|
||||
default: abort(); break;
|
||||
case SHAPE_BLOCK: shape = 1; break;
|
||||
case SHAPE_HOR: shape = 3; break;
|
||||
case SHAPE_VER: shape = 5; break;
|
||||
default:
|
||||
abort(); break;
|
||||
case SHAPE_BLOCK:
|
||||
shape = 1; break;
|
||||
case SHAPE_HOR:
|
||||
shape = 3; break;
|
||||
case SHAPE_VER:
|
||||
shape = 5; break;
|
||||
}
|
||||
UNIBI_SET_NUM_VAR(data->params[0], shape + (int)(c.blinkon == 0));
|
||||
unibi_out_ext(ui, data->unibi_ext.set_cursor_style);
|
||||
@ -1124,8 +1124,8 @@ static void tui_mode_change(UI *ui, String mode, Integer mode_idx)
|
||||
}
|
||||
|
||||
static void tui_grid_scroll(UI *ui, Integer g, Integer startrow, // -V751
|
||||
Integer endrow, Integer startcol, Integer endcol,
|
||||
Integer rows, Integer cols FUNC_ATTR_UNUSED)
|
||||
Integer endrow, Integer startcol, Integer endcol, Integer rows,
|
||||
Integer cols FUNC_ATTR_UNUSED)
|
||||
{
|
||||
TUIData *data = ui->data;
|
||||
UGrid *grid = &data->grid;
|
||||
@ -1134,16 +1134,16 @@ static void tui_grid_scroll(UI *ui, Integer g, Integer startrow, // -V751
|
||||
|
||||
bool fullwidth = left == 0 && right == ui->width-1;
|
||||
data->scroll_region_is_full_screen = fullwidth
|
||||
&& top == 0 && bot == ui->height-1;
|
||||
&& top == 0 && bot == ui->height-1;
|
||||
|
||||
ugrid_scroll(grid, top, bot, left, right, (int)rows);
|
||||
|
||||
bool can_scroll = data->can_scroll
|
||||
&& (data->scroll_region_is_full_screen
|
||||
|| (data->can_change_scroll_region
|
||||
&& ((left == 0 && right == ui->width - 1)
|
||||
|| data->can_set_lr_margin
|
||||
|| data->can_set_left_right_margin)));
|
||||
&& (data->scroll_region_is_full_screen
|
||||
|| (data->can_change_scroll_region
|
||||
&& ((left == 0 && right == ui->width - 1)
|
||||
|| data->can_set_lr_margin
|
||||
|| data->can_set_left_right_margin)));
|
||||
|
||||
if (can_scroll) {
|
||||
// Change terminal scroll region and move cursor to the top
|
||||
@ -1184,8 +1184,7 @@ static void tui_grid_scroll(UI *ui, Integer g, Integer startrow, // -V751
|
||||
}
|
||||
}
|
||||
|
||||
static void tui_hl_attr_define(UI *ui, Integer id, HlAttrs attrs,
|
||||
HlAttrs cterm_attrs, Array info)
|
||||
static void tui_hl_attr_define(UI *ui, Integer id, HlAttrs attrs, HlAttrs cterm_attrs, Array info)
|
||||
{
|
||||
TUIData *data = ui->data;
|
||||
kv_a(data->attrs, (size_t)id) = attrs;
|
||||
@ -1201,8 +1200,7 @@ static void tui_visual_bell(UI *ui)
|
||||
unibi_out(ui, unibi_flash_screen);
|
||||
}
|
||||
|
||||
static void tui_default_colors_set(UI *ui, Integer rgb_fg, Integer rgb_bg,
|
||||
Integer rgb_sp,
|
||||
static void tui_default_colors_set(UI *ui, Integer rgb_fg, Integer rgb_bg, Integer rgb_sp,
|
||||
Integer cterm_fg, Integer cterm_bg)
|
||||
{
|
||||
TUIData *data = ui->data;
|
||||
@ -1379,9 +1377,8 @@ static void tui_option_set(UI *ui, String name, Object value)
|
||||
}
|
||||
}
|
||||
|
||||
static void tui_raw_line(UI *ui, Integer g, Integer linerow, Integer startcol,
|
||||
Integer endcol, Integer clearcol, Integer clearattr,
|
||||
LineFlags flags, const schar_T *chunk,
|
||||
static void tui_raw_line(UI *ui, Integer g, Integer linerow, Integer startcol, Integer endcol,
|
||||
Integer clearcol, Integer clearattr, LineFlags flags, const schar_T *chunk,
|
||||
const sattr_T *attrs)
|
||||
{
|
||||
TUIData *data = ui->data;
|
||||
@ -1561,8 +1558,7 @@ static void out(void *ctx, const char *str, size_t len)
|
||||
data->bufpos += len;
|
||||
}
|
||||
|
||||
static void unibi_set_if_empty(unibi_term *ut, enum unibi_string str,
|
||||
const char *val)
|
||||
static void unibi_set_if_empty(unibi_term *ut, enum unibi_string str, const char *val)
|
||||
{
|
||||
if (!unibi_get_str(ut, str)) {
|
||||
unibi_set_str(ut, str, val);
|
||||
@ -1596,9 +1592,8 @@ static int unibi_find_ext_bool(unibi_term *ut, const char *name)
|
||||
/// Patches the terminfo records after loading from system or built-in db.
|
||||
/// Several entries in terminfo are known to be deficient or outright wrong;
|
||||
/// and several terminal emulators falsely announce incorrect terminal types.
|
||||
static void patch_terminfo_bugs(TUIData *data, const char *term,
|
||||
const char *colorterm, long vte_version,
|
||||
long konsolev, bool iterm_env, bool nsterm)
|
||||
static void patch_terminfo_bugs(TUIData *data, const char *term, const char *colorterm,
|
||||
long vte_version, long konsolev, bool iterm_env, bool nsterm)
|
||||
{
|
||||
unibi_term *ut = data->ut;
|
||||
const char *xterm_version = os_getenv("XTERM_VERSION");
|
||||
@ -1606,8 +1601,8 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|
||||
bool roxterm = !!os_getenv("ROXTERM_ID");
|
||||
#endif
|
||||
bool xterm = terminfo_is_term_family(term, "xterm")
|
||||
// Treat Terminal.app as generic xterm-like, for now.
|
||||
|| nsterm;
|
||||
// Treat Terminal.app as generic xterm-like, for now.
|
||||
|| nsterm;
|
||||
bool kitty = terminfo_is_term_family(term, "xterm-kitty");
|
||||
bool linuxvt = terminfo_is_term_family(term, "linux");
|
||||
bool bsdvt = terminfo_is_bsd_console(term);
|
||||
@ -1618,18 +1613,18 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|
||||
bool tmux = terminfo_is_term_family(term, "tmux") || !!os_getenv("TMUX");
|
||||
bool st = terminfo_is_term_family(term, "st");
|
||||
bool gnome = terminfo_is_term_family(term, "gnome")
|
||||
|| terminfo_is_term_family(term, "vte");
|
||||
|| terminfo_is_term_family(term, "vte");
|
||||
bool iterm = terminfo_is_term_family(term, "iterm")
|
||||
|| terminfo_is_term_family(term, "iterm2")
|
||||
|| terminfo_is_term_family(term, "iTerm.app")
|
||||
|| terminfo_is_term_family(term, "iTerm2.app");
|
||||
|| terminfo_is_term_family(term, "iterm2")
|
||||
|| terminfo_is_term_family(term, "iTerm.app")
|
||||
|| terminfo_is_term_family(term, "iTerm2.app");
|
||||
bool alacritty = terminfo_is_term_family(term, "alacritty");
|
||||
// None of the following work over SSH; see :help TERM .
|
||||
bool iterm_pretending_xterm = xterm && iterm_env;
|
||||
bool gnome_pretending_xterm = xterm && colorterm
|
||||
&& strstr(colorterm, "gnome-terminal");
|
||||
&& strstr(colorterm, "gnome-terminal");
|
||||
bool mate_pretending_xterm = xterm && colorterm
|
||||
&& strstr(colorterm, "mate-terminal");
|
||||
&& strstr(colorterm, "mate-terminal");
|
||||
bool true_xterm = xterm && !!xterm_version && !bsdvt;
|
||||
bool cygwin = terminfo_is_term_family(term, "cygwin");
|
||||
|
||||
@ -1839,8 +1834,8 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|
||||
data->unibi_ext.set_cursor_style =
|
||||
(int)unibi_add_ext_str(ut, "Ss", "\x1b[%p1%d q");
|
||||
if (-1 == data->unibi_ext.reset_cursor_style) {
|
||||
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
|
||||
"");
|
||||
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
|
||||
"");
|
||||
}
|
||||
unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
|
||||
"\x1b[ q");
|
||||
@ -1849,25 +1844,25 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|
||||
// does not support DECSCUSR.
|
||||
// See http://linuxgazette.net/137/anonymous.html for more info
|
||||
data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(ut, "Ss",
|
||||
"\x1b[?"
|
||||
"%?"
|
||||
// The parameter passed to Ss is the DECSCUSR parameter, so the
|
||||
// terminal capability has to translate into the Linux idiosyncratic
|
||||
// parameter.
|
||||
//
|
||||
// linuxvt only supports block and underline. It is also only
|
||||
// possible to have a steady block (no steady underline)
|
||||
"%p1%{2}%<" "%t%{8}" // blink block
|
||||
"%e%p1%{2}%=" "%t%{112}" // steady block
|
||||
"%e%p1%{3}%=" "%t%{4}" // blink underline (set to half block)
|
||||
"%e%p1%{4}%=" "%t%{4}" // steady underline
|
||||
"%e%p1%{5}%=" "%t%{2}" // blink bar (set to underline)
|
||||
"%e%p1%{6}%=" "%t%{2}" // steady bar
|
||||
"%e%{0}" // anything else
|
||||
"%;" "%dc");
|
||||
"\x1b[?"
|
||||
"%?"
|
||||
// The parameter passed to Ss is the DECSCUSR parameter, so the
|
||||
// terminal capability has to translate into the Linux idiosyncratic
|
||||
// parameter.
|
||||
//
|
||||
// linuxvt only supports block and underline. It is also only
|
||||
// possible to have a steady block (no steady underline)
|
||||
"%p1%{2}%<" "%t%{8}" // blink block
|
||||
"%e%p1%{2}%=" "%t%{112}" // steady block
|
||||
"%e%p1%{3}%=" "%t%{4}" // blink underline (set to half block)
|
||||
"%e%p1%{4}%=" "%t%{4}" // steady underline
|
||||
"%e%p1%{5}%=" "%t%{2}" // blink bar (set to underline)
|
||||
"%e%p1%{6}%=" "%t%{2}" // steady bar
|
||||
"%e%{0}" // anything else
|
||||
"%;" "%dc");
|
||||
if (-1 == data->unibi_ext.reset_cursor_style) {
|
||||
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
|
||||
"");
|
||||
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
|
||||
"");
|
||||
}
|
||||
unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
|
||||
"\x1b[?c");
|
||||
@ -1875,34 +1870,34 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|
||||
// Konsole before version 18.07.70: set up a nonce profile. This has
|
||||
// side-effects on temporary font resizing. #6798
|
||||
data->unibi_ext.set_cursor_style = (int)unibi_add_ext_str(ut, "Ss",
|
||||
TMUX_WRAP(tmux, "\x1b]50;CursorShape=%?"
|
||||
"%p1%{3}%<" "%t%{0}" // block
|
||||
"%e%p1%{5}%<" "%t%{2}" // underline
|
||||
"%e%{1}" // everything else is bar
|
||||
"%;%d;BlinkingCursorEnabled=%?"
|
||||
"%p1%{1}%<" "%t%{1}" // Fortunately if we exclude zero as special,
|
||||
"%e%p1%{1}%&" // in all other cases we can treat bit #0 as a flag.
|
||||
"%;%d\x07"));
|
||||
TMUX_WRAP(tmux,
|
||||
"\x1b]50;CursorShape=%?"
|
||||
"%p1%{3}%<" "%t%{0}" // block
|
||||
"%e%p1%{5}%<" "%t%{2}" // underline
|
||||
"%e%{1}" // everything else is bar
|
||||
"%;%d;BlinkingCursorEnabled=%?"
|
||||
"%p1%{1}%<" "%t%{1}" // Fortunately if we exclude zero as special,
|
||||
"%e%p1%{1}%&" // in all other cases we can treat bit #0 as a flag.
|
||||
"%;%d\x07"));
|
||||
if (-1 == data->unibi_ext.reset_cursor_style) {
|
||||
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
|
||||
"");
|
||||
data->unibi_ext.reset_cursor_style = (int)unibi_add_ext_str(ut, "Se",
|
||||
"");
|
||||
}
|
||||
unibi_set_ext_str(ut, (size_t)data->unibi_ext.reset_cursor_style,
|
||||
"\x1b]50;\x07");
|
||||
"\x1b]50;\x07");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// This adds stuff that is not in standard terminfo as extended unibilium
|
||||
/// capabilities.
|
||||
static void augment_terminfo(TUIData *data, const char *term,
|
||||
long vte_version,
|
||||
long konsolev, bool iterm_env, bool nsterm)
|
||||
static void augment_terminfo(TUIData *data, const char *term, long vte_version, long konsolev,
|
||||
bool iterm_env, bool nsterm)
|
||||
{
|
||||
unibi_term *ut = data->ut;
|
||||
bool xterm = terminfo_is_term_family(term, "xterm")
|
||||
// Treat Terminal.app as generic xterm-like, for now.
|
||||
|| nsterm;
|
||||
// Treat Terminal.app as generic xterm-like, for now.
|
||||
|| nsterm;
|
||||
bool bsdvt = terminfo_is_bsd_console(term);
|
||||
bool dtterm = terminfo_is_term_family(term, "dtterm");
|
||||
bool rxvt = terminfo_is_term_family(term, "rxvt");
|
||||
@ -1911,9 +1906,9 @@ static void augment_terminfo(TUIData *data, const char *term,
|
||||
bool screen = terminfo_is_term_family(term, "screen");
|
||||
bool tmux = terminfo_is_term_family(term, "tmux") || !!os_getenv("TMUX");
|
||||
bool iterm = terminfo_is_term_family(term, "iterm")
|
||||
|| terminfo_is_term_family(term, "iterm2")
|
||||
|| terminfo_is_term_family(term, "iTerm.app")
|
||||
|| terminfo_is_term_family(term, "iTerm2.app");
|
||||
|| terminfo_is_term_family(term, "iterm2")
|
||||
|| terminfo_is_term_family(term, "iTerm.app")
|
||||
|| terminfo_is_term_family(term, "iTerm2.app");
|
||||
bool alacritty = terminfo_is_term_family(term, "alacritty");
|
||||
// None of the following work over SSH; see :help TERM .
|
||||
bool iterm_pretending_xterm = xterm && iterm_env;
|
||||
@ -1928,19 +1923,18 @@ static void augment_terminfo(TUIData *data, const char *term,
|
||||
|| teraterm // per TeraTerm "Supported Control Functions" doco
|
||||
|| rxvt) { // per command.C
|
||||
data->unibi_ext.resize_screen = (int)unibi_add_ext_str(ut,
|
||||
"ext.resize_screen",
|
||||
"\x1b[8;%p1%d;%p2%dt");
|
||||
"ext.resize_screen",
|
||||
"\x1b[8;%p1%d;%p2%dt");
|
||||
}
|
||||
if (putty || xterm || rxvt) {
|
||||
data->unibi_ext.reset_scroll_region = (int)unibi_add_ext_str(ut,
|
||||
"ext.reset_scroll_region",
|
||||
"\x1b[r");
|
||||
"ext.reset_scroll_region",
|
||||
"\x1b[r");
|
||||
}
|
||||
|
||||
// terminfo describes strikethrough modes as rmxx/smxx with respect
|
||||
// to the ECMA-48 strikeout/crossed-out attributes.
|
||||
data->unibi_ext.enter_strikethrough_mode = (int)unibi_find_ext_str(
|
||||
ut, "smxx");
|
||||
data->unibi_ext.enter_strikethrough_mode = (int)unibi_find_ext_str(ut, "smxx");
|
||||
|
||||
// Dickey ncurses terminfo does not include the setrgbf and setrgbb
|
||||
// capabilities, proposed by Rüdiger Sonderfeld on 2013-10-15. Adding
|
||||
@ -1955,29 +1949,29 @@ static void augment_terminfo(TUIData *data, const char *term,
|
||||
|
||||
// can use colons like ISO 8613-6:1994/ITU T.416:1993 says.
|
||||
bool has_colon_rgb = !tmux && !screen
|
||||
&& !vte_version // VTE colon-support has a big memory leak. #7573
|
||||
&& (iterm || iterm_pretending_xterm // per VT100Terminal.m
|
||||
// per http://invisible-island.net/xterm/xterm.log.html#xterm_282
|
||||
|| true_xterm);
|
||||
&& !vte_version // VTE colon-support has a big memory leak. #7573
|
||||
&& (iterm || iterm_pretending_xterm // per VT100Terminal.m
|
||||
// per http://invisible-island.net/xterm/xterm.log.html#xterm_282
|
||||
|| true_xterm);
|
||||
|
||||
data->unibi_ext.set_rgb_foreground = unibi_find_ext_str(ut, "setrgbf");
|
||||
if (-1 == data->unibi_ext.set_rgb_foreground) {
|
||||
if (has_colon_rgb) {
|
||||
data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, "setrgbf",
|
||||
"\x1b[38:2:%p1%d:%p2%d:%p3%dm");
|
||||
"\x1b[38:2:%p1%d:%p2%d:%p3%dm");
|
||||
} else {
|
||||
data->unibi_ext.set_rgb_foreground = (int)unibi_add_ext_str(ut, "setrgbf",
|
||||
"\x1b[38;2;%p1%d;%p2%d;%p3%dm");
|
||||
"\x1b[38;2;%p1%d;%p2%d;%p3%dm");
|
||||
}
|
||||
}
|
||||
data->unibi_ext.set_rgb_background = unibi_find_ext_str(ut, "setrgbb");
|
||||
if (-1 == data->unibi_ext.set_rgb_background) {
|
||||
if (has_colon_rgb) {
|
||||
data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, "setrgbb",
|
||||
"\x1b[48:2:%p1%d:%p2%d:%p3%dm");
|
||||
"\x1b[48:2:%p1%d:%p2%d:%p3%dm");
|
||||
} else {
|
||||
data->unibi_ext.set_rgb_background = (int)unibi_add_ext_str(ut, "setrgbb",
|
||||
"\x1b[48;2;%p1%d;%p2%d;%p3%dm");
|
||||
"\x1b[48;2;%p1%d;%p2%d;%p3%dm");
|
||||
}
|
||||
}
|
||||
|
||||
@ -1985,63 +1979,59 @@ static void augment_terminfo(TUIData *data, const char *term,
|
||||
// FIXME: Bypassing tmux like this affects the cursor colour globally, in
|
||||
// all panes, which is not particularly desirable. A better approach
|
||||
// would use a tmux control sequence and an extra if(screen) test.
|
||||
data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
|
||||
ut, NULL, TMUX_WRAP(tmux, "\033]Pl%p1%06x\033\\"));
|
||||
data->unibi_ext.set_cursor_color =
|
||||
(int)unibi_add_ext_str(ut, NULL, TMUX_WRAP(tmux, "\033]Pl%p1%06x\033\\"));
|
||||
} else if ((xterm || rxvt || tmux || alacritty)
|
||||
&& (vte_version == 0 || vte_version >= 3900)) {
|
||||
// Supported in urxvt, newer VTE.
|
||||
data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(
|
||||
ut, "ext.set_cursor_color", "\033]12;#%p1%06x\007");
|
||||
data->unibi_ext.set_cursor_color = (int)unibi_add_ext_str(ut, "ext.set_cursor_color",
|
||||
"\033]12;#%p1%06x\007");
|
||||
}
|
||||
|
||||
if (-1 != data->unibi_ext.set_cursor_color) {
|
||||
data->unibi_ext.reset_cursor_color = (int)unibi_add_ext_str(
|
||||
ut, "ext.reset_cursor_color", "\x1b]112\x07");
|
||||
data->unibi_ext.reset_cursor_color = (int)unibi_add_ext_str(ut, "ext.reset_cursor_color",
|
||||
"\x1b]112\x07");
|
||||
}
|
||||
|
||||
data->unibi_ext.save_title = (int)unibi_add_ext_str(
|
||||
ut, "ext.save_title", "\x1b[22;0t");
|
||||
data->unibi_ext.restore_title = (int)unibi_add_ext_str(
|
||||
ut, "ext.restore_title", "\x1b[23;0t");
|
||||
data->unibi_ext.save_title = (int)unibi_add_ext_str(ut, "ext.save_title", "\x1b[22;0t");
|
||||
data->unibi_ext.restore_title = (int)unibi_add_ext_str(ut, "ext.restore_title", "\x1b[23;0t");
|
||||
|
||||
/// Terminals usually ignore unrecognized private modes, and there is no
|
||||
/// known ambiguity with these. So we just set them unconditionally.
|
||||
data->unibi_ext.enable_lr_margin = (int)unibi_add_ext_str(
|
||||
ut, "ext.enable_lr_margin", "\x1b[?69h");
|
||||
data->unibi_ext.disable_lr_margin = (int)unibi_add_ext_str(
|
||||
ut, "ext.disable_lr_margin", "\x1b[?69l");
|
||||
data->unibi_ext.enable_bracketed_paste = (int)unibi_add_ext_str(
|
||||
ut, "ext.enable_bpaste", "\x1b[?2004h");
|
||||
data->unibi_ext.disable_bracketed_paste = (int)unibi_add_ext_str(
|
||||
ut, "ext.disable_bpaste", "\x1b[?2004l");
|
||||
data->unibi_ext.enable_lr_margin =
|
||||
(int)unibi_add_ext_str(ut, "ext.enable_lr_margin", "\x1b[?69h");
|
||||
data->unibi_ext.disable_lr_margin = (int)unibi_add_ext_str(ut, "ext.disable_lr_margin",
|
||||
"\x1b[?69l");
|
||||
data->unibi_ext.enable_bracketed_paste = (int)unibi_add_ext_str(ut, "ext.enable_bpaste",
|
||||
"\x1b[?2004h");
|
||||
data->unibi_ext.disable_bracketed_paste = (int)unibi_add_ext_str(ut, "ext.disable_bpaste",
|
||||
"\x1b[?2004l");
|
||||
// For urxvt send BOTH xterm and old urxvt sequences. #8695
|
||||
data->unibi_ext.enable_focus_reporting = (int)unibi_add_ext_str(
|
||||
ut, "ext.enable_focus",
|
||||
rxvt ? "\x1b[?1004h\x1b]777;focus;on\x7" : "\x1b[?1004h");
|
||||
data->unibi_ext.disable_focus_reporting = (int)unibi_add_ext_str(
|
||||
ut, "ext.disable_focus",
|
||||
rxvt ? "\x1b[?1004l\x1b]777;focus;off\x7" : "\x1b[?1004l");
|
||||
data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(
|
||||
ut, "ext.enable_mouse", "\x1b[?1002h\x1b[?1006h");
|
||||
data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(
|
||||
ut, "ext.disable_mouse", "\x1b[?1002l\x1b[?1006l");
|
||||
data->unibi_ext.enable_focus_reporting = (int)unibi_add_ext_str(ut, "ext.enable_focus",
|
||||
rxvt ? "\x1b[?1004h\x1b]777;focus;on\x7" : "\x1b[?1004h");
|
||||
data->unibi_ext.disable_focus_reporting = (int)unibi_add_ext_str(ut, "ext.disable_focus",
|
||||
rxvt ? "\x1b[?1004l\x1b]777;focus;off\x7" : "\x1b[?1004l");
|
||||
data->unibi_ext.enable_mouse = (int)unibi_add_ext_str(ut, "ext.enable_mouse",
|
||||
"\x1b[?1002h\x1b[?1006h");
|
||||
data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(ut, "ext.disable_mouse",
|
||||
"\x1b[?1002l\x1b[?1006l");
|
||||
|
||||
// Extended underline.
|
||||
// terminfo will have Smulx for this (but no support for colors yet).
|
||||
data->unibi_ext.set_underline_style = unibi_find_ext_str(ut, "Smulx");
|
||||
if (data->unibi_ext.set_underline_style == -1) {
|
||||
int ext_bool_Su = unibi_find_ext_bool(ut, "Su"); // used by kitty
|
||||
if (vte_version >= 5102
|
||||
|| (ext_bool_Su != -1
|
||||
&& unibi_get_ext_bool(ut, (size_t)ext_bool_Su))) {
|
||||
data->unibi_ext.set_underline_style = (int)unibi_add_ext_str(
|
||||
ut, "ext.set_underline_style", "\x1b[4:%p1%dm");
|
||||
}
|
||||
int ext_bool_Su = unibi_find_ext_bool(ut, "Su"); // used by kitty
|
||||
if (vte_version >= 5102
|
||||
|| (ext_bool_Su != -1
|
||||
&& unibi_get_ext_bool(ut, (size_t)ext_bool_Su))) {
|
||||
data->unibi_ext.set_underline_style = (int)unibi_add_ext_str(ut, "ext.set_underline_style",
|
||||
"\x1b[4:%p1%dm");
|
||||
}
|
||||
}
|
||||
if (data->unibi_ext.set_underline_style != -1) {
|
||||
// Only support colon syntax. #9270
|
||||
data->unibi_ext.set_underline_color = (int)unibi_add_ext_str(
|
||||
ut, "ext.set_underline_color", "\x1b[58:2::%p1%d:%p2%d:%p3%dm");
|
||||
// Only support colon syntax. #9270
|
||||
data->unibi_ext.set_underline_color = (int)unibi_add_ext_str(ut, "ext.set_underline_color",
|
||||
"\x1b[58:2::%p1%d:%p2%d:%p3%dm");
|
||||
}
|
||||
}
|
||||
|
||||
@ -2134,8 +2124,7 @@ static const char *tui_get_stty_erase(void)
|
||||
|
||||
/// libtermkey hook to override terminfo entries.
|
||||
/// @see TermInput.tk_ti_hook_fn
|
||||
static const char *tui_tk_ti_getstr(const char *name, const char *value,
|
||||
void *data)
|
||||
static const char *tui_tk_ti_getstr(const char *name, const char *value, void *data)
|
||||
{
|
||||
static const char *stty_erase = NULL;
|
||||
if (stty_erase == NULL) {
|
||||
|
Loading…
Reference in New Issue
Block a user