From 5c6b6187ac51a4d8545e823c1be6cdf70cac8a57 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 10 Nov 2019 17:51:38 +0100 Subject: patch 8.1.2288: not using all space when popup with "topleft" flips to above Problem: Not using all space when popup with "topleft" flips to above. Solution: Recompute the height when a popup flips from below to above. (closes #5151) --- src/popupwin.c | 12 +++++++++++- src/testdir/dumps/Test_popupwin_nospace.dump | 12 ++++++------ src/testdir/test_popupwin.vim | 4 ++-- src/version.c | 2 ++ 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/popupwin.c b/src/popupwin.c index 41839b44a..405e6081a 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -1102,6 +1102,7 @@ popup_adjust_position(win_T *wp) int left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3]; int extra_height = top_extra + bot_extra; int extra_width = left_extra + right_extra; + int w_height_before_limit; int org_winrow = wp->w_winrow; int org_wincol = wp->w_wincol; int org_width = wp->w_width; @@ -1399,6 +1400,7 @@ popup_adjust_position(win_T *wp) wp->w_height = wp->w_minheight; if (wp->w_maxheight > 0 && wp->w_height > wp->w_maxheight) wp->w_height = wp->w_maxheight; + w_height_before_limit = wp->w_height; if (wp->w_height > Rows - wp->w_winrow) wp->w_height = Rows - wp->w_winrow; if (wp->w_height != org_height) @@ -1434,9 +1436,17 @@ popup_adjust_position(win_T *wp) if (wantline + (wp->w_height + extra_height) - 1 > Rows && wantline * 2 > Rows && (wp->w_popup_flags & POPF_POSINVERT)) + { // top aligned and not enough space below but there is space above: - // make bottom aligned + // make bottom aligned and recompute the height + wp->w_height = w_height_before_limit; wp->w_winrow = wantline - 2 - wp->w_height - extra_height; + if (wp->w_winrow < 0) + { + wp->w_height += wp->w_winrow; + wp->w_winrow = 0; + } + } else wp->w_winrow = wantline - 1; } diff --git a/src/testdir/dumps/Test_popupwin_nospace.dump b/src/testdir/dumps/Test_popupwin_nospace.dump index f062a685b..9eaacf066 100644 --- a/src/testdir/dumps/Test_popupwin_nospace.dump +++ b/src/testdir/dumps/Test_popupwin_nospace.dump @@ -1,9 +1,9 @@ -|-+0&#ffffff0|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@1|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@8|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@32| @14 -|-|║+0#0000001#ffd7ff255|o|n|e|║|-+0#0000000#ffffff0@1|║+0#0000001#ffd7ff255|o|n|e|║|-+0#0000000#ffffff0@8|║+0#0000001#ffd7ff255|a@2|║|-+0#0000000#ffffff0@32| @14 -|-|║+0#0000001#ffd7ff255|t|w|o|║|-+0#0000000#ffffff0@1|║+0#0000001#ffd7ff255|t|w|o|║|-+0#0000000#ffffff0@8|║+0#0000001#ffd7ff255|b@2|║|-+0#0000000#ffffff0@15|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@11| @14 -|-|╚+0#0000001#ffd7ff255|═@2|╝|-+0#0000000#ffffff0@1|╚+0#0000001#ffd7ff255|═@2|╝|-+0#0000000#ffffff0@8|║+0#0000001#ffd7ff255|c@2|║|-+0#0000000#ffffff0@15|║+0#0000001#ffd7ff255|o|n|e|║|-+0#0000000#ffffff0@11| @14 -|-|@|-@5|#|-@5|%|-@5|║+0#0000001#ffd7ff255|d@2|║|-+0#0000000#ffffff0@15|║+0#0000001#ffd7ff255|t|w|o|║|-+0#0000000#ffffff0@1>*|-@8| @14 -|-@14|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@1|║+0#0000001#ffd7ff255|e@2|║|-+0#0000000#ffffff0@15|║+0#0000001#ffd7ff255|t|e@1|║|-+0#0000000#ffffff0@1|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@4| @14 +|-+0&#ffffff0|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@1|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@8|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@15|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@11| @14 +|-|║+0#0000001#ffd7ff255|o|n|e|║|-+0#0000000#ffffff0@1|║+0#0000001#ffd7ff255|o|n|e|║|-+0#0000000#ffffff0@8|║+0#0000001#ffd7ff255|a@2|║|-+0#0000000#ffffff0@15|║+0#0000001#ffd7ff255|o|n|e|║|-+0#0000000#ffffff0@11| @14 +|-|║+0#0000001#ffd7ff255|t|w|o|║|-+0#0000000#ffffff0@1|║+0#0000001#ffd7ff255|t|w|o|║|-+0#0000000#ffffff0@8|║+0#0000001#ffd7ff255|b@2|║|-+0#0000000#ffffff0@15|║+0#0000001#ffd7ff255|t|w|o|║|-+0#0000000#ffffff0@11| @14 +|-|╚+0#0000001#ffd7ff255|═@2|╝|-+0#0000000#ffffff0@1|╚+0#0000001#ffd7ff255|═@2|╝|-+0#0000000#ffffff0@8|║+0#0000001#ffd7ff255|c@2|║|-+0#0000000#ffffff0@15|║+0#0000001#ffd7ff255|t|e@1|║|-+0#0000000#ffffff0@11| @14 +|-|@|-@5|#|-@5|%|-@5|║+0#0000001#ffd7ff255|d@2|║|-+0#0000000#ffffff0@15|║+0#0000001#ffd7ff255|f|o|u|║|-+0#0000000#ffffff0@1>*|-@8| @14 +|-@14|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@1|║+0#0000001#ffd7ff255|e@2|║|-+0#0000000#ffffff0@15|║+0#0000001#ffd7ff255|f|i|v|║|-+0#0000000#ffffff0@1|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@4| @14 |-@14|║+0#0000001#ffd7ff255|o|n|e|║|-+0#0000000#ffffff0@1|╚+0#0000001#ffd7ff255|═@2|╝|-+0#0000000#ffffff0@15|╚+0#0000001#ffd7ff255|═@2|╝|-+0#0000000#ffffff0@1|║+0#0000001#ffd7ff255|a@2|║|-+0#0000000#ffffff0@4| @14 |-@14|║+0#0000001#ffd7ff255|t|w|o|║|-+0#0000000#ffffff0@1|*|-@5|@|-@5|#|-@5|%|-@5|║+0#0000001#ffd7ff255|b@2|║|-+0#0000000#ffffff0@4| @14 |-@14|║+0#0000001#ffd7ff255|t|e@1|║|-+0#0000000#ffffff0@8|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@1|╔+0#0000001#ffd7ff255|═@2|╗|-+0#0000000#ffffff0@8|║+0#0000001#ffd7ff255|c@2|║|-+0#0000000#ffffff0@4| @14 diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim index ed4a7759e..ad3caa020 100644 --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -389,9 +389,9 @@ func Test_popup_nospace() \ border: [], \ }) " cursor in a line in top half, using "topleft" with popup that - " doesn't fit and "posinvert" set: flips to below. + " doesn't fit and "posinvert" set: flips to above. normal 8G44|r% - let winid1 = popup_create(['one', 'two', 'tee'], #{ + let winid1 = popup_create(['one', 'two', 'tee', 'fou', 'fiv'], #{ \ line: 'cursor+1', \ col: 'cursor', \ pos: 'topleft', diff --git a/src/version.c b/src/version.c index 34e5b2f36..d2baa1fac 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2288, /**/ 2287, /**/ -- cgit v1.2.1