From bc55368304a54806383201b3560b2791e07c6109 Mon Sep 17 00:00:00 2001 From: Chris Lord Date: Tue, 24 Jun 2008 10:22:53 +0000 Subject: [PATCH] Bug 988 - cursor position wrong with multibyte invisible char * clutter/clutter-entry.c: (clutter_entry_ensure_cursor_position): Fix cursor position calculation when using invisible text --- ChangeLog | 7 +++++++ clutter/clutter-entry.c | 27 +++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8cd880a36..16472412c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-06-24 Chris Lord + + Bug 988 - cursor position wrong with multibyte invisible char + + * clutter/clutter-entry.c: (clutter_entry_ensure_cursor_position): + Fix cursor position calculation when using invisible text + 2008-06-23 Emmanuele Bassi * clutter/x11/clutter-event-x11.c (event_translate): Set the diff --git a/clutter/clutter-entry.c b/clutter/clutter-entry.c index 0a4b07072..76597a8b4 100644 --- a/clutter/clutter-entry.c +++ b/clutter/clutter-entry.c @@ -4,7 +4,7 @@ * An OpenGL based 'interactive canvas' library. * * Authored By Matthew Allum - * Neil Jagdish Patel * * Copyright (C) 2006 OpenedHand * @@ -350,13 +350,32 @@ clutter_entry_ensure_cursor_position (ClutterEntry *entry) ClutterEntryPrivate *priv; gint index_; PangoRectangle rect; + gint priv_char_bytes; priv = entry->priv; - if (priv->position == -1) - index_ = strlen (priv->text); + /* If characters are invisible, get the byte-length of the invisible + * character. If priv_char is 0, we use '*', which is ASCII (1 byte). + */ + if (!priv->text_visible && priv->priv_char) + priv_char_bytes = g_unichar_to_utf8 (priv->priv_char, NULL); else - index_ = offset_to_bytes (priv->text, priv->position); + priv_char_bytes = 1; + + if (priv->position == -1) + { + if (priv->text_visible) + index_ = strlen (priv->text); + else + index_ = priv->n_chars * priv_char_bytes; + } + else + { + if (priv->text_visible) + index_ = offset_to_bytes (priv->text, priv->position); + else + index_ = priv->position * priv_char_bytes; + } pango_layout_get_cursor_pos (priv->layout, index_, &rect, NULL); priv->cursor_pos.x = rect.x / PANGO_SCALE;