Avoid header line with some empty non-nil formats
Allow the value of 'header-line-format' to indicate that no header line should be displayed when it trivially yields 'nil', even if it is not plain 'nil'. Previously, any non-nil 'header-line-format' resulted in a (possibly empty) header line. This change adds some flexibility by also taking a non-nil value of 'header-line-format' to mean that no header line should be displayed if it's a list whose 'car' is a symbol and either that symbol is ':eval' and the second list element evaluates to 'nil', or the symbol's value as a variable is 'nil' or void. (Bug#63825) * src/xdisp.c (safe_eval_inhibit_quit): New function. * src/lisp.h (safe_eval_inhibit_quit): Declare it. * src/window.c (null_header_line_format): New function. (window_wants_header_line): Use it. * doc/lispref/modes.texi (Header Line): Update to reflect new conditions for displaying a window's header line. * etc/NEWS: Announce updated treatment of 'header-line-format'.
This commit is contained in:
parent
d751915ef4
commit
4f66cbbfe5
5 changed files with 72 additions and 2 deletions
|
@ -2597,6 +2597,15 @@ It is normally @code{nil}, so that ordinary buffers have no header
|
|||
line.
|
||||
@end defvar
|
||||
|
||||
Emacs displays the header line for a window unless
|
||||
@code{header-line-format} is either @code{nil}, or it's a list whose
|
||||
@sc{car} is a symbol, and either that symbol is @code{:eval} and the
|
||||
second list element evaluates to @code{nil} or the symbol's value as a
|
||||
variable is @code{nil} or void. Note that there are other possible
|
||||
values @code{header-line-format} that result in an empty header line
|
||||
(for example, @code{""}), but all other values tell Emacs to display a
|
||||
header line, whether or not it is empty.
|
||||
|
||||
If @code{display-line-numbers-mode} is turned on in a buffer
|
||||
(@pxref{Display Custom, display-line-numbers-mode,, emacs, The GNU
|
||||
Emacs Manual}), the buffer text is indented on display by the amount
|
||||
|
|
8
etc/NEWS
8
etc/NEWS
|
@ -451,6 +451,14 @@ hooks named after the feature name, like 'esh-mode-unload-hook'.
|
|||
+++
|
||||
** 'copy-tree' now copies records when its optional 2nd argument is non-nil.
|
||||
|
||||
+++
|
||||
** Certain values of 'header-line-format' now inhibit empty header line.
|
||||
Emacs now avoids displaying a header line, instead of displaying an
|
||||
empty one, when 'header-line-format' is a list whose 'car' is a
|
||||
symbol, and either that symbol is ':eval' and the second element of
|
||||
the list evaluates to 'nil' or the symbol's value as a variable is
|
||||
'nil' or void.
|
||||
|
||||
|
||||
* Lisp Changes in Emacs 30.1
|
||||
|
||||
|
|
|
@ -4174,6 +4174,7 @@ void set_frame_cursor_types (struct frame *, Lisp_Object);
|
|||
extern void syms_of_xdisp (void);
|
||||
extern void init_xdisp (void);
|
||||
extern Lisp_Object safe_eval (Lisp_Object);
|
||||
extern Lisp_Object safe_eval_inhibit_quit (Lisp_Object);
|
||||
extern bool pos_visible_p (struct window *, ptrdiff_t, int *,
|
||||
int *, int *, int *, int *, int *);
|
||||
|
||||
|
|
50
src/window.c
50
src/window.c
|
@ -5471,6 +5471,48 @@ window_wants_mode_line (struct window *w)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* null_header_line_format:
|
||||
*
|
||||
* Return non-zero when header line format FMT indicates that the
|
||||
* header line should not be displayed at all.
|
||||
*
|
||||
* This is when FMT is nil, or if FMT is a cons cell and either its
|
||||
* car is a symbol whose value as a variable is nil or void, or its
|
||||
* car is the symbol ':eval' and its cadr evaluates to nil.
|
||||
*/
|
||||
static bool
|
||||
null_header_line_format (Lisp_Object fmt, struct frame * f)
|
||||
{
|
||||
Lisp_Object car;
|
||||
Lisp_Object val;
|
||||
|
||||
if (NILP (fmt))
|
||||
return true;
|
||||
|
||||
if (CONSP (fmt))
|
||||
{
|
||||
car = XCAR (fmt);
|
||||
if (SYMBOLP (car))
|
||||
{
|
||||
if (EQ (car, QCeval))
|
||||
{
|
||||
val = safe_eval_inhibit_quit (XCAR (XCDR (fmt)));
|
||||
if (!FRAME_LIVE_P (f))
|
||||
signal_error (":eval deleted the frame being displayed", fmt);
|
||||
return NILP (val);
|
||||
}
|
||||
val = find_symbol_value (car);
|
||||
return (SYMBOLP (car)
|
||||
&& (EQ (val, Qunbound)
|
||||
|| NILP (val)));
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* window_wants_header_line:
|
||||
*
|
||||
|
@ -5491,12 +5533,16 @@ window_wants_header_line (struct window *w)
|
|||
Lisp_Object window_header_line_format =
|
||||
window_parameter (w, Qheader_line_format);
|
||||
|
||||
struct frame * f = WINDOW_XFRAME(w);
|
||||
|
||||
return (WINDOW_LEAF_P (w)
|
||||
&& !MINI_WINDOW_P (w)
|
||||
&& !WINDOW_PSEUDO_P (w)
|
||||
&& !EQ (window_header_line_format, Qnone)
|
||||
&& (!NILP (window_header_line_format)
|
||||
|| !NILP (BVAR (XBUFFER (WINDOW_BUFFER (w)), header_line_format)))
|
||||
&& (!null_header_line_format (window_header_line_format, f)
|
||||
|| !null_header_line_format (BVAR (XBUFFER (WINDOW_BUFFER (w)),
|
||||
header_line_format),
|
||||
f))
|
||||
&& (WINDOW_PIXEL_HEIGHT (w)
|
||||
> (window_wants_mode_line (w)
|
||||
? 2 * WINDOW_FRAME_LINE_HEIGHT (w)
|
||||
|
|
|
@ -3074,6 +3074,12 @@ safe__eval (bool inhibit_quit, Lisp_Object sexpr)
|
|||
return safe__call1 (inhibit_quit, Qeval, sexpr);
|
||||
}
|
||||
|
||||
Lisp_Object
|
||||
safe_eval_inhibit_quit (Lisp_Object sexpr)
|
||||
{
|
||||
return safe__eval (true, sexpr);
|
||||
}
|
||||
|
||||
/* Call function FN with two arguments ARG1 and ARG2.
|
||||
Return the result, or nil if something went wrong. */
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue