Prevent non-local exits from ns-in-echo-area

* src/nsterm.m (ns_in_echo_area_1):
(ns_in_echo_area_2):
(ns_in_echo_area): New functions.
([EmacsView firstRectForCharacterRange:]): Call them instead.
(syms_of_nsterm): New defsym.
This commit is contained in:
Po Lu 2022-11-13 09:03:51 +08:00
parent 9d334f558a
commit 47b377f64b

View file

@ -7056,6 +7056,36 @@ - (void)unmarkText
processingCompose = NO;
}
static Lisp_Object
ns_in_echo_area_1 (void *ptr)
{
Lisp_Object in_echo_area;
specpdl_ref count;
count = SPECPDL_INDEX ();
specbind (Qinhibit_quit, Qt);
in_echo_area = safe_call (1, Qns_in_echo_area);
return unbind_to (count, in_echo_area);
}
static Lisp_Object
ns_in_echo_area_2 (enum nonlocal_exit exit, Lisp_Object error)
{
return Qnil;
}
static bool
ns_in_echo_area (void)
{
Lisp_Object in_echo_area;
in_echo_area
= internal_catch_all (ns_in_echo_area_1, NULL,
ns_in_echo_area_2);
return !NILP (in_echo_area);
}
/* Used to position char selection windows, etc. */
- (NSRect)firstRectForCharacterRange: (NSRange)theRange
@ -7069,7 +7099,7 @@ - (NSRect)firstRectForCharacterRange: (NSRange)theRange
if (NS_KEYLOG)
NSLog (@"firstRectForCharRange request");
if (WINDOWP (echo_area_window) && ! NILP (call0 (intern ("ns-in-echo-area"))))
if (WINDOWP (echo_area_window) && ns_in_echo_area ())
win = XWINDOW (echo_area_window);
else
win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe));
@ -11012,6 +11042,7 @@ Nil means use fullscreen the old (< 10.7) way. The old way works better with
DEFSYM (Qcondensed, "condensed");
DEFSYM (Qreverse_italic, "reverse-italic");
DEFSYM (Qexpanded, "expanded");
DEFSYM (Qns_in_echo_area, "ns-in-echo-area");
#ifdef NS_IMPL_COCOA
Fprovide (Qcocoa, Qnil);