]> git.neil.brown.name Git - edlib.git/commitdiff
Change vmark functions to take a pane instead of a document.
authorNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 00:34:47 +0000 (11:34 +1100)
committerNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 00:34:47 +0000 (11:34 +1100)
Signed-off-by: NeilBrown <neil@brown.name>
core-doc.c
core-mark.c
core.h
render-lines.c

index 135fe7fa5c7f3e0c3dfc3fdd4bf7e9f2b3f2cf52..c100b81d1f933c1d8326264b570a1b5f794ff5e8 100644 (file)
@@ -208,6 +208,14 @@ DEF_CMD(doc_handle)
                return 1;
        }
 
+       if (strcmp(ci->key, "doc:vmark-get") == 0) {
+               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);
+               return 1;
+       }
+
        return key_lookup(d->map, ci);
 }
 
index d09dc2ad7f965fa8c2dcd4631805e7e4971f4809..be7a76b416769ca4d1b7cd6526b521e5b8ea40fc 100644 (file)
@@ -760,7 +760,7 @@ struct mark *vmark_prev(struct mark *m)
        return __vmark_prev(tl);
 }
 
-struct mark *vmark_first(struct doc *d, int view)
+struct mark *do_vmark_first(struct doc *d, int view)
 {
        struct tlist_head *tl;
 
@@ -775,7 +775,7 @@ struct mark *vmark_first(struct doc *d, int view)
        return NULL;
 }
 
-struct mark *vmark_last(struct doc *d, int view)
+struct mark *do_vmark_last(struct doc *d, int view)
 {
        struct tlist_head *tl;
 
@@ -790,6 +790,51 @@ struct mark *vmark_last(struct doc *d, int view)
        return NULL;
 }
 
+static int vmark_get(struct pane *p, int view,
+                    struct mark **first, struct mark **last, struct mark **point)
+{
+       struct cmd_info ci = {0};
+
+       ci.key = "doc:vmark-get";
+       ci.focus = p;
+       ci.numeric = view;
+       if (point)
+               ci.extra = 1;
+       if (key_handle_focus(&ci) == 0)
+               return 0;
+       if (first)
+               *first = ci.mark;
+       if (point)
+               *point = ci.mark2;
+       else if (last)
+               *last = ci.mark2;
+       return 1;
+}
+
+struct mark *vmark_first(struct pane *p, int view)
+{
+       struct mark *first = NULL;
+       if (vmark_get(p, view, &first, NULL, NULL) == 0)
+               return 0;
+       return first;
+}
+
+struct mark *vmark_last(struct pane *p, int view)
+{
+       struct mark *last = NULL;
+       if (vmark_get(p, view, NULL, &last, NULL) == 0)
+               return 0;
+       return last;
+}
+
+struct mark *vmark_at_point(struct pane *p, int view)
+{
+       struct mark *point = NULL;
+       if (vmark_get(p, view, NULL, NULL, &point) == 0)
+               return 0;
+       return point;
+}
+
 struct mark *vmark_matching(struct pane *p, struct mark *m)
 {
        /* Find a nearby mark in the same view with the same ref */
@@ -804,7 +849,7 @@ struct mark *vmark_matching(struct pane *p, struct mark *m)
        return NULL;
 }
 
-struct mark *vmark_at_point(struct point *pt, int view)
+struct mark *do_vmark_at_point(struct point *pt, int view)
 {
        struct tlist_head *tl;
        struct mark *m;
diff --git a/core.h b/core.h
index 3f1a0fc13d40e1ed055109db09fbfa9f10cc1e71..ce7bed8f4b491967b605131aa0b4aa2d0dea7704 100644 (file)
--- a/core.h
+++ b/core.h
@@ -176,10 +176,13 @@ void points_attach(struct doc *d, int view);
 void point_free(struct point *p);
 struct mark *vmark_next(struct mark *m);
 struct mark *vmark_prev(struct mark *m);
-struct mark *vmark_first(struct doc *d, int view);
-struct mark *vmark_last(struct doc *d, int view);
+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 *vmark_at_point(struct point *pt, int view);
+struct mark *do_vmark_at_point(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);
 
 static inline int mark_ordered(struct mark *m1, struct mark *m2)
 {
index d5bfc95d0f97f7586c583e5cedf9fa0a118e148a..e2ef929584e7e44b713e06228543ba3ef23e53dc 100644 (file)
@@ -389,8 +389,8 @@ static void find_lines(struct point **ptp, struct pane *p)
        int lines_above = 0, lines_below = 0;
 
        d = (*ptp)->doc;
-       top = container_of(vmark_first(d, rl->typenum), struct rl_mark, m);
-       bot = container_of(vmark_last(d, rl->typenum), struct rl_mark, m);
+       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, ptp, mark_at_point(*ptp, rl->typenum),
                                  0, &rl->top_sol);
        if (!m)
@@ -518,7 +518,7 @@ restart:
                rl->header_lines = y;
        }
        y -= rl->skip_lines;
