]> git.eshelyaron.com Git - emacs.git/commitdiff
The range [STARTPOS..ENDPOS] is inclusive in strings.
authorEli Zaretskii <eliz@gnu.org>
Sat, 23 Oct 2010 12:58:12 +0000 (14:58 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 23 Oct 2010 12:58:12 +0000 (14:58 +0200)
Tested with multiline display strings.

 xdisp.c (mouse_face_from_string_pos): Fix off-by-one error when
 testing against ENDPOS.

src/ChangeLog
src/xdisp.c

index 0cd77348d12397325c1ccea1ef7afa5bf57db367..d6e93b282997bb053a8e3f89e917f215ad5fee1b 100644 (file)
@@ -4,6 +4,7 @@
        flag to zero, and exit the outer loop when it's non-zero.  Bail
        our early if no row in the window belongs to the highlighted
        string.  Always back up after exiting the second loop.
+       Fix off-by-one error when testing against ENDPOS.
 
 2010-10-16  Eli Zaretskii  <eliz@gnu.org>
 
index 5a7ba32b6783223395d8dc41620b3af0c1a331f5..2db6ab8dbd146a03a5fbb8e312090ad1568105b4 100644 (file)
@@ -24409,7 +24409,7 @@ fast_find_string_pos (struct window *w, EMACS_INT pos, Lisp_Object object,
 #endif /* not used */
 
 /* Find the positions of the first and the last glyphs in window W's
-   current matrix that occlude positions [STARTPOS..ENDPOS) in OBJECT
+   current matrix that occlude positions [STARTPOS..ENDPOS] in OBJECT
    (assumed to be a string), and return in DPYINFO's mouse_face
    members the pixel and column/row coordinates of those glyphs.  */
 
@@ -24425,7 +24425,7 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
   int found = 0;
 
   /* Find the glyph row with at least one position in the range
-     [STARTPOS..ENDPOS), and the leftmost glyph in that row whose
+     [STARTPOS..ENDPOS], and the leftmost glyph in that row whose
      position belongs to that range.  */
   for (r = MATRIX_FIRST_TEXT_ROW (w->current_matrix);
        r->enabled_p && r->y < yb;
@@ -24435,7 +24435,7 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
       e = g + r->used[TEXT_AREA];
       for (gx = r->x; g < e; gx += g->pixel_width, ++g)
        if (EQ (g->object, object)
-           && startpos <= g->charpos && g->charpos < endpos)
+           && startpos <= g->charpos && g->charpos <= endpos)
          {
            dpyinfo->mouse_face_beg_row = r - w->current_matrix->rows;
            dpyinfo->mouse_face_beg_y = r->y;
@@ -24470,7 +24470,7 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
       found = 0;
       for ( ; g < e; ++g)
        if (EQ (g->object, object)
-           && startpos <= g->charpos && g->charpos < endpos)
+           && startpos <= g->charpos && g->charpos <= endpos)
          {
            found = 1;
            break;
@@ -24478,22 +24478,27 @@ mouse_face_from_string_pos (struct window *w, Display_Info *dpyinfo,
       if (!found)
        break;
     }
+
+  /* The highlighted region ends on the previous row.  */
   r--;
 
+  /* Set the end row and its vertical pixel coordinate.  */
   dpyinfo->mouse_face_end_row = r - w->current_matrix->rows;
   dpyinfo->mouse_face_end_y = r->y;
 
+  /* Compute and set the end column.  */
   g = r->glyphs[TEXT_AREA];
   e = g + r->used[TEXT_AREA];
   for ( ; e > g; --e)
     if (EQ ((e-1)->object, object)
-       && startpos <= (e-1)->charpos && (e-1)->charpos < endpos)
+       && startpos <= (e-1)->charpos && (e-1)->charpos <= endpos)
       break;
   if (!r->reversed_p)
     dpyinfo->mouse_face_end_col = e - g;
   else
     dpyinfo->mouse_face_beg_col = e - g;
 
+  /* Compute and set the end column's horizontal pixel coordinate.  */
   for (gx = r->x; g < e; ++g)
     gx += g->pixel_width;
   if (!r->reversed_p)