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)
This commit is contained in:
Bram Moolenaar
2019-10-16 22:17:07 +02:00
parent b2fe1d676f
commit 7b3d939667
5 changed files with 64 additions and 1 deletions

View 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 static void
popup_show_curline(win_T *wp) popup_show_curline(win_T *wp)
@ -550,6 +550,11 @@ popup_show_curline(win_T *wp)
wp->w_topline = 1; wp->w_topline = 1;
else if (wp->w_topline > wp->w_buffer->b_ml.ml_line_count) else if (wp->w_topline > wp->w_buffer->b_ml.ml_line_count)
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. // Don't use "firstline" now.
@ -1041,6 +1046,7 @@ popup_adjust_position(win_T *wp)
linenr_T lnum; linenr_T lnum;
int wrapped = 0; int wrapped = 0;
int maxwidth; int maxwidth;
int used_maxwidth = FALSE;
int maxspace; int maxspace;
int center_vert = FALSE; int center_vert = FALSE;
int center_hor = FALSE; int center_hor = FALSE;
@ -1208,6 +1214,7 @@ popup_adjust_position(win_T *wp)
++wrapped; ++wrapped;
len -= maxwidth; len -= maxwidth;
wp->w_width = maxwidth; wp->w_width = maxwidth;
used_maxwidth = TRUE;
} }
} }
else if (len > maxwidth else if (len > maxwidth
@ -1259,6 +1266,8 @@ popup_adjust_position(win_T *wp)
{ {
++right_extra; ++right_extra;
++extra_width; ++extra_width;
if (used_maxwidth)
maxwidth -= 2; // try to show the scrollbar
} }
minwidth = wp->w_minwidth; minwidth = wp->w_minwidth;

View File

@ -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|

View File

@ -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|

View File

@ -509,6 +509,38 @@ func Test_popup_close_with_mouse()
call delete('XtestPopupClose') call delete('XtestPopupClose')
endfunction 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() func Test_popup_with_mask()
CheckScreendump CheckScreendump

View File

@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2164,
/**/ /**/
2163, 2163,
/**/ /**/