From 544bbc31d93719ca7419f6da97809ad5eef1c378 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 28 Aug 2010 12:32:44 +0300 Subject: [PATCH] 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. --- src/ChangeLog | 5 +++++ src/xdisp.c | 21 ++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 242018c4061..9b7c11d3bde 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -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 --git a/src/xdisp.c b/src/xdisp.c index 7fcbab718b1..c6d441fa6c1 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -23897,7 +23897,7 @@ mouse_face_from_buffer_pos (Lisp_Object window, 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 @@ mouse_face_from_buffer_pos (Lisp_Object window, { /* 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 @@ mouse_face_from_buffer_pos (Lisp_Object window, && 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; } } -- 2.39.5