# HG changeset patch # User Eli Zaretskii # Date 1282987964 -10800 # Node ID f4fc1590d90472a7e7cfe5349474dad86e8fcde4 # Parent 5a930b6b595eb3757cecc757dfdb74875a424557 Fix L2R code using bug #1220 as a test case. xdisp.c (mouse_face_from_buffer_pos): before_string and after_string are also relevant when they come from an overlay. diff -r 5a930b6b595e -r f4fc1590d904 src/ChangeLog --- a/src/ChangeLog Sat Aug 21 18:24:15 2010 +0300 +++ b/src/ChangeLog Sat Aug 28 12:32:44 2010 +0300 @@ -1,3 +1,8 @@ +2010-08-28 Eli Zaretskii + + * xdisp.c (mouse_face_from_buffer_pos): Fix code using bug#1220 as + test case. + 2010-08-21 Eli Zaretskii * xdisp.c (mouse_face_from_buffer_pos): Support mouse highlight in diff -r 5a930b6b595e -r f4fc1590d904 src/xdisp.c --- a/src/xdisp.c Sat Aug 21 18:24:15 2010 +0300 +++ b/src/xdisp.c Sat Aug 28 12:32:44 2010 +0300 @@ -23897,7 +23897,7 @@ between START_CHARPOS and END_CHARPOS, and highlight all the glyphs between those two. This may cover more than just the text between START_CHARPOS and END_CHARPOS if the range of - characters strides the the bidi level boundary, e.g. if the + characters strides the bidi level boundary, e.g. if the beginning is in R2L text while the end is in L2R text or vice versa. */ if (!row->reversed_p) @@ -23929,18 +23929,21 @@ { /* BEFORE_STRING or AFTER_STRING are only relevant if they are present at buffer positions between - START_CHARPOS and END_CHARPOS. */ + START_CHARPOS and END_CHARPOS, or if they come from + an overlay. */ if (EQ (glyph->object, before_string)) { pos = string_buffer_position (w, before_string, start_charpos); - if (pos && pos >= start_charpos && pos < end_charpos) + /* If pos == 0, it means before_string came from an + overlay, not from a buffer position. */ + if (!pos || pos >= start_charpos && pos < end_charpos) break; } else if (EQ (glyph->object, after_string)) { pos = string_buffer_position (w, after_string, end_charpos); - if (pos && pos >= start_charpos && pos < end_charpos) + if (!pos || pos >= start_charpos && pos < end_charpos) break; } x += glyph->pixel_width; @@ -24001,19 +24004,19 @@ && end->charpos < end_charpos)); --end) { - /* BEFORE_STRING or AFTER_STRING are only relevant if - they are present at buffer positions between - START_CHARPOS and END_CHARPOS. */ + /* BEFORE_STRING or AFTER_STRING are only relevant if they + are present at buffer positions between START_CHARPOS and + END_CHARPOS, or if they come from an overlay. */ if (EQ (end->object, before_string)) { pos = string_buffer_position (w, before_string, start_charpos); - if (pos && pos >= start_charpos && pos < end_charpos) + if (!pos || pos >= start_charpos && pos < end_charpos) break; } else if (EQ (end->object, after_string)) { pos = string_buffer_position (w, after_string, end_charpos); - if (pos && pos >= start_charpos && pos < end_charpos) + if (!pos || pos >= start_charpos && pos < end_charpos) break; } }