mirror of
https://github.com/neovim/neovim.git
synced 2025-11-15 06:49:01 +00:00
fix(pum): crash when resizing grid with pumborder set (#36404)
Problem: Grid size check didn't account for border_width, causing row index out of bounds when drawing bordered popup menu. Solution: Check grid.rows against pum_height + border_width.
This commit is contained in:
@@ -660,7 +660,8 @@ void pum_redraw(void)
|
|||||||
pum_invalid = false;
|
pum_invalid = false;
|
||||||
must_redraw_pum = false;
|
must_redraw_pum = false;
|
||||||
|
|
||||||
if (!pum_grid.chars || pum_grid.rows != pum_height || pum_grid.cols != grid_width) {
|
if (!pum_grid.chars || pum_grid.rows != pum_height + border_width
|
||||||
|
|| pum_grid.cols != grid_width + border_width) {
|
||||||
grid_alloc(&pum_grid, pum_height + border_width, grid_width + border_width,
|
grid_alloc(&pum_grid, pum_height + border_width, grid_width + border_width,
|
||||||
!invalid_grid, false);
|
!invalid_grid, false);
|
||||||
ui_call_grid_resize(pum_grid.handle, pum_grid.cols, pum_grid.rows);
|
ui_call_grid_resize(pum_grid.handle, pum_grid.cols, pum_grid.rows);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ local eq = t.eq
|
|||||||
local pcall_err = t.pcall_err
|
local pcall_err = t.pcall_err
|
||||||
local exec_lua = n.exec_lua
|
local exec_lua = n.exec_lua
|
||||||
local exec = n.exec
|
local exec = n.exec
|
||||||
|
local poke_eventloop = n.poke_eventloop
|
||||||
|
|
||||||
describe('ui/ext_popupmenu', function()
|
describe('ui/ext_popupmenu', function()
|
||||||
local screen
|
local screen
|
||||||
@@ -9343,6 +9344,39 @@ describe('builtin popupmenu', function()
|
|||||||
]])
|
]])
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
it("no crash when 'pumborder' set #36337", function()
|
||||||
|
command('set autocomplete pumborder=rounded complete=o cot=popup,menuone,noinsert')
|
||||||
|
command('set columns=50 lines=20')
|
||||||
|
exec_lua(function()
|
||||||
|
local list1 = {
|
||||||
|
{ abbr = 'array: ', info = '', kind = 'Field', word = 'array: ' },
|
||||||
|
{ abbr = 'arrays: ', info = '', kind = 'Field', word = 'arrays: ' },
|
||||||
|
}
|
||||||
|
local list2 = {
|
||||||
|
{ abbr = 'match ', info = '', kind = 'Keyword', word = 'match ' },
|
||||||
|
{ abbr = 'throw ', info = '', kind = 'Keyword', word = 'throw ' },
|
||||||
|
{ abbr = 'array: ', info = '', kind = 'Field', word = 'array: ' },
|
||||||
|
{ abbr = 'arrays: ', info = '', kind = 'Field', word = 'arrays: ' },
|
||||||
|
}
|
||||||
|
_G.fake_omni = function(_, _)
|
||||||
|
local line = vim.api.nvim_get_current_line()
|
||||||
|
if line:find('%s%)$') then
|
||||||
|
vim.schedule(function()
|
||||||
|
vim.fn.complete(25, list1)
|
||||||
|
vim.fn.complete(25, list2)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
return -2
|
||||||
|
end
|
||||||
|
vim.opt.omnifunc = 'v:lua.fake_omni'
|
||||||
|
vim.api.nvim_buf_set_lines(0, 0, -1, true, { '<?php', 'array_intersect_key($x)' })
|
||||||
|
vim.cmd.normal('G$')
|
||||||
|
end)
|
||||||
|
feed('i, ')
|
||||||
|
poke_eventloop()
|
||||||
|
assert_alive()
|
||||||
|
eq({ 4, 1 }, { #fn.complete_info({ 'items' }).items, fn.pumvisible() })
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user