aboutsummaryrefslogtreecommitdiff
path: root/view.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-06-13 14:20:30 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-06-15 15:51:43 +0200
commita845dec7336c379d007832cbc5ff9abbb9fe1dab (patch)
treec9088d61b6b80a304433e697d9b53f869e3a4f74 /view.c
parent83206fa91345d24881146f1caed88050594797e1 (diff)
downloadvis-a845dec7336c379d007832cbc5ff9abbb9fe1dab.tar.gz
vis-a845dec7336c379d007832cbc5ff9abbb9fe1dab.tar.xz
view: introduce view_selections_normalize
Dispose all invalid and merge all overlapping selections.
Diffstat (limited to 'view.c')
-rw-r--r--view.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/view.c b/view.c
index 262bdde..1233b24 100644
--- a/view.c
+++ b/view.c
@@ -1250,6 +1250,28 @@ bool view_selections_restore(Selection *s) {
return true;
}
+void view_selections_normalize(View *view) {
+ Selection *prev = NULL;
+ Filerange range_prev = text_range_empty();
+ for (Selection *s = view->selections, *next; s; s = next) {
+ next = s->next;
+ Filerange range = view_selections_get(s);
+ if (!text_range_valid(&range)) {
+ view_selections_dispose(s);
+ } else if (prev && text_range_overlap(&range_prev, &range)) {
+ range_prev = text_range_union(&range_prev, &range);
+ view_selections_dispose(s);
+ } else {
+ if (prev)
+ view_selections_set(prev, &range_prev);
+ range_prev = range;
+ prev = s;
+ }
+ }
+ if (prev)
+ view_selections_set(prev, &range_prev);
+}
+
Text *view_text(View *view) {
return view->text;
}