patch 9.1.0949: popups inconsistently shifted to the left
Problem: popups inconsistently shifted to the left
Solution: always shift non-fixed popups to the left when the
text would be truncated
(no matter whether 'wrap' is set or not)
(Boris Staletic)
fixes: #16231
closes: #16247
Signed-off-by: Boris Staletic <boris.staletic@protonmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt
index b9e992b..b1e6c0c 100644
--- a/runtime/doc/popup.txt
+++ b/runtime/doc/popup.txt
@@ -1,4 +1,4 @@
-*popup.txt* For Vim version 9.1. Last change: 2024 Jun 16
+*popup.txt* For Vim version 9.1. Last change: 2024 Dec 19
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -705,7 +705,6 @@
present. Use zero to reset.
fixed When FALSE (the default), and:
- "pos" is "botleft" or "topleft", and
- - "wrap" is off, and
- the popup would be truncated at the right edge of
the screen, then
the popup is moved to the left so as to fit the
diff --git a/src/popupwin.c b/src/popupwin.c
index 8c56717..4045490 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -1434,17 +1434,7 @@
len = linetabsize(wp, lnum);
wp->w_width = w_width;
- if (wp->w_p_wrap)
- {
- while (len + margin_width > maxwidth)
- {
- ++wrapped;
- len -= maxwidth - margin_width;
- wp->w_width = maxwidth;
- used_maxwidth = TRUE;
- }
- }
- else if (len + margin_width > maxwidth
+ if (len + margin_width > maxwidth
&& allow_adjust_left
&& (wp->w_popup_pos == POPPOS_TOPLEFT
|| wp->w_popup_pos == POPPOS_BOTLEFT))
@@ -1456,7 +1446,6 @@
{
int truncate_shift = shift_by - wp->w_wincol;
- len -= truncate_shift;
shift_by -= truncate_shift;
}
@@ -1464,6 +1453,16 @@
maxwidth += shift_by;
wp->w_width = maxwidth;
}
+ if (wp->w_p_wrap)
+ {
+ while (len + margin_width > maxwidth)
+ {
+ ++wrapped;
+ len -= maxwidth - margin_width;
+ wp->w_width = maxwidth;
+ used_maxwidth = TRUE;
+ }
+ }
if (wp->w_width < len + margin_width)
{
wp->w_width = len + margin_width;
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index d345b3e..8b6b78f 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -31,7 +31,7 @@
\ .. "#{text: 'a comment line', props: [#{"
\ .. "col: 3, length: 7, minwidth: 20, type: 'comment'"
\ .. "}]},"
- \ .. "], #{line: 4, col: 9, minwidth: 20})\<CR>")
+ \ .. "], #{line: 4, col: 9, minwidth: 20, fixed: v:true})\<CR>")
call VerifyScreenDump(buf, 'Test_popupwin_02', {})
" switch back to first tabpage
@@ -87,7 +87,7 @@
call popup_create('hello both', #{line: 2, col: 43, border: [], padding: [], highlight: 'Normal'})
call popup_create('border TL', #{line: 6, col: 3, border: [1, 0, 0, 4]})
call popup_create('paddings', #{line: 6, col: 23, padding: range(1, 4)})
- call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
+ call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1], fixed: v:true})
call popup_create('right aligned text', #{line: 11, col: 56, wrap: 0, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
call popup_create('X', #{line: 2, col: 73})
call popup_create('X', #{line: 3, col: 74})
@@ -1970,7 +1970,7 @@
" Anything placed past the last cell on the right of the screen is moved to
" the left.
"
- " When wrapping is disabled, we also shift to the left to display on the
+ " We also shift to the left to display on the
" screen, unless fixed is set.
" Entries for cases which don't vary based on wrapping.
@@ -1995,9 +1995,10 @@
" - expected height
let tests = [
\ #{
- \ comment: 'left-aligned with wrapping',
+ \ comment: 'left aligned with wrapping, fixed position',
\ options: #{
\ wrap: 1,
+ \ fixed: v:true,
\ pos: 'botleft',
\ },
\ tests: both_wrap_tests + [
@@ -2022,9 +2023,22 @@
\ ],
\ },
\ #{
- \ comment: 'left aligned without wrapping',
+ \ comment: 'left aligned with wrapping, no fixed position',
+ \ options: #{
+ \ wrap: 1,
+ \ fixed: v:false,
+ \ pos: 'botleft',
+ \ },
+ \ tests: both_wrap_tests + [
+ \ [ repeat('a', &columns*3), 5, &columns, 3, 1, &columns, 3],
+ \ [ repeat('a', 50), 5, &columns, 5, &columns - 50 + 1, 50, 1],
+ \ ],
+ \ },
+ \ #{
+ \ comment: 'left aligned without wrapping, no fixed position',
\ options: #{
\ wrap: 0,
+ \ fixed: v:false,
\ pos: 'botleft',
\ },
\ tests: both_wrap_tests + [
@@ -2048,7 +2062,7 @@
\ ],
\ },
\ #{
- \ comment: 'left aligned with fixed position',
+ \ comment: 'left aligned without wrapping, fixed position',
\ options: #{
\ wrap: 0,
\ fixed: 1,
diff --git a/src/version.c b/src/version.c
index 00088ff..762919e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 949,
+/**/
948,
/**/
947,