From a845dec7336c379d007832cbc5ff9abbb9fe1dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 13 Jun 2017 14:20:30 +0200 Subject: view: introduce view_selections_normalize Dispose all invalid and merge all overlapping selections. --- view.c | 22 ++++++++++++++++++++++ view.h | 2 ++ 2 files changed, 24 insertions(+) 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; } diff --git a/view.h b/view.h index e5f4c7f..677824a 100644 --- a/view.h +++ b/view.h @@ -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 -- cgit v1.2.3