X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/96c0686368d8b7d481cb40239db896ff37df416a..51721edc6ba92f9c7cb6a2daab45bb538a696f3d:/src/xmenu.c diff --git a/src/xmenu.c b/src/xmenu.c index 216772edcd..0de8faaf36 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -1,6 +1,6 @@ /* X Communication module for terminals which understand the X protocol. -Copyright (C) 1986, 1988, 1993-1994, 1996, 1999-2013 Free Software +Copyright (C) 1986, 1988, 1993-1994, 1996, 1999-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -110,11 +110,6 @@ along with GNU Emacs. If not, see . */ static Lisp_Object Qdebug_on_next_call; -#if defined (USE_X_TOOLKIT) || defined (USE_GTK) -static Lisp_Object xdialog_show (struct frame *, bool, Lisp_Object, Lisp_Object, - const char **); -#endif - /* Flag which when set indicates a dialog or menu has been posted by Xt on behalf of one of the widget sets. */ static int popup_activated_flag; @@ -144,53 +139,6 @@ menubar_id_to_frame (LWLIB_ID id) } #endif - -#ifdef HAVE_X_WINDOWS -/* Return the mouse position in *X and *Y. The coordinates are window - relative for the edit window in frame F. - This is for Fx_popup_menu. The mouse_position_hook can not - be used for X, as it returns window relative coordinates - for the window where the mouse is in. This could be the menu bar, - the scroll bar or the edit window. Fx_popup_menu needs to be - sure it is the edit window. */ -void -mouse_position_for_popup (struct frame *f, int *x, int *y) -{ - Window root, dummy_window; - int dummy; - - eassert (FRAME_X_P (f)); - - block_input (); - - XQueryPointer (FRAME_X_DISPLAY (f), - DefaultRootWindow (FRAME_X_DISPLAY (f)), - - /* The root window which contains the pointer. */ - &root, - - /* Window pointer is on, not used */ - &dummy_window, - - /* The position on that root window. */ - x, y, - - /* x/y in dummy_window coordinates, not used. */ - &dummy, &dummy, - - /* Modifier keys and pointer buttons, about which - we don't care. */ - (unsigned int *) &dummy); - - unblock_input (); - - /* xmenu_show expects window coordinates, not root window - coordinates. Translate. */ - *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); - *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); -} - -#endif /* HAVE_X_WINDOWS */ #ifndef MSDOS @@ -213,9 +161,6 @@ x_menu_set_in_use (int in_use) /* Wait for an X event to arrive or for a timer to expire. */ -#ifndef USE_MOTIF -static -#endif void x_menu_wait_for_event (void *data) { @@ -796,7 +741,7 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) #ifdef USE_GTK /* If we have detached menus, we must update deep so detached menus also gets updated. */ - deep_p = deep_p || xg_have_tear_offs (); + deep_p = deep_p || xg_have_tear_offs (f); #endif if (deep_p) @@ -805,7 +750,7 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) struct buffer *prev = current_buffer; Lisp_Object buffer; - ptrdiff_t specpdl_count = SPECPDL_INDEX (); + dynwind_begin (); int previous_menu_items_used = f->menu_bar_items_used; Lisp_Object *previous_items = alloca (previous_menu_items_used * sizeof *previous_items); @@ -887,12 +832,8 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) /* Convert menu_items into widget_value trees to display the menu. This cannot evaluate Lisp code. */ - wv = xmalloc_widget_value (); - wv->name = "menubar"; - wv->value = 0; - wv->enabled = 1; + wv = make_widget_value ("menubar", NULL, true, Qnil); wv->button_type = BUTTON_TYPE_NONE; - wv->help = Qnil; first_wv = wv; for (i = 0; submenu_start[i] >= 0; i++) @@ -926,7 +867,7 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) the menus in any form, since it would be a no-op. */ free_menubar_widget_value_tree (first_wv); discard_menu_items (); - unbind_to (specpdl_count, Qnil); + dynwind_end (); return; } @@ -935,7 +876,7 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) f->menu_bar_items_used = menu_items_used; /* This undoes save_menu_items. */ - unbind_to (specpdl_count, Qnil); + dynwind_end (); /* Now GC cannot happen during the lifetime of the widget_value, so it's safe to store data from a Lisp_String. */ @@ -957,12 +898,8 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) /* Make a widget-value tree containing just the top level menu bar strings. */ - wv = xmalloc_widget_value (); - wv->name = "menubar"; - wv->value = 0; - wv->enabled = 1; + wv = make_widget_value ("menubar", NULL, true, Qnil); wv->button_type = BUTTON_TYPE_NONE; - wv->help = Qnil; first_wv = wv; items = FRAME_MENU_BAR_ITEMS (f); @@ -974,12 +911,8 @@ set_frame_menubar (struct frame *f, bool first_time, bool deep_p) if (NILP (string)) break; - wv = xmalloc_widget_value (); - wv->name = SSDATA (string); - wv->value = 0; - wv->enabled = 1; + wv = make_widget_value (SSDATA (string), NULL, true, Qnil); wv->button_type = BUTTON_TYPE_NONE; - wv->help = Qnil; /* This prevents lwlib from assuming this menu item is really supposed to be empty. */ /* The intptr_t cast avoids a warning. @@ -1175,16 +1108,17 @@ free_frame_menubar (struct frame *f) #endif /* USE_X_TOOLKIT || USE_GTK */ -/* xmenu_show actually displays a menu using the panes and items in menu_items +/* x_menu_show actually displays a menu using the panes and items in menu_items and returns the value selected from it. - There are two versions of xmenu_show, one for Xt and one for Xlib. + There are two versions of x_menu_show, one for Xt and one for Xlib. Both assume input is blocked by the caller. */ /* F is the frame the menu is for. X and Y are the frame-relative specified position, relative to the inside upper left corner of the frame F. - FOR_CLICK is true if this menu was invoked for a mouse click. - KEYMAPS is true if this menu was specified with keymaps; + Bitfield MENUFLAGS bits are: + MENU_FOR_CLICK is set if this menu was invoked for a mouse click. + MENU_KEYMAPS is set if this menu was specified with keymaps; in that case, we return a list containing the chosen item's value and perhaps also the pane's prefix. TITLE is the specified menu title. @@ -1267,7 +1201,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, GtkWidget *menu; GtkMenuPositionFunc pos_func = 0; /* Pop up at pointer. */ struct next_popup_x_y popup_x_y; - ptrdiff_t specpdl_count = SPECPDL_INDEX (); + dynwind_begin (); bool use_pos_func = ! for_click; #ifdef HAVE_GTK3 @@ -1306,6 +1240,8 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, for (i = 0; i < 5; i++) if (FRAME_DISPLAY_INFO (f)->grabbed & (1 << i)) break; + /* If keys aren't grabbed (i.e., a mouse up event), use 0. */ + if (i == 5) i = 0; } /* Display the menu. */ @@ -1325,7 +1261,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, popup_widget_loop (1, menu); } - unbind_to (specpdl_count, Qnil); + dynwind_end (); /* Must reset this manually because the button release event is not passed to Emacs event loop. */ @@ -1427,7 +1363,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, { int fact = 4 * sizeof (LWLIB_ID); - ptrdiff_t specpdl_count = SPECPDL_INDEX (); + dynwind_begin (); record_unwind_protect (pop_down_menu, Fcons (make_number (menu_id >> (fact)), make_number (menu_id & ~(-1 << (fact))))); @@ -1435,7 +1371,7 @@ create_and_show_popup_menu (struct frame *f, widget_value *first_wv, /* Process events that apply to the menu. */ popup_get_selection (0, FRAME_DISPLAY_INFO (f), menu_id, 1); - unbind_to (specpdl_count, Qnil); + dynwind_end (); } } @@ -1448,8 +1384,8 @@ cleanup_widget_value_tree (void *arg) } Lisp_Object -xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, - Lisp_Object title, const char **error_name) +x_menu_show (struct frame *f, int x, int y, int menuflags, + Lisp_Object title, const char **error_name) { int i; widget_value *wv, *save_wv = 0, *first_wv = 0, *prev_wv = 0; @@ -1461,7 +1397,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, int first_pane; - ptrdiff_t specpdl_count = SPECPDL_INDEX (); + dynwind_begin (); eassert (FRAME_X_P (f)); @@ -1470,6 +1406,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) { *error_name = "Empty menu"; + dynwind_end (); return Qnil; } @@ -1477,12 +1414,8 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, /* Create a tree of widget_value objects representing the panes and their items. */ - wv = xmalloc_widget_value (); - wv->name = "menu"; - wv->value = 0; - wv->enabled = 1; + wv = make_widget_value ("menu", NULL, true, Qnil); wv->button_type = BUTTON_TYPE_NONE; - wv->help =Qnil; first_wv = wv; first_pane = 1; @@ -1538,20 +1471,16 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, /* If the pane has a meaningful name, make the pane a top-level menu item with its items as a submenu beneath it. */ - if (!keymaps && strcmp (pane_string, "")) + if (!(menuflags & MENU_KEYMAPS) && strcmp (pane_string, "")) { - wv = xmalloc_widget_value (); + wv = make_widget_value (pane_string, NULL, true, Qnil); if (save_wv) save_wv->next = wv; else first_wv->contents = wv; - wv->name = (char *) pane_string; - if (keymaps && !NILP (prefix)) + if ((menuflags & MENU_KEYMAPS) && !NILP (prefix)) wv->name++; - wv->value = 0; - wv->enabled = 1; wv->button_type = BUTTON_TYPE_NONE; - wv->help = Qnil; save_wv = wv; prev_wv = 0; } @@ -1589,20 +1518,18 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, } #endif /* not HAVE_MULTILINGUAL_MENU */ - wv = xmalloc_widget_value (); + wv = make_widget_value (SSDATA (item_name), NULL, !NILP (enable), + STRINGP (help) ? help : Qnil); if (prev_wv) prev_wv->next = wv; else save_wv->contents = wv; - wv->name = SSDATA (item_name); if (!NILP (descrip)) wv->key = SSDATA (descrip); - wv->value = 0; /* If this item has a null value, make the call_data null so that it won't display a box when the mouse is on it. */ wv->call_data = !NILP (def) ? aref_addr (menu_items, i) : 0; - wv->enabled = !NILP (enable); if (NILP (type)) wv->button_type = BUTTON_TYPE_NONE; @@ -1615,11 +1542,6 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, wv->selected = !NILP (selected); - if (! STRINGP (help)) - help = Qnil; - - wv->help = help; - prev_wv = wv; i += MENU_ITEMS_ITEM_LENGTH; @@ -1629,27 +1551,20 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, /* Deal with the title, if it is non-nil. */ if (!NILP (title)) { - widget_value *wv_title = xmalloc_widget_value (); - widget_value *wv_sep1 = xmalloc_widget_value (); - widget_value *wv_sep2 = xmalloc_widget_value (); + widget_value *wv_title; + widget_value *wv_sep1 = make_widget_value ("--", NULL, false, Qnil); + widget_value *wv_sep2 = make_widget_value ("--", NULL, false, Qnil); - wv_sep2->name = "--"; wv_sep2->next = first_wv->contents; - wv_sep2->help = Qnil; - - wv_sep1->name = "--"; wv_sep1->next = wv_sep2; - wv_sep1->help = Qnil; #ifndef HAVE_MULTILINGUAL_MENU if (STRING_MULTIBYTE (title)) title = ENCODE_MENU_STRING (title); #endif - wv_title->name = SSDATA (title); - wv_title->enabled = true; + wv_title = make_widget_value (SSDATA (title), NULL, true, Qnil); wv_title->button_type = BUTTON_TYPE_NONE; - wv_title->help = Qnil; wv_title->next = wv_sep1; first_wv->contents = wv_title; } @@ -1662,9 +1577,10 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, record_unwind_protect_ptr (cleanup_widget_value_tree, first_wv); /* Actually create and show the menu until popped down. */ - create_and_show_popup_menu (f, first_wv, x, y, for_click); + create_and_show_popup_menu (f, first_wv, x, y, + menuflags & MENU_FOR_CLICK); - unbind_to (specpdl_count, Qnil); + dynwind_end (); /* Find the selected item, and its pane, to return the proper value. */ @@ -1703,7 +1619,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, = AREF (menu_items, i + MENU_ITEMS_ITEM_VALUE); if (menu_item_selection == aref_addr (menu_items, i)) { - if (keymaps) + if (menuflags & MENU_KEYMAPS) { int j; @@ -1721,7 +1637,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, } } } - else if (!for_click) + else if (!(menuflags & MENU_FOR_CLICK)) { unblock_input (); /* Make "Cancel" equivalent to C-g. */ @@ -1761,7 +1677,7 @@ create_and_show_dialog (struct frame *f, widget_value *first_wv) if (menu) { - ptrdiff_t specpdl_count = SPECPDL_INDEX (); + dynwind_begin (); record_unwind_protect_ptr (pop_down_menu, menu); /* Display the menu. */ @@ -1770,7 +1686,7 @@ create_and_show_dialog (struct frame *f, widget_value *first_wv) /* Process events that apply to the menu. */ popup_widget_loop (1, menu); - unbind_to (specpdl_count, Qnil); + dynwind_end (); } } @@ -1816,7 +1732,7 @@ create_and_show_dialog (struct frame *f, widget_value *first_wv) /* Process events that apply to the dialog box. Also handle timers. */ { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); int fact = 4 * sizeof (LWLIB_ID); /* xdialog_show_unwind is responsible for popping the dialog box down. */ @@ -1826,7 +1742,7 @@ create_and_show_dialog (struct frame *f, widget_value *first_wv) popup_get_selection (0, FRAME_DISPLAY_INFO (f), dialog_id, 1); - unbind_to (count, Qnil); + dynwind_end (); } } @@ -1837,11 +1753,8 @@ static const char * button_names [] = { "button6", "button7", "button8", "button9", "button10" }; static Lisp_Object -xdialog_show (struct frame *f, - bool keymaps, - Lisp_Object title, - Lisp_Object header, - const char **error_name) +x_dialog_show (struct frame *f, Lisp_Object title, + Lisp_Object header, const char **error_name) { int i, nb_buttons=0; char dialog_name[6]; @@ -1853,7 +1766,7 @@ xdialog_show (struct frame *f, /* 1 means we've seen the boundary between left-hand elts and right-hand. */ int boundary_seen = 0; - ptrdiff_t specpdl_count = SPECPDL_INDEX (); + dynwind_begin (); eassert (FRAME_X_P (f)); @@ -1862,25 +1775,19 @@ xdialog_show (struct frame *f, if (menu_items_n_panes > 1) { *error_name = "Multiple panes in dialog box"; + dynwind_end (); return Qnil; } /* Create a tree of widget_value objects representing the text label and buttons. */ { - Lisp_Object pane_name, prefix; + Lisp_Object pane_name; const char *pane_string; pane_name = AREF (menu_items, MENU_ITEMS_PANE_NAME); - prefix = AREF (menu_items, MENU_ITEMS_PANE_PREFIX); pane_string = (NILP (pane_name) ? "" : SSDATA (pane_name)); - prev_wv = xmalloc_widget_value (); - prev_wv->value = (char *) pane_string; - if (keymaps && !NILP (prefix)) - prev_wv->name++; - prev_wv->enabled = 1; - prev_wv->name = "message"; - prev_wv->help = Qnil; + prev_wv = make_widget_value ("message", (char *) pane_string, true, Qnil); first_wv = prev_wv; /* Loop over all panes and items, filling in the tree. */ @@ -1899,6 +1806,7 @@ xdialog_show (struct frame *f, { free_menubar_widget_value_tree (first_wv); *error_name = "Submenu in dialog items"; + dynwind_end (); return Qnil; } if (EQ (item_name, Qquote)) @@ -1913,18 +1821,17 @@ xdialog_show (struct frame *f, { free_menubar_widget_value_tree (first_wv); *error_name = "Too many dialog items"; + dynwind_end (); return Qnil; } - wv = xmalloc_widget_value (); + wv = make_widget_value (button_names[nb_buttons], + SSDATA (item_name), + !NILP (enable), Qnil); prev_wv->next = wv; - wv->name = (char *) button_names[nb_buttons]; if (!NILP (descrip)) wv->key = SSDATA (descrip); - wv->value = SSDATA (item_name); wv->call_data = aref_addr (menu_items, i); - wv->enabled = !NILP (enable); - wv->help = Qnil; prev_wv = wv; if (! boundary_seen) @@ -1939,9 +1846,7 @@ xdialog_show (struct frame *f, if (! boundary_seen) left_count = nb_buttons - nb_buttons / 2; - wv = xmalloc_widget_value (); - wv->name = dialog_name; - wv->help = Qnil; + wv = make_widget_value (dialog_name, NULL, false, Qnil); /* Frame title: 'Q' = Question, 'I' = Information. Can also have 'E' = Error if, one day, we want @@ -1974,26 +1879,19 @@ xdialog_show (struct frame *f, /* Actually create and show the dialog. */ create_and_show_dialog (f, first_wv); - unbind_to (specpdl_count, Qnil); + dynwind_end (); /* Find the selected item, and its pane, to return the proper value. */ if (menu_item_selection != 0) { - Lisp_Object prefix; - - prefix = Qnil; i = 0; while (i < menu_items_used) { Lisp_Object entry; if (EQ (AREF (menu_items, i), Qt)) - { - prefix - = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX); - i += MENU_ITEMS_PANE_LENGTH; - } + i += MENU_ITEMS_PANE_LENGTH; else if (EQ (AREF (menu_items, i), Qquote)) { /* This is the boundary between left-side elts and @@ -2005,15 +1903,7 @@ xdialog_show (struct frame *f, entry = AREF (menu_items, i + MENU_ITEMS_ITEM_VALUE); if (menu_item_selection == aref_addr (menu_items, i)) - { - if (keymaps != 0) - { - entry = list1 (entry); - if (!NILP (prefix)) - entry = Fcons (prefix, entry); - } - return entry; - } + return entry; i += MENU_ITEMS_ITEM_LENGTH; } } @@ -2031,7 +1921,7 @@ xw_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents) Lisp_Object title; const char *error_name; Lisp_Object selection; - ptrdiff_t specpdl_count = SPECPDL_INDEX (); + dynwind_begin (); check_window_system (f); @@ -2050,10 +1940,10 @@ xw_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents) /* Display them in a dialog box. */ block_input (); - selection = xdialog_show (f, 0, title, header, &error_name); + selection = x_dialog_show (f, title, header, &error_name); unblock_input (); - unbind_to (specpdl_count, Qnil); + dynwind_end (); discard_menu_items (); if (error_name) error ("%s", error_name); @@ -2088,7 +1978,7 @@ menu_help_callback (char const *help_string, int pane, int item) if (EQ (first_item[0], Qt)) pane_name = first_item[MENU_ITEMS_PANE_NAME]; else if (EQ (first_item[0], Qquote)) - /* This shouldn't happen, see xmenu_show. */ + /* This shouldn't happen, see x_menu_show. */ pane_name = empty_unibyte_string; else pane_name = first_item[MENU_ITEMS_ITEM_NAME]; @@ -2130,8 +2020,8 @@ pop_down_menu (Lisp_Object arg) Lisp_Object -xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, - Lisp_Object title, const char **error_name) +x_menu_show (struct frame *f, int x, int y, int menuflags, + Lisp_Object title, const char **error_name) { Window root; XMenu *menu; @@ -2144,17 +2034,20 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, int maxwidth; int dummy_int; unsigned int dummy_uint; - ptrdiff_t specpdl_count = SPECPDL_INDEX (); + dynwind_begin (); eassert (FRAME_X_P (f) || FRAME_MSDOS_P (f)); *error_name = 0; - if (menu_items_n_panes == 0) + if (menu_items_n_panes == 0) { + dynwind_end (); return Qnil; + } if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) { *error_name = "Empty menu"; + dynwind_end (); return Qnil; } @@ -2171,14 +2064,10 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, { *error_name = "Can't create menu"; unblock_input (); + dynwind_end (); return Qnil; } - /* Don't GC while we prepare and show the menu, - because we give the oldxmenu library pointers to the - contents of strings. */ - inhibit_garbage_collection (); - #ifdef HAVE_X_WINDOWS /* Adjust coordinates to relative to the outer (window manager) window. */ x += FRAME_OUTER_TO_INNER_DIFF_X (f); @@ -2206,7 +2095,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, prefix = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX); pane_string = (NILP (pane_name) ? "" : SSDATA (pane_name)); - if (keymaps && !NILP (prefix)) + if ((menuflags & MENU_KEYMAPS) && !NILP (prefix)) pane_string++; lpane = XMenuAddPane (FRAME_X_DISPLAY (f), menu, pane_string, TRUE); @@ -2215,6 +2104,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, XMenuDestroy (FRAME_X_DISPLAY (f), menu); *error_name = "Can't create pane"; unblock_input (); + dynwind_end (); return Qnil; } i += MENU_ITEMS_PANE_LENGTH; @@ -2280,6 +2170,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, XMenuDestroy (FRAME_X_DISPLAY (f), menu); *error_name = "Can't add selection to menu"; unblock_input (); + dynwind_end (); return Qnil; } i += MENU_ITEMS_ITEM_LENGTH; @@ -2329,7 +2220,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, if (ulx < 0) x -= ulx; if (uly < 0) y -= uly; - if (! for_click) + if (!(menuflags & MENU_FOR_CLICK)) { /* If position was not given by a mouse click, adjust so upper left corner of the menu as a whole ends up at given coordinates. This @@ -2383,7 +2274,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, { entry = AREF (menu_items, i + MENU_ITEMS_ITEM_VALUE); - if (keymaps) + if (menuflags & MENU_KEYMAPS) { entry = list1 (entry); if (!NILP (pane_prefix)) @@ -2405,7 +2296,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, case XM_NO_SELECT: /* Make "Cancel" equivalent to C-g unless FOR_CLICK (which means the menu was invoked with a mouse event as POSITION). */ - if (! for_click) + if (!(menuflags & MENU_FOR_CLICK)) { unblock_input (); Fsignal (Qquit, Qnil); @@ -2414,7 +2305,7 @@ xmenu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, } unblock_input (); - unbind_to (specpdl_count, Qnil); + dynwind_end (); return entry; } @@ -2444,6 +2335,8 @@ DEFUN ("menu-or-popup-active-p", Fmenu_or_popup_active_p, Smenu_or_popup_active_ void syms_of_xmenu (void) { +#include "xmenu.x" + DEFSYM (Qdebug_on_next_call, "debug-on-next-call"); #ifdef USE_X_TOOLKIT @@ -2451,11 +2344,8 @@ syms_of_xmenu (void) next_menubar_widget_id = 1; #endif - defsubr (&Smenu_or_popup_active_p); - #if defined (USE_GTK) || defined (USE_X_TOOLKIT) - defsubr (&Sx_menu_bar_open_internal); Ffset (intern_c_string ("accelerate-menu"), - intern_c_string (Sx_menu_bar_open_internal.symbol_name)); + intern_c_string ("x-menu-bar-open-internal")); #endif }