]> granicus.if.org Git - vim/commitdiff
patch 8.2.1307: popup window width does not include number of sign columns v8.2.1307
authorBram Moolenaar <Bram@vim.org>
Mon, 27 Jul 2020 20:40:37 +0000 (22:40 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 27 Jul 2020 20:40:37 +0000 (22:40 +0200)
Problem:    popup window width does not include number, fold of sign column
            width.
Solution:   Take number, fold and sign column with into account.

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

index d2b7f22f0b91a1849e012e635b894b902a2b0d25..3bd8e731426a8e440626a2d8593ab718f6712ce5 100644 (file)
@@ -1111,6 +1111,7 @@ popup_adjust_position(win_T *wp)
     int                wrapped = 0;
     int                maxwidth;
     int                used_maxwidth = FALSE;
+    int                margin_width = 0;
     int                maxspace;
     int                center_vert = FALSE;
     int                center_hor = FALSE;
@@ -1249,6 +1250,19 @@ popup_adjust_position(win_T *wp)
        allow_adjust_left = FALSE;
        maxwidth = wp->w_maxwidth;
     }
+
+    if (wp->w_p_nu || wp->w_p_rnu)
+       margin_width = number_width(wp) + 1;
+#ifdef FEAT_FOLDING
+    margin_width += wp->w_p_fdc;
+#endif
+#ifdef FEAT_SIGNS
+    if (signcolumn_on(wp))
+       margin_width += 2;
+#endif
+    if (margin_width >= maxwidth)
+       margin_width = maxwidth - 1;
+
     minwidth = wp->w_minwidth;
     minheight = wp->w_minheight;
 #ifdef FEAT_TERMINAL
@@ -1289,6 +1303,7 @@ popup_adjust_position(win_T *wp)
 
        // Count Tabs for what they are worth and compute the length based on
        // the maximum width (matters when 'showbreak' is set).
+       // "margin_width" is added to "len" where it matters.
        if (wp->w_width < maxwidth)
            wp->w_width = maxwidth;
        len = win_linetabsize(wp, ml_get_buf(wp->w_buffer, lnum, FALSE),
@@ -1297,21 +1312,21 @@ popup_adjust_position(win_T *wp)
 
        if (wp->w_p_wrap)
        {
-           while (len > maxwidth)
+           while (len + margin_width > maxwidth)
            {
                ++wrapped;
-               len -= maxwidth;
+               len -= maxwidth - margin_width;
                wp->w_width = maxwidth;
                used_maxwidth = TRUE;
            }
        }
-       else if (len > maxwidth
+       else if (len + margin_width > maxwidth
                && allow_adjust_left
                && (wp->w_popup_pos == POPPOS_TOPLEFT
                    || wp->w_popup_pos == POPPOS_BOTLEFT))
        {
            // adjust leftwise to fit text on screen
-           int shift_by = len - maxwidth;
+           int shift_by = len + margin_width - maxwidth;
 
            if (shift_by > wp->w_wincol)
            {
@@ -1325,9 +1340,9 @@ popup_adjust_position(win_T *wp)
            maxwidth += shift_by;
            wp->w_width = maxwidth;
        }
-       if (wp->w_width < len)
+       if (wp->w_width < len + margin_width)
        {
-           wp->w_width = len;
+           wp->w_width = len + margin_width;
            if (wp->w_maxwidth > 0 && wp->w_width > wp->w_maxwidth)
                wp->w_width = wp->w_maxwidth;
        }
diff --git a/src/testdir/dumps/Test_popupwin_sign_2.dump b/src/testdir/dumps/Test_popupwin_sign_2.dump
new file mode 100644 (file)
index 0000000..ddccde1
--- /dev/null
@@ -0,0 +1,10 @@
+|>+0#e000002#ffffff0@1>0+0#ffffff16#ff404010| @71
+| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|2+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|3+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|4+0#0000000#ffffff0| @13| +0#0000e05#a8a8a8255@1|#+0#ffffff16#ff404010|!| +0#af5f00255#ffd7ff255@1|1| |a+0#0000001#ffff4012| |l|o|n|g|e|r| |l|i|n|e| |t|o| |c|h|e|c|k| |t|h|e| |w|i|d|t|h| +0#0000000#ffffff0@17
+| +0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @71
+| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @71
+|:|c|a|l@1| |S|e|t|O|p|t|i|o|n|s|(|)| @38|1|,|1| @10|T|o|p| 
index beb6870b6de43b7a9cefdb6071a06ccd2877ce81..00b956a9e0dccb7dd446495b9c92dcbb86686d75 100644 (file)
@@ -3375,12 +3375,22 @@ func Test_popupwin_sign()
     call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
     " add sign to popup buffer, does not show
     call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
+
+    func SetOptions()
+      call setwinvar(g:winid, '&number', 1)
+      call setwinvar(g:winid, '&foldcolumn', 2)
+      call popup_settext(g:winid, 'a longer line to check the width')
+    endfunc
   END
   call writefile(lines, 'XtestPopupSign')
 
   let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
   call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
 
+  " set more options to check the width is adjusted
+  call term_sendkeys(buf, ":call SetOptions()\<CR>")
+  call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
+
   call StopVimInTerminal(buf)
   call delete('XtestPopupSign')
 endfunc
index a87cc89d37ff4f66ea7c9b6880645eeaf5c4f11a..78aafb8e3ee234c2c2714bd95d8588095d00dbf8 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1307,
 /**/
     1306,
 /**/