From 053964094e4527100790ae80fd4fd2a50844e207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Fri, 13 Jan 2017 10:20:55 +0100 Subject: 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/<<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; diff --git a/view.h b/view.h index 07fedf4..b32df64 100644 --- a/view.h +++ b/view.h @@ -132,6 +132,13 @@ bool view_cursors_multiple(View*); /* dispose an existing cursor with its associated selection (if any), * not applicaple for the last existing cursor */ bool view_cursors_dispose(Cursor*); +/* if called for the last existing cursor its selection is destroyed + * and the cursor is marked for destruction and will be disposed as + * soon as a new cursor is created. */ +bool view_cursors_dispose_force(Cursor*); +/* if the primary cursor was marked for destruction (by means of + * view_cursors_dispose_force) return it and clear descruction flag */ +Cursor *view_cursor_disposed(View*); /* only keep the main cursor, release all others together with their * selections (if any) */ void view_cursors_clear(View*); -- cgit v1.2.3