summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kangas <stefan@marxist.se>2021-11-23 08:49:49 +0100
committerStefan Kangas <stefan@marxist.se>2021-11-23 08:49:49 +0100
commit4c5efda8d33e582c53a0d7a1d3dfabecaca038bd (patch)
tree8ed63baa5c6d6d17399c8b2292b179d2b2548ea8
parent2955d46c00430b38310d0fae968adea91e2bbc3d (diff)
parentd791cd556d622accb935e4dd230023c485d1e07a (diff)
downloademacs-4c5efda8d33e582c53a0d7a1d3dfabecaca038bd.tar.gz
emacs-4c5efda8d33e582c53a0d7a1d3dfabecaca038bd.tar.bz2
emacs-4c5efda8d33e582c53a0d7a1d3dfabecaca038bd.zip
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
-rw-r--r--lisp/proced.el7
-rw-r--r--src/xdisp.c30
2 files changed, 26 insertions, 11 deletions
diff --git a/lisp/proced.el b/lisp/proced.el
index e959e91c6e2..9e9793abece 100644
--- a/lisp/proced.el
+++ b/lisp/proced.el
@@ -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))
diff --git a/src/xdisp.c b/src/xdisp.c
index 259d057adb1..f6aa7fe3d0c 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -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;