Mercurial > vim
changeset 18339:a776385eac9f v8.1.2164
patch 8.1.2164: stuck when using "j" in a popupwin with popup_filter_menu
Commit: https://github.com/vim/vim/commit/7b3d93966709998011e2eb3b84414ff454161b37
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Oct 16 22:17:07 2019 +0200
patch 8.1.2164: stuck when using "j" in a popupwin with popup_filter_menu
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 16 Oct 2019 22:30:04 +0200 |
parents | 93ce94d4d30c |
children | e42270cd4457 |
files | src/popupwin.c src/testdir/dumps/Test_popupwin_wrap_1.dump src/testdir/dumps/Test_popupwin_wrap_2.dump src/testdir/test_popupwin.vim src/version.c |
diffstat | 5 files changed, 64 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/popupwin.c +++ b/src/popupwin.c @@ -535,7 +535,7 @@ check_highlight(dict_T *dict, char *name } /* - * 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;
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_wrap_1.dump @@ -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|
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_wrap_2.dump @@ -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|
--- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -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