8994291
To: vim-dev@vim.org
8994291
Subject: Patch 7.0.062
8994291
Fcc: outbox
8994291
From: Bram Moolenaar <Bram@moolenaar.net>
8994291
Mime-Version: 1.0
8994291
Content-Type: text/plain; charset=ISO-8859-1
8994291
Content-Transfer-Encoding: 8bit
8994291
------------
8994291
8994291
Patch 7.0.062
8994291
Problem:    Mac: Crash when using the popup menu for spell correction.  The
8994291
	    popup menu appears twice when letting go of the right mouse button
8994291
	    early.
8994291
Solution:   Don't show the popup menu on the release of the right mouse
8994291
	    button.  Also check that a menu pointer is actually valid.
8994291
Files:	    src/proto/menu.pro, src/menu.c, src/normal.c, src/term.c
8994291
8994291
8994291
*** ../vim-7.0.061/src/proto/menu.pro	Fri Mar 24 23:37:59 2006
8994291
--- src/proto/menu.pro	Wed Aug 16 20:25:57 2006
8994291
***************
8994291
*** 10,15 ****
8994291
--- 10,16 ----
8994291
  extern int menu_is_child_of_popup __ARGS((vimmenu_T *menu));
8994291
  extern int menu_is_toolbar __ARGS((char_u *name));
8994291
  extern int menu_is_separator __ARGS((char_u *name));
8994291
+ extern int check_menu_pointer __ARGS((vimmenu_T *root, vimmenu_T *menu_to_check));
8994291
  extern void gui_create_initial_menus __ARGS((vimmenu_T *menu));
8994291
  extern void gui_update_menus __ARGS((int modes));
8994291
  extern int gui_is_menu_shortcut __ARGS((int key));
8994291
*** ../vim-7.0.061/src/menu.c	Wed Aug 16 15:56:58 2006
8994291
--- src/menu.c	Wed Aug 16 20:35:09 2006
8994291
***************
8994291
*** 1778,1783 ****
8994291
--- 1778,1804 ----
8994291
  }
8994291
  
8994291
  /*
8994291
+  * Check that a pointer appears in the menu tree.  Used to protect from using
8994291
+  * a menu that was deleted after it was selected but before the event was
8994291
+  * handled.
8994291
+  * Return OK or FAIL.  Used recursively.
8994291
+  */
8994291
+     int
8994291
+ check_menu_pointer(root, menu_to_check)
8994291
+     vimmenu_T *root;
8994291
+     vimmenu_T *menu_to_check;
8994291
+ {
8994291
+     vimmenu_T	*p;
8994291
+ 
8994291
+     for (p = root; p != NULL; p = p->next)
8994291
+ 	if (p == menu_to_check
8994291
+ 		|| (p->children != NULL
8994291
+ 		    && check_menu_pointer(p->children, menu_to_check) == OK))
8994291
+ 	    return OK;
8994291
+     return FAIL;
8994291
+ }
8994291
+ 
8994291
+ /*
8994291
   * After we have started the GUI, then we can create any menus that have been
8994291
   * defined.  This is done once here.  add_menu_path() may have already been
8994291
   * called to define these menus, and may be called again.  This function calls
8994291
*** ../vim-7.0.061/src/normal.c	Sat Apr 29 23:53:55 2006
8994291
--- src/normal.c	Wed Aug 16 19:54:04 2006
8994291
***************
8994291
*** 2504,2510 ****
8994291
  	     * NOTE: Ignore right button down and drag mouse events.
8994291
  	     * Windows only shows the popup menu on the button up event.
8994291
  	     */
8994291
! #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON)
8994291
  	    if (!is_click)
8994291
  		return FALSE;
8994291
  #endif
8994291
--- 2504,2511 ----
8994291
  	     * NOTE: Ignore right button down and drag mouse events.
8994291
  	     * Windows only shows the popup menu on the button up event.
8994291
  	     */
8994291
! #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
8994291
! 			  || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
8994291
  	    if (!is_click)
8994291
  		return FALSE;
8994291
  #endif
8994291
*** ../vim-7.0.061/src/term.c	Wed May  3 23:26:49 2006
8994291
--- src/term.c	Wed Aug 16 21:24:21 2006
8994291
***************
8994291
*** 4783,4788 ****
8994291
--- 4783,4796 ----
8994291
  		return -1;
8994291
  	    current_menu = (vimmenu_T *)val;
8994291
  	    slen += num_bytes;
8994291
+ 
8994291
+ 	    /* The menu may have been deleted right after it was used, check
8994291
+ 	     * for that. */
8994291
+ 	    if (check_menu_pointer(root_menu, current_menu) == FAIL)
8994291
+ 	    {
8994291
+ 		key_name[0] = KS_EXTRA;
8994291
+ 		key_name[1] = (int)KE_IGNORE;
8994291
+ 	    }
8994291
  	}
8994291
  # endif
8994291
  # ifdef FEAT_GUI_TABLINE
8994291
*** ../vim-7.0.061/src/version.c	Wed Aug 16 21:26:19 2006
8994291
--- src/version.c	Wed Aug 16 21:40:37 2006
8994291
***************
8994291
*** 668,669 ****
8994291
--- 668,671 ----
8994291
  {   /* Add new patch number below this line */
8994291
+ /**/
8994291
+     62,
8994291
  /**/
8994291
8994291
-- 
8994291
hundred-and-one symptoms of being an internet addict:
8994291
166. You have been on your computer soo long that you didn't realize
8994291
     you had grandchildren.
8994291
8994291
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
8994291
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
8994291
\\\        download, build and distribute -- http://www.A-A-P.org        ///
8994291
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///