feat(ui): indicate margins for the area used by win_viewport

Problem: using win_viewport for implementing smooth scrolling in an external
UI might run into problems when winbar or borders is used, as there is
no indication that the entire grid is not used for scrolled buffer text.

Solution: add `win_viewport_margins` event.
This commit is contained in:
bfredl
2024-03-28 15:27:32 +01:00
parent e2224a7933
commit 2e4e12756a
6 changed files with 68 additions and 2 deletions

View File

@@ -1536,7 +1536,12 @@ describe('float window', function()
}, win_viewport={
[2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
[4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 2, sum_scroll_delta = 0};
}}
},
win_viewport_margins={
[2] = {win = 1000, top = 0, bottom = 0, left = 0, right = 0};
[4] = {win = 1001, top = 1, bottom = 1, left = 1, right = 1};
}
}
else
screen:expect{grid=[[
^ |
@@ -1736,7 +1741,12 @@ describe('float window', function()
}, win_viewport={
[2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
[4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 2, sum_scroll_delta = 0};
}}
},
win_viewport_margins={
[2] = {win = 1000, top = 0, bottom = 0, left = 0, right = 0};
[4] = {win = 1001, top = 0, bottom = 0, left = 1, right = 1};
}
}
else
screen:expect{grid=[[
^ |
@@ -1769,6 +1779,10 @@ describe('float window', function()
}, win_viewport={
[2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
[4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 2, sum_scroll_delta = 0};
},
win_viewport_margins={
[2] = {win = 1000, top = 0, bottom = 0, left = 0, right = 0};
[4] = {win = 1001, top = 1, bottom = 1, left = 0, right = 0};
}}
else
screen:expect{grid=[[
@@ -1814,6 +1828,10 @@ describe('float window', function()
}, win_viewport={
[2] = {win = 1000, topline = 0, botline = 6, curline = 5, curcol = 0, linecount = 6, sum_scroll_delta = 0};
[4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 2, sum_scroll_delta = 0};
},
win_viewport_margins={
[2] = {win = 1000, top = 0, bottom = 0, left = 0, right = 0};
[4] = {win = 1001, top = 0, bottom = 1, left = 0, right = 1};
}}
else
screen:expect{grid=[[
@@ -8361,6 +8379,10 @@ describe('float window', function()
}, win_viewport={
[2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
[4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
},
win_viewport_margins={
[2] = {win = 1000, top = 0, bottom = 0, left = 0, right = 0};
[4] = {win = 1001, top = 2, bottom = 1, left = 1, right = 1};
}}
else
screen:expect{grid=[[

View File

@@ -2354,6 +2354,9 @@ describe('ext_multigrid', function()
]], win_viewport={
[2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
[4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
}, win_viewport_margins={
[2] = {win = 1000, top = 0, bottom = 0, left = 0, right = 0};
[4] = {win = 1001, top = 0, bottom = 0, left = 0, right = 0};
}}
-- XXX: hack to get notifications. Could use next_msg() also.
@@ -2384,6 +2387,9 @@ describe('ext_multigrid', function()
]], win_viewport={
[2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
[4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
}, win_viewport_margins={
[2] = {win = 1000, top = 0, bottom = 0, left = 0, right = 0};
[4] = {win = 1001, top = 1, bottom = 0, left = 0, right = 0};
}}
eq({}, win_pos)
@@ -2406,6 +2412,9 @@ describe('ext_multigrid', function()
]], win_viewport={
[2] = {win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
[4] = {win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0};
}, win_viewport_margins={
[2] = {win = 1000, top = 0, bottom = 0, left = 0, right = 0};
[4] = {win = 1001, top = 0, bottom = 0, left = 0, right = 0};
}}
eq({}, win_pos)
end)

View File

@@ -204,6 +204,7 @@ function Screen.new(width, height)
wildmenu_selected = nil,
win_position = {},
win_viewport = {},
win_viewport_margins = {},
float_pos = {},
msg_grid = nil,
msg_grid_pos = nil,
@@ -337,6 +338,7 @@ local ext_keys = {
'ruler',
'float_pos',
'win_viewport',
'win_viewport_margins',
}
local expect_keys = {
@@ -621,6 +623,9 @@ screen:redraw_debug() to show all intermediate screen states.]]
if expected.win_viewport == nil then
extstate.win_viewport = nil
end
if expected.win_viewport_margins == nil then
extstate.win_viewport_margins = nil
end
if expected.float_pos then
expected.float_pos = deepcopy(expected.float_pos)
@@ -993,6 +998,7 @@ function Screen:_handle_grid_destroy(grid)
if self._options.ext_multigrid then
self.win_position[grid] = nil
self.win_viewport[grid] = nil
self.win_viewport_margins[grid] = nil
end
end
@@ -1048,6 +1054,16 @@ function Screen:_handle_win_viewport(
}
end
function Screen:_handle_win_viewport_margins(grid, win, top, bottom, left, right)
self.win_viewport_margins[grid] = {
win = win,
top = top,
bottom = bottom,
left = left,
right = right,
}
end
function Screen:_handle_win_float_pos(grid, ...)
self.win_position[grid] = nil
self.float_pos[grid] = { ... }
@@ -1466,6 +1482,8 @@ function Screen:_extstate_repr(attr_state)
end
local win_viewport = (next(self.win_viewport) and self.win_viewport) or nil
local win_viewport_margins = (next(self.win_viewport_margins) and self.win_viewport_margins)
or nil
return {
popupmenu = self.popupmenu,
@@ -1480,6 +1498,7 @@ function Screen:_extstate_repr(attr_state)
msg_history = msg_history,
float_pos = self.float_pos,
win_viewport = win_viewport,
win_viewport_margins = win_viewport_margins,
}
end