Patch 8.1.1420
Problem: Popup window size only uses first line length.
Solution: Use the longest line. (Ben Jackson, closes #4451) Also deal with
wrapping lines.
Files: src/popupwin.c, src/testdir/test_popupwin.vim
*** ../vim-8.1.1419/src/popupwin.c 2019-05-29 21:44:30.764788713 +0200
--- src/popupwin.c 2019-05-29 23:02:05.528300268 +0200
***************
*** 154,159 ****
--- 154,163 ----
static void
popup_adjust_position(win_T *wp)
{
+ linenr_T lnum;
+ int wrapped = 0;
+ int maxwidth;
+
// TODO: Compute the size and position properly.
if (wp->w_wantline > 0)
wp->w_winrow = wp->w_wantline - 1;
***************
*** 171,188 ****
if (wp->w_wincol >= Columns - 3)
wp->w_wincol = Columns - 3;
! // TODO: set width based on longest text line and the 'wrap' option
! wp->w_width = vim_strsize(ml_get_buf(wp->w_buffer, 1, FALSE));
if (wp->w_minwidth > 0 && wp->w_width < wp->w_minwidth)
wp->w_width = wp->w_minwidth;
! if (wp->w_maxwidth > 0 && wp->w_width > wp->w_maxwidth)
! wp->w_width = wp->w_maxwidth;
! if (wp->w_width > Columns - wp->w_wincol)
! wp->w_width = Columns - wp->w_wincol;
if (wp->w_height <= 1)
! // TODO: adjust height for wrapped lines
! wp->w_height = wp->w_buffer->b_ml.ml_line_count;
if (wp->w_minheight > 0 && wp->w_height < wp->w_minheight)
wp->w_height = wp->w_minheight;
if (wp->w_maxheight > 0 && wp->w_height > wp->w_maxheight)
--- 175,208 ----
if (wp->w_wincol >= Columns - 3)
wp->w_wincol = Columns - 3;
! maxwidth = Columns - wp->w_wincol;
! if (wp->w_maxwidth > 0 && maxwidth > wp->w_maxwidth)
! maxwidth = wp->w_maxwidth;
!
! // Compute width based on longest text line and the 'wrap' option.
! // TODO: more accurate wrapping
! wp->w_width = 0;
! for (lnum = 1; lnum <= wp->w_buffer->b_ml.ml_line_count; ++lnum)
! {
! int len = vim_strsize(ml_get_buf(wp->w_buffer, lnum, FALSE));
!
! while (wp->w_p_wrap && len > maxwidth)
! {
! ++wrapped;
! len -= maxwidth;
! wp->w_width = maxwidth;
! }
! if (wp->w_width < len)
! wp->w_width = len;
! }
!
if (wp->w_minwidth > 0 && wp->w_width < wp->w_minwidth)
wp->w_width = wp->w_minwidth;
! if (wp->w_width > maxwidth)
! wp->w_width = maxwidth;
if (wp->w_height <= 1)
! wp->w_height = wp->w_buffer->b_ml.ml_line_count + wrapped;
if (wp->w_minheight > 0 && wp->w_height < wp->w_minheight)
wp->w_height = wp->w_minheight;
if (wp->w_maxheight > 0 && wp->w_height > wp->w_maxheight)
*** ../vim-8.1.1419/src/testdir/test_popupwin.vim 2019-05-29
20:26:32.525530253 +0200
--- src/testdir/test_popupwin.vim 2019-05-29 23:08:49.922611877 +0200
***************
*** 176,178 ****
--- 176,214 ----
call popup_close(winid)
endfunc
+
+ func Test_popup_width_longest()
+ let tests = [
+ \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
+ \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
+ \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
+ \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
+ \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
+ \ ]
+
+ for test in tests
+ let winid = popup_create(test[0], {'line': 2, 'col': 3})
+ redraw
+ let position = popup_getposition(winid)
+ call assert_equal(test[1], position.width)
+ call popup_close(winid)
+ endfor
+ endfunc
+
+ func Test_popup_wraps()
+ let tests = [
+ \ ['nowrap', 6, 1],
+ \ ['a line that wraps once', 12, 2],
+ \ ['a line that wraps two times', 12, 3],
+ \ ]
+ for test in tests
+ let winid = popup_create(test[0],
+ \ {'line': 2, 'col': 3, 'maxwidth': 12})
+ redraw
+ let position = popup_getposition(winid)
+ call assert_equal(test[1], position.width)
+ call assert_equal(test[2], position.height)
+
+ call popup_close(winid)
+ endfor
+ endfunc
*** ../vim-8.1.1419/src/version.c 2019-05-29 22:28:25.763184805 +0200
--- src/version.c 2019-05-29 22:53:50.798934188 +0200
***************
*** 769,770 ****
--- 769,772 ----
{ /* Add new patch number below this line */
+ /**/
+ 1420,
/**/
--
hundred-and-one symptoms of being an internet addict:
48. You get a tatoo that says "This body best viewed with Netscape 3.1 or
higher."
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/201905292114.x4TLEhdl027604%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.