summaryrefslogtreecommitdiff
path: root/vis-registers.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-06-14 22:54:06 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-06-15 15:51:43 +0200
commitf000d2f9c924bb964203d7dba27b3290045c6853 (patch)
tree38dfb204c458979ff298cc466ec6c64f69173798 /vis-registers.c
parent4b2513c5e1587319ec14ec511a01cfbad331ac79 (diff)
vis: add basic infrastructure to store selections in registers
Diffstat (limited to 'vis-registers.c')
-rw-r--r--vis-registers.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/vis-registers.c b/vis-registers.c
index aae7fdc..3e69b13 100644
--- a/vis-registers.c
+++ b/vis-registers.c
@@ -29,6 +29,7 @@ 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(&reg->selections, sizeof(SelectionRegion));
array_init_sized(&reg->values, sizeof(Buffer));
return array_add(&reg->values, &buf);
}
@@ -36,6 +37,7 @@ bool register_init(Register *reg) {
void register_release(Register *reg) {
if (!reg)
return;
+ array_release(&reg->selections);
size_t n = array_capacity(&reg->values);
for (size_t i = 0; i < n; i++)
buffer_release(array_get(&reg->values, i));
@@ -239,6 +241,39 @@ const char *vis_register_slot_get(Vis *vis, enum VisRegister id, size_t slot, si
return NULL;
}
+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)
+ return sel;
+ View *view = vis->win->view;
+ size_t len = array_length(&reg->selections);
+ array_reserve(&sel, len);
+ for (size_t i = 0; i < len; i++) {
+ SelectionRegion *sr = array_get(&reg->selections, i);
+ Filerange r = view_regions_restore(view, sr);
+ if (text_range_valid(&r))
+ array_add(&sel, &r);
+ }
+ //selections_normalize(&sel);
+ return sel;
+}
+
+void vis_register_selections_set(Vis *vis, enum VisRegister id, Array *sel) {
+ Register *reg = register_from(vis, id);
+ if (!reg)
+ return;
+ array_clear(&reg->selections);
+ 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(&reg->selections, &ss);
+ }
+}
+
const RegisterDef vis_registers[] = {
[VIS_REG_DEFAULT] = { '"', VIS_HELP("Unnamed register") },
[VIS_REG_ZERO] = { '0', VIS_HELP("Yank register") },