* Execute the currently selected popup menu item.
*/
static void
-pum_execute_menu(vimmenu_T *menu)
+pum_execute_menu(vimmenu_T *menu, int mode)
{
vimmenu_T *mp;
int idx = 0;
exarg_T ea;
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));
execute_menu(&ea, mp);
int c;
pum_redraw();
- setcursor();
+ setcursor_mayforce(TRUE);
out_flush();
c = vgetc();
else if (c == CAR || c == NL)
{
/* enter: select current item, if any, and close */
- pum_execute_menu(menu);
+ pum_execute_menu(menu, mode);
break;
}
else if (c == 'k' || c == K_UP || c == K_MOUSEUP)
pum_select_mouse_pos();
if (pum_selected >= 0)
{
- pum_execute_menu(menu);
+ pum_execute_menu(menu, mode);
break;
}
if (c == K_LEFTMOUSE || c == K_LEFTMOUSE_NM)
void screen_start(void);
void windgoto(int row, int col);
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_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);
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();
windgoto(W_WINROW(curwin) + curwin->w_wrow,