From 09e7c9657467b3991e3fe9e968f9122a6df48cfe Mon Sep 17 00:00:00 2001 From: Jan Arne Petersen Date: Sun, 9 Sep 2012 23:08:37 +0200 Subject: [PATCH] editor: Insert commit-string at cursor Instead of appending at the end, insert the commit-string at the cursor position. Signed-off-by: Jan Arne Petersen --- clients/editor.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/clients/editor.c b/clients/editor.c index b3759380..295018a3 100644 --- a/clients/editor.c +++ b/clients/editor.c @@ -205,15 +205,7 @@ static void text_entry_button_handler(struct widget *widget, struct input *input, uint32_t time, uint32_t button, enum wl_pointer_button_state state, void *data); - -static void -text_entry_append(struct text_entry *entry, const char *text) -{ - entry->text = realloc(entry->text, strlen(entry->text) + strlen(text) + 1); - strcat(entry->text, text); - text_layout_set_text(entry->layout, entry->text); -} - +static void text_entry_insert_at_cursor(struct text_entry *entry, const char *text); static void text_model_commit_string(void *data, @@ -223,7 +215,12 @@ text_model_commit_string(void *data, { struct text_entry *entry = data; - text_entry_append(entry, text); + if (index > strlen(text)) { + fprintf(stderr, "Invalid cursor index %d\n", index); + index = strlen(text); + } + + text_entry_insert_at_cursor(entry, text); widget_schedule_redraw(entry->widget); } @@ -408,6 +405,23 @@ text_entry_deactivate(struct text_entry *entry, seat); } +static void +text_entry_insert_at_cursor(struct text_entry *entry, const char *text) +{ + char *new_text = malloc(strlen(entry->text) + strlen(text) + 1); + + strncpy(new_text, entry->text, entry->cursor); + strcpy(new_text + entry->cursor, text); + strcpy(new_text + entry->cursor + strlen(text), + entry->text + entry->cursor); + + free(entry->text); + entry->text = new_text; + entry->cursor += strlen(text); + + text_layout_set_text(entry->layout, entry->text); +} + static void text_entry_set_cursor_position(struct text_entry *entry, int32_t x, int32_t y)