aboutsummaryrefslogtreecommitdiff
path: root/view.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-06-14 15:09:36 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-06-15 15:51:43 +0200
commit57a743f42f0cecdc5794b424720500d0532cfc4b (patch)
treecd2cfe704793e847f17764801f12790f07dbda2c /view.c
parent11d7a0e6a505a3cc9c1a8fedf9e8101059d96701 (diff)
downloadvis-57a743f42f0cecdc5794b424720500d0532cfc4b.tar.gz
vis-57a743f42f0cecdc5794b424720500d0532cfc4b.tar.xz
view: add functions to get/set all selections
Diffstat (limited to 'view.c')
-rw-r--r--view.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/view.c b/view.c
index 22607e4..206cb42 100644
--- a/view.c
+++ b/view.c
@@ -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();