From: NeilBrown Date: Thu, 26 Nov 2015 05:10:15 +0000 (+1100) Subject: Change "Refresh" function to pass 'point' via ci->mark. X-Git-Tag: lca2016~196 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=ced8a964e7b7ef79ccc5f9097c700fd311cf4d53;p=edlib.git Change "Refresh" function to pass 'point' via ci->mark. Signed-off-by: NeilBrown --- diff --git a/core-pane.c b/core-pane.c index f0e3b2ef..0664292d 100644 --- a/core-pane.c +++ b/core-pane.c @@ -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 fc4cd8ae..6524fb1e 100644 --- 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); diff --git a/lib-view.c b/lib-view.c index b0974705..02e20fe1 100644 --- a/lib-view.c +++ b/lib-view.c @@ -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); } diff --git a/render-lines.c b/render-lines.c index 65fc91f3..80febb21 100644 --- a/render-lines.c +++ b/render-lines.c @@ -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);