]> git.neil.brown.name Git - edlib.git/commitdiff
Change "Refresh" function to pass 'point' via ci->mark.
authorNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 05:10:15 +0000 (16:10 +1100)
committerNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 05:25:59 +0000 (16:25 +1100)
Signed-off-by: NeilBrown <neil@brown.name>
core-pane.c
core.h
lib-view.c
render-lines.c

index f0e3b2ef2b271fb26eda8bf5a1827845e898fe42..0664292d7aef8b6ce31410a3bc9107764ffc314e 100644 (file)
@@ -102,36 +102,36 @@ static void __pane_refresh(struct cmd_info *ci)
        struct pane *c;
        int damage = ci->extra;
        struct pane *p = ci->home;
-       struct point  **pp;
+       struct cmd_info ci2 = *ci;
 
        if (p->focus == NULL)
                p->focus = list_first_entry_or_null(
                        &p->children, struct pane, siblings);
        if (p->point)
-               ci->pointp = &p->point;
-       pp = ci->pointp;
+               ci2.mark = &p->point->m;
+
        damage |= p->damaged;
        if (!damage)
                return;
        if (damage == DAMAGED_CHILD)
                damage = 0;
        else {
-               ci->extra = damage;
-               if (ci->extra & DAMAGED_SIZE)
-                       ci->extra |= DAMAGED_CONTENT;
-               if (ci->extra & DAMAGED_CONTENT)
-                       ci->extra |= DAMAGED_CURSOR;
+               ci2.extra = damage;
+               if (ci2.extra & DAMAGED_SIZE)
+                       ci2.extra |= DAMAGED_CONTENT;
+               if (ci2.extra & DAMAGED_CONTENT)
+                       ci2.extra |= DAMAGED_CURSOR;
                damage &= DAMAGED_SIZE;
-               ci->comm = p->handle;
-               if (p->handle->func(ci) == 0)
+               ci2.comm = p->handle;
+               if (p->handle->func(&ci2) == 0)
                        pane_check_size(p);
        }
        p->damaged = 0;
        list_for_each_entry(c, &p->children, siblings) {
-               ci->pointp = pp;
-               ci->extra = damage;
-               ci->home = c;
-               __pane_refresh(ci);
+               ci2.extra = damage;
+               ci2.home = c;
+               ci2.comm = NULL;
+               __pane_refresh(&ci2);
        }
 }
 
diff --git a/core.h b/core.h
index fc4cd8aec85f89dcb5ae32ed359785f903611431..6524fb1e4688c77ed81f9048ee45b1da4781f984 100644 (file)
--- a/core.h
+++ b/core.h
@@ -194,6 +194,11 @@ static inline int mark_ordered_or_same(struct doc *d, struct mark *m1, struct ma
        return mark_ordered(m1, m2) || mark_same(d, m1, m2);
 }
 