-       m = container_of(vmark_first(d, rl->typenum), struct rl_mark, m);
+       m = container_of(vmark_first(p, rl->typenum), struct rl_mark, m);
 
        p->cx = p->cy = -1;
        rl->cursor_line = 0;
@@ -588,7 +588,6 @@ DEF_CMD(render_lines_refresh)
 {
        struct pane *p = ci->home;
        struct rl_data *rl = p->data;
-       struct doc *d;
        struct mark *m;
        char *a;
 
@@ -597,9 +596,7 @@ DEF_CMD(render_lines_refresh)
        a = pane_attr_get(p, "render-wrap");
        rl->do_wrap = (!a || strcmp(a, "yes") == 0);
 
-       d = (*ci->pointp)->doc;
-
-       m = vmark_first(d, rl->typenum);
+       m = vmark_first(p, rl->typenum);
        if (rl->top_sol && m)
                m = call_render_line_prev(p, ci->pointp, mark_dup(m, 0), 0,
                                          &rl->top_sol);
@@ -619,12 +616,9 @@ DEF_CMD(render_lines_close)
 {
        struct pane *p = ci->home;
        struct rl_data *rl = p->data;
-       struct doc *d;
        struct mark *m;
 
-       d = (*ci->pointp)->doc;
-
-       while ((m = vmark_first(d, rl->typenum)) != NULL) {
+       while ((m = vmark_first(p, rl->typenum)) != NULL) {
                struct rl_mark *rm = container_of(m, struct rl_mark, m);
                free(rm->line);
                mark_free(m);
@@ -669,11 +663,10 @@ DEF_CMD(render_lines_move)
        int rpt = RPT_NUM(ci);
        struct rl_data *rl = p->data;
        struct point **ptp = ci->pointp;
-       struct doc *d = (*ptp)->doc;
        struct mark *top;
        int pagesize = 1;
 
-       top = vmark_first(d, rl->typenum);
+       top = vmark_first(p, rl->typenum);
        if (!top)
                return 0;
        if (strcmp(ci->key, "Move-View-Large") == 0)
@@ -724,7 +717,7 @@ DEF_CMD(render_lines_move)
                        if ((rpt+pagesize-1)/pagesize !=
                            (rpt+pagesize-y-1)/pagesize)
                                /* Have cross a full page, can discard old lines */
-                               while ((old = vmark_first(d, rl->typenum)) != NULL &&
+                               while ((old = vmark_first(p, rl->typenum)) != NULL &&
                                       old != top) {
                                        rm = container_of(old, struct rl_mark, m);
                                        free(rm->line);
@@ -742,7 +735,6 @@ DEF_CMD(render_lines_set_cursor)
 {
        struct pane *p = ci->home;
        struct point **ptp = ci->pointp;
-       struct doc *d = (*ptp)->doc;
        struct rl_data *rl = p->data;
        struct rl_mark *m;
        int y = rl->header_lines - rl->skip_lines;
@@ -750,7 +742,7 @@ DEF_CMD(render_lines_set_cursor)
 
        render_lines_other_move_func(ci);
 
-       m = container_of(vmark_first(d, rl->typenum), struct rl_mark, m);
+       m = container_of(vmark_first(p, rl->typenum), struct rl_mark, m);
 
        while (y <= ci->hy && m && m->line) {
                int cx = ci->hx, cy = ci->hy, o = -1;
@@ -776,12 +768,11 @@ DEF_CMD(render_lines_move_pos)
        struct pane *p = ci->home;
        struct rl_data *rl = p->data;
        struct point *pt = *ci->pointp;
-       struct doc *d = pt->doc;
        struct mark *top, *bot;
 
        rl->ignore_point = 1;
-       top = vmark_first(d, rl->typenum);
-       bot = vmark_last(d, rl->typenum);
+       top = vmark_first(p, rl->typenum);
+       bot = vmark_last(p, rl->typenum);
        if (top && bot &&
            mark_ordered(top, &pt->m) &&
            mark_ordered(&pt->m, bot))
@@ -842,7 +833,7 @@ DEF_CMD(render_lines_move_line)
 
        if (target_x >= 0 || target_y >= 0) {
                struct rl_mark *start =
-                       container_of(vmark_at_point(*ci->pointp, rl->typenum),
+                       container_of(vmark_at_point(p, rl->typenum),
                                     struct rl_mark, m);
                int y = 0;
                if (!start || !start->line) {
@@ -923,10 +914,9 @@ DEF_CMD(render_lines_redraw)
 {
        struct pane *p = ci->home;
        struct rl_data *rl = p->data;
-       struct doc *d = (*ci->pointp)->doc;
        struct mark *m;
 
-       for (m = vmark_first(d, rl->typenum);
+       for (m = vmark_first(p, rl->typenum);
             m;
             m = vmark_next(m)) {
                struct rl_mark *rm = container_of(m, struct rl_mark, m);