aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/ui.txt2
-rw-r--r--src/nvim/api/ui_events.in.h2
-rw-r--r--src/nvim/highlight.c7
-rw-r--r--src/nvim/terminal.c1
-rw-r--r--test/functional/ui/float_spec.lua50
-rw-r--r--test/functional/ui/multigrid_spec.lua50
-rw-r--r--test/functional/ui/popupmenu_spec.lua3
-rw-r--r--test/functional/ui/screen.lua11
8 files changed, 73 insertions, 53 deletions
diff --git a/runtime/doc/ui.txt b/runtime/doc/ui.txt
index 1440e2ac78..7d213f959b 100644
--- a/runtime/doc/ui.txt
+++ b/runtime/doc/ui.txt
@@ -292,6 +292,8 @@ numerical highlight ids to the actual attributes.
`bold`: bold text.
`underline`: underlined text. The line has `special` color.
`undercurl`: undercurled text. The curl has `special` color.
+ `blend`: Blend level (0-100). Could be used by UIs to support
+ blending floating windows to the background.
For absent color keys the default color should be used. Don't store
the default value in the table, rather a sentinel value, so that
diff --git a/src/nvim/api/ui_events.in.h b/src/nvim/api/ui_events.in.h
index 41bf0af65b..9f58257e53 100644
--- a/src/nvim/api/ui_events.in.h
+++ b/src/nvim/api/ui_events.in.h
@@ -100,7 +100,7 @@ void raw_line(Integer grid, Integer row, Integer startcol,
void event(char *name, Array args, bool *args_consumed)
FUNC_API_NOEXPORT;
-void win_pos(Integer grid, Integer win, Integer startrow,
+void win_pos(Integer grid, Window win, Integer startrow,
Integer startcol, Integer width, Integer height)
FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void win_float_pos(Integer grid, Window win, String anchor, Integer anchor_grid,
diff --git a/src/nvim/highlight.c b/src/nvim/highlight.c
index f11880cb2b..3a61409dfe 100644
--- a/src/nvim/highlight.c
+++ b/src/nvim/highlight.c
@@ -233,6 +233,7 @@ int hl_get_underline(void)
.rgb_fg_color = -1,
.rgb_bg_color = -1,
.rgb_sp_color = -1,
+ .hl_blend = -1,
},
.kind = kHlUI,
.id1 = 0,
@@ -427,6 +428,8 @@ int hl_blend_attrs(int back_attr, int front_attr, bool *through)
cattrs.rgb_bg_color = rgb_blend(ratio, battrs.rgb_bg_color,
fattrs.rgb_bg_color);
+ cattrs.hl_blend = -1; // blend property was consumed
+
HlKind kind = *through ? kHlBlendThrough : kHlBlend;
id = get_attr_entry((HlEntry){ .attr = cattrs, .kind = kind,
.id1 = back_attr, .id2 = front_attr });
@@ -614,6 +617,10 @@ Dictionary hlattrs2dict(HlAttrs ae, bool use_rgb)
}
}
+ if (ae.hl_blend > -1) {
+ PUT(hl, "blend", INTEGER_OBJ(ae.hl_blend));
+ }
+
return hl;
}
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index 5aeea3223b..3faf6dd5bb 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -662,6 +662,7 @@ void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr,
.rgb_fg_color = vt_fg,
.rgb_bg_color = vt_bg,
.rgb_sp_color = -1,
+ .hl_blend = -1,
});
}
diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua
index 3e77349843..8dfe36c799 100644
--- a/test/functional/ui/float_spec.lua
+++ b/test/functional/ui/float_spec.lua
@@ -4144,14 +4144,14 @@ describe('floating windows', function()
[4:----------------------------------------]|
[4:----------------------------------------]|
:tabnew |
- ## grid 2
+ ## grid 2 (hidden)
x |
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
- ## grid 3
+ ## grid 3 (hidden)
{1:y }|
{2:~ }|
## grid 4
@@ -4193,7 +4193,7 @@ describe('floating windows', function()
## grid 3
{1:y }|
{2:~ }|
- ## grid 4
+ ## grid 4 (hidden)
|
{0:~ }|
{0:~ }|
@@ -4223,13 +4223,13 @@ describe('floating windows', function()
[4:----------------------------------------]|
[4:----------------------------------------]|
:tabnext |
- ## grid 2
+ ## grid 2 (hidden)
x |
{0:~ }|
{0:~ }|
{0:~ }|
{0:~ }|
- ## grid 3
+ ## grid 3 (hidden)
{1:y }|
{2:~ }|
## grid 4
@@ -4267,7 +4267,7 @@ describe('floating windows', function()
[4:----------------------------------------]|
[4:----------------------------------------]|
:tabnew |
- ## grid 2
+ ## grid 2 (hidden)
x |
{0:~ }|
{0:~ }|
@@ -4313,7 +4313,7 @@ describe('floating windows', function()
{0:~ }|
{0:~ }|
{0:~ }|
- ## grid 4
+ ## grid 4 (hidden)
|
{0:~ }|
{0:~ }|
@@ -4333,7 +4333,7 @@ describe('floating windows', function()
[4:----------------------------------------]|
[4:----------------------------------------]|
:tabnext |
- ## grid 2
+ ## grid 2 (hidden)
x |
{0:~ }|
{0:~ }|
@@ -4365,7 +4365,11 @@ describe('floating windows', function()
[5] = {foreground = tonumber('0x990000'), background = tonumber('0xfff1ff')},
[6] = {foreground = tonumber('0x332533'), background = tonumber('0xfff1ff')},
[7] = {background = tonumber('0xffcfff'), bold = true, foreground = tonumber('0x0000d8')},
- [8] = {background = Screen.colors.LightMagenta, bold = true, foreground = Screen.colors.Blue1}
+ [8] = {background = Screen.colors.LightMagenta, bold = true, foreground = Screen.colors.Blue1},
+ [9] = {background = Screen.colors.LightMagenta, blend=30},
+ [10] = {foreground = Screen.colors.Red, background = Screen.colors.LightMagenta, blend=0},
+ [11] = {foreground = Screen.colors.Red, background = Screen.colors.LightMagenta, blend=80},
+ [12] = {background = Screen.colors.LightMagenta, bold = true, foreground = Screen.colors.Blue1, blend=30},
})
insert([[
Lorem ipsum dolor sit amet, consectetur
@@ -4445,9 +4449,9 @@ describe('floating windows', function()
qui officia deserunt mollit anim id est |
laborum^. |
## grid 4
- {1:test }|
- {1: }|
- {1:popup text }|
+ {9:test }|
+ {9: }|
+ {9:popup text }|
]], float_pos={[4] = {{id = 1002}, "NW", 1, 2, 5, true}}, unchanged=true}
else
screen:expect([[
@@ -4487,9 +4491,9 @@ describe('floating windows', function()
qui officia deserunt mollit anim id est |
laborum^. |
## grid 4
- {1:test }|
- {1: }|
- {4:popup text}{1: }|
+ {9:test }|
+ {9: }|
+ {10:popup text}{9: }|
]], float_pos={[4] = {{id = 1002}, "NW", 1, 2, 5, true}}}
else
screen:expect([[
@@ -4497,7 +4501,7 @@ describe('floating windows', function()
exercitation ullamco laboris nisi ut aliquip ex |
ea co{2:test}{3:o consequat}. Duis aute irure dolor in |
repre{3:henderit in vol}uptate velit esse cillum |
- dolor{4:popup text}{3:ul}la pariatur. Excepteur sint |
+ dolor{10:popup text}{3:ul}la pariatur. Excepteur sint |
occaecat cupidatat non proident, sunt in culpa |
qui officia deserunt mollit anim id est |
laborum^. |
@@ -4528,9 +4532,9 @@ describe('floating windows', function()
qui officia deserunt mollit anim id est |
laborum^. |
## grid 4
- {1:test }|
- {1: }|
- {4:popup text}{1: }|
+ {9:test }|
+ {9: }|
+ {11:popup text}{9: }|
]], float_pos={[4] = {{id = 1002}, "NW", 1, 2, 5, true}}, unchanged=true}
else
screen:expect([[
@@ -4570,9 +4574,9 @@ describe('floating windows', function()
qui officia deserunt mollit anim id est |
laborum^. |
## grid 4
- {4:popup text}{1: }|
- {8:~ }|
- {8:~ }|
+ {11:popup text}{9: }|
+ {12:~ }|
+ {12:~ }|
]], float_pos={[4] = {{id = 1002}, "NW", 1, 2, 5, true}}}
else
meths.input_mouse('wheel', 'down', '', 0, 4, 7)
@@ -4672,7 +4676,7 @@ describe('floating windows', function()
[2] = {foreground = Screen.colors.Grey0, background = tonumber('0xffcfff')},
[3] = {bold = true, foreground = Screen.colors.Blue1},
[4] = {background = tonumber('0xffcfff'), bold = true, foreground = tonumber('0xb282ff')},
- [5] = {background = Screen.colors.LightMagenta},
+ [5] = {background = Screen.colors.LightMagenta, blend=30},
})
if multigrid then
screen:expect{grid=[[
diff --git a/test/functional/ui/multigrid_spec.lua b/test/functional/ui/multigrid_spec.lua
index c5a23e4661..a910f5e2ea 100644
--- a/test/functional/ui/multigrid_spec.lua
+++ b/test/functional/ui/multigrid_spec.lua
@@ -76,7 +76,7 @@ describe('ext_multigrid', function()
it('positions windows correctly', function()
command('vsplit')
- screen:expect([[
+ screen:expect{grid=[[
## grid 1
[3:--------------------------]{12:│}[2:--------------------------]|
[3:--------------------------]{12:│}[2:--------------------------]|
@@ -118,15 +118,15 @@ describe('ext_multigrid', function()
{1:~ }|
{1:~ }|
{1:~ }|
- ]], nil, nil, function()
+ ]], condition=function()
eq({
- [2] = { win = 1000, startrow = 0, startcol = 27, width = 26, height = 12 },
- [3] = { win = 1001, startrow = 0, startcol = 0, width = 26, height = 12 }
+ [2] = { win = {id=1000}, startrow = 0, startcol = 27, width = 26, height = 12 },
+ [3] = { win = {id=1001}, startrow = 0, startcol = 0, width = 26, height = 12 }
}, screen.win_position)
- end)
+ end}
command('wincmd l')
command('split')
- screen:expect([[
+ screen:expect{grid=[[
## grid 1
[3:--------------------------]{12:│}[4:--------------------------]|
[3:--------------------------]{12:│}[4:--------------------------]|
@@ -168,16 +168,16 @@ describe('ext_multigrid', function()
{1:~ }|
{1:~ }|
{1:~ }|
- ]], nil, nil, function()
+ ]], condition=function()
eq({
- [2] = { win = 1000, startrow = 7, startcol = 27, width = 26, height = 5 },
- [3] = { win = 1001, startrow = 0, startcol = 0, width = 26, height = 12 },
- [4] = { win = 1002, startrow = 0, startcol = 27, width = 26, height = 6 }
+ [2] = { win = {id=1000}, startrow = 7, startcol = 27, width = 26, height = 5 },
+ [3] = { win = {id=1001}, startrow = 0, startcol = 0, width = 26, height = 12 },
+ [4] = { win = {id=1002}, startrow = 0, startcol = 27, width = 26, height = 6 }
}, screen.win_position)
- end)
+ end}
command('wincmd h')
command('q')
- screen:expect([[
+ screen:expect{grid=[[
## grid 1
[4:-----------------------------------------------------]|
[4:-----------------------------------------------------]|
@@ -206,12 +206,12 @@ describe('ext_multigrid', function()
{1:~ }|
{1:~ }|
{1:~ }|
- ]], nil, nil, function()
+ ]], condition=function()
eq({
- [2] = { win = 1000, startrow = 7, startcol = 0, width = 53, height = 5 },
- [4] = { win = 1002, startrow = 0, startcol = 0, width = 53, height = 6 }
+ [2] = { win = {id=1000}, startrow = 7, startcol = 0, width = 53, height = 5 },
+ [4] = { win = {id=1002}, startrow = 0, startcol = 0, width = 53, height = 6 }
}, screen.win_position)
- end)
+ end}
end)
describe('split', function ()
@@ -1206,7 +1206,7 @@ describe('ext_multigrid', function()
]])
end)
- it('handles switich tabs', function()
+ it('handles switch tabs', function()
command('vsp')
screen:expect([[
## grid 1
@@ -1271,7 +1271,7 @@ describe('ext_multigrid', function()
[4:-----------------------------------------------------]|
{11:[No Name] }|
|
- ## grid 2
+ ## grid 2 (hidden)
|
{1:~ }|
{1:~ }|
@@ -1284,7 +1284,7 @@ describe('ext_multigrid', function()
{1:~ }|
{1:~ }|
{1:~ }|
- ## grid 3
+ ## grid 3 (hidden)
|
{1:~ }|
{1:~ }|
@@ -1328,7 +1328,7 @@ describe('ext_multigrid', function()
[4:-----------------------------------------------------]|
{12:[No Name] }|
|
- ## grid 2
+ ## grid 2 (hidden)
|
{1:~ }|
{1:~ }|
@@ -1341,7 +1341,7 @@ describe('ext_multigrid', function()
{1:~ }|
{1:~ }|
{1:~ }|
- ## grid 3
+ ## grid 3 (hidden)
|
{1:~ }|
{1:~ }|
@@ -1409,13 +1409,13 @@ describe('ext_multigrid', function()
{1:~ }|
{1:~ }|
{1:~ }|
- ## grid 4
+ ## grid 4 (hidden)
|
{1:~ }|
{1:~ }|
{1:~ }|
{1:~ }|
- ## grid 5
+ ## grid 5 (hidden)
|
{1:~ }|
{1:~ }|
@@ -1440,7 +1440,7 @@ describe('ext_multigrid', function()
[4:-----------------------------------------------------]|
{12:[No Name] }|
|
- ## grid 2
+ ## grid 2 (hidden)
|
{1:~ }|
{1:~ }|
@@ -1452,7 +1452,7 @@ describe('ext_multigrid', function()
{1:~ }|
{1:~ }|
{1:~ }|
- ## grid 3
+ ## grid 3 (hidden)
|
{1:~ }|
{1:~ }|
diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua
index 9bfea28ed7..c4cfc9d8d3 100644
--- a/test/functional/ui/popupmenu_spec.lua
+++ b/test/functional/ui/popupmenu_spec.lua
@@ -1644,6 +1644,7 @@ describe('builtin popupmenu', function()
[42] = {foreground = tonumber('0x0c0c0c'), background = tonumber('0xe5a8e5')},
[43] = {background = tonumber('0x7f5d7f'), bold = true, foreground = tonumber('0x3f3f3f')},
[44] = {foreground = tonumber('0x3f3f3f'), background = tonumber('0x7f5d7f')},
+ [45] = {background = Screen.colors.WebGray, blend=0},
})
command('syntax on')
command('set mouse=a')
@@ -1761,7 +1762,7 @@ describe('builtin popupmenu', function()
Lorem ipsum d{1:ol}or sit amet, consectetur |
adipisicing elit, sed do eiusmod tempor |
bla bla incididunt^ |
- incidid{22: incididunt }{27: }d{1:ol}ore magna aliqua. |
+ incidid{45: incididunt }{27: }d{1:ol}ore magna aliqua. |
Ut enim{28: }{29:ut}{28: minim veniam}{25:,} quis nostrud |
exercit{28:a}{29:labore}{28:llamco la}{25:b}oris nisi ut aliquip ex |
{2:[No Nam}{30:e}{43:et}{30:[+] }{32: }{2: }|
diff --git a/test/functional/ui/screen.lua b/test/functional/ui/screen.lua
index 81a15cada2..df0fce4199 100644
--- a/test/functional/ui/screen.lua
+++ b/test/functional/ui/screen.lua
@@ -316,9 +316,10 @@ local ext_keys = {
-- cmdline_block: Expected ext_cmdline block (for function definitions)
-- wildmenu_items: Expected items for ext_wildmenu
-- wildmenu_pos: Expected position for ext_wildmenu
-function Screen:expect(expected, attr_ids, attr_ignore)
+function Screen:expect(expected, attr_ids, attr_ignore, ...)
local grid, condition = nil, nil
local expected_rows = {}
+ assert(next({...}) == nil, "invalid args to expect()")
if type(expected) == "table" then
assert(not (attr_ids ~= nil or attr_ignore ~= nil))
local is_key = {grid=true, attr_ids=true, attr_ignore=true, condition=true,
@@ -1211,7 +1212,11 @@ function Screen:render(headers, attr_state, preview)
local rv = {}
for igrid,grid in pairs(self._grids) do
if headers then
- table.insert(rv, "## grid "..igrid)
+ local suffix = ""
+ if igrid > 1 and self.win_position[igrid] == nil and self.float_pos[igrid] == nil then
+ suffix = " (hidden)"
+ end
+ table.insert(rv, "## grid "..igrid..suffix)
end
for i = 1, grid.height do
local cursor = self._cursor.grid == igrid and self._cursor.row == i
@@ -1491,7 +1496,7 @@ function Screen:_equal_attrs(a, b)
a.underline == b.underline and a.undercurl == b.undercurl and
a.italic == b.italic and a.reverse == b.reverse and
a.foreground == b.foreground and a.background == b.background and
- a.special == b.special
+ a.special == b.special and a.blend == b.blend
end
function Screen:_equal_info(a, b)