From 504b29168f4cb5b492541c5e439beb861951efce Mon Sep 17 00:00:00 2001 From: Thomas White Date: Mon, 21 Mar 2016 23:25:31 +0100 Subject: get_cursor_pos(): Fix handling of multi-byte characters --- src/wrap.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/wrap.c b/src/wrap.c index 8918bc9..6d0ea60 100644 --- a/src/wrap.c +++ b/src/wrap.c @@ -142,6 +142,7 @@ static double text_box_index_to_x(struct wrap_box *box, int pos) int p; int i; int err; + ptrdiff_t offs_p; nseg = which_segment(box, pos, &err); if ( err ) return 0.0; @@ -159,10 +160,16 @@ static double text_box_index_to_x(struct wrap_box *box, int pos) box->offs_char + seg->offs_char); ep = g_utf8_offset_to_pointer(seg_text, seg->len_chars); - /* FIXME: pos should be in bytes, not chars */ + /* Make character position relative to segment start (not box start) */ + pos -= seg->offs_char; + + /* Convert the character position to a byte offset */ + offs_p = g_utf8_offset_to_pointer(seg_text, pos) - seg_text; + pango_glyph_string_index_to_x(seg->glyphs, (char *)seg_text, ep - seg_text, &seg->analysis, - pos, FALSE, &p); + offs_p, FALSE, &p); + return pango_units_to_double(x+p); } -- cgit v1.2.3