(get_next_display_element): Use `escape-glyph' for
authorRichard M. Stallman <rms@gnu.org>
Wed, 8 Dec 2004 22:06:31 +0000 (22:06 +0000)
committerRichard M. Stallman <rms@gnu.org>
Wed, 8 Dec 2004 22:06:31 +0000 (22:06 +0000)
control chars and escaped octal codes.
(Qescape_glyph): New variable.
(syms_of_xdisp): Initialize it.
(escape_glyph_face): New variable.
(redisplay_window): Initialize it.

src/xdisp.c

index c4c39fd..491418d 100644 (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");