From: NeilBrown Date: Thu, 26 Nov 2015 23:26:56 +0000 (+1100) Subject: simplify/improve mark-at-point functions. X-Git-Tag: lca2016~179 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=25082d32748764b1dfa2dab616be28cd9ccf5b9d;p=edlib.git simplify/improve mark-at-point functions. Signed-off-by: NeilBrown --- diff --git a/core-doc.c b/core-doc.c index 5ca50f85..a6ef5494 100644 --- a/core-doc.c +++ b/core-doc.c @@ -374,16 +374,21 @@ DEF_CMD(doc_handle) 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; } @@ -423,7 +428,8 @@ DEF_CMD(doc_handle) 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; } diff --git a/core-mark.c b/core-mark.c index e10db224..1a3bf93e 100644 --- a/core-mark.c +++ b/core-mark.c @@ -132,25 +132,37 @@ static void dup_mark(struct mark *orig, struct mark *new) 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; @@ -871,18 +883,18 @@ struct mark *vmark_matching(struct pane *p, struct mark *m) 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; } diff --git a/core.h b/core.h index 13a307cd..a2e26bfa 100644 --- a/core.h +++ b/core.h @@ -174,7 +174,8 @@ wint_t mark_step(struct doc *d, struct mark *m, int forward, int move, struct cm 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); @@ -183,7 +184,7 @@ struct mark *vmark_prev(struct mark *m); 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); diff --git a/emacs-search.c b/emacs-search.c index c4040d5b..ae93a104 100644 --- a/emacs-search.c +++ b/emacs-search.c @@ -238,7 +238,7 @@ DEF_CMD(emacs_search) 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); diff --git a/mode-emacs.c b/mode-emacs.c index f7677e58..765fb49f 100644 --- a/mode-emacs.c +++ b/mode-emacs.c @@ -572,7 +572,7 @@ DEF_CMD(emacs_search) 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); diff --git a/render-complete.c b/render-complete.c index 0f74d631..eb4f45e1 100644 --- a/render-complete.c +++ b/render-complete.c @@ -214,7 +214,7 @@ DEF_CMD(complete_set_prefix) 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); diff --git a/render-lines.c b/render-lines.c index aaf59114..eb44da33 100644 --- a/render-lines.c +++ b/render-lines.c @@ -388,8 +388,7 @@ static void find_lines(struct mark *pm, struct pane *p) 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;