From 5c600e15c1c1ab64f385de918c93d2bdb23955d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 6 Jul 2017 21:28:51 +0200 Subject: vis: use marks instead of registers to store selections The key binding remain the same, but the selections are now stored on a per-buffer basis. --- vis-registers.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'vis-registers.c') diff --git a/vis-registers.c b/vis-registers.c index d20c76c..9976b3b 100644 --- a/vis-registers.c +++ b/vis-registers.c @@ -29,7 +29,6 @@ static ssize_t read_buffer(void *context, char *data, size_t len) { bool register_init(Register *reg) { Buffer buf; buffer_init(&buf); - array_init_sized(®->selections, sizeof(SelectionRegion)); array_init_sized(®->values, sizeof(Buffer)); return array_add(®->values, &buf); } @@ -37,13 +36,22 @@ bool register_init(Register *reg) { void register_release(Register *reg) { if (!reg) return; - array_release(®->selections); size_t n = array_capacity(®->values); for (size_t i = 0; i < n; i++) buffer_release(array_get(®->values, i)); array_release(®->values); } +void marks_init(Array *arr) { + array_init_sized(arr, sizeof(SelectionRegion)); +} + +void mark_release(Array *arr) { + if (!arr) + return; + array_release(arr); +} + const char *register_slot_get(Vis *vis, Register *reg, size_t slot, size_t *len) { if (len) *len = 0; @@ -220,9 +228,16 @@ enum VisRegister vis_register_used(Vis *vis) { return vis->action.reg - vis->registers; } +static Array *mark_from(Vis *vis, enum VisMark id) { + if (id == VIS_MARK_SELECTION && vis->win) + return &vis->win->saved_selections; + File *file = vis->win->file; + if (id < LENGTH(file->marks)) + return &file->marks[id]; + return NULL; +} + static Register *register_from(Vis *vis, enum VisRegister id) { - if (id == VIS_REG_SELECTION && vis->win) - return &vis->win->reg_selections; if (VIS_REG_A <= id && id <= VIS_REG_Z) id = VIS_REG_a + id - VIS_REG_A; if (id < LENGTH(vis->registers)) @@ -252,14 +267,14 @@ const char *vis_register_slot_get(Vis *vis, enum VisRegister id, size_t slot, si Array vis_register_selections_get(Vis *vis, enum VisRegister id) { Array sel; array_init_sized(&sel, sizeof(Filerange)); - Register *reg = register_from(vis, id); - if (!reg) + Array *mark = mark_from(vis, id); + if (!mark) return sel; View *view = vis->win->view; - size_t len = array_length(®->selections); + size_t len = array_length(mark); array_reserve(&sel, len); for (size_t i = 0; i < len; i++) { - SelectionRegion *sr = array_get(®->selections, i); + SelectionRegion *sr = array_get(mark, i); Filerange r = view_regions_restore(view, sr); if (text_range_valid(&r)) array_add(&sel, &r); @@ -269,16 +284,16 @@ Array vis_register_selections_get(Vis *vis, enum VisRegister id) { } void vis_register_selections_set(Vis *vis, enum VisRegister id, Array *sel) { - Register *reg = register_from(vis, id); - if (!reg) + Array *mark = mark_from(vis, id); + if (!mark) return; - array_clear(®->selections); + array_clear(mark); View *view = vis->win->view; for (size_t i = 0, len = array_length(sel); i < len; i++) { SelectionRegion ss; Filerange *r = array_get(sel, i); if (view_regions_save(view, r, &ss)) - array_add(®->selections, &ss); + array_add(mark, &ss); } } -- cgit v1.2.3