]> granicus.if.org Git - vim/commitdiff
patch 8.0.1574: show cursor in wrong place when using popup menu v8.0.1574
authorBram Moolenaar <Bram@vim.org>
Tue, 6 Mar 2018 10:43:04 +0000 (11:43 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 6 Mar 2018 10:43:04 +0000 (11:43 +0100)
Problem:    Show cursor in wrong place when using popup menu. (Wei Zhang)
Solution:   Force updating the cursor position.  Fix skipping over unused
            entries.

src/popupmnu.c
src/proto/screen.pro
src/screen.c
src/version.c

index 9b5f750f88ddde233961df5abf5e2813f7570109..985a0e62f986f8b80104c93ee5fc44680f2bfa9e 100644 (file)
@@ -1104,14 +1104,14 @@ pum_select_mouse_pos(void)
  * 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);
@@ -1171,7 +1171,7 @@ pum_show_popupmenu(vimmenu_T *menu)
        int     c;
 
        pum_redraw();
-       setcursor();
+       setcursor_mayforce(TRUE);
        out_flush();
 
        c = vgetc();
@@ -1180,7 +1180,7 @@ pum_show_popupmenu(vimmenu_T *menu)
        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)
@@ -1221,7 +1221,7 @@ pum_show_popupmenu(vimmenu_T *menu)
            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)
index 39424b485bb5d149f42bba99b256dcbd64c79133..f04fda51e40a99c0647bd4ffa4d1c47b9fd8e5bb 100644 (file)
@@ -44,6 +44,7 @@ int can_clear(char_u *p);
 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);
index 935f9810ccd7ac60a4c3349a30747b0c658f2da0..5ab2e85fc8109e04181664da7cbd5ac2e3247dbb 100644 (file)
@@ -9471,7 +9471,17 @@ windgoto(int row, int col)
     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,
index 8fd5ea7388cb4d4943e23a7251ddf276814c81d7..3cf25501893c97008f55708b2a0cd2435436d83e 100644 (file)
@@ -766,6 +766,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1574,
 /**/
     1573,
 /**/