+static inline int mark_ordered_or_same_pane(struct pane *p, struct mark *m1, struct mark *m2)
+{
+       return mark_ordered(m1, m2) || mark_same_pane(p, m1, m2, NULL);
+}
+
 static inline int mark_ordered_not_same(struct doc *d, struct mark *m1, struct mark *m2)
 {
        return mark_ordered(m1, m2) && !mark_same(d, m1, m2);
index b09747054def36acbdd8f0b74f0f34e7922785fd..02e20fe1b34993bd56bb53b273a7bc0cada9c770 100644 (file)
@@ -42,14 +42,15 @@ static int view_refresh(struct cmd_info *ci)
 {
        struct pane *p = ci->home;
        struct view_data *vd = p->data;
-       struct point *pt;
+       struct mark *m = ci->mark;
        int ln, l, w, c = -1;
        struct cmd_info ci2 = {0};
        char msg[100];
        int i;
        int mid;
-
-       pt = *ci->pointp;
+       struct editor *ed = pane2ed(ci->home);
+       struct pane *dp = doc_get_pane(ci->home);
+       struct doc *d = dp->data;
 
        pane_check_size(p);
        p->cx = 0; p->cy = 0;
@@ -64,13 +65,13 @@ static int view_refresh(struct cmd_info *ci)
                if (p->h > 4) {
                        ci2.key = "CountLines";
                        ci2.home = ci2.focus = p;
-                       ci2.mark = &pt->m;
-                       key_lookup(pt->doc->ed->commands, &ci2);
+                       ci2.mark = m;
+                       key_lookup(ed->commands, &ci2);
 
-                       ln = attr_find_int(*mark_attr(&pt->m), "lines");
-                       l = attr_find_int(pt->doc->attrs, "lines");
-                       w = attr_find_int(pt->doc->attrs, "words");
-                       c = attr_find_int(pt->doc->attrs, "chars");
+                       ln = attr_find_int(*mark_attr(m), "lines");
+                       l = attr_find_int(d->attrs, "lines");
+                       w = attr_find_int(d->attrs, "words");
+                       c = attr_find_int(d->attrs, "chars");
                        if (l <= 0)
                                l = 1;
                        mid = 1 + (p->h-4) * ln / l;
@@ -89,7 +90,7 @@ static int view_refresh(struct cmd_info *ci)
                int label;
                for (i = 0; i < p->w; i++)
                        pane_text(p, '-', "inverse", i, 0);
-               snprintf(msg, sizeof(msg), "%s", pt->doc->name);
+               snprintf(msg, sizeof(msg), "%s", d->name);
                label = (p->w - strlen(msg)) / 2;
                if (label < 1)
                        label = 1;
@@ -103,9 +104,9 @@ static int view_refresh(struct cmd_info *ci)
                if (!(vd->border & BORDER_TOP)) {
                        if (c >= 0)
                                snprintf(msg, sizeof(msg), "L%d W%d C%d D:%s",
-                                        l,w,c, pt->doc->name);
+                                        l,w,c, d->name);
                        else
-                               snprintf(msg, sizeof(msg),"%s", pt->doc->name);
+                               snprintf(msg, sizeof(msg),"%s", d->name);
                        for (i = 0; msg[i] && i+4 < p->w; i++)
                                pane_text(p, msg[i], "inverse", i+4, p->h-1);
                }
index 65fc91f381dd30386b662cbded6bfe64805e3749..80febb212f6a6c71d7fcc30d8319135e0cef4283 100644 (file)
@@ -291,8 +291,7 @@ static struct mark *call_render_line_prev(struct pane *p,
        return m;
 }
 
-static struct mark *call_render_line(struct pane *p, struct point **ptp,
-                                    struct rl_mark *start)
+static struct mark *call_render_line(struct pane *p, struct rl_mark *start)
 {
        struct cmd_info ci = {0};
        struct mark *m, *m2;
@@ -332,7 +331,7 @@ static struct mark *call_render_line(struct pane *p, struct point **ptp,
        return m;
 }
 
-static struct mark *call_render_line_offset(struct pane *p, struct point **ptp,
+static struct mark *call_render_line_offset(struct pane *p,
                                            struct rl_mark *start, int offset)
 {
        struct cmd_info ci = {0};
@@ -349,7 +348,7 @@ static struct mark *call_render_line_offset(struct pane *p, struct point **ptp,
        return ci.mark;
 }
 
-static int call_render_line_to_point(struct pane *p, struct point **ptp,
+static int call_render_line_to_point(struct pane *p, struct mark *pm,
                                     struct rl_mark *start)
 {
        struct cmd_info ci = {0};
@@ -357,7 +356,7 @@ static int call_render_line_to_point(struct pane *p, struct point **ptp,
 
        ci.key = "render-line";
        ci.focus = p;
-       ci.mark2 = &(*ptp)->m;
+       ci.mark2 = pm;
        ci.mark = mark_dup(&start->m, 0);
        ci.numeric = -1;
        if (key_handle(&ci) == 0) {
@@ -373,10 +372,9 @@ static int call_render_line_to_point(struct pane *p, struct point **ptp,
        return len;
 }
 
-static void find_lines(struct point **ptp, struct pane *p)
+static void find_lines(struct mark *pm, struct pane *p)
 {
        struct rl_data *rl = p->data;
-       struct doc *d;
        struct rl_mark *top, *bot;
        struct mark *m;
        struct rl_mark *start, *end;
@@ -385,17 +383,17 @@ static void find_lines(struct point **ptp, struct pane *p)
        int found_start = 0, found_end = 0;
        int lines_above = 0, lines_below = 0;
 
-       d = (*ptp)->doc;
        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(*ptp, rl->typenum),
+       m = call_render_line_prev(p, mark_at_point(container_of(pm, struct point, m),
+                                                  rl->typenum),
                                  0, &rl->top_sol);
        if (!m)
                return;
        start = container_of(m, struct rl_mark, m);
-       offset = call_render_line_to_point(p, ptp, start);
+       offset = call_render_line_to_point(p, pm, start);
        if (start->line == NULL)
-               m = call_render_line(p, ptp, start);
+               m = call_render_line(p, start);
        else
                m = vmark_next(&start->m);
 
@@ -408,12 +406,12 @@ static void find_lines(struct point **ptp, struct pane *p)
        }
        y = 1;
        /* We have start/end of the focus line, and its height */
-       if (bot && !mark_ordered_or_same(d, &bot->m, &start->m))
+       if (bot && !mark_ordered_or_same_pane(p, &bot->m, &start->m))
                /* already before 'bot', so will never "cross over" bot, so
                 * ignore 'bot'
                 */
                bot = NULL;
-       if (top && !mark_ordered_or_same(d, &end->m, &top->m))
+       if (top && !mark_ordered_or_same_pane(p, &end->m, &top->m))
                top = NULL;
 
        rl->skip_lines = 0;
@@ -433,7 +431,7 @@ static void find_lines(struct point **ptp, struct pane *p)
                                        int h = 0;
                                        start = container_of(m, struct rl_mark, m);
                                        if (!start->line)
-                                               call_render_line(p, ptp, start);
+                                               call_render_line(p, start);
                                        render_line(p, start->line, &h, 0,
                                                    NULL, NULL, NULL);
                                        if (h) {
@@ -453,7 +451,7 @@ static void find_lines(struct point **ptp, struct pane *p)
                                y += 1;
                        } else {
                                if (!end->line)
-                                       call_render_line(p, ptp, end);
+                                       call_render_line(p, end);
                                if (!end->line)
                                        found_end = 1;
                                else {
@@ -490,17 +488,14 @@ static void find_lines(struct point **ptp, struct pane *p)
        end->line = NULL;
 }
 
-static void render(struct point **ptp, struct pane *p)
+static void render(struct mark *pm, struct pane *p)
 {
        struct rl_data *rl = p->data;
-       struct doc *d;
        int y;
        struct rl_mark *m, *m2;
        int restarted = 0;
        char *hdr;
 
-       d = (*ptp)->doc;
-
        hdr = pane_attr_get(p, "heading");
        if (hdr && !*hdr)
                hdr = NULL;
@@ -522,13 +517,13 @@ restart:
        while (m && y < p->h) {
                if (m->line == NULL) {
                        /* This line has changed. */
-                       call_render_line(p, ptp, m);
+                       call_render_line(p, m);
                }
                m2 = container_of(vmark_next(&m->m), struct rl_mark, m);
                if (p->cx <= 0 &&
-                   mark_ordered_or_same(d, &m->m, &(*ptp)->m) &&
-                   (!m2 || mark_ordered_or_same(d, &(*ptp)->m, &m2->m))) {
-                       int len = call_render_line_to_point(p, ptp,
+                   mark_ordered_or_same_pane(p, &m->m, pm) &&
+                   (!m2 || mark_ordered_or_same_pane(p, pm, &m2->m))) {
+                       int len = call_render_line_to_point(p, pm,
                                                            m);
                        rl->cursor_line = y;
                        render_line(p, m->line ?: "", &y, 1, &p->cx, &p->cy, &len);
@@ -598,13 +593,13 @@ DEF_CMD(render_lines_refresh)
                                          &rl->top_sol);
 
        if (m) {
-               render(ci->pointp, p);
+               render(ci->mark, p);
                if (rl->ignore_point || (p->cx >= 0 && p->cy < p->h))
                        /* Found the cursor! */
                        return 1;
        }
-       find_lines(ci->pointp, p);
-       render(ci->pointp, p);
+       find_lines(ci->mark, p);
+       render(ci->mark, p);
        return 1;
 }
 
@@ -658,7 +653,6 @@ DEF_CMD(render_lines_move)
        struct pane *p = ci->home;
        int rpt = RPT_NUM(ci);
        struct rl_data *rl = p->data;
-       struct point **ptp = ci->pointp;
        struct mark *top;
        int pagesize = 1;
 
@@ -688,7 +682,7 @@ DEF_CMD(render_lines_move)
                                break;
                        rm = container_of(top, struct rl_mark, m);
                        if (rm->line == NULL)
-                               call_render_line(p, ptp, rm);
+                               call_render_line(p, rm);
                        if (rm->line == NULL)
                                break;
                        render_line(p, rm->line, &y, 0, NULL, NULL, NULL);
@@ -701,7 +695,7 @@ DEF_CMD(render_lines_move)
                        struct rl_mark *rm = container_of(top, struct rl_mark, m);
 
                        if (rm->line == NULL)
-                               call_render_line(p, ptp, rm);
+                               call_render_line(p, rm);
                        if (rm->line == NULL)
                                break;
                        render_line(p, rm->line, &y, 0, NULL, NULL, NULL);
@@ -744,7 +738,7 @@ DEF_CMD(render_lines_set_cursor)
                int cx = ci->hx, cy = ci->hy, o = -1;
                render_line(p, m->line, &y, 0, &cx, &cy, &o);
                if (o >= 0) {
-                       struct mark *m2 = call_render_line_offset(p, ptp, m, o);
+                       struct mark *m2 = call_render_line_offset(p, m, o);
                        if (m2) {
                                point_to_mark(*ptp, m2);
                                mark_free(m2);
@@ -774,7 +768,7 @@ DEF_CMD(render_lines_move_pos)
            mark_ordered(&pt->m, bot))
                /* pos already displayed */
                return 1;
-       find_lines(ci->pointp, ci->home);
+       find_lines(&(*ci->pointp)->m, ci->home);
        pane_damaged(p, DAMAGED_CONTENT);
        return 1;
 }
@@ -840,7 +834,7 @@ DEF_CMD(render_lines_move_line)
                /* 'o' is the distance from start-of-line of the target */
                if (o >= 0) {
                        struct mark *m2 = call_render_line_offset(
-                               p, ci->pointp, start, o);
+                               p, start, o);
                        if (m2)
                                point_to_mark(*ci->pointp, m2);
                        mark_free(m2);