Merge from emacs-23; up to 2010-06-22T07:41:10Z!rgm@gnu.org
This commit is contained in:
commit
a64bfdfa5a
2 changed files with 33 additions and 4 deletions
|
@ -1,3 +1,9 @@
|
|||
2011-11-06 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
|
||||
|
||||
* xmenu.c (cleanup_widget_value_tree): New function.
|
||||
(xmenu_show, xdialog_show): Use it in record_unwind_protect instead of
|
||||
calling free_menubar_widget_value_tree directly (Bug#9830).
|
||||
|
||||
2011-11-06 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Fix some portability problems with 'inline'.
|
||||
|
|
31
src/xmenu.c
31
src/xmenu.c
|
@ -1604,6 +1604,17 @@ create_and_show_popup_menu (FRAME_PTR f, widget_value *first_wv,
|
|||
|
||||
#endif /* not USE_GTK */
|
||||
|
||||
static Lisp_Object
|
||||
cleanup_widget_value_tree (Lisp_Object arg)
|
||||
{
|
||||
struct Lisp_Save_Value *p = XSAVE_VALUE (arg);
|
||||
widget_value *wv = p->pointer;
|
||||
|
||||
free_menubar_widget_value_tree (wv);
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
Lisp_Object
|
||||
xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps,
|
||||
Lisp_Object title, const char **error_name, Time timestamp)
|
||||
|
@ -1618,6 +1629,8 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps,
|
|||
|
||||
int first_pane;
|
||||
|
||||
int specpdl_count = SPECPDL_INDEX ();
|
||||
|
||||
if (! FRAME_X_P (f))
|
||||
abort ();
|
||||
|
||||
|
@ -1812,11 +1825,15 @@ xmenu_show (FRAME_PTR f, int x, int y, int for_click, int keymaps,
|
|||
/* No selection has been chosen yet. */
|
||||
menu_item_selection = 0;
|
||||
|
||||
/* Make sure to free the widget_value objects we used to specify the
|
||||
contents even with longjmp. */
|
||||
record_unwind_protect (cleanup_widget_value_tree,
|
||||
make_save_value (first_wv, 0));
|
||||
|
||||
/* Actually create and show the menu until popped down. */
|
||||
create_and_show_popup_menu (f, first_wv, x, y, for_click, timestamp);
|
||||
|
||||
/* Free the widget_value objects we used to specify the contents. */
|
||||
free_menubar_widget_value_tree (first_wv);
|
||||
unbind_to (specpdl_count, Qnil);
|
||||
|
||||
/* Find the selected item, and its pane, to return
|
||||
the proper value. */
|
||||
|
@ -2003,6 +2020,8 @@ xdialog_show (FRAME_PTR f,
|
|||
/* 1 means we've seen the boundary between left-hand elts and right-hand. */
|
||||
int boundary_seen = 0;
|
||||
|
||||
int specpdl_count = SPECPDL_INDEX ();
|
||||
|
||||
if (! FRAME_X_P (f))
|
||||
abort ();
|
||||
|
||||
|
@ -2116,11 +2135,15 @@ xdialog_show (FRAME_PTR f,
|
|||
/* No selection has been chosen yet. */
|
||||
menu_item_selection = 0;
|
||||
|
||||
/* Make sure to free the widget_value objects we used to specify the
|
||||
contents even with longjmp. */
|
||||
record_unwind_protect (cleanup_widget_value_tree,
|
||||
make_save_value (first_wv, 0));
|
||||
|
||||
/* Actually create and show the dialog. */
|
||||
create_and_show_dialog (f, first_wv);
|
||||
|
||||
/* Free the widget_value objects we used to specify the contents. */
|
||||
free_menubar_widget_value_tree (first_wv);
|
||||
unbind_to (specpdl_count, Qnil);
|
||||
|
||||
/* Find the selected item, and its pane, to return
|
||||
the proper value. */
|
||||
|
|
Loading…
Add table
Reference in a new issue