return 1;
}
- if (strcmp(ci->key, "PointDup") == 0) {
- struct point *pt = NULL;
+ if (strcmp(ci->key, "doc:dup-point") == 0) {
+ struct point *pt = ci->home->point;
+ if (ci->mark && ci->mark->viewnum == MARK_POINT)
+ pt = container_of(ci->mark, struct point, m);
ci->mark = NULL;
if (ci->home->point) {
if (ci->extra == MARK_POINT) {
- pt = point_dup(ci->home->point);
+ pt = point_dup(pt);
ci->mark = &pt->m;
}
- if (ci->extra == MARK_UNGROUPED)
- ci->mark = mark_dup(&ci->home->point->m, 1);
+ else if (ci->extra == MARK_UNGROUPED)
+ ci->mark = mark_dup(&pt->m, 1);
+ else
+ ci->mark = do_mark_at_point(d, pt,
+ ci->extra);
}
return 1;
}
ci->mark = do_vmark_first(d, ci->numeric);
ci->mark2 = do_vmark_last(d, ci->numeric);
if (ci->extra && ci->home->point)
- ci->mark2 = do_vmark_at_point(ci->home->point, ci->numeric);
+ ci->mark2 = do_vmark_at_point(d, ci->home->point,
+ ci->numeric);
return 1;
}
assign_seq(new, orig->seq);
}
-struct mark *mark_at_point(struct point *p, int view)
+struct mark *do_mark_at_point(struct doc *d, struct point *pt, int view)
{
struct mark *ret;
int size = sizeof(*ret);
if (view >= 0)
- size += p->doc->views[view].space;
+ size += d->views[view].space;
ret = calloc(size, 1);
- dup_mark(&p->m, ret);
+ dup_mark(&pt->m, ret);
ret->viewnum = view;
if (view >= 0)
- tlist_add(&ret->view, GRP_MARK, &p->links->lists[view]);
+ tlist_add(&ret->view, GRP_MARK, &pt->links->lists[view]);
else
INIT_TLIST_HEAD(&ret->view, GRP_MARK);
return ret;
}
+struct mark *mark_at_point(struct pane *p, struct mark *pm, int view)
+{
+ struct cmd_info ci = {0};
+ ci.key = "doc:dup-point";
+ ci.extra = view;
+ ci.mark = pm;
+ ci.focus = p;
+ if (key_handle_focus(&ci) == 0)
+ return NULL;
+ return ci.mark;
+}
+
struct point *point_dup(struct point *p)
{
int i;
return NULL;
}
-struct mark *do_vmark_at_point(struct point *pt, int view)
+struct mark *do_vmark_at_point(struct doc *d, struct point *pt, int view)
{
struct tlist_head *tl;
struct mark *m;
tl = &pt->links->lists[view];
m = __vmark_prev(tl);
- if (m && mark_same(pt->doc, m, &pt->m))
+ if (m && mark_same(d, m, &pt->m))
return m;
tl = &pt->links->lists[view];
m = __vmark_next(tl);
- if (m && mark_same(pt->doc, m, &pt->m))
+ if (m && mark_same(d, m, &pt->m))
return m;
return NULL;
}
wint_t mark_step2(struct doc *d, struct mark *m, int forward, int move);
wint_t mark_next(struct doc *d, struct mark *m);
wint_t mark_prev(struct doc *d, struct mark *m);
-struct mark *mark_at_point(struct point *p, int view);
+struct mark *mark_at_point(struct pane *p, struct mark *pm, int view);
+struct mark *do_mark_at_point(struct doc *d, struct point *pt, int view);
void points_resize(struct doc *d);
void points_attach(struct doc *d, int view);
void point_free(struct point *p);
struct mark *do_vmark_first(struct doc *d, int view);
struct mark *do_vmark_last(struct doc *d, int view);
struct mark *vmark_matching(struct pane *p, struct mark *m);
-struct mark *do_vmark_at_point(struct point *pt, int view);
+struct mark *do_vmark_at_point(struct doc *d, struct point *pt, int view);
struct mark *vmark_first(struct pane *p, int view);
struct mark *vmark_last(struct pane *p, int view);
struct mark *vmark_at_point(struct pane *p, int view);
esi = malloc(sizeof(*esi));
esi->target = ci2.focus;
memset(&ci2, 0, sizeof(ci2));
- ci2.key = "PointDup";
+ ci2.key = "doc:dup-point";
ci2.extra = MARK_POINT;
ci2.focus = esi->target;
key_handle_focus(&ci2);
if (!ci->str || !ci->str[0])
return -1;
- ci2.key = "PointDup";
+ ci2.key = "doc:dup-point";
ci2.focus = ci->home;
ci2.extra = MARK_UNGROUPED;
key_handle_focus(&ci2);
free(cd->prefix);
cd->prefix = strdup(ci->str);
- ci2.key = "PointDup";
+ ci2.key = "doc:dup-point";
ci2.focus = ci->home;
ci2.extra = MARK_UNGROUPED;
key_handle_focus(&ci2);
top = container_of(vmark_first(p, rl->typenum), struct rl_mark, m);
bot = container_of(vmark_last(p, rl->typenum), struct rl_mark, m);
- m = call_render_line_prev(p, mark_at_point(container_of(pm, struct point, m),
- rl->typenum),
+ m = call_render_line_prev(p, mark_at_point(p, pm, rl->typenum),
0, &rl->top_sol);
if (!m)
return;