From fe89e713ca7c1c6fe05bb82283068cd8c66eaf4f Mon Sep 17 00:00:00 2001 From: Jan Arne Petersen Date: Thu, 18 Apr 2013 16:47:27 +0200 Subject: [PATCH] editor: Send cursor position to the input method Signed-off-by: Jan Arne Petersen --- clients/editor.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/clients/editor.c b/clients/editor.c index e6862486..e61eda04 100644 --- a/clients/editor.c +++ b/clients/editor.c @@ -127,6 +127,8 @@ static void text_entry_delete_text(struct text_entry *entry, static void text_entry_delete_selected_text(struct text_entry *entry); static void text_entry_reset_preedit(struct text_entry *entry); static void text_entry_commit_and_reset(struct text_entry *entry); +static void text_entry_get_cursor_rectangle(struct text_entry *entry, struct rectangle *rectangle); +static void text_entry_update(struct text_entry *entry); static void text_input_commit_string(void *data, @@ -165,6 +167,8 @@ text_input_preedit_string(void *data, entry->preedit_info.cursor = 0; entry->preedit_info.attr_list = NULL; + text_entry_update(entry); + widget_schedule_redraw(entry->widget); } @@ -630,6 +634,8 @@ text_entry_update_layout(struct text_entry *entry) static void text_entry_update(struct text_entry *entry) { + struct rectangle cursor_rectangle; + text_input_set_content_type(entry->text_input, TEXT_INPUT_CONTENT_HINT_NONE, entry->content_purpose); @@ -643,6 +649,10 @@ text_entry_update(struct text_entry *entry) text_input_set_preferred_language(entry->text_input, entry->preferred_language); + text_entry_get_cursor_rectangle(entry, &cursor_rectangle); + text_input_set_cursor_rectangle(entry->text_input, cursor_rectangle.x, cursor_rectangle.y, + cursor_rectangle.width, cursor_rectangle.height); + text_input_commit_state(entry->text_input); } @@ -827,6 +837,34 @@ text_entry_delete_selected_text(struct text_entry *entry) entry->anchor = entry->cursor; } +static void +text_entry_get_cursor_rectangle(struct text_entry *entry, struct rectangle *rectangle) +{ + struct rectangle allocation; + PangoRectangle extents; + PangoRectangle cursor_pos; + + widget_get_allocation(entry->widget, &allocation); + + if (entry->preedit.text && entry->preedit.cursor < 0) { + rectangle->x = 0; + rectangle->y = 0; + rectangle->width = 0; + rectangle->height = 0; + return; + } + + pango_layout_get_extents(entry->layout, &extents, NULL); + pango_layout_get_cursor_pos(entry->layout, + entry->cursor + entry->preedit.cursor, + &cursor_pos, NULL); + + rectangle->x = allocation.x + (allocation.height / 2) + PANGO_PIXELS(cursor_pos.x); + rectangle->y = allocation.y + 10 + PANGO_PIXELS(cursor_pos.y); + rectangle->width = PANGO_PIXELS(cursor_pos.width); + rectangle->height = PANGO_PIXELS(cursor_pos.height); +} + static void text_entry_draw_cursor(struct text_entry *entry, cairo_t *cr) {