From 4a17fae8e7071666b2f689ecf5fccef2bc929eb7 Mon Sep 17 00:00:00 2001 From: Jan Arne Petersen Date: Wed, 16 Jan 2013 21:26:40 +0100 Subject: [PATCH] editor: support commit on reset Commit pending pre-edit text when focus-out or changing the cursor location. Signed-off-by: Jan Arne Petersen --- clients/editor.c | 54 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/clients/editor.c b/clients/editor.c index 890b32cd..77764e25 100644 --- a/clients/editor.c +++ b/clients/editor.c @@ -297,6 +297,8 @@ static void text_entry_set_preedit(struct text_entry *entry, static void text_entry_delete_text(struct text_entry *entry, uint32_t index, uint32_t length); 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_model_commit_string(void *data, @@ -310,6 +312,8 @@ text_model_commit_string(void *data, if (index > strlen(text)) fprintf(stderr, "Invalid cursor index %d\n", index); + text_entry_reset_preedit(entry); + text_entry_delete_selected_text(entry); text_entry_insert_at_cursor(entry, text); @@ -327,6 +331,9 @@ text_model_preedit_string(void *data, text_entry_delete_selected_text(entry); text_entry_set_preedit(entry, text, entry->preedit_info.cursor); + entry->preedit.commit = strdup(commit); + + entry->preedit_info.cursor = 0; widget_schedule_redraw(entry->widget); } @@ -484,6 +491,8 @@ text_model_leave(void *data, { struct text_entry *entry = data; + text_entry_commit_and_reset(entry); + entry->active = 0; widget_schedule_redraw(entry->widget); @@ -664,16 +673,39 @@ text_entry_insert_at_cursor(struct text_entry *entry, const char *text) text_entry_update_layout(entry); } +static void +text_entry_reset_preedit(struct text_entry *entry) +{ + entry->preedit.cursor = 0; + + free(entry->preedit.text); + entry->preedit.text = NULL; + + free(entry->preedit.commit); + entry->preedit.commit = NULL; +} + +static void +text_entry_commit_and_reset(struct text_entry *entry) +{ + char *commit = NULL; + + if (entry->preedit.commit) + commit = strdup(entry->preedit.commit); + + text_entry_reset_preedit(entry); + if (commit) { + text_entry_insert_at_cursor(entry, commit); + free(commit); + } +} + static void text_entry_set_preedit(struct text_entry *entry, const char *preedit_text, int preedit_cursor) { - if (entry->preedit.text) { - free(entry->preedit.text); - entry->preedit.text = NULL; - entry->preedit.cursor = 0; - } + text_entry_reset_preedit(entry); if (!preedit_text) return; @@ -688,6 +720,8 @@ static void text_entry_set_cursor_position(struct text_entry *entry, int32_t x, int32_t y) { + text_entry_commit_and_reset(entry); + entry->cursor = text_layout_xy_to_index(entry->layout, x, y); entry->serial++; @@ -979,6 +1013,8 @@ key_handler(struct window *window, switch (sym) { case XKB_KEY_BackSpace: + text_entry_commit_and_reset(entry); + start = utf8_prev_char(entry->text, entry->text + entry->cursor); if (start == NULL) @@ -990,6 +1026,8 @@ key_handler(struct window *window, end - start); break; case XKB_KEY_Delete: + text_entry_commit_and_reset(entry); + start = utf8_start_char(entry->text, entry->text + entry->cursor); if (start == NULL) @@ -1005,6 +1043,8 @@ key_handler(struct window *window, end - start); break; case XKB_KEY_Left: + text_entry_commit_and_reset(entry); + new_char = utf8_prev_char(entry->text, entry->text + entry->cursor); if (new_char != NULL) { entry->cursor = new_char - entry->text; @@ -1013,6 +1053,8 @@ key_handler(struct window *window, } break; case XKB_KEY_Right: + text_entry_commit_and_reset(entry); + new_char = utf8_next_char(entry->text + entry->cursor); if (new_char != NULL) { entry->cursor = new_char - entry->text; @@ -1024,6 +1066,8 @@ key_handler(struct window *window, if (xkb_keysym_to_utf8(sym, text, sizeof(text)) <= 0) break; + text_entry_commit_and_reset(entry); + text_entry_insert_at_cursor(entry, text); break; }