XEmacs 21.4.9 "Informed Management".
[chise/xemacs-chise.git.1] / src / extents.c
index 910c0aa..5b00161 100644 (file)
@@ -406,7 +406,7 @@ typedef int Endpoint_Index;
 #define DE_MUST_BE_ATTACHED 2
 
 Lisp_Object Vlast_highlighted_extent;
-int mouse_highlight_priority;
+Fixnum mouse_highlight_priority;
 
 Lisp_Object Qextentp;
 Lisp_Object Qextent_live_p;
@@ -2753,9 +2753,10 @@ invisible_ellipsis_p (REGISTER Lisp_Object propval, Lisp_Object list)
 
 face_index
 extent_fragment_update (struct window *w, struct extent_fragment *ef,
-                       Bytind pos)
+                       Bytind pos, Lisp_Object last_glyph)
 {
   int i;
+  int seen_glyph = NILP (last_glyph) ? 1 : 0;
   Extent_List *sel =
     buffer_or_string_stack_of_extents_force (ef->object)->extents;
   EXTENT lhe = 0;
@@ -2796,11 +2797,15 @@ extent_fragment_update (struct window *w, struct extent_fragment *ef,
       if (extent_start (e) == mempos && !NILP (extent_begin_glyph (e)))
        {
          Lisp_Object glyph = extent_begin_glyph (e);
-         struct glyph_block gb;
-
-         gb.glyph = glyph;
-         XSETEXTENT (gb.extent, e);
-         Dynarr_add (ef->begin_glyphs, gb);
+         if (seen_glyph) {
+           struct glyph_block gb;
+           
+           gb.glyph = glyph;
+           XSETEXTENT (gb.extent, e);
+           Dynarr_add (ef->begin_glyphs, gb);
+         }
+         else if (EQ (glyph, last_glyph))
+           seen_glyph = 1;
        }
     }
 
@@ -2811,11 +2816,15 @@ extent_fragment_update (struct window *w, struct extent_fragment *ef,
       if (extent_end (e) == mempos && !NILP (extent_end_glyph (e)))
        {
          Lisp_Object glyph = extent_end_glyph (e);
-         struct glyph_block gb;
+         if (seen_glyph) {
+           struct glyph_block gb;
 
-         gb.glyph = glyph;
-         XSETEXTENT (gb.extent, e);
-         Dynarr_add (ef->end_glyphs, gb);
+           gb.glyph = glyph;
+           XSETEXTENT (gb.extent, e);
+           Dynarr_add (ef->end_glyphs, gb);
+         }
+         else if (EQ (glyph, last_glyph))
+           seen_glyph = 1;
        }
     }
 
@@ -2950,9 +2959,9 @@ print_extent_1 (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
   if (extent_detached_p (ext))
     strcpy (bp, "detached");
   else
-    sprintf (bp, "%ld, %ld",
-            (long) XINT (Fextent_start_position (obj)),
-            (long) XINT (Fextent_end_position (obj)));
+    sprintf (bp, "%d, %d",
+            XINT (Fextent_start_position (obj)),
+            XINT (Fextent_end_position (obj)));
   bp += strlen (bp);
   *bp++ = (extent_end_open_p (anc) ? ')': ']');
   if (!NILP (extent_end_glyph (anc))) *bp++ = '*';
@@ -3426,7 +3435,7 @@ DEFUN ("next-extent-change", Fnext_extent_change, 1, 2, 0, /*
 Return the next position after POS where an extent begins or ends.
 If POS is at the end of the buffer or string, POS will be returned;
  otherwise a position greater than POS will always be returned.
-If BUFFER is nil, the current buffer is assumed.
+If OBJECT is nil, the current buffer is assumed.
 */
        (pos, object))
 {
@@ -3843,6 +3852,7 @@ See documentation on `detach-extent' for a discussion of undo recording.
   get_buffer_or_string_range_byte (buffer_or_string, start, end, &s, &e,
                                   GB_ALLOW_PAST_ACCESSIBLE);
 
+  buffer_or_string_extent_info_force (buffer_or_string);
   set_extent_endpoints (ext, s, e, buffer_or_string);
   return extent;
 }
@@ -4574,27 +4584,36 @@ process_extents_for_insertion_mapper (EXTENT extent, void *arg)
 #endif
 
   /* The extent-adjustment code adjusted the extent's endpoints as if
-     they were markers -- endpoints at the gap (i.e. the insertion
-     point) go to the left of the insertion point, which is correct
-     for [) extents.  We need to fix the other kinds of extents.
+     all extents were closed-open -- endpoints at the insertion point
+     remain unchanged.  We need to fix the other kinds of extents:
 
-     Note that both conditions below will hold for zero-length (]
-     extents at the gap.  Zero-length () extents would get adjusted
-     such that their start is greater than their end; we treat them
-     as [) extents.  This is unfortunately an inelegant part of the
-     extent model, but there is no way around it. */
+     1. Start position of start-open extents needs to be moved.
+
+     2. End position of end-closed extents needs to be moved.
+
+     Note that both conditions hold for zero-length (] extents at the
+     insertion point.  But under these rules, zero-length () extents
+     would get adjusted such that their start is greater than their
+     end; instead of allowing that, we treat them as [) extents by
+     modifying condition #1 to not fire nothing when dealing with a
+     zero-length open-open extent.
+
+     Existence of zero-length open-open extents is unfortunately an
+     inelegant part of the extent model, but there is no way around
+     it. */
 
   {
-    Memind new_start, new_end;
+    Memind new_start = extent_start (extent);
+    Memind new_end   = extent_end (extent);
 
-    new_start = extent_start (extent);
-    new_end = extent_end (extent);
-    if (indice == extent_start (extent) && extent_start_open_p (extent) &&
-       /* coerce zero-length () extents to [) */
-       new_start != new_end)
+    if (indice == extent_start (extent) && extent_start_open_p (extent)
+       /* zero-length () extents are exempt; see comment above. */
+       && !(new_start == new_end && extent_end_open_p (extent))
+       )
       new_start += closure->length;
     if (indice == extent_end (extent) && !extent_end_open_p (extent))
       new_end += closure->length;
+
     set_extent_endpoints_1 (extent, new_start, new_end);
   }
 
@@ -4916,7 +4935,7 @@ canonicalize_extent_property (Lisp_Object prop, Lisp_Object value)
 
 /* Do we need a lisp-level function ? */
 DEFUN ("set-extent-initial-redisplay-function", Fset_extent_initial_redisplay_function,
-       2,2,0,/*
+       2,2,0, /*
 Note: This feature is experimental!
 
 Set initial-redisplay-function of EXTENT to the function
@@ -5437,6 +5456,7 @@ For a list of built-in properties, see `set-extent-property'.
 
 DEFUN ("extent-property", Fextent_property, 2, 3, 0, /*
 Return EXTENT's value for property PROPERTY.
+If no such property exists, DEFAULT is returned.
 See `set-extent-property' for the built-in property names.
 */
        (extent, property, default_))
@@ -6596,7 +6616,7 @@ Scans characters forward from POS till it finds a change in the PROP
  argument OBJECT is the buffer or string to scan (defaults to the current
  buffer).
 The property values are compared with `eq'.
-Return nil if the property is constant all the way to the end of BUFFER.
+Return nil if the property is constant all the way to the end of OBJECT.
 If the value is non-nil, it is a position greater than POS, never equal.
 
 If the optional fourth argument LIMIT is non-nil, don't search
@@ -6663,7 +6683,7 @@ Scans characters backward from POS till it finds a change in the PROP
  argument OBJECT is the buffer or string to scan (defaults to the current
  buffer).
 The property values are compared with `eq'.
-Return nil if the property is constant all the way to the start of BUFFER.
+Return nil if the property is constant all the way to the start of OBJECT.
 If the value is non-nil, it is a position less than POS, never equal.
 
 If the optional fourth argument LIMIT is non-nil, don't search back