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:
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
12
src/screen.c
12
src/screen.c
@@ -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,
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user