aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-06-30 08:36:09 +0800
committerGitHub <noreply@github.com>2023-06-30 08:36:09 +0800
commitd7bb19e0138c7363ed40c142972c07e4e1912785 (patch)
tree5fe1e81723319cc4b8a6bc88a42fc2c69ae68f17
parent8758c6fb875ff5446c0dff2166e9c3392c2c31d6 (diff)
downloadrneovim-d7bb19e0138c7363ed40c142972c07e4e1912785.tar.gz
rneovim-d7bb19e0138c7363ed40c142972c07e4e1912785.tar.bz2
rneovim-d7bb19e0138c7363ed40c142972c07e4e1912785.zip
fix(statusline): fill for double-width char after moving items (#24207)
-rw-r--r--src/nvim/statusline.c23
-rw-r--r--test/functional/ui/tabline_spec.lua73
2 files changed, 73 insertions, 23 deletions
diff --git a/src/nvim/statusline.c b/src/nvim/statusline.c
index dd602ddf87..f2502fe1e3 100644
--- a/src/nvim/statusline.c
+++ b/src/nvim/statusline.c
@@ -263,6 +263,7 @@ void stl_fill_click_defs(StlClickDefinition *click_defs, StlClickRecord *click_r
};
for (int i = 0; click_recs[i].start != NULL; i++) {
len += vim_strnsize(buf, (int)(click_recs[i].start - buf));
+ assert(len <= width);
if (col < len) {
while (col < len) {
click_defs[col++] = cur_click_def;
@@ -2052,17 +2053,6 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, char *opt_n
// Put a `<` to mark where we truncated at
*trunc_p = '<';
-
- if (width + 1 < maxwidth) {
- // Advance the pointer to the end of the string
- trunc_p = trunc_p + strlen(trunc_p);
- }
-
- // Fill up for half a double-wide character.
- while (++width < maxwidth) {
- MB_CHAR2BYTES(fillchar, trunc_p);
- *trunc_p = NUL;
- }
// }
// { Change the start point for items based on
@@ -2084,6 +2074,17 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, char *opt_n
}
}
// }
+
+ if (width + 1 < maxwidth) {
+ // Advance the pointer to the end of the string
+ trunc_p = trunc_p + strlen(trunc_p);
+ }
+
+ // Fill up for half a double-wide character.
+ while (++width < maxwidth) {
+ MB_CHAR2BYTES(fillchar, trunc_p);
+ *trunc_p = NUL;
+ }
}
width = maxwidth;
diff --git a/test/functional/ui/tabline_spec.lua b/test/functional/ui/tabline_spec.lua
index 2cdec62d01..befdb7c5d1 100644
--- a/test/functional/ui/tabline_spec.lua
+++ b/test/functional/ui/tabline_spec.lua
@@ -1,6 +1,9 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local clear, command, eq = helpers.clear, helpers.command, helpers.eq
+local insert = helpers.insert
+local meths = helpers.meths
+local assert_alive = helpers.assert_alive
describe('ui/ext_tabline', function()
local screen
@@ -92,6 +95,10 @@ describe("tabline", function()
clear()
screen = Screen.new(42, 5)
screen:attach()
+ screen:set_default_attr_ids({
+ [0] = {bold = true, foreground = Screen.colors.Blue}; -- NonText
+ [1] = {reverse = true}; -- TabLineFill
+ })
end)
it('redraws when tabline option is set', function()
@@ -100,24 +107,18 @@ describe("tabline", function()
screen:expect{grid=[[
{1:asdf }|
^ |
- {2:~ }|
- {2:~ }|
+ {0:~ }|
+ {0:~ }|
|
- ]], attr_ids={
- [1] = {reverse = true};
- [2] = {bold = true, foreground = Screen.colors.Blue1};
- }}
+ ]]}
command('set tabline=jkl')
screen:expect{grid=[[
{1:jkl }|
^ |
- {2:~ }|
- {2:~ }|
+ {0:~ }|
+ {0:~ }|
|
- ]], attr_ids={
- [1] = {reverse = true};
- [2] = {bold = true, foreground = Screen.colors.Blue};
- }}
+ ]]}
end)
it('click definitions do not leak memory #21765', function()
@@ -125,4 +126,52 @@ describe("tabline", function()
command('set showtabline=2')
command('redrawtabline')
end)
+
+ it('clicks work with truncated double-width label #24187', function()
+ insert('tab1')
+ command('tabnew')
+ insert('tab2')
+ command('tabprev')
+ meths.set_option_value('tabline', '%1T口口%2Ta' .. ('b'):rep(38) .. '%999Xc', {})
+ screen:expect{grid=[[
+ {1:<abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc }|
+ tab^1 |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]]}
+ assert_alive()
+ meths.input_mouse('left', 'press', '', 0, 0, 1)
+ screen:expect{grid=[[
+ {1:<abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc }|
+ tab^2 |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]]}
+ meths.input_mouse('left', 'press', '', 0, 0, 0)
+ screen:expect{grid=[[
+ {1:<abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc }|
+ tab^1 |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]]}
+ meths.input_mouse('left', 'press', '', 0, 0, 39)
+ screen:expect{grid=[[
+ {1:<abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc }|
+ tab^2 |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]]}
+ meths.input_mouse('left', 'press', '', 0, 0, 40)
+ screen:expect{grid=[[
+ tab^1 |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]]}
+ end)
end)