]> granicus.if.org Git - vim/commitdiff
patch 8.1.2288: not using all space when popup with "topleft" flips to above v8.1.2288
authorBram Moolenaar <Bram@vim.org>
Sun, 10 Nov 2019 16:51:38 +0000 (17:51 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 10 Nov 2019 16:51:38 +0000 (17:51 +0100)
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
src/testdir/dumps/Test_popupwin_nospace.dump
src/testdir/test_popupwin.vim
src/version.c

index 41839b44a0d31983158e048161ea1b5fecc189b3..405e6081ac3dac3f205ff003ac3fd2bb3549b68c 100644 (file)
@@ -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;
     }
index f062a685b5d3cb62fd7bfd5880187260816f8e3c..9eaacf066f584558f345c59b3fab0165cb5f6398 100644 (file)
@@ -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
-|-|â\95\91+0#0000001#ffd7ff255|t|w|o|â\95\91|-+0#0000000#ffffff0@1|â\95\91+0#0000001#ffd7ff255|t|w|o|â\95\91|-+0#0000000#ffffff0@8|â\95\91+0#0000001#ffd7ff255|b@2|â\95\91|-+0#0000000#ffffff0@15|â\95\94+0#0000001#ffd7ff255|â\95\90@2|â\95\97|-+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
+|-|â\95\91+0#0000001#ffd7ff255|t|w|o|â\95\91|-+0#0000000#ffffff0@1|â\95\91+0#0000001#ffd7ff255|t|w|o|â\95\91|-+0#0000000#ffffff0@8|â\95\91+0#0000001#ffd7ff255|b@2|â\95\91|-+0#0000000#ffffff0@15|â\95\91+0#0000001#ffd7ff255|t|w|o|â\95\91|-+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
index ed4a7759ee869886d27bfa8161d22a8d642bc0b9..ad3caa020cb76e1da259ab8450403d82043df3ea 100644 (file)
@@ -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',
index 34e5b2f36101907725f83bcfe926170365bf8fdb..d2baa1faccf20d4b6629d965093a89f794d698c3 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2288,
 /**/
     2287,
 /**/