0
0
mirror of https://github.com/vim/vim.git synced 2025-10-08 06:04:08 -04:00

patch 8.0.1574: show cursor in wrong place when using popup menu

Problem:    Show cursor in wrong place when using popup menu. (Wei Zhang)
Solution:   Force updating the cursor position.  Fix skipping over unused
            entries.
This commit is contained in:
Bram Moolenaar
2018-03-06 11:43:04 +01:00
parent 89894aa671
commit 987723e084
4 changed files with 19 additions and 6 deletions

View File

@@ -1104,14 +1104,14 @@ pum_select_mouse_pos(void)
* Execute the currently selected popup menu item. * Execute the currently selected popup menu item.
*/ */
static void static void
pum_execute_menu(vimmenu_T *menu) pum_execute_menu(vimmenu_T *menu, int mode)
{ {
vimmenu_T *mp; vimmenu_T *mp;
int idx = 0; int idx = 0;
exarg_T ea; exarg_T ea;
for (mp = menu->children; mp != NULL; mp = mp->next) for (mp = menu->children; mp != NULL; mp = mp->next)
if (idx++ == pum_selected) if ((mp->modes & mp->enabled & mode) && idx++ == pum_selected)
{ {
vim_memset(&ea, 0, sizeof(ea)); vim_memset(&ea, 0, sizeof(ea));
execute_menu(&ea, mp); execute_menu(&ea, mp);
@@ -1171,7 +1171,7 @@ pum_show_popupmenu(vimmenu_T *menu)
int c; int c;
pum_redraw(); pum_redraw();
setcursor(); setcursor_mayforce(TRUE);
out_flush(); out_flush();
c = vgetc(); c = vgetc();
@@ -1180,7 +1180,7 @@ pum_show_popupmenu(vimmenu_T *menu)
else if (c == CAR || c == NL) else if (c == CAR || c == NL)
{ {
/* enter: select current item, if any, and close */ /* enter: select current item, if any, and close */
pum_execute_menu(menu); pum_execute_menu(menu, mode);
break; break;
} }
else if (c == 'k' || c == K_UP || c == K_MOUSEUP) else if (c == 'k' || c == K_UP || c == K_MOUSEUP)
@@ -1221,7 +1221,7 @@ pum_show_popupmenu(vimmenu_T *menu)
pum_select_mouse_pos(); pum_select_mouse_pos();
if (pum_selected >= 0) if (pum_selected >= 0)
{ {
pum_execute_menu(menu); pum_execute_menu(menu, mode);
break; break;
} }
if (c == K_LEFTMOUSE || c == K_LEFTMOUSE_NM) if (c == K_LEFTMOUSE || c == K_LEFTMOUSE_NM)

View File

@@ -44,6 +44,7 @@ int can_clear(char_u *p);
void screen_start(void); void screen_start(void);
void windgoto(int row, int col); void windgoto(int row, int col);
void setcursor(void); void setcursor(void);
void setcursor_mayforce(int force);
int win_ins_lines(win_T *wp, int row, int line_count, int invalid, int mayclear); int win_ins_lines(win_T *wp, int row, int line_count, int invalid, int mayclear);
int win_del_lines(win_T *wp, int row, int line_count, int invalid, int mayclear, int clear_attr); int win_del_lines(win_T *wp, int row, int line_count, int invalid, int mayclear, int clear_attr);
int screen_ins_lines(int off, int row, int line_count, int end, int clear_attr, win_T *wp); int screen_ins_lines(int off, int row, int line_count, int end, int clear_attr, win_T *wp);

View File

@@ -9471,7 +9471,17 @@ windgoto(int row, int col)
void void
setcursor(void) setcursor(void)
{ {
if (redrawing()) setcursor_mayforce(FALSE);
}
/*
* Set cursor to its position in the current window.
* When "force" is TRUE also when not redrawing.
*/
void
setcursor_mayforce(int force)
{
if (force || redrawing())
{ {
validate_cursor(); validate_cursor();
windgoto(W_WINROW(curwin) + curwin->w_wrow, windgoto(W_WINROW(curwin) + curwin->w_wrow,

View File

@@ -766,6 +766,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 */
/**/
1574,
/**/ /**/
1573, 1573,
/**/ /**/