Add a "fill" style attribute to clear the entire format drawing area in

a colour, GitHub issue 1815.
This commit is contained in:
nicm 2019-07-01 06:56:00 +00:00
parent cf30e0f935
commit 2da050413c
4 changed files with 30 additions and 1 deletions

View File

@ -511,8 +511,9 @@ format_draw(struct screen_write_ctx *octx, const struct grid_cell *base,
u_int ocx = os->cx, ocy = os->cy, i, width[TOTAL]; u_int ocx = os->cx, ocy = os->cy, i, width[TOTAL];
u_int map[] = { LEFT, LEFT, CENTRE, RIGHT }; u_int map[] = { LEFT, LEFT, CENTRE, RIGHT };
int focus_start = -1, focus_end = -1; int focus_start = -1, focus_end = -1;
int list_state = -1; int list_state = -1, fill = -1;
enum style_align list_align = STYLE_ALIGN_DEFAULT; enum style_align list_align = STYLE_ALIGN_DEFAULT;
struct grid_cell gc;
struct style sy; struct style sy;
struct utf8_data *ud = &sy.gc.data; struct utf8_data *ud = &sy.gc.data;
const char *cp, *end; const char *cp, *end;
@ -590,6 +591,10 @@ format_draw(struct screen_write_ctx *octx, const struct grid_cell *base,
style_tostring(&sy)); style_tostring(&sy));
free(tmp); free(tmp);
/* If this style has a fill colour, store it for later. */
if (sy.fill != 8)
fill = sy.fill;
/* Check the list state. */ /* Check the list state. */
switch (sy.list) { switch (sy.list) {
case STYLE_LIST_ON: case STYLE_LIST_ON:
@ -711,6 +716,14 @@ format_draw(struct screen_write_ctx *octx, const struct grid_cell *base,
fr->argument, names[fr->index], fr->start, fr->end); fr->argument, names[fr->index], fr->start, fr->end);
} }
/* Clear the available area. */
if (fill != -1) {
memcpy(&gc, &grid_default_cell, sizeof gc);
gc.bg = fill;
for (i = 0; i < available; i++)
screen_write_putc(octx, &gc, ' ');
}
/* /*
* Draw the screens. How they are arranged depends on where the list * Draw the screens. How they are arranged depends on where the list
* appearsq. * appearsq.

12
style.c
View File

@ -32,6 +32,7 @@
static struct style style_default = { static struct style style_default = {
{ 0, 0, 8, 8, 0, { { ' ' }, 0, 1, 1 } }, { 0, 0, 8, 8, 0, { { ' ' }, 0, 1, 1 } },
8,
STYLE_ALIGN_DEFAULT, STYLE_ALIGN_DEFAULT,
STYLE_LIST_OFF, STYLE_LIST_OFF,
@ -127,6 +128,10 @@ style_parse(struct style *sy, const struct grid_cell *base, const char *in)
sy->align = STYLE_ALIGN_RIGHT; sy->align = STYLE_ALIGN_RIGHT;
else else
goto error; goto error;
} else if (end > 5 && strncasecmp(tmp, "fill=", 5) == 0) {
if ((value = colour_fromstring(tmp + 5)) == -1)
goto error;
sy->fill = value;
} else if (end > 3 && strncasecmp(tmp + 1, "g=", 2) == 0) { } else if (end > 3 && strncasecmp(tmp + 1, "g=", 2) == 0) {
if ((value = colour_fromstring(tmp + 3)) == -1) if ((value = colour_fromstring(tmp + 3)) == -1)
goto error; goto error;
@ -213,6 +218,11 @@ style_tostring(struct style *sy)
tmp); tmp);
comma = ","; comma = ",";
} }
if (sy->fill != 8) {
off += xsnprintf(s + off, sizeof s - off, "%sfill=%s", comma,
colour_tostring(sy->fill));
comma = ",";
}
if (gc->fg != 8) { if (gc->fg != 8) {
off += xsnprintf(s + off, sizeof s - off, "%sfg=%s", comma, off += xsnprintf(s + off, sizeof s - off, "%sfg=%s", comma,
colour_tostring(gc->fg)); colour_tostring(gc->fg));
@ -290,6 +300,8 @@ style_equal(struct style *sy1, struct style *sy2)
return (0); return (0);
if ((gc1->attr & STYLE_ATTR_MASK) != (gc2->attr & STYLE_ATTR_MASK)) if ((gc1->attr & STYLE_ATTR_MASK) != (gc2->attr & STYLE_ATTR_MASK))
return (0); return (0);
if (sy1->fill != sy2->fill)
return (0);
if (sy1->align != sy2->align) if (sy1->align != sy2->align)
return (0); return (0);
return (1); return (1);

3
tmux.1
View File

@ -4337,6 +4337,9 @@ to unset.
.Ic align=right .Ic align=right
.Xc .Xc
Align text to the left, centre or right of the available space if appropriate. Align text to the left, centre or right of the available space if appropriate.
.It Xo Ic fill=colour
.Xc
Fill the available space with a background colour if appropriate.
.It Xo Ic list=on , .It Xo Ic list=on ,
.Ic list=focus , .Ic list=focus ,
.Ic list=left-marker , .Ic list=left-marker ,

1
tmux.h
View File

@ -682,6 +682,7 @@ TAILQ_HEAD(style_ranges, style_range);
struct style { struct style {
struct grid_cell gc; struct grid_cell gc;
int fill;
enum style_align align; enum style_align align;
enum style_list list; enum style_list list;