# HG changeset patch # User Chong Yidong # Date 1221947074 0 # Node ID 16fcbc5c4c7d819eba91c2cecea55f3ff65c5d9d # Parent 6cc568b9215c90dfcebea596288984d541205356 (get_next_display_element): Handle string display correctly when checking for the end of a box run. diff -r 6cc568b9215c -r 16fcbc5c4c7d src/xdisp.c --- a/src/xdisp.c Sat Sep 20 21:43:47 2008 +0000 +++ b/src/xdisp.c Sat Sep 20 21:44:34 2008 +0000 @@ -5940,14 +5940,51 @@ if (it->face_box_p && it->s == NULL) { - int face_id; - struct face *face; - - it->end_of_box_run_p - = ((face_id = face_after_it_pos (it), - face_id != it->face_id) - && (face = FACE_FROM_ID (it->f, face_id), - face->box == FACE_NO_BOX)); + if (it->method == GET_FROM_STRING && it->sp) + { + int face_id = underlying_face_id (it); + struct face *face = FACE_FROM_ID (it->f, face_id); + + if (face) + { + if (face->box == FACE_NO_BOX) + { + /* If the box comes from face properties in a + display string, check faces in that string. */ + int string_face_id = face_after_it_pos (it); + it->end_of_box_run_p + = (FACE_FROM_ID (it->f, string_face_id)->box + == FACE_NO_BOX); + } + /* Otherwise, the box comes from the underlying face. + If this is the last string character displayed, check + the next buffer location. */ + else if ((IT_STRING_CHARPOS (*it) >= SCHARS (it->string) - 1) + && (it->current.overlay_string_index + == it->n_overlay_strings - 1)) + { + EMACS_INT ignore; + int next_face_id; + struct text_pos pos = it->current.pos; + INC_TEXT_POS (pos, it->multibyte_p); + + next_face_id = face_at_buffer_position + (it->w, CHARPOS (pos), it->region_beg_charpos, + it->region_end_charpos, &ignore, + (IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT), 0); + it->end_of_box_run_p + = (FACE_FROM_ID (it->f, next_face_id)->box + == FACE_NO_BOX); + } + } + } + else + { + int face_id = face_after_it_pos (it); + it->end_of_box_run_p + = (face_id != it->face_id + && FACE_FROM_ID (it->f, face_id)->box == FACE_NO_BOX); + } } /* Value is 0 if end of buffer or string reached. */