[PATCH v2 20/28] text: delete text on commit_string
Jan Arne Petersen
jpetersen at openismus.com
Thu Apr 18 07:47:34 PDT 2013
From: Jan Arne Petersen <jpetersen at openismus.com>
Signed-off-by: Jan Arne Petersen <jpetersen at openismus.com>
---
clients/editor.c | 33 +++++++++++++++++++--------------
clients/keyboard.c | 3 +++
2 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/clients/editor.c b/clients/editor.c
index c40815a..56205af 100644
--- a/clients/editor.c
+++ b/clients/editor.c
@@ -56,6 +56,8 @@ struct text_entry {
struct {
int32_t cursor;
int32_t anchor;
+ uint32_t delete_index;
+ uint32_t delete_length;
} pending_commit;
struct text_input *text_input;
PangoLayout *layout;
@@ -148,6 +150,13 @@ text_input_commit_string(void *data,
text_entry_reset_preedit(entry);
text_entry_delete_selected_text(entry);
+
+ if (entry->pending_commit.delete_length) {
+ text_entry_delete_text(entry,
+ entry->pending_commit.delete_index,
+ entry->pending_commit.delete_length);
+ }
+
text_entry_insert_at_cursor(entry, text,
entry->pending_commit.cursor,
entry->pending_commit.anchor);
@@ -186,28 +195,24 @@ text_input_delete_surrounding_text(void *data,
uint32_t length)
{
struct text_entry *entry = data;
- uint32_t cursor_index = index + entry->cursor;
- const char *start, *end;
+ uint32_t text_length;
+
+ entry->pending_commit.delete_index = entry->cursor + index;
+ entry->pending_commit.delete_length = length;
- if (cursor_index > strlen(entry->text)) {
+ text_length = utf8_characters(entry->text);
+
+ if (entry->pending_commit.delete_index > text_length) {
fprintf(stderr, "Invalid cursor index %d\n", index);
+ entry->pending_commit.delete_length = 0;
return;
}
- if (cursor_index + length > strlen(entry->text)) {
+ if (entry->pending_commit.delete_index + length > text_length) {
fprintf(stderr, "Invalid length %d\n", length);
+ entry->pending_commit.delete_length = 0;
return;
}
-
- if (length == 0)
- return;
-
- start = utf8_start_char(entry->text, entry->text + cursor_index);
- end = utf8_end_char(entry->text + cursor_index + length);
-
- text_entry_delete_text(entry,
- start - entry->text,
- end - start);
}
static void
diff --git a/clients/keyboard.c b/clients/keyboard.c
index 9dd210a..bd88207 100644
--- a/clients/keyboard.c
+++ b/clients/keyboard.c
@@ -447,6 +447,9 @@ keyboard_handle_key(struct keyboard *keyboard, uint32_t time, const struct key *
if (strlen(keyboard->keyboard->preedit_string) == 0) {
input_method_context_delete_surrounding_text(keyboard->keyboard->context,
-1, 1);
+ input_method_context_commit_string(keyboard->keyboard->context,
+ keyboard->keyboard->serial,
+ "");
} else {
keyboard->keyboard->preedit_string[strlen(keyboard->keyboard->preedit_string) - 1] = '\0';
virtual_keyboard_send_preedit(keyboard->keyboard, -1);
--
1.8.1.4
More information about the wayland-devel
mailing list