(get_next_display_element): Use `escape-glyph' for

control chars and escaped octal codes.
(Qescape_glyph): New variable.
(syms_of_xdisp): Initialize it.
(escape_glyph_face): New variable.
(redisplay_window): Initialize it.
This commit is contained in:
Richard M. Stallman 2004-12-08 22:06:31 +00:00
parent c14a736ec0
commit 303747453b

View file

@ -342,6 +342,11 @@ Lisp_Object Vvoid_text_area_pointer;
Lisp_Object Qtrailing_whitespace;
/* Name and number of the face used to highlight escape glyphs. */
Lisp_Object Qescape_glyph;
int escape_glyph_face;
/* The symbol `image' which is the car of the lists used to represent
images in Lisp. */
@ -4922,6 +4927,21 @@ get_next_display_element (it)
display. Then, set IT->dpvec to these glyphs. */
GLYPH g;
int ctl_len;
int face_id = escape_glyph_face;
/* Find the face id if `escape-glyph' unless we recently did. */
if (face_id < 0)
{
Lisp_Object tem = Fget (Qescape_glyph, Qface);
if (INTEGERP (tem))
face_id = XINT (tem);
else
face_id = 0;
/* If there's overflow, use 0 instead. */
if (FAST_GLYPH_FACE (FAST_MAKE_GLYPH (0, face_id)) != face_id)
face_id = 0;
escape_glyph_face = face_id;
}
if (it->c < 128 && it->ctl_arrow_p)
{
@ -4931,10 +4951,10 @@ get_next_display_element (it)
&& GLYPH_CHAR_VALID_P (XINT (DISP_CTRL_GLYPH (it->dp))))
g = XINT (DISP_CTRL_GLYPH (it->dp));
else
g = FAST_MAKE_GLYPH ('^', 0);
g = FAST_MAKE_GLYPH ('^', face_id);
XSETINT (it->ctl_chars[0], g);
g = FAST_MAKE_GLYPH (it->c ^ 0100, 0);
g = FAST_MAKE_GLYPH (it->c ^ 0100, face_id);
XSETINT (it->ctl_chars[1], g);
ctl_len = 2;
}
@ -4951,7 +4971,7 @@ get_next_display_element (it)
&& GLYPH_CHAR_VALID_P (XFASTINT (DISP_ESCAPE_GLYPH (it->dp))))
escape_glyph = XFASTINT (DISP_ESCAPE_GLYPH (it->dp));
else
escape_glyph = FAST_MAKE_GLYPH ('\\', 0);
escape_glyph = FAST_MAKE_GLYPH ('\\', face_id);
if (SINGLE_BYTE_CHAR_P (it->c))
str[0] = it->c, len = 1;
@ -4978,11 +4998,14 @@ get_next_display_element (it)
XSETINT (it->ctl_chars[i * 4], escape_glyph);
/* Insert three more glyphs into IT->ctl_chars for
the octal display of the character. */
g = FAST_MAKE_GLYPH (((str[i] >> 6) & 7) + '0', 0);
g = FAST_MAKE_GLYPH (((str[i] >> 6) & 7) + '0',
face_id);
XSETINT (it->ctl_chars[i * 4 + 1], g);
g = FAST_MAKE_GLYPH (((str[i] >> 3) & 7) + '0', 0);
g = FAST_MAKE_GLYPH (((str[i] >> 3) & 7) + '0',
face_id);
XSETINT (it->ctl_chars[i * 4 + 2], g);
g = FAST_MAKE_GLYPH ((str[i] & 7) + '0', 0);
g = FAST_MAKE_GLYPH ((str[i] & 7) + '0',
face_id);
XSETINT (it->ctl_chars[i * 4 + 3], g);
}
ctl_len = len * 4;
@ -11578,6 +11601,9 @@ redisplay_window (window, just_this_one_p)
*w->desired_matrix->method = 0;
#endif
/* Force this to be looked up again for each redisp of each window. */
escape_glyph_face = -1;
specbind (Qinhibit_point_motion_hooks, Qt);
reconsider_clip_changes (w, buffer);
@ -22145,6 +22171,8 @@ syms_of_xdisp ()
staticpro (&Qfontification_functions);
Qtrailing_whitespace = intern ("trailing-whitespace");
staticpro (&Qtrailing_whitespace);
Qescape_glyph = intern ("escape-glyph");
staticpro (&Qescape_glyph);
Qimage = intern ("image");
staticpro (&Qimage);
QCmap = intern (":map");