diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-06-13 14:20:30 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-06-15 15:51:43 +0200 |
| commit | a845dec7336c379d007832cbc5ff9abbb9fe1dab (patch) | |
| tree | c9088d61b6b80a304433e697d9b53f869e3a4f74 | |
| parent | 83206fa91345d24881146f1caed88050594797e1 (diff) | |
| download | vis-a845dec7336c379d007832cbc5ff9abbb9fe1dab.tar.gz vis-a845dec7336c379d007832cbc5ff9abbb9fe1dab.tar.xz | |
view: introduce view_selections_normalize
Dispose all invalid and merge all overlapping selections.
| -rw-r--r-- | view.c | 22 | ||||
| -rw-r--r-- | view.h | 2 |
2 files changed, 24 insertions, 0 deletions
@@ -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; } @@ -137,6 +137,8 @@ bool view_selections_dispose_force(Selection*); Selection *view_selection_disposed(View*); /** Dispose all but the primary selection. */ void view_selections_dispose_all(View*); +/** Dispose all invalid and merge all overlapping selections. */ +void view_selections_normalize(View*); /** * @} * @defgroup view_navigate |
