aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan de Boyne Pollard <J.deBoynePollard-newsgroups@NTLWorld.com>2017-06-05 22:12:53 +0100
committerJonathan de Boyne Pollard <J.deBoynePollard-newsgroups@NTLWorld.com>2017-06-05 22:12:53 +0100
commit054b03e07ac8c27f49afba7225a20214697a3720 (patch)
tree141b5245e8c8bb6bd650d38716bcaa7b72508117 /src
parent239b0aaf2e59327454bc313da25dcfdfcee6a4cd (diff)
downloadrneovim-054b03e07ac8c27f49afba7225a20214697a3720.tar.gz
rneovim-054b03e07ac8c27f49afba7225a20214697a3720.tar.bz2
rneovim-054b03e07ac8c27f49afba7225a20214697a3720.zip
tui: Combine multiple attribute changes.
Use the terminfo set_attribute capability to set multiple attributes in one control sequence, if it is available.
Diffstat (limited to 'src')
-rw-r--r--src/nvim/tui/tui.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 949a24db89..387a340588 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -360,19 +360,43 @@ static void update_attrs(UI *ui, HlAttrs attrs)
}
data->print_attrs = attrs;
- if (!data->default_attr) {
- data->default_attr = true;
- unibi_out(ui, unibi_exit_attribute_mode);
- }
UGrid *grid = &data->grid;
int fg = attrs.foreground != -1 ? attrs.foreground : grid->fg;
int bg = attrs.background != -1 ? attrs.background : grid->bg;
- data->default_attr = fg == -1 && bg == -1
- && !attrs.bold && !attrs.italic && !attrs.underline && !attrs.undercurl
- && !attrs.reverse;
-
+ if (unibi_get_str(data->ut, unibi_set_attributes)) {
+ if (attrs.bold || attrs.reverse || attrs.underline || attrs.undercurl) {
+ data->params[0].i = 0; // standout
+ data->params[1].i = attrs.underline || attrs.undercurl;
+ data->params[2].i = attrs.reverse;
+ data->params[3].i = 0; // blink
+ data->params[4].i = 0; // dim
+ data->params[5].i = attrs.bold;
+ data->params[6].i = 0; // blank
+ data->params[7].i = 0; // protect
+ data->params[8].i = 0; // alternate character set
+ unibi_out(ui, unibi_set_attributes);
+ } else if (!data->default_attr) {
+ unibi_out(ui, unibi_exit_attribute_mode);
+ }
+ } else {
+ if (!data->default_attr) {
+ unibi_out(ui, unibi_exit_attribute_mode);
+ }
+ if (attrs.bold) {
+ unibi_out(ui, unibi_enter_bold_mode);
+ }
+ if (attrs.underline || attrs.undercurl) {
+ unibi_out(ui, unibi_enter_underline_mode);
+ }
+ if (attrs.reverse) {
+ unibi_out(ui, unibi_enter_reverse_mode);
+ }
+ }
+ if (attrs.italic) {
+ unibi_out(ui, unibi_enter_italics_mode);
+ }
if (ui->rgb) {
if (fg != -1) {
data->params[0].i = (fg >> 16) & 0xff; // red
@@ -399,18 +423,9 @@ static void update_attrs(UI *ui, HlAttrs attrs)
}
}
- if (attrs.bold) {
- unibi_out(ui, unibi_enter_bold_mode);
- }
- if (attrs.italic) {
- unibi_out(ui, unibi_enter_italics_mode);
- }
- if (attrs.underline || attrs.undercurl) {
- unibi_out(ui, unibi_enter_underline_mode);
- }
- if (attrs.reverse) {
- unibi_out(ui, unibi_enter_reverse_mode);
- }
+ data->default_attr = fg == -1 && bg == -1
+ && !attrs.bold && !attrs.italic && !attrs.underline && !attrs.undercurl
+ && !attrs.reverse;
}
static void final_column_wrap(UI *ui)