aboutsummaryrefslogtreecommitdiff
path: root/view.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-01-13 10:20:55 +0100
committerMarc André Tanner <mat@brain-dump.org>2017-01-13 10:20:55 +0100
commit053964094e4527100790ae80fd4fd2a50844e207 (patch)
tree3a520e9dc4325e33b94e0e7501758699ad61c15b /view.c
parent0f35467395910cc0bed2b40fdbbc91998f97ac41 (diff)
downloadvis-053964094e4527100790ae80fd4fd2a50844e207.tar.gz
vis-053964094e4527100790ae80fd4fd2a50844e207.tar.xz
view: add infrastructure for delayed cursor destruction
At least one cursor (referred to as primary or main cursor) has always to exist. In the sam command language implementation we might want to dispose a cursor even if it is the primary one before later commands will create different ones (e.g. `:x/pattern/ { i/>>>/ a/<<</ }`). This commit introduces view_cursors_dispose_force. If called on the last remaining cursor, its selection is cleared and it is marked for destruction as soon as a new cursor is created. view_cursor_disposed returns the cursor marked for deletion (if any) and clears the descruction flag.
Diffstat (limited to 'view.c')
-rw-r--r--view.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/view.c b/view.c
index b9e47a6..5352a0f 100644
--- a/view.c
+++ b/view.c
@@ -80,6 +80,7 @@ struct View {
Line *lastline; /* last currently used line, always <= bottomline */
Line *bottomline; /* bottom of view, might be unused if lastline < bottomline */
Cursor *cursor; /* main cursor, always placed within the visible viewport */
+ Cursor *cursor_dead;/* main cursor which was disposed, will be removed when another cursor is created */
int cursor_count; /* how many cursors do currently exist */
Line *line; /* used while drawing view content, line where next char will be drawn */
int col; /* used while drawing view content, column where next char will be drawn */
@@ -972,7 +973,8 @@ static Cursor *cursors_new(View *view, size_t pos, bool force) {
view->cursors = c;
}
view->cursor = c;
- view->cursor_count++;;
+ view->cursor_count++;
+ view_cursors_dispose(view->cursor_dead);
view_cursors_to(c, pos);
return c;
err:
@@ -1067,13 +1069,15 @@ static void view_cursors_free(Cursor *c) {
c->view->cursors = c->next;
if (c->view->cursor == c)
c->view->cursor = c->next ? c->next : c->prev;
+ if (c->view->cursor_dead == c)
+ c->view->cursor_dead = NULL;
c->view->cursor_count--;
free(c);
}
bool view_cursors_dispose(Cursor *c) {
if (!c)
- return false;
+ return true;
View *view = c->view;
if (!view->cursors || !view->cursors->next)
return false;
@@ -1083,6 +1087,23 @@ bool view_cursors_dispose(Cursor *c) {
return true;
}
+bool view_cursors_dispose_force(Cursor *c) {
+ if (view_cursors_dispose(c))
+ return true;
+ View *view = c->view;
+ if (view->cursor_dead)
+ return false;
+ view_cursors_selection_clear(c);
+ view->cursor_dead = c;
+ return true;
+}
+
+Cursor *view_cursor_disposed(View *view) {
+ Cursor *c = view->cursor_dead;
+ view->cursor_dead = NULL;
+ return c;
+}
+
Cursor *view_cursors(View *view) {
view->cursor_generation++;
return view->cursors;