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:
@ -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;
|
||||
|
||||
10
src/testdir/dumps/Test_popupwin_wrap_1.dump
Normal file
10
src/testdir/dumps/Test_popupwin_wrap_1.dump
Normal 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|
|
||||
10
src/testdir/dumps/Test_popupwin_wrap_2.dump
Normal file
10
src/testdir/dumps/Test_popupwin_wrap_2.dump
Normal 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|
|
||||
@ -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
|
||||
|
||||
|
||||
@ -753,6 +753,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
2164,
|
||||
/**/
|
||||
2163,
|
||||
/**/
|
||||
|
||||
Reference in New Issue
Block a user