]> git.neil.brown.name Git - edlib.git/commitdiff
simplify/improve mark-at-point functions.
authorNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 23:26:56 +0000 (10:26 +1100)
committerNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 23:26:56 +0000 (10:26 +1100)
Signed-off-by: NeilBrown <neil@brown.name>
core-doc.c
core-mark.c
core.h
emacs-search.c
mode-emacs.c
render-complete.c
render-lines.c

index 5ca50f85f43efa37b6c9db12fee9b678f42726e1..a6ef54941823ddfd6be21db55a09db8d7c0bbf30 100644 (file)
@@ -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;
        }
 
index e10db2241e68a307b8a97789800724eb3a8ca442..1a3bf93ef7c6d95cd2a5ad80444cff683b6279fc 100644 (file)
@@ -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 13a307cdd49aa5f838c773a32182997e42f41578..a2e26bfa305e1b8e99eef40aa12f0ab9c358ffc9 100644 (file)
--- 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);
index c4040d5b18da5c74d8739b8018bac0d8c4ce65e5..ae93a104776d0bfa6b2132630d1ea79b1f775f9f 100644 (file)
@@ -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);
index f7677e58b39fdd9097b7f2428173e6bd1d1968e9..765fb49fa84f969bc7c7e4e389f4c46e89ec444c 100644 (file)
@@ -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);
index 0f74d631ea01f22cbd61fd1c715ebfa7ac612848..eb4f45e1c79947a25dcc26b998d3da73ff254071 100644 (file)
@@ -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);
index aaf59114ce21fc1d093e53acd2bb89dd7b514041..eb44da33dc04a39dc5fd199503bd020d760dbbf5 100644 (file)
@@ -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;