Fix unrelated help text tooltips if a popup is shown during the delay

* doc/lispref/frames.texi (Pop-Up Menus): Document new hook.
* etc/NEWS: Announce `x-pre-popup-menu-hook'.
* lisp/tooltip.el (tooltip-mode): Make sure `tooltip-hide' is
run before any popup menu is displayed to prevent unrelated help
text from obscuring the popup menu if it pops up during the
tooltip delay.
* src/menu.c (x_popup_menu_1): Run said hook right before the
popup menu is displayed.
(syms_of_menu): New hook `x-pre-popup-menu-hook'.
This commit is contained in:
Po Lu 2022-01-29 18:53:28 +08:00
parent 0a5ece3da1
commit e380fb509b
4 changed files with 31 additions and 3 deletions

View file

@ -3744,6 +3744,13 @@ still use a menu keymap to implement it. To make the contents vary, add
a hook function to @code{menu-bar-update-hook} to update the contents of
the menu keymap as necessary.
@defvar x-pre-popup-menu-hook
A normal hook run immediately before a pop-up menu is displayed,
either directly by calling @code{x-popup-menu}, or through a menu
keymap. It won't be called if @code{x-popup-menu} returns for some
other reason without displaying a pop-up menu.
@end defvar
@node Dialog Boxes
@section Dialog Boxes
@cindex dialog boxes

View file

@ -1085,6 +1085,11 @@ This event is sent when a user performs a pinch gesture on a touchpad,
which is comprised of placing two fingers on the touchpad and moving
them towards or away from each other.
+++
** New hook 'x-pre-popup-menu-hook'.
This hook is run before 'x-popup-menu' is about to display a
deck-of-cards menu on screen.
** Text security and suspiciousness
+++

View file

@ -58,9 +58,11 @@ echo area, instead of making a pop-up window."
(if (and tooltip-mode (fboundp 'x-show-tip))
(progn
(add-hook 'pre-command-hook 'tooltip-hide)
(add-hook 'tooltip-functions 'tooltip-help-tips))
(add-hook 'tooltip-functions 'tooltip-help-tips)
(add-hook 'x-pre-popup-menu-hook 'tooltip-hide))
(unless (and (boundp 'gud-tooltip-mode) gud-tooltip-mode)
(remove-hook 'pre-command-hook 'tooltip-hide))
(remove-hook 'pre-command-hook 'tooltip-hide)
(remove-hook 'x-pre-popup-menu-hook 'tooltip-hide))
(remove-hook 'tooltip-functions 'tooltip-help-tips))
(setq show-help-function
(if tooltip-mode 'tooltip-show-help 'tooltip-show-help-non-mode)))

View file

@ -1395,6 +1395,8 @@ x_popup_menu_1 (Lisp_Object position, Lisp_Object menu)
record_unwind_protect_void (discard_menu_items);
#endif
run_hook (Qx_pre_popup_menu_hook);
/* Display them in a menu, but not if F is the initial frame that
doesn't have its hooks set (e.g., in a batch session), because
such a frame cannot display menus. */
@ -1408,7 +1410,11 @@ x_popup_menu_1 (Lisp_Object position, Lisp_Object menu)
discard_menu_items ();
#endif
#ifdef HAVE_NTGUI /* FIXME: Is it really w32-specific? --Stef */
#ifdef HAVE_NTGUI /* W32 specific because other terminals clear
the grab inside their `menu_show_hook's if
it's actually required (i.e. there isn't a
way to query the buttons currently held down
after XMenuActivate). */
if (FRAME_W32_P (f))
FRAME_DISPLAY_INFO (f)->grabbed = 0;
#endif
@ -1602,6 +1608,14 @@ syms_of_menu (void)
staticpro (&menu_items);
DEFSYM (Qhide, "hide");
DEFSYM (Qx_pre_popup_menu_hook, "x-pre-popup-menu-hook");
DEFVAR_LISP ("x-pre-popup-menu-hook", Vx_pre_popup_menu_hook,
doc: /* Hook run before `x-popup-menu' displays a popup menu.
It is only run before the menu is really going to be displayed. It
won't be run if `x-popup-menu' fails or returns for some other reason
(such as the keymap is invalid). */);
Vx_pre_popup_menu_hook = Qnil;
defsubr (&Sx_popup_menu);
defsubr (&Sx_popup_dialog);