Fix L2R code using bug #1220 as a test case.
authorEli Zaretskii <eliz@gnu.org>
Sat, 28 Aug 2010 09:32:44 +0000 (12:32 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 28 Aug 2010 09:32:44 +0000 (12:32 +0300)
 xdisp.c (mouse_face_from_buffer_pos): before_string and after_string
 are also relevant when they come from an overlay.

src/ChangeLog
src/xdisp.c

index 242018c..9b7c11d 100644 (file)
@@ -1,3 +1,8 @@
+2010-08-28  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (mouse_face_from_buffer_pos): Fix code using bug#1220 as
+       test case.
+
 2010-08-21  Eli Zaretskii  <eliz@gnu.org>
 
        * xdisp.c (mouse_face_from_buffer_pos): Support mouse highlight in
index 7fcbab7..c6d441f 100644 (file)
@@ -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;
            }
        }