From: NeilBrown Date: Thu, 10 Dec 2015 03:00:18 +0000 (+1100) Subject: Introduce pane_mark_attr. X-Git-Tag: lca2016~76 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=934aa380716feadd6147c7125db0901837eae557;p=edlib.git Introduce pane_mark_attr. This searches panes for an attribute at a mark. This removes another doc_from_pane call. Signed-off-by: NeilBrown --- diff --git a/core-pane.c b/core-pane.c index 22a7eedc..a6df9507 100644 --- a/core-pane.c +++ b/core-pane.c @@ -515,6 +515,17 @@ char *pane_attr_get(struct pane *p, char *key) return NULL; } +char *pane_mark_attr(struct pane *p, struct mark *m, int forward, char *key) +{ + while (p) { + char *a = doc_attr(p, m, forward, key); + if (a) + return a; + p = p->parent; + } + return NULL; +} + struct pane *pane_final_child(struct pane *p) { struct pane *c; diff --git a/core.h b/core.h index 1e252664..8964e04a 100644 --- a/core.h +++ b/core.h @@ -333,6 +333,7 @@ struct pane *pane_attach(struct pane *p, char *type, struct pane *dp, char *arg) void pane_clear(struct pane *p, char *attrs); void pane_text(struct pane *p, wchar_t ch, char *attrs, int x, int y); char *pane_attr_get(struct pane *p, char *key); +char *pane_mark_attr(struct pane *p, struct mark *m, int forward, char *key); struct pane *call_pane(char *key, struct pane *focus, int numeric, struct mark *m, int extra); diff --git a/render-format.c b/render-format.c index 0c7df85f..18f94d04 100644 --- a/render-format.c +++ b/render-format.c @@ -25,7 +25,6 @@ DEF_CMD(render_line) char *body = pane_attr_get(ci->focus, "line-format"); struct rf_data *rf = ci->home->data; struct buf ret; - struct doc *d = doc_from_pane(ci->home); struct mark *m = ci->mark; struct mark *pm = ci->mark2; char *n; @@ -34,7 +33,7 @@ DEF_CMD(render_line) int field = 0; int rv; - if (!d || !ci->mark || !ci->focus) + if (!ci->mark || !ci->focus) return -1; if (pm && !mark_same_pane(ci->home, pm, m, NULL)) @@ -93,7 +92,7 @@ DEF_CMD(render_line) buf_append(&ret, ch); continue; } - val = doc_attr(d->home, m, 1, buf); + val = pane_mark_attr(ci->focus, m, 1, buf); if (!val) val = "-"; if (*n != ':') {