]> granicus.if.org Git - vim/commitdiff
updated for version 7.0-062 v7.0.062
authorBram Moolenaar <Bram@vim.org>
Wed, 16 Aug 2006 19:41:08 +0000 (19:41 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 16 Aug 2006 19:41:08 +0000 (19:41 +0000)
src/menu.c
src/normal.c
src/proto/menu.pro
src/term.c
src/version.c

index 80ada2c8ed281926da4e14d9afa696e1ecce4a56..926f4c1247e47dc86e04fba43ae0ac8982ee39f3 100644 (file)
@@ -1777,6 +1777,27 @@ get_menu_mode()
     return MENU_INDEX_INVALID;
 }
 
+/*
+ * Check that a pointer appears in the menu tree.  Used to protect from using
+ * a menu that was deleted after it was selected but before the event was
+ * handled.
+ * Return OK or FAIL.  Used recursively.
+ */
+    int
+check_menu_pointer(root, menu_to_check)
+    vimmenu_T *root;
+    vimmenu_T *menu_to_check;
+{
+    vimmenu_T  *p;
+
+    for (p = root; p != NULL; p = p->next)
+       if (p == menu_to_check
+               || (p->children != NULL
+                   && check_menu_pointer(p->children, menu_to_check) == OK))
+           return OK;
+    return FAIL;
+}
+
 /*
  * After we have started the GUI, then we can create any menus that have been
  * defined.  This is done once here.  add_menu_path() may have already been
index db6c66a5978e9357beb2d5d3fb70f6055ec9789f..df1afce21d210eb278cc33f82f90cd20254445ab 100644 (file)
@@ -2504,7 +2504,8 @@ do_mouse(oap, c, dir, count, fixindent)
             * NOTE: Ignore right button down and drag mouse events.
             * Windows only shows the popup menu on the button up event.
             */
-#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON)
+#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
+                         || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
            if (!is_click)
                return FALSE;
 #endif
index 227b694d55cc46b68debb967df1667b451351ad9..32a1665315f2dcca002634c990e3d995b7f7420b 100644 (file)
@@ -10,6 +10,7 @@ extern int menu_is_popup __ARGS((char_u *name));
 extern int menu_is_child_of_popup __ARGS((vimmenu_T *menu));
 extern int menu_is_toolbar __ARGS((char_u *name));
 extern int menu_is_separator __ARGS((char_u *name));
+extern int check_menu_pointer __ARGS((vimmenu_T *root, vimmenu_T *menu_to_check));
 extern void gui_create_initial_menus __ARGS((vimmenu_T *menu));
 extern void gui_update_menus __ARGS((int modes));
 extern int gui_is_menu_shortcut __ARGS((int key));
index 7597c93bd905e814cbccb1ad212883abb0e8a2ce..9fcce2b6a2f0fc4e9ed0a46326ba5c28eaed0c2f 100644 (file)
@@ -4783,6 +4783,14 @@ check_termcode(max_offset, buf, buflen)
                return -1;
            current_menu = (vimmenu_T *)val;
            slen += num_bytes;
+
+           /* The menu may have been deleted right after it was used, check
+            * for that. */
+           if (check_menu_pointer(root_menu, current_menu) == FAIL)
+           {
+               key_name[0] = KS_EXTRA;
+               key_name[1] = (int)KE_IGNORE;
+           }
        }
 # endif
 # ifdef FEAT_GUI_TABLINE
index 7ed4e4b23689592583f3c27244f09ef4c5dd7d9c..7e0b557c708f2ed6590d20135502fe3f1ca92fc0 100644 (file)
@@ -666,6 +666,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    62,
 /**/
     61,
 /**/