]> granicus.if.org Git - vim/commitdiff
patch 8.1.1450: popup window positioning wrong when using padding or borders v8.1.1450
authorBram Moolenaar <Bram@vim.org>
Sun, 2 Jun 2019 13:34:29 +0000 (15:34 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 2 Jun 2019 13:34:29 +0000 (15:34 +0200)
Problem:    Popup window positioning wrong when using padding or borders.
Solution:   Fix computing the position.

src/popupwin.c
src/testdir/dumps/Test_popupwin_corners.dump [new file with mode: 0644]
src/testdir/test_popupwin.vim
src/version.c

index 297faeb4eec266a686bc14758af8993a17c2dc83..4a67e241edbeeff39d637152def94b178afa8e1c 100644 (file)
@@ -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 (file)
index 0000000..eee6601
--- /dev/null
@@ -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| 
index e4f7cd23228cdd25f4c3f62d22ba1364a7bad74b..73f53a23a4f7319f13b23da2bd043fb437f88d13 100644 (file)
@@ -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', {})
index 90c77ead3df275c84827d587a928392594acd8c1..6417e41d36cecfc58dcd66bd0e9c289088c59061 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1450,
 /**/
     1449,
 /**/