Mercurial > emacs
changeset 110469:9fa0b071facc
Fix position calculation on mouse click within bidi-reordered composition.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 22 Sep 2010 11:54:58 +0900 |
parents | 8ceac426a2d7 |
children | 937bcfd8c509 |
files | src/ChangeLog src/dispnew.c src/xdisp.c |
diffstat | 3 files changed, 44 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Tue Sep 21 20:45:10 2010 +0900 +++ b/src/ChangeLog Wed Sep 22 11:54:58 2010 +0900 @@ -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.
--- a/src/dispnew.c Tue Sep 21 20:45:10 2010 +0900 +++ b/src/dispnew.c Wed Sep 22 11:54:58 2010 +0900 @@ -5420,6 +5420,22 @@ 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)
--- a/src/xdisp.c Tue Sep 21 20:45:10 2010 +0900 +++ b/src/xdisp.c Wed Sep 22 11:54:58 2010 +0900 @@ -3177,7 +3177,7 @@ { 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 @@ } } - 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 @@ 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 @@ { /* 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 @@ { /* 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 @@ { /* 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 @@ 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 @@ 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),