diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-06-14 15:09:36 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-06-15 15:51:43 +0200 |
| commit | 57a743f42f0cecdc5794b424720500d0532cfc4b (patch) | |
| tree | cd2cfe704793e847f17764801f12790f07dbda2c /view.c | |
| parent | 11d7a0e6a505a3cc9c1a8fedf9e8101059d96701 (diff) | |
| download | vis-57a743f42f0cecdc5794b424720500d0532cfc4b.tar.gz vis-57a743f42f0cecdc5794b424720500d0532cfc4b.tar.xz | |
view: add functions to get/set all selections
Diffstat (limited to 'view.c')
| -rw-r--r-- | view.c | 39 |
1 files changed, 34 insertions, 5 deletions
@@ -38,11 +38,6 @@ enum { * the necessary offset for the last character. */ -typedef struct { - Mark anchor; - Mark cursor; -} SelectionRegion; - struct Selection { Mark cursor; /* other selection endpoint where it changes */ Mark anchor; /* position where the selection was created */ @@ -1247,6 +1242,40 @@ bool view_selections_restore(Selection *s) { return true; } +void view_selections_set_all(View *view, Array *arr) { + Selection *s; + Filerange *r; + size_t i = 0; + for (s = view->selections; s; s = s->next) { + if (!(r = array_get(arr, i++)) || !view_selections_set(s, r)) { + for (Selection *next; s; s = next) { + next = view_selections_next(s); + view_selections_dispose(s); + } + break; + } + } + while ((r = array_get(arr, i++))) { + s = view_selections_new_force(view, r->start); + if (!s || !view_selections_set(s, r)) + break; + } + view_selections_primary_set(view->selections); +} + +Array view_selections_get_all(View *view) { + Array arr; + array_init_sized(&arr, sizeof(Filerange)); + if (!array_reserve(&arr, view_selections_count(view))) + return arr; + for (Selection *s = view->selections; s; s = s->next) { + Filerange r = view_selections_get(s); + if (text_range_valid(&r)) + array_add(&arr, &r); + } + return arr; +} + void view_selections_normalize(View *view) { Selection *prev = NULL; Filerange range_prev = text_range_empty(); |
