Merge from origin/emacs-28

d791cd556d Fix '(space :relative-width N)' display spec w/non-ASCII c...
712898210f * lisp/proced.el (proced-sort-header): Fix event positions...

# Conflicts:
#	lisp/proced.el
This commit is contained in:
Stefan Kangas 2021-11-23 08:49:49 +01:00
commit 4c5efda8d3
2 changed files with 26 additions and 11 deletions

View file

@ -1333,11 +1333,12 @@ It is converted to the corresponding attribute key.
This command updates the variable `proced-sort'.
Prefix ARG controls sort order, see `proced-sort-interactive'."
(interactive (list last-input-event (or last-prefix-arg 'no-arg)) proced-mode)
(let ((start (event-start event))
col key)
(let* ((start (event-start event))
(obj (posn-object start))
col key)
(save-selected-window
(select-window (posn-window start))
(setq col (+ (1- (car (posn-actual-col-row start)))
(setq col (+ (if obj (cdr obj) (posn-point start))
(window-hscroll)))
(when (and (<= 0 col) (< col (length proced-header-line)))
(setq key (get-text-property col 'proced-key proced-header-line))

View file

@ -30017,7 +30017,7 @@ append_stretch_glyph (struct it *it, Lisp_Object object,
#endif /* HAVE_WINDOW_SYSTEM */
/* Produce a stretch glyph for iterator IT. IT->object is the value
of the glyph property displayed. The value must be a list
of the display property. The value must be a list of the form
`(space KEYWORD VALUE ...)' with the following KEYWORD/VALUE pairs
being recognized:
@ -30027,7 +30027,7 @@ append_stretch_glyph (struct it *it, Lisp_Object object,
2. `:relative-width FACTOR' specifies that the width of the stretch
should be computed from the width of the first character having the
`glyph' property, and should be FACTOR times that width.
`display' property, and should be FACTOR times that width.
3. `:align-to HPOS' specifies that the space should be wide enough
to reach HPOS, a value in canonical character units.
@ -30039,7 +30039,7 @@ append_stretch_glyph (struct it *it, Lisp_Object object,
5. `:relative-height FACTOR' specifies that the height of the
stretch should be FACTOR times the height of the characters having
the glyph property.
the display property.
Either none or exactly one of 4 or 5 must be present.
@ -30060,10 +30060,11 @@ produce_stretch_glyph (struct it *it)
#ifdef HAVE_WINDOW_SYSTEM
int ascent = 0;
bool zero_height_ok_p = false;
struct face *face;
if (FRAME_WINDOW_P (it->f))
{
struct face *face = FACE_FROM_ID (it->f, it->face_id);
face = FACE_FROM_ID (it->f, it->face_id);
font = face->font ? face->font : FRAME_FONT (it->f);
prepare_face_for_display (it->f, face);
}
@ -30084,14 +30085,27 @@ produce_stretch_glyph (struct it *it)
else if (prop = Fplist_get (plist, QCrelative_width), NUMVAL (prop) > 0)
{
/* Relative width `:relative-width FACTOR' specified and valid.
Compute the width of the characters having the `glyph'
Compute the width of the characters having this `display'
property. */
struct it it2;
unsigned char *p = BYTE_POS_ADDR (IT_BYTEPOS (*it));
Lisp_Object object = it->stack[it->sp - 1].string;
unsigned char *p = (STRINGP (object)
? SDATA (object) + IT_STRING_BYTEPOS (*it)
: BYTE_POS_ADDR (IT_BYTEPOS (*it)));
bool multibyte_p =
STRINGP (object) ? STRING_MULTIBYTE (object) : it->multibyte_p;
it2 = *it;
if (it->multibyte_p)
it2.c = it2.char_to_display = string_char_and_length (p, &it2.len);
if (multibyte_p)
{
it2.c = it2.char_to_display = string_char_and_length (p, &it2.len);
#ifdef HAVE_WINDOW_SYSTEM
if (FRAME_WINDOW_P (it->f) && ! ASCII_CHAR_P (it2.c))
it2.face_id = FACE_FOR_CHAR (it->f, face, it2.c,
IT_CHARPOS (*it),
STRINGP (object)? object : Qnil);
#endif
}
else
{
it2.c = it2.char_to_display = *p, it2.len = 1;