aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/tui/tui.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/tui/tui.c')
-rw-r--r--src/nvim/tui/tui.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 519ef1cccd..9fdc6eceba 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -103,6 +103,7 @@ typedef struct {
bool busy, is_invisible;
bool cork, overflow;
bool cursor_color_changed;
+ bool is_starting;
cursorentry_T cursor_shapes[SHAPE_IDX_COUNT];
HlAttrs clear_attrs;
kvec_t(HlAttrs) attrs;
@@ -122,8 +123,9 @@ typedef struct {
int reset_scroll_region;
int set_cursor_style, reset_cursor_style;
int save_title, restore_title;
- int enter_undercurl_mode, exit_undercurl_mode, set_underline_color;
int get_bg;
+ int set_underline_style;
+ int set_underline_color;
} unibi_ext;
char *space_buf;
} TUIData;
@@ -215,6 +217,7 @@ static void terminfo_start(UI *ui)
data->unibi_ext.set_cursor_style = -1;
data->unibi_ext.reset_cursor_style = -1;
data->unibi_ext.get_bg = -1;
+ data->unibi_ext.set_underline_color = -1;
data->out_fd = 1;
data->out_isatty = os_isatty(data->out_fd);
@@ -396,6 +399,7 @@ static void tui_main(UIBridgeData *bridge, UI *ui)
ui->data = data;
data->bridge = bridge;
data->loop = &tui_loop;
+ data->is_starting = true;
kv_init(data->invalid_regions);
signal_watcher_init(data->loop, &data->winch_handle, ui);
signal_watcher_init(data->loop, &data->cont_handle, data);
@@ -532,7 +536,7 @@ static void update_attrs(UI *ui, int attr_id)
bool underline;
bool undercurl;
- if (data->unibi_ext.enter_undercurl_mode) {
+ if (data->unibi_ext.set_underline_style != -1) {
underline = attr & HL_UNDERLINE;
undercurl = attr & HL_UNDERCURL;
} else {
@@ -575,10 +579,11 @@ static void update_attrs(UI *ui, int attr_id)
if (italic) {
unibi_out(ui, unibi_enter_italics_mode);
}
- if (undercurl && data->unibi_ext.enter_undercurl_mode) {
- unibi_out_ext(ui, data->unibi_ext.enter_undercurl_mode);
+ if (undercurl && data->unibi_ext.set_underline_style != -1) {
+ UNIBI_SET_NUM_VAR(data->params[0], 3);
+ unibi_out_ext(ui, data->unibi_ext.set_underline_style);
}
- if ((undercurl || underline) && data->unibi_ext.set_underline_color) {
+ 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
@@ -888,7 +893,7 @@ static void tui_grid_resize(UI *ui, Integer g, Integer width, Integer height)
r->right = MIN(r->right, grid->width);
}
- if (!got_winch && (!starting || did_user_set_dimensions)) {
+ if (!got_winch && (!data->is_starting || did_user_set_dimensions)) {
// Resize the _host_ terminal.
UNIBI_SET_NUM_VAR(data->params[0], (int)height);
UNIBI_SET_NUM_VAR(data->params[1], (int)width);
@@ -1051,6 +1056,7 @@ static void tui_mode_change(UI *ui, String mode, Integer mode_idx)
{
TUIData *data = ui->data;
tui_set_mode(ui, (ModeShape)mode_idx);
+ data->is_starting = false; // mode entered, no longer starting
data->showing_mode = (ModeShape)mode_idx;
}
@@ -1355,7 +1361,7 @@ static void tui_guess_size(UI *ui)
int width = 0, height = 0;
// 1 - look for non-default 'columns' and 'lines' options during startup
- if (starting && (Columns != DFLT_COLS || Rows != DFLT_ROWS)) {
+ if (data->is_starting && (Columns != DFLT_COLS || Rows != DFLT_ROWS)) {
did_user_set_dimensions = true;
assert(Columns >= INT_MIN && Columns <= INT_MAX);
assert(Rows >= INT_MIN && Rows <= INT_MAX);
@@ -1908,13 +1914,19 @@ static void augment_terminfo(TUIData *data, const char *term,
data->unibi_ext.disable_mouse = (int)unibi_add_ext_str(
ut, "ext.disable_mouse", "\x1b[?1002l\x1b[?1006l");
- 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.enter_undercurl_mode = (int)unibi_add_ext_str(
- ut, "ext.enter_undercurl_mode", "\x1b[4:3m");
- data->unibi_ext.exit_undercurl_mode = (int)unibi_add_ext_str(
- ut, "ext.exit_undercurl_mode", "\x1b[4:0m");
+ // 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");
+ }
+ }
+ 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");