refactor: format tui.c with uncrustify (#15640)

This commit is contained in:
dundargoc 2021-09-14 10:36:08 +02:00 committed by GitHub
parent 5fd21b8d3e
commit 0771504488
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 163 additions and 174 deletions

View File

@ -1,4 +1,4 @@
# Uncrustify-0.73.0-159-81b1bc77 # Uncrustify-0.73.0-162-ac9b0f48
# #
# General options # General options

View File

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