]> code.delx.au - gnu-emacs/blobdiff - src/indent.c
Merge from emacs--rel--22
[gnu-emacs] / src / indent.c
index b4a47782e3e54ff9e6bd8518234b700b4304fe91..9ac4478bf574ec1b4ab1d2fefa2f602c172accc8 100644 (file)
@@ -504,6 +504,47 @@ current_column ()
   return col;
 }
 \f
+extern Lisp_Object Qspace, QCwidth, QCalign_to;
+
+/* Check the presence of a display property and compute its width.
+   If a property was found and its width was found as well, return
+   its width (>= 0) and set the position of the end of the property
+   in ENDPOS.
+   Otherwise just return -1.  */
+static int
+check_display_width (EMACS_INT pos, EMACS_INT col, EMACS_INT *endpos)
+{
+  Lisp_Object val, overlay;
+
+  if (CONSP (val = get_char_property_and_overlay
+            (make_number (pos), Qdisplay, Qnil, &overlay))
+      && EQ (Qspace, XCAR (val)))
+    { /* FIXME: Use calc_pixel_width_or_height, as in term.c.  */
+      Lisp_Object plist = XCDR (val), prop;
+      int width = -1;
+
+      if ((prop = Fplist_get (plist, QCwidth), NATNUMP (prop)))
+       width = XINT (prop);
+      else if (FLOATP (prop))
+       width = (int)(XFLOAT_DATA (prop) + 0.5);
+      else if ((prop = Fplist_get (plist, QCalign_to), NATNUMP (prop)))
+       width = XINT (prop) - col;
+      else if (FLOATP (prop))
+       width = (int)(XFLOAT_DATA (prop) + 0.5) - col;
+           
+      if (width >= 0)
+       {
+         EMACS_INT start;
+         if (OVERLAYP (overlay))
+           *endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
+         else
+           get_property_and_range (pos, Qdisplay, &val, &start, endpos, Qnil);
+         return width;
+       }
+    }
+  return -1;
+}
+
 /* Scanning from the beginning of the current line, stop at the buffer
    position ENDPOS or at the column GOALCOL or at the end of line, whichever
    comes first.
@@ -560,8 +601,7 @@ scan_for_column (EMACS_INT *endpos, EMACS_INT *goalcol, EMACS_INT *prevcol)
        break;
       prev_col = col;
 
-      /* Check composition sequence.  */
-      {
+      { /* Check composition sequence.  */
        int len, len_byte, width;
 
        if (check_composition (scan, scan_byte, end,
@@ -575,6 +615,20 @@ scan_for_column (EMACS_INT *endpos, EMACS_INT *goalcol, EMACS_INT *prevcol)
          }
       }
 
+      { /* Check display property.  */
+       EMACS_INT end;
+       int width = check_display_width (scan, col, &end);
+       if (width >= 0)
+         {
+           col += width;
+           if (end > scan) /* Avoid infinite loops with 0-width overlays.  */
+             {
+               scan = end; scan_byte = charpos_to_bytepos (scan);
+               continue;
+             }
+         }
+      }
+
       c = FETCH_BYTE (scan_byte);
 
       /* See if there is a display table and it relates
@@ -984,10 +1038,11 @@ The return value is the current column.  */)
      and scan through it again.  */
   if (!NILP (force) && col > goal)
     {
+      int c;
       EMACS_INT pos_byte = PT_BYTE;
-      DEC_POS (pos_byte);
-      int c = FETCH_CHAR (pos_byte);
 
+      DEC_POS (pos_byte);
+      c = FETCH_CHAR (pos_byte);
       if (c == '\t' && prev_col < goal)
        {
          EMACS_INT goal_pt, goal_pt_byte;