Fix position calculation on mouse click within bidi-reordered composition.
authorKenichi Handa <handa@m17n.org>
Wed, 22 Sep 2010 02:54:58 +0000 (11:54 +0900)
committerKenichi Handa <handa@m17n.org>
Wed, 22 Sep 2010 02:54:58 +0000 (11:54 +0900)
src/ChangeLog
src/dispnew.c
src/xdisp.c

index 205ae56..063d654 100644 (file)
@@ -1,3 +1,15 @@
+2010-09-22  Kenichi Handa  <handa@m17n.org>
+
+       * xdisp.c (compute_stop_pos): Call composition_compute_stop_pos
+       only if we are not at a composition.
+       (set_iterator_to_next): Give it->end_charpos to
+       composition_compute_stop_pos.
+       (set_iterator_to_next, next_element_from_buffer): Likewise.
+
+       * dispnew.c (buffer_posn_from_coords): Fix position when the
+       current display element is a grapheme cluster in bidi-reordered
+       region.
+
 2010-09-21  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * emacs.c: Do not include sys/ioctl.h, not needed.
index 9344d79..0869526 100644 (file)
@@ -5420,6 +5420,22 @@ buffer_posn_from_coords (struct window *w, int *x, int *y, struct display_pos *p
   if (STRINGP (it.string))
     string = it.string;
   *pos = it.current;
+  if (it.what == IT_COMPOSITION
+      && it.cmp_it.nchars > 1
+      && it.cmp_it.reversed_p)
+    {
+      /* The current display element is a grapheme cluster in a
+        composition.  In that case, we need the position of the first
+        character of the cluster.  But, as it.cmp_it.reversed_p is 1,
+        it.current points to the last character of the cluster, thus
+        we must move back to the first character of the same
+        cluster.  */
+      CHARPOS (pos->pos) -= it.cmp_it.nchars - 1;
+      if (STRINGP (it.string))
+       BYTEPOS (pos->pos) = string_char_to_byte (string, CHARPOS (pos->pos));
+      else
+       BYTEPOS (pos->pos) = CHAR_TO_BYTE (CHARPOS (pos->pos));
+    }
 
 #ifdef HAVE_WINDOW_SYSTEM
   if (it.what == IT_IMAGE)
index 7b49eed..be6ff12 100644 (file)
@@ -3177,7 +3177,7 @@ compute_stop_pos (struct it *it)
 {
   register INTERVAL iv, next_iv;
   Lisp_Object object, limit, position;
-  EMACS_INT charpos, bytepos, stoppos;
+  EMACS_INT charpos, bytepos;
 
   /* If nowhere else, stop at the end.  */
   it->stop_charpos = it->end_charpos;
@@ -3267,12 +3267,15 @@ compute_stop_pos (struct it *it)
        }
     }
 
-  if (it->bidi_p && it->bidi_it.scan_dir < 0)
-    stoppos = -1;
-  else
-    stoppos = it->stop_charpos;
-  composition_compute_stop_pos (&it->cmp_it, charpos, bytepos,
-                               stoppos, it->string);
+  if (it->cmp_it.id < 0)
+    {
+      EMACS_INT stoppos = it->end_charpos;
+
+      if (it->bidi_p && it->bidi_it.scan_dir < 0)
+       stoppos = -1;
+      composition_compute_stop_pos (&it->cmp_it, charpos, bytepos,
+                                   stoppos, it->string);
+    }
 
   xassert (STRINGP (it->string)
           || (it->stop_charpos >= BEGV
@@ -6126,7 +6129,7 @@ set_iterator_to_next (struct it *it, int reseat_p)
                  it->cmp_it.id = -1;
                  composition_compute_stop_pos (&it->cmp_it, IT_CHARPOS (*it),
                                                IT_BYTEPOS (*it),
-                                               it->stop_charpos, Qnil);
+                                               it->end_charpos, Qnil);
                }
            }
          else if (! it->cmp_it.reversed_p)
@@ -6149,7 +6152,7 @@ set_iterator_to_next (struct it *it, int reseat_p)
                {
                  /* No more grapheme clusters in this composition.
                     Find the next stop position.  */
-                 EMACS_INT stop = it->stop_charpos;
+                 EMACS_INT stop = it->end_charpos;
                  if (it->bidi_it.scan_dir < 0)
                    /* Now we are scanning backward and don't know
                       where to stop.  */
@@ -6177,7 +6180,7 @@ set_iterator_to_next (struct it *it, int reseat_p)
                {
                  /* No more grapheme clusters in this composition.
                     Find the next stop position.  */
-                 EMACS_INT stop = it->stop_charpos;
+                 EMACS_INT stop = it->end_charpos;
                  if (it->bidi_it.scan_dir < 0)
                    /* Now we are scanning backward and don't know
                       where to stop.  */
@@ -6210,7 +6213,7 @@ set_iterator_to_next (struct it *it, int reseat_p)
                {
                  /* As the scan direction was changed, we must
                     re-compute the stop position for composition.  */
-                 EMACS_INT stop = it->stop_charpos;
+                 EMACS_INT stop = it->end_charpos;
                  if (it->bidi_it.scan_dir < 0)
                    stop = -1;
                  composition_compute_stop_pos (&it->cmp_it, IT_CHARPOS (*it),
@@ -6288,7 +6291,7 @@ set_iterator_to_next (struct it *it, int reseat_p)
              composition_compute_stop_pos (&it->cmp_it,
                                            IT_STRING_CHARPOS (*it),
                                            IT_STRING_BYTEPOS (*it),
-                                           it->stop_charpos, it->string);
+                                           it->end_charpos, it->string);
            }
        }
       else
@@ -6705,7 +6708,7 @@ next_element_from_buffer (struct it *it)
       IT_BYTEPOS (*it) = it->bidi_it.bytepos;
       SET_TEXT_POS (it->position, IT_CHARPOS (*it), IT_BYTEPOS (*it));
       {
-       EMACS_INT stop = it->stop_charpos;
+       EMACS_INT stop = it->end_charpos;
        if (it->bidi_it.scan_dir < 0)
          stop = -1;
        composition_compute_stop_pos (&it->cmp_it, IT_CHARPOS (*it),