]> granicus.if.org Git - vim/commitdiff
patch 8.1.2164: stuck when using "j" in a popupwin with popup_filter_menu v8.1.2164
authorBram Moolenaar <Bram@vim.org>
Wed, 16 Oct 2019 20:17:07 +0000 (22:17 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 16 Oct 2019 20:17:07 +0000 (22:17 +0200)
Problem:    Stuck when using "j" in a popupwin with popup_filter_menu if a
            line wraps.
Solution:   Check the cursor line is visible. (closes #4577)

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

index 6b0b383b089fa41768aa7fe9b3424879762134c3..f9c127a6c49a8410df4ff31e441a1bea220d4913 100644 (file)
@@ -535,7 +535,7 @@ check_highlight(dict_T *dict, char *name, char_u **pval)
 }
 
 /*
- * Scroll to show the line with the cursor.  This assumes lines don't wrap.
+ * Scroll to show the line with the cursor.
  */
     static void
 popup_show_curline(win_T *wp)
@@ -550,6 +550,11 @@ popup_show_curline(win_T *wp)
            wp->w_topline = 1;
        else if (wp->w_topline > wp->w_buffer->b_ml.ml_line_count)
            wp->w_topline = wp->w_buffer->b_ml.ml_line_count;
+       while (wp->w_topline < wp->w_cursor.lnum
+               && wp->w_topline < wp->w_buffer->b_ml.ml_line_count
+               && plines_m_win(wp, wp->w_topline, wp->w_cursor.lnum)
+                                                               > wp->w_height)
+           ++wp->w_topline;
     }
 
     // Don't use "firstline" now.
@@ -1041,6 +1046,7 @@ popup_adjust_position(win_T *wp)
     linenr_T   lnum;
     int                wrapped = 0;
     int                maxwidth;
+    int                used_maxwidth = FALSE;
     int                maxspace;
     int                center_vert = FALSE;
     int                center_hor = FALSE;
@@ -1208,6 +1214,7 @@ popup_adjust_position(win_T *wp)
                ++wrapped;
                len -= maxwidth;
                wp->w_width = maxwidth;
+               used_maxwidth = TRUE;
            }
        }
        else if (len > maxwidth
@@ -1259,6 +1266,8 @@ popup_adjust_position(win_T *wp)
     {
        ++right_extra;
        ++extra_width;
+       if (used_maxwidth)
+           maxwidth -= 2;  // try to show the scrollbar
     }
 
     minwidth = wp->w_minwidth;
diff --git a/src/testdir/dumps/Test_popupwin_wrap_1.dump b/src/testdir/dumps/Test_popupwin_wrap_1.dump
new file mode 100644 (file)
index 0000000..5643dc7
--- /dev/null
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @73
+|╔+0#0000001#ffd7ff255|═@73
+|║| |o+0&#e0e0e08|n|e| @67| +0&#ffd7ff255| +0#0000000#0000001
+|║+0#0000001#ffd7ff255| |a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d| | +0#0000000#0000001
+|║+0#0000001#ffd7ff255| |f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s| @52| +0#0000000#a8a8a8255
+|╚+0#0000001#ffd7ff255|═@73
+|8+0#0000000#ffffff0| @73
+|9| @73
+@57|1|,|1| @10|T|o|p| 
diff --git a/src/testdir/dumps/Test_popupwin_wrap_2.dump b/src/testdir/dumps/Test_popupwin_wrap_2.dump
new file mode 100644 (file)
index 0000000..3a02fc5
--- /dev/null
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @73
+|╔+0#0000001#ffd7ff255|═@73
+|║| |a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d| | +0#0000000#a8a8a8255
+|║+0#0000001#ffd7ff255| |f|a|s|d|f|a|s|d|f|a|s|d|f|a|s|d|f|a|s| @52| +0#0000000#0000001
+|║+0#0000001#ffd7ff255| |t+0&#e0e0e08|h|r|e@1| @65| +0&#ffd7ff255| +0#0000000#0000001
+|╚+0#0000001#ffd7ff255|═@73
+|8+0#0000000#ffffff0| @73
+|9| @73
+@57|1|,|1| @10|T|o|p| 
index 771db9a69eec57f75937793b638d64e0fb4edaee..e84527bf7ff6def6ff5c38aea5f74d8c700a696d 100644 (file)
@@ -509,6 +509,38 @@ func Test_popup_close_with_mouse()
   call delete('XtestPopupClose')
 endfunction
 
+func Test_popup_menu_wrap()
+  CheckScreendump
+
+  let lines =<< trim END
+       call setline(1, range(1, 20))
+       call popup_create([
+             \ 'one',
+             \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
+             \ 'three',
+             \ 'four',
+             \ ], #{
+             \ pos: "botleft",
+             \ border: [],
+             \ padding: [0,1,0,1],
+             \ maxheight: 3,
+             \ cursorline: 1,
+             \ filter: 'popup_filter_menu',
+             \ })
+  END
+  call writefile(lines, 'XtestPopupWrap')
+  let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
+  call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
+
+  call term_sendkeys(buf, "jj")
+  call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
+
+  " clean up
+  call term_sendkeys(buf, "\<Esc>")
+  call StopVimInTerminal(buf)
+  call delete('XtestPopupWrap')
+endfunction
+
 func Test_popup_with_mask()
   CheckScreendump
 
index cfd54a19ccdb64c7ac0c68ced28819d3e21440d5..f6a3817da6cc564a4bc6b57e3ec5a738d8ceb79b 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2164,
 /**/
     2163,
 /**/