From 60fe132d6c59d54021091af8e5aa09fcd4704562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 30 Jun 2015 11:13:17 +0200 Subject: Cleanup insert/replace mode input handling View should only display the file content, but not modify it. --- editor.c | 61 ++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 19 deletions(-) (limited to 'editor.c') diff --git a/editor.c b/editor.c index 114c06e..ae2bc2d 100644 --- a/editor.c +++ b/editor.c @@ -5,6 +5,7 @@ #include #include "editor.h" #include "util.h" +#include "text-motions.h" static void file_free(Editor *ed, File *file); static File *file_new(Editor *ed, const char *filename); @@ -421,35 +422,57 @@ void editor_free(Editor *ed) { free(ed); } -void editor_insert_key(Editor *ed, const char *c, size_t len) { +void editor_insert(Editor *ed, size_t pos, const char *data, size_t len) { + text_insert(ed->win->file->text, pos, data, len); + editor_windows_invalidate(ed, pos, pos + len); +} + +void editor_insert_key(Editor *ed, const char *data, size_t len) { View *view = ed->win->view; - size_t start = view_cursor_get(view); - view_insert_key(view, c, len); - editor_windows_invalidate(ed, start, start + len); + size_t pos = view_cursor_get(view); + if (memchr(data, '\n', len) && view_cursor_viewpos(view).y+1 == view_height_get(view)) + view_viewport_down(view, 1); + editor_insert(ed, pos, data, len); + view_cursor_to(view, pos + len); +} + +void editor_replace(Editor *ed, size_t pos, const char *data, size_t len) { + size_t chars = 0; + for (size_t i = 0; i < len; i++) { + if (ISUTF8(data[i])) + chars++; + } + + Text *txt = ed->win->file->text; + Iterator it = text_iterator_get(txt, pos); + for (char c; chars-- > 0 && text_iterator_byte_get(&it, &c) && c != '\r' && c != '\n'; ) + text_iterator_char_next(&it, NULL); + + text_delete(txt, pos, it.pos - pos); + editor_insert(ed, pos, data, len); } -void editor_replace_key(Editor *ed, const char *c, size_t len) { +void editor_replace_key(Editor *ed, const char *data, size_t len) { View *view = ed->win->view; - size_t start = view_cursor_get(view); - view_replace_key(view, c, len); - editor_windows_invalidate(ed, start, start + 6); + size_t pos = view_cursor_get(view); + if (memchr(data, '\n', len) && view_cursor_viewpos(view).y+1 == view_height_get(view)) + view_viewport_down(view, 1); + editor_replace(ed, pos, data, len); + view_cursor_to(view, pos + len); } void editor_backspace_key(Editor *ed) { View *view = ed->win->view; + Text *txt = ed->win->file->text; size_t end = view_cursor_get(view); - size_t start = view_backspace_key(view); + size_t start = text_char_prev(txt, end); + if (view_viewport_get(view).start == end) { + view_viewport_up(view, 1); + view_cursor_to(view, end); + } + text_delete(txt, start, end-start); editor_windows_invalidate(ed, start, end); -} - -void editor_delete_key(Editor *ed) { - size_t start = view_delete_key(ed->win->view); - editor_windows_invalidate(ed, start, start + 6); -} - -void editor_insert(Editor *ed, size_t pos, const char *c, size_t len) { - text_insert(ed->win->file->text, pos, c, len); - editor_windows_invalidate(ed, pos, pos + len); + view_cursor_to(view, start); } void editor_delete(Editor *ed, size_t pos, size_t len) { -- cgit v1.2.3