]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix start-of-box-face display after display and overlay strings
authorEli Zaretskii <eliz@gnu.org>
Thu, 30 Dec 2021 11:21:01 +0000 (13:21 +0200)
committerEli Zaretskii <eliz@gnu.org>
Thu, 30 Dec 2021 11:21:01 +0000 (13:21 +0200)
* src/xdisp.c (pop_it): Recompute the 'start_of_box_run_p' flag,
like we do in 'handle_fontified_prop', when faces change while
iterating over a buffer or string.  (Bug#51550)

src/xdisp.c

index a6c122aee8b2906f92c44e40c9c92096e697927d..6c63278f528698823d3aab6d502d2533f86b92df 100644 (file)
@@ -6841,6 +6841,7 @@ pop_it (struct it *it)
   struct iterator_stack_entry *p;
   bool from_display_prop = it->from_disp_prop_p;
   ptrdiff_t prev_pos = IT_CHARPOS (*it);
+  int prev_face_id = it->face_id;
 
   eassert (it->sp > 0);
   --it->sp;
@@ -6876,9 +6877,18 @@ pop_it (struct it *it)
 
        /* Restore the face_box_p flag, since it could have been
           overwritten by the face of the object that we just finished
-          displaying.  */
+          displaying.  Also, set the start_of_box_run_p flag if the
+          change in faces requires that.  */
        if (face)
-         it->face_box_p = face->box != FACE_NO_BOX;
+         {
+           struct face *prev_face = FACE_FROM_ID_OR_NULL (it->f, prev_face_id);
+
+           if (!(it->start_of_box_run_p && prev_face && prev_face->box))
+             it->start_of_box_run_p = (face->box != FACE_NO_BOX
+                                       && (prev_face == NULL
+                                           || prev_face->box == FACE_NO_BOX));
+           it->face_box_p = face->box != FACE_NO_BOX;
+         }
        it->object = it->w->contents;
       }
       break;
@@ -6888,9 +6898,18 @@ pop_it (struct it *it)
 
        /* Restore the face_box_p flag, since it could have been
           overwritten by the face of the object that we just finished
-          displaying.  */
+          displaying.  Also, set the start_of_box_run_p flag if the
+          change in faces requires that.  */
        if (face)
-         it->face_box_p = face->box != FACE_NO_BOX;
+         {
+           struct face *prev_face = FACE_FROM_ID_OR_NULL (it->f, prev_face_id);
+
+           if (!(it->start_of_box_run_p && prev_face && prev_face->box))
+             it->start_of_box_run_p = (face->box != FACE_NO_BOX
+                                       && (prev_face == NULL
+                                           || prev_face->box == FACE_NO_BOX));
+           it->face_box_p = face->box != FACE_NO_BOX;
+         }
        it->object = it->string;
       }
       break;