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
|
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;
|
||||||
|
|||||||
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')
|
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
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user