From d7a7a3efde175e944cc6943170c9f60467850060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 23 Jul 2015 14:38:45 +0200 Subject: vis: add infrastructure to support multiple cursors/selections This cleans up the existing selection handling code and adds the necessary bits to eventually support multiple cursors/selections. The cursor position is kept track of using marks, which means retrieving the cursor position is no longer a constant time operation. Furthermore the terminal cursor is no longer used, instead the whole window is redrawn after every cursor movement. --- editor.c | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) (limited to 'editor.c') diff --git a/editor.c b/editor.c index fac598c..a47c141 100644 --- a/editor.c +++ b/editor.c @@ -414,12 +414,11 @@ void editor_insert(Editor *ed, size_t pos, const char *data, size_t len) { } void editor_insert_key(Editor *ed, const char *data, size_t len) { - View *view = ed->win->view; - 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); + for (Cursor *c = view_cursors(ed->win->view); c; c = view_cursors_next(c)) { + size_t pos = view_cursors_pos(c); + editor_insert(ed, pos, data, len); + view_cursors_scroll_to(c, pos + len); + } } void editor_replace(Editor *ed, size_t pos, const char *data, size_t len) { @@ -439,26 +438,11 @@ void editor_replace(Editor *ed, size_t pos, const char *data, size_t len) { } void editor_replace_key(Editor *ed, const char *data, size_t len) { - View *view = ed->win->view; - 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 = text_char_prev(txt, end); - if (view_viewport_get(view).start == end) { - view_viewport_up(view, 1); - view_cursor_to(view, end); + for (Cursor *c = view_cursors(ed->win->view); c; c = view_cursors_next(c)) { + size_t pos = view_cursors_pos(c); + editor_replace(ed, pos, data, len); + view_cursors_scroll_to(c, pos + len); } - text_delete(txt, start, end-start); - editor_windows_invalidate(ed, start, end); - view_cursor_to(view, start); } void editor_delete(Editor *ed, size_t pos, size_t len) { -- cgit v1.2.3