# HG changeset patch # User Bram Moolenaar # Date 1559483105 -7200 # Node ID 16fd1bb2e675483b1fe340def3e138ebdb46651b # Parent 84c04459c23d7aec30ca51aceeff8fb483e81ac3 patch 8.1.1450: popup window positioning wrong when using padding or borders commit https://github.com/vim/vim/commit/399d898ac1e6e587088b5bdd6e36eca4998bc1eb Author: Bram Moolenaar Date: Sun Jun 2 15:34:29 2019 +0200 patch 8.1.1450: popup window positioning wrong when using padding or borders Problem: Popup window positioning wrong when using padding or borders. Solution: Fix computing the position. diff --git a/src/popupwin.c b/src/popupwin.c --- a/src/popupwin.c +++ b/src/popupwin.c @@ -382,6 +382,12 @@ popup_adjust_position(win_T *wp) int center_vert = FALSE; int center_hor = FALSE; int allow_adjust_left = !wp->w_popup_fixed; + int top_extra = wp->w_popup_border[0] + wp->w_popup_padding[0]; + int right_extra = wp->w_popup_border[1] + wp->w_popup_padding[1]; + int bot_extra = wp->w_popup_border[2] + wp->w_popup_padding[2]; + 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; wp->w_winrow = 0; wp->w_wincol = 0; @@ -474,8 +480,8 @@ popup_adjust_position(win_T *wp) { // Right aligned: move to the right if needed. // No truncation, because that would change the height. - if (wp->w_width < wp->w_wantcol) - wp->w_wincol = wp->w_wantcol - wp->w_width; + if (wp->w_width + extra_width < wp->w_wantcol) + wp->w_wincol = wp->w_wantcol - (wp->w_width + extra_width); } if (wp->w_height <= 1) @@ -492,9 +498,9 @@ popup_adjust_position(win_T *wp) else if (wp->w_popup_pos == POPPOS_BOTRIGHT || wp->w_popup_pos == POPPOS_BOTLEFT) { - if (wp->w_height <= wp->w_wantline) + if ((wp->w_height + extra_height) <= wp->w_wantline) // bottom aligned: may move down - wp->w_winrow = wp->w_wantline - wp->w_height; + wp->w_winrow = wp->w_wantline - (wp->w_height + extra_height); else // not enough space, make top aligned wp->w_winrow = wp->w_wantline + 1; diff --git a/src/testdir/dumps/Test_popupwin_corners.dump b/src/testdir/dumps/Test_popupwin_corners.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_corners.dump @@ -0,0 +1,12 @@ +|-+0&#ffffff0@59| @14 +|-@1|#|-@20|@|-@34| @14 +|-@1|╔+0#0000001#ffd7ff255|═@7|╗|-+0#0000000#ffffff0@2|╔+0#0000001#ffd7ff255|═@7|╗|-+0#0000000#ffffff0@2|╔+0#0000001#ffd7ff255|═@7|╗|-+0#0000000#ffffff0@2|╔+0#0000001#ffd7ff255|═@7|╗|-+0#0000000#ffffff0@8| @14 +|-@1|║+0#0000001#ffd7ff255| @7|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| @7|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| @7|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| @7|║|-+0#0000000#ffffff0@8| @14 +|-@1|║+0#0000001#ffd7ff255| |f|i|r|s|t| @1|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| |F|i|r|s|t| @1|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| |f|i|R|S|t| @1|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| |F|I|r|s|T| @1|║|-+0#0000000#ffffff0@8| @14 +|-@1|║+0#0000001#ffd7ff255| |s|e|c|o|n|d| |║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| |S|e|c|o|n|D| |║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| |s|e|C|O|n|d| |║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| |S|E|c|o|N|D| |║|-+0#0000000#ffffff0@8| @14 +|-@1|║+0#0000001#ffd7ff255| @7|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| @7|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| @7|║|-+0#0000000#ffffff0@2|║+0#0000001#ffd7ff255| @7|║|-+0#0000000#ffffff0@8| @14 +|-@1|╚+0#0000001#ffd7ff255|═@7|╝|-+0#0000000#ffffff0@2|╚+0#0000001#ffd7ff255|═@7|╝|-+0#0000000#ffffff0@2|╚+0#0000001#ffd7ff255|═@7|╝|-+0#0000000#ffffff0@2|╚+0#0000001#ffd7ff255|═@7|╝|-+0#0000000#ffffff0@8| @14 +|-@27|%|-@20>&|-@8| @14 +|-@59| @14 +|-@59| @14 +@57|9|,|5|1| @9|T|o|p| diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -175,6 +175,55 @@ func Test_popup_with_syntax_setbufvar() call delete('XtestPopup') endfunc +func Test_popup_all_corners() + if !CanRunVimInTerminal() + return + endif + let lines =<< trim END + call setline(1, repeat([repeat('-', 60)], 15)) + set so=0 + normal 2G3|r# + let winid1 = popup_create(['first', 'second'], { + \ 'line': 'cursor+1', + \ 'col': 'cursor', + \ 'pos': 'topleft', + \ 'border': [], + \ 'padding': [], + \ }) + normal 25|r@ + let winid1 = popup_create(['First', 'SeconD'], { + \ 'line': 'cursor+1', + \ 'col': 'cursor', + \ 'pos': 'topright', + \ 'border': [], + \ 'padding': [], + \ }) + normal 9G29|r% + let winid1 = popup_create(['fiRSt', 'seCOnd'], { + \ 'line': 'cursor-1', + \ 'col': 'cursor', + \ 'pos': 'botleft', + \ 'border': [], + \ 'padding': [], + \ }) + normal 51|r& + let winid1 = popup_create(['FIrsT', 'SEcoND'], { + \ 'line': 'cursor-1', + \ 'col': 'cursor', + \ 'pos': 'botright', + \ 'border': [], + \ 'padding': [], + \ }) + END + call writefile(lines, 'XtestPopupCorners') + let buf = RunVimInTerminal('-S XtestPopupCorners', {'rows': 12}) + call VerifyScreenDump(buf, 'Test_popupwin_corners', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('XtestPopupCorners') +endfunc + func Test_win_execute_closing_curwin() split let winid = popup_create('some text', {}) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -768,6 +768,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1450, +/**/ 1449, /**/ 1448,