summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-27 22:40:37 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-27 22:40:37 +0200
commit0aac67a4314d72a29d3fbee91b6f0ba89e950462 (patch)
tree7842e51a903e38f9b91d8f81f1f7859b6ac95966 /src
parentb13ab99908097d54e21ab5adad22f4ad2a8ec688 (diff)
downloadvim-git-0aac67a4314d72a29d3fbee91b6f0ba89e950462.tar.gz
patch 8.2.1307: popup window width does not include number of sign columnsv8.2.1307
Problem: popup window width does not include number, fold of sign column width. Solution: Take number, fold and sign column with into account.
Diffstat (limited to 'src')
-rw-r--r--src/popupwin.c27
-rw-r--r--src/testdir/dumps/Test_popupwin_sign_2.dump10
-rw-r--r--src/testdir/test_popupwin.vim10
-rw-r--r--src/version.c2
4 files changed, 43 insertions, 6 deletions
diff --git a/src/popupwin.c b/src/popupwin.c
index d2b7f22f0..3bd8e7314 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -1111,6 +1111,7 @@ popup_adjust_position(win_T *wp)
int wrapped = 0;
int maxwidth;
int used_maxwidth = FALSE;
+ int margin_width = 0;
int maxspace;
int center_vert = FALSE;
int center_hor = FALSE;
@@ -1249,6 +1250,19 @@ popup_adjust_position(win_T *wp)
allow_adjust_left = FALSE;
maxwidth = wp->w_maxwidth;
}
+
+ if (wp->w_p_nu || wp->w_p_rnu)
+ margin_width = number_width(wp) + 1;
+#ifdef FEAT_FOLDING
+ margin_width += wp->w_p_fdc;
+#endif
+#ifdef FEAT_SIGNS
+ if (signcolumn_on(wp))
+ margin_width += 2;
+#endif
+ if (margin_width >= maxwidth)
+ margin_width = maxwidth - 1;
+
minwidth = wp->w_minwidth;
minheight = wp->w_minheight;
#ifdef FEAT_TERMINAL
@@ -1289,6 +1303,7 @@ popup_adjust_position(win_T *wp)
// Count Tabs for what they are worth and compute the length based on
// the maximum width (matters when 'showbreak' is set).
+ // "margin_width" is added to "len" where it matters.
if (wp->w_width < maxwidth)
wp->w_width = maxwidth;
len = win_linetabsize(wp, ml_get_buf(wp->w_buffer, lnum, FALSE),
@@ -1297,21 +1312,21 @@ popup_adjust_position(win_T *wp)
if (wp->w_p_wrap)
{
- while (len > maxwidth)
+ while (len + margin_width > maxwidth)
{
++wrapped;
- len -= maxwidth;
+ len -= maxwidth - margin_width;
wp->w_width = maxwidth;
used_maxwidth = TRUE;
}
}
- else if (len > maxwidth
+ else if (len + margin_width > maxwidth
&& allow_adjust_left
&& (wp->w_popup_pos == POPPOS_TOPLEFT
|| wp->w_popup_pos == POPPOS_BOTLEFT))
{
// adjust leftwise to fit text on screen
- int shift_by = len - maxwidth;
+ int shift_by = len + margin_width - maxwidth;
if (shift_by > wp->w_wincol)
{
@@ -1325,9 +1340,9 @@ popup_adjust_position(win_T *wp)
maxwidth += shift_by;
wp->w_width = maxwidth;
}
- if (wp->w_width < len)
+ if (wp->w_width < len + margin_width)
{
- wp->w_width = len;
+ wp->w_width = len + margin_width;
if (wp->w_maxwidth > 0 && wp->w_width > wp->w_maxwidth)
wp->w_width = wp->w_maxwidth;
}
diff --git a/src/testdir/dumps/Test_popupwin_sign_2.dump b/src/testdir/dumps/Test_popupwin_sign_2.dump
new file mode 100644
index 000000000..ddccde1e3
--- /dev/null
+++ b/src/testdir/dumps/Test_popupwin_sign_2.dump
@@ -0,0 +1,10 @@
+|>+0#e000002#ffffff0@1>0+0#ffffff16#ff404010| @71
+| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @13| +0#0000e05#a8a8a8255@1|#+0#ffffff16#ff404010|!| +0#af5f00255#ffd7ff255@1|1| |a+0#0000001#ffff4012| |l|o|n|g|e|r| |l|i|n|e| |t|o| |c|h|e|c|k| |t|h|e| |w|i|d|t|h| +0#0000000#ffffff0@17
+| +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @71
+|:|c|a|l@1| |S|e|t|O|p|t|i|o|n|s|(|)| @38|1|,|1| @10|T|o|p|
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index beb6870b6..00b956a9e 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -3375,12 +3375,22 @@ func Test_popupwin_sign()
call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
" add sign to popup buffer, does not show
call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
+
+ func SetOptions()
+ call setwinvar(g:winid, '&number', 1)
+ call setwinvar(g:winid, '&foldcolumn', 2)
+ call popup_settext(g:winid, 'a longer line to check the width')
+ endfunc
END
call writefile(lines, 'XtestPopupSign')
let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
+ " set more options to check the width is adjusted
+ call term_sendkeys(buf, ":call SetOptions()\<CR>")
+ call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
+
call StopVimInTerminal(buf)
call delete('XtestPopupSign')
endfunc
diff --git a/src/version.c b/src/version.c
index a87cc89d3..78aafb8e3 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1307,
+/**/
1306,
/**/
1305,