From cfd794af4214ae0e5587ab8b1f4e5fcb355a0f12 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Wed, 4 Jun 2014 08:58:31 +0400 Subject: [PATCH] Use terminal-specific hooks to display menus. * termhooks.h (struct terminal): New field menu_show_hook. * menu.h (): Bit flags for menu hooks. (x_menu_show, w32_menu_show, ns_menu_show, tty_menu_show): Adjust prototypes. * menu.c (Fx_popup_menu): Use bit flags and menu_show_hook. * nsmenu.m (ns_menu_show): * w32menu.c (w32_menu_show): * xmenu.c (x_menu_show): * term.c (tty_menu_show): Adjust to use bit flags. (set_tty_hooks): Set menu_show_hook. * xterm.c (x_create_terminal): * nsterm.m (ns_create_terminal): * msdos.c (initialize_msdos_display): * w32term.c (w32_create_terminal): Likewise. --- src/ChangeLog | 18 +++++++++++++++++ src/menu.c | 53 ++++++++++--------------------------------------- src/menu.h | 27 ++++++++++++++++++------- src/msdos.c | 1 + src/nsmenu.m | 3 ++- src/nsterm.m | 3 ++- src/term.c | 19 ++++++++++++------ src/termhooks.h | 5 ++++- src/w32menu.c | 17 ++++++++-------- src/w32term.c | 2 ++ src/xmenu.c | 40 +++++++++++++++++++------------------ src/xterm.c | 2 ++ 12 files changed, 104 insertions(+), 86 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 48f82e9ef42..bf46f8e7f1e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,21 @@ +2014-06-04 Dmitry Antipov + + Use terminal-specific hooks to display menus. + * termhooks.h (struct terminal): New field menu_show_hook. + * menu.h (): Bit flags for menu hooks. + (x_menu_show, w32_menu_show, ns_menu_show, tty_menu_show): + Adjust prototypes. + * menu.c (Fx_popup_menu): Use bit flags and menu_show_hook. + * nsmenu.m (ns_menu_show): + * w32menu.c (w32_menu_show): + * xmenu.c (x_menu_show): + * term.c (tty_menu_show): Adjust to use bit flags. + (set_tty_hooks): Set menu_show_hook. + * xterm.c (x_create_terminal): + * nsterm.m (ns_create_terminal): + * msdos.c (initialize_msdos_display): + * w32term.c (w32_create_terminal): Likewise. + 2014-06-03 Juanma Barranquero * w32heap.c (DUMPED_HEAP_SIZE) [!_WIN64]: Reduce to 11 MB. diff --git a/src/menu.c b/src/menu.c index 0cd886f55d1..b65401c6f4f 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1161,9 +1161,7 @@ no quit occurs and `x-popup-menu' returns nil. */) Lisp_Object selection = Qnil; struct frame *f = NULL; Lisp_Object x, y, window; - bool keymaps = 0; - bool for_click = 0; - bool kbd_menu_navigation = 0; + int menuflags = 0; ptrdiff_t specpdl_count = SPECPDL_INDEX (); struct gcpro gcpro1; @@ -1193,12 +1191,12 @@ no quit occurs and `x-popup-menu' returns nil. */) } else { - for_click = 1; + menuflags |= MENU_FOR_CLICK; tem = Fcar (Fcdr (position)); /* EVENT_START (position) */ window = Fcar (tem); /* POSN_WINDOW (tem) */ tem2 = Fcar (Fcdr (tem)); /* POSN_POSN (tem) */ - /* The kbd_menu_navigation flag is set when the menu was - invoked by F10, which probably means they have no + /* The MENU_KBD_NAVIGATION field is set when the menu + was invoked by F10, which probably means they have no mouse. In that case, we let them switch between top-level menu-bar menus by using C-f/C-b and horizontal arrow keys, since they cannot click the @@ -1211,7 +1209,7 @@ no quit occurs and `x-popup-menu' returns nil. */) if (!EQ (POSN_POSN (last_nonmenu_event), POSN_POSN (position)) && CONSP (tem2) && EQ (Fcar (tem2), Qmenu_bar)) - kbd_menu_navigation = 1; + menuflags |= MENU_KBD_NAVIGATION; tem = Fcar (Fcdr (Fcdr (tem))); /* POSN_WINDOW_POSN (tem) */ x = Fcar (tem); y = Fcdr (tem); @@ -1340,7 +1338,7 @@ no quit occurs and `x-popup-menu' returns nil. */) if (!NILP (prompt) && menu_items_n_panes >= 0) ASET (menu_items, MENU_ITEMS_PANE_NAME, prompt); - keymaps = 1; + menuflags |= MENU_KEYMAPS; } else if (CONSP (menu) && KEYMAPP (XCAR (menu))) { @@ -1373,7 +1371,7 @@ no quit occurs and `x-popup-menu' returns nil. */) if (!NILP (title) && menu_items_n_panes >= 0) ASET (menu_items, MENU_ITEMS_PANE_NAME, title); - keymaps = 1; + menuflags |= MENU_KEYMAPS; SAFE_FREE (); } @@ -1385,7 +1383,7 @@ no quit occurs and `x-popup-menu' returns nil. */) list_of_panes (Fcdr (menu)); - keymaps = 0; + menuflags &= ~MENU_KEYMAPS; } unbind_to (specpdl_count, Qnil); @@ -1416,39 +1414,8 @@ no quit occurs and `x-popup-menu' returns nil. */) #endif /* Display them in a menu. */ - - /* FIXME: Use a terminal hook! */ -#if defined HAVE_NTGUI - if (FRAME_W32_P (f)) - selection = w32_menu_show (f, xpos, ypos, for_click, - keymaps, title, &error_name); - else -#endif -#if defined HAVE_NS - if (FRAME_NS_P (f)) - selection = ns_menu_show (f, xpos, ypos, for_click, - keymaps, title, &error_name); - else -#endif -#if (defined (HAVE_X_WINDOWS) || defined (MSDOS)) - if (FRAME_X_P (f) || FRAME_MSDOS_P (f)) - selection = xmenu_show (f, xpos, ypos, for_click, - keymaps, title, &error_name); - else -#endif -#ifndef MSDOS - if (FRAME_TERMCAP_P (f)) - { - ptrdiff_t count1 = SPECPDL_INDEX (); - - /* Avoid crashes if, e.g., another client will connect while we - are in a menu. */ - temporarily_switch_to_single_kboard (f); - selection = tty_menu_show (f, xpos, ypos, for_click, keymaps, title, - kbd_menu_navigation, &error_name); - unbind_to (count1, Qnil); - } -#endif + selection = FRAME_TERMINAL (f)->menu_show_hook (f, xpos, ypos, menuflags, + title, &error_name); #ifdef HAVE_NS unbind_to (specpdl_count, Qnil); diff --git a/src/menu.h b/src/menu.h index 266a471bc38..e2d7601378e 100644 --- a/src/menu.h +++ b/src/menu.h @@ -26,6 +26,14 @@ along with GNU Emacs. If not, see . */ extern Lisp_Object Qunsupported__w32_dialog; #endif +/* Bit fields used by terminal-specific menu_show_hook. */ + +enum { + MENU_KEYMAPS = 0x1, + MENU_FOR_CLICK = 0x2, + MENU_KBD_NAVIGATION = 0x4 +}; + extern void x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval); @@ -49,14 +57,19 @@ extern widget_value *digest_single_submenu (int, int, bool); #ifdef HAVE_X_WINDOWS extern void mouse_position_for_popup (struct frame *f, int *x, int *y); #endif - -extern Lisp_Object w32_menu_show (struct frame *, int, int, int, int, +#if defined (HAVE_X_WINDOWS) || defined (MSDOS) +extern Lisp_Object x_menu_show (struct frame *, int, int, int, + Lisp_Object, const char **); +#endif +#ifdef HAVE_NTGUI +extern Lisp_Object w32_menu_show (struct frame *, int, int, int, Lisp_Object, const char **); -extern Lisp_Object ns_menu_show (struct frame *, int, int, bool, bool, +#endif +#ifdef HAVE_NS +extern Lisp_Object ns_menu_show (struct frame *, int, int, int, Lisp_Object, const char **); -extern Lisp_Object xmenu_show (struct frame *, int, int, bool, bool, - Lisp_Object, const char **); -extern Lisp_Object tty_menu_show (struct frame *, int, int, bool, bool, - Lisp_Object, bool, const char **); +#endif +extern Lisp_Object tty_menu_show (struct frame *, int, int, int, + Lisp_Object, const char **); extern ptrdiff_t menu_item_width (const unsigned char *); #endif /* MENU_H */ diff --git a/src/msdos.c b/src/msdos.c index 21794341222..ccca371583f 100644 --- a/src/msdos.c +++ b/src/msdos.c @@ -1863,6 +1863,7 @@ initialize_msdos_display (struct terminal *term) term->update_end_hook = IT_update_end; term->frame_up_to_date_hook = IT_frame_up_to_date; term->mouse_position_hook = 0; /* set later by dos_ttraw */ + term->menu_show_hook = x_menu_show; term->frame_rehighlight_hook = 0; term->frame_raise_lower_hook = 0; term->set_vertical_scroll_bar_hook = 0; diff --git a/src/nsmenu.m b/src/nsmenu.m index 46b7400b2e4..65494cb2582 100644 --- a/src/nsmenu.m +++ b/src/nsmenu.m @@ -812,7 +812,7 @@ extern NSString *NSMenuDidBeginTrackingNotification; ========================================================================== */ Lisp_Object -ns_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, +ns_menu_show (struct frame *f, int x, int y, int menuflags, Lisp_Object title, const char **error) { EmacsMenu *pmenu; @@ -820,6 +820,7 @@ ns_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, Lisp_Object tem; ptrdiff_t specpdl_count = SPECPDL_INDEX (); widget_value *wv, *first_wv = 0; + bool keymaps = (menuflags & MENU_KEYMAPS); block_input (); diff --git a/src/nsterm.m b/src/nsterm.m index f91b86daea6..295cfc5c86d 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -54,7 +54,7 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu) #include "termhooks.h" #include "termchar.h" - +#include "menu.h" #include "window.h" #include "keyboard.h" #include "buffer.h" @@ -4164,6 +4164,7 @@ ns_create_terminal (struct ns_display_info *dpyinfo) terminal->frame_rehighlight_hook = ns_frame_rehighlight; terminal->frame_raise_lower_hook = ns_frame_raise_lower; terminal->fullscreen_hook = ns_fullscreen_hook; + terminal->menu_show_hook = ns_menu_show; terminal->set_vertical_scroll_bar_hook = ns_set_vertical_scroll_bar; terminal->condemn_scroll_bars_hook = ns_condemn_scroll_bars; terminal->redeem_scroll_bar_hook = ns_redeem_scroll_bar; diff --git a/src/term.c b/src/term.c index 379c94e54a1..aa0be9871c8 100644 --- a/src/term.c +++ b/src/term.c @@ -3583,8 +3583,8 @@ tty_menu_new_item_coords (struct frame *f, int which, int *x, int *y) } Lisp_Object -tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, - Lisp_Object title, bool kbd_navigation, const char **error_name) +tty_menu_show (struct frame *f, int x, int y, int menuflags, + Lisp_Object title, const char **error_name) { tty_menu *menu; int pane, selidx, lpane, status; @@ -3621,6 +3621,10 @@ tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, menu functions pointers to the contents of strings. */ specpdl_count = inhibit_garbage_collection (); + /* Avoid crashes if, e.g., another client will connect while we + are in a menu. */ + temporarily_switch_to_single_kboard (f); + /* Adjust coordinates to be root-window-relative. */ item_x = x += f->left_pos; item_y = y += f->top_pos; @@ -3642,7 +3646,7 @@ tty_menu_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 = tty_menu_add_pane (menu, pane_string); @@ -3782,7 +3786,8 @@ tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, specbind (Qoverriding_terminal_local_map, Fsymbol_value (Qtty_menu_navigation_map)); status = tty_menu_activate (menu, &pane, &selidx, x, y, &datap, - tty_menu_help_callback, kbd_navigation); + tty_menu_help_callback, + menuflags & MENU_KBD_NAVIGATION); entry = pane_prefix = Qnil; switch (status) @@ -3808,7 +3813,7 @@ tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, { entry = AREF (menu_items, i + MENU_ITEMS_ITEM_VALUE); - if (keymaps != 0) + if (menuflags & MENU_KEYMAPS) { entry = Fcons (entry, Qnil); if (!NILP (pane_prefix)) @@ -3841,7 +3846,7 @@ tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, Ftop_level (); /* 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)) Fsignal (Qquit, Qnil); break; } @@ -3922,6 +3927,7 @@ clear_tty_hooks (struct terminal *terminal) terminal->frame_rehighlight_hook = 0; terminal->frame_raise_lower_hook = 0; terminal->fullscreen_hook = 0; + terminal->menu_show_hook = 0; terminal->set_vertical_scroll_bar_hook = 0; terminal->condemn_scroll_bars_hook = 0; terminal->redeem_scroll_bar_hook = 0; @@ -3953,6 +3959,7 @@ set_tty_hooks (struct terminal *terminal) terminal->reset_terminal_modes_hook = &tty_reset_terminal_modes; terminal->set_terminal_modes_hook = &tty_set_terminal_modes; terminal->update_end_hook = &tty_update_end; + terminal->menu_show_hook = &tty_menu_show; terminal->set_terminal_window_hook = &tty_set_terminal_window; terminal->read_socket_hook = &tty_read_avail_input; /* keyboard.c */ terminal->delete_frame_hook = &tty_free_frame_resources; diff --git a/src/termhooks.h b/src/termhooks.h index 207b8ccbc3c..76adc539e48 100644 --- a/src/termhooks.h +++ b/src/termhooks.h @@ -478,7 +478,10 @@ struct terminal may do something OS dependent, like extended window manager hints on X11. */ void (*fullscreen_hook) (struct frame *f); - + /* This hook is called to display menus. */ + Lisp_Object (*menu_show_hook) (struct frame *f, int x, int y, int menuflags, + Lisp_Object title, const char **error_name); + /* Scroll bar hooks. */ /* The representation of scroll bars is determined by the code which diff --git a/src/w32menu.c b/src/w32menu.c index 467eb7a5710..6276c840fc6 100644 --- a/src/w32menu.c +++ b/src/w32menu.c @@ -549,8 +549,9 @@ free_frame_menubar (struct frame *f) /* 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 nonzero if this menu was invoked for a mouse click. - KEYMAPS is 1 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. @@ -558,7 +559,7 @@ free_frame_menubar (struct frame *f) (We return nil on failure, but the value doesn't actually matter.) */ Lisp_Object -w32_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, +w32_menu_show (struct frame *f, int x, int y, int menuflags, Lisp_Object title, const char **error) { int i; @@ -647,14 +648,14 @@ w32_menu_show (struct frame *f, int x, int y, int for_click, int 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 = make_widget_value (pane_string, NULL, true, Qnil); if (save_wv) save_wv->next = wv; else first_wv->contents = wv; - if (keymaps && !NILP (prefix)) + if ((menuflags & MENU_KEYMAPS) && !NILP (prefix)) wv->name++; wv->button_type = BUTTON_TYPE_NONE; save_wv = wv; @@ -811,10 +812,10 @@ w32_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, i += 1; else { - entry = AREF (menu_items, i + MENU_ITEMS_ITEM_VALUE); + entry = AREF (menu_items, i + MENU_ITEMS_ITEM_VALUE); if (menu_item_selection == i) { - if (keymaps != 0) + if (menuflags & MENU_KEYMAPS) { int j; @@ -832,7 +833,7 @@ w32_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, } } } - else if (!for_click) + else if (!(menuflags & MENU_FOR_CLICK)) { unblock_input (); /* Make "Cancel" equivalent to C-g. */ diff --git a/src/w32term.c b/src/w32term.c index 5145c840c71..213cff4f138 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -50,6 +50,7 @@ along with GNU Emacs. If not, see . */ #include "process.h" #include "atimer.h" #include "keymap.h" +#include "menu.h" #ifdef WINDOWSNT #include "w32.h" /* for filename_from_utf16, filename_from_ansi */ @@ -6272,6 +6273,7 @@ w32_create_terminal (struct w32_display_info *dpyinfo) terminal->frame_rehighlight_hook = w32_frame_rehighlight; terminal->frame_raise_lower_hook = w32_frame_raise_lower; terminal->fullscreen_hook = w32fullscreen_hook; + terminal->menu_show_hook = w32_menu_show; terminal->set_vertical_scroll_bar_hook = w32_set_vertical_scroll_bar; terminal->condemn_scroll_bars_hook = w32_condemn_scroll_bars; terminal->redeem_scroll_bar_hook = w32_redeem_scroll_bar; diff --git a/src/xmenu.c b/src/xmenu.c index c167eaa8159..18793457dad 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -179,7 +179,7 @@ mouse_position_for_popup (struct frame *f, int *x, int *y) unblock_input (); - /* xmenu_show expects window coordinates, not root window + /* x_menu_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); @@ -1158,16 +1158,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. @@ -1433,8 +1434,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; @@ -1519,14 +1520,14 @@ 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 = make_widget_value (pane_string, NULL, true, Qnil); if (save_wv) save_wv->next = wv; else first_wv->contents = wv; - if (keymaps && !NILP (prefix)) + if ((menuflags & MENU_KEYMAPS) && !NILP (prefix)) wv->name++; wv->button_type = BUTTON_TYPE_NONE; save_wv = wv; @@ -1625,7 +1626,8 @@ 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); @@ -1666,7 +1668,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; @@ -1684,7 +1686,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. */ @@ -2022,7 +2024,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]; @@ -2064,8 +2066,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; @@ -2140,7 +2142,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); @@ -2263,7 +2265,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 @@ -2317,7 +2319,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)) @@ -2339,7 +2341,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); diff --git a/src/xterm.c b/src/xterm.c index c4b8db35f31..df4ab349104 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -75,6 +75,7 @@ along with GNU Emacs. If not, see . */ #include "xsettings.h" #include "xgselect.h" #include "sysselect.h" +#include "menu.h" #ifdef USE_X_TOOLKIT #include @@ -10531,6 +10532,7 @@ x_create_terminal (struct x_display_info *dpyinfo) terminal->frame_rehighlight_hook = XTframe_rehighlight; terminal->frame_raise_lower_hook = XTframe_raise_lower; terminal->fullscreen_hook = XTfullscreen_hook; + terminal->menu_show_hook = x_menu_show; terminal->set_vertical_scroll_bar_hook = XTset_vertical_scroll_bar; terminal->condemn_scroll_bars_hook = XTcondemn_scroll_bars; terminal->redeem_scroll_bar_hook = XTredeem_scroll_bar; -- 2.39.5