Allow replacing each of the many sets of separate foo-{fg,bg,attr}

options with a single foo-style option. For example:

    set -g status-fg yellow
    set -g status-bg red
    set -g status-attr blink

Becomes:

    set -g status-style fg=yellow,bg=red,blink

The -a flag to set can be used to add to rather than replace a style. So:

    set -g status-bg red

Becomes:

    set -ag status-style bg=red

Currently this is fully backwards compatible (all *-{fg,bg,attr} options
remain) but the plan is to deprecate them over time.

From Tiago Cunha.
This commit is contained in:
nicm 2014-01-28 23:07:09 +00:00
parent c930fd5ff6
commit 945339b443
15 changed files with 710 additions and 439 deletions

View File

@ -113,6 +113,7 @@ SRCS= arguments.c \
session.c \ session.c \
signal.c \ signal.c \
status.c \ status.c \
style.c \
tmux.c \ tmux.c \
tty-acs.c \ tty-acs.c \
tty-keys.c \ tty-keys.c \

View File

@ -60,6 +60,9 @@ struct options_entry *cmd_set_option_flag(struct cmd *, struct cmd_q *,
struct options_entry *cmd_set_option_choice(struct cmd *, struct cmd_q *, struct options_entry *cmd_set_option_choice(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *, const struct options_table_entry *, struct options *,
const char *); const char *);
struct options_entry *cmd_set_option_style(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
const struct cmd_entry cmd_set_option_entry = { const struct cmd_entry cmd_set_option_entry = {
"set-option", "set", "set-option", "set",
@ -304,9 +307,11 @@ cmd_set_option_set(struct cmd *self, struct cmd_q *cmdq,
break; break;
case OPTIONS_TABLE_COLOUR: case OPTIONS_TABLE_COLOUR:
o = cmd_set_option_colour(self, cmdq, oe, oo, value); o = cmd_set_option_colour(self, cmdq, oe, oo, value);
style_update_new(oo, o->name, oe->style);
break; break;
case OPTIONS_TABLE_ATTRIBUTES: case OPTIONS_TABLE_ATTRIBUTES:
o = cmd_set_option_attributes(self, cmdq, oe, oo, value); o = cmd_set_option_attributes(self, cmdq, oe, oo, value);
style_update_new(oo, o->name, oe->style);
break; break;
case OPTIONS_TABLE_FLAG: case OPTIONS_TABLE_FLAG:
o = cmd_set_option_flag(self, cmdq, oe, oo, value); o = cmd_set_option_flag(self, cmdq, oe, oo, value);
@ -314,6 +319,9 @@ cmd_set_option_set(struct cmd *self, struct cmd_q *cmdq,
case OPTIONS_TABLE_CHOICE: case OPTIONS_TABLE_CHOICE:
o = cmd_set_option_choice(self, cmdq, oe, oo, value); o = cmd_set_option_choice(self, cmdq, oe, oo, value);
break; break;
case OPTIONS_TABLE_STYLE:
o = cmd_set_option_style(self, cmdq, oe, oo, value);
break;
} }
if (o == NULL) if (o == NULL)
return (-1); return (-1);
@ -462,3 +470,23 @@ cmd_set_option_choice(unused struct cmd *self, struct cmd_q *cmdq,
return (options_set_number(oo, oe->name, choice)); return (options_set_number(oo, oe->name, choice));
} }
/* Set a style option. */
struct options_entry *
cmd_set_option_style(struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
{
struct args *args = self->args;
struct options_entry *o;
int append;
append = args_has(args, 'a');
if ((o = options_set_style(oo, oe->name, value, append)) == NULL) {
cmdq_error(cmdq, "bad style: %s", value);
return (NULL);
}
style_update_old(oo, oe->name, &o->style);
return (o);
}

1
grid.c
View File

@ -37,7 +37,6 @@
/* Default grid cell data. */ /* Default grid cell data. */
const struct grid_cell grid_default_cell = { 0, 0, 8, 8, (1 << 4) | 1, " " }; const struct grid_cell grid_default_cell = { 0, 0, 8, 8, (1 << 4) | 1, " " };
const struct grid_cell grid_marker_cell = { 0, 0, 8, 8, (1 << 4) | 1, "_" };
#define grid_put_cell(gd, px, py, gc) do { \ #define grid_put_cell(gd, px, py, gc) do { \
memcpy(&gd->linedata[py].celldata[px], \ memcpy(&gd->linedata[py].celldata[px], \

View File

@ -196,32 +196,43 @@ const struct options_table_entry session_options_table[] = {
{ .name = "message-attr", { .name = "message-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0 .default_num = 0,
.style = "message-style"
}, },
{ .name = "message-bg", { .name = "message-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 3 .default_num = 3,
.style = "message-style"
}, },
{ .name = "message-command-attr", { .name = "message-command-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0 .default_num = 0,
.style = "message-command-style"
}, },
{ .name = "message-command-bg", { .name = "message-command-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 0 .default_num = 0,
.style = "message-command-style"
}, },
{ .name = "message-command-fg", { .name = "message-command-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 3 .default_num = 3,
.style = "message-command-style"
},
{ .name = "message-command-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "bg=black,fg=yellow"
}, },
{ .name = "message-fg", { .name = "message-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 0 .default_num = 0,
.style = "message-style"
}, },
{ .name = "message-limit", { .name = "message-limit",
@ -231,6 +242,11 @@ const struct options_table_entry session_options_table[] = {
.default_num = 20 .default_num = 20
}, },
{ .name = "message-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "bg=yellow,fg=black"
},
{ .name = "mouse-resize-pane", { .name = "mouse-resize-pane",
.type = OPTIONS_TABLE_FLAG, .type = OPTIONS_TABLE_FLAG,
.default_num = 0 .default_num = 0
@ -253,22 +269,36 @@ const struct options_table_entry session_options_table[] = {
{ .name = "pane-active-border-bg", { .name = "pane-active-border-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "pane-active-border-style"
}, },
{ .name = "pane-active-border-fg", { .name = "pane-active-border-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 2 .default_num = 2,
.style = "pane-active-border-style"
},
{ .name = "pane-active-border-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "fg=green"
}, },
{ .name = "pane-border-bg", { .name = "pane-border-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "pane-border-style"
}, },
{ .name = "pane-border-fg", { .name = "pane-border-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "pane-border-style"
},
{ .name = "pane-border-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "default"
}, },
{ .name = "prefix", { .name = "prefix",
@ -315,17 +345,20 @@ const struct options_table_entry session_options_table[] = {
{ .name = "status-attr", { .name = "status-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0 .default_num = 0,
.style = "status-style"
}, },
{ .name = "status-bg", { .name = "status-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 2 .default_num = 2,
.style = "status-style"
}, },
{ .name = "status-fg", { .name = "status-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 0 .default_num = 0,
.style = "status-style"
}, },
{ .name = "status-interval", { .name = "status-interval",
@ -354,17 +387,20 @@ const struct options_table_entry session_options_table[] = {
{ .name = "status-left-attr", { .name = "status-left-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0 .default_num = 0,
.style = "status-left-style"
}, },
{ .name = "status-left-bg", { .name = "status-left-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "status-left-style"
}, },
{ .name = "status-left-fg", { .name = "status-left-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "status-left-style"
}, },
{ .name = "status-left-length", { .name = "status-left-length",
@ -374,6 +410,11 @@ const struct options_table_entry session_options_table[] = {
.default_num = 10 .default_num = 10
}, },
{ .name = "status-left-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "default"
},
{ .name = "status-position", { .name = "status-position",
.type = OPTIONS_TABLE_CHOICE, .type = OPTIONS_TABLE_CHOICE,
.choices = options_table_status_position_list, .choices = options_table_status_position_list,
@ -387,17 +428,20 @@ const struct options_table_entry session_options_table[] = {
{ .name = "status-right-attr", { .name = "status-right-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0 .default_num = 0,
.style = "status-right-style"
}, },
{ .name = "status-right-bg", { .name = "status-right-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "status-right-style"
}, },
{ .name = "status-right-fg", { .name = "status-right-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "status-right-style"
}, },
{ .name = "status-right-length", { .name = "status-right-length",
@ -407,6 +451,16 @@ const struct options_table_entry session_options_table[] = {
.default_num = 40 .default_num = 40
}, },
{ .name = "status-right-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "default"
},
{ .name = "status-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "bg=green,fg=black"
},
{ .name = "status-utf8", { .name = "status-utf8",
.type = OPTIONS_TABLE_FLAG, .type = OPTIONS_TABLE_FLAG,
.default_num = 0 /* overridden in main() */ .default_num = 0 /* overridden in main() */
@ -537,17 +591,20 @@ const struct options_table_entry window_options_table[] = {
{ .name = "mode-attr", { .name = "mode-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0 .default_num = 0,
.style = "mode-style"
}, },
{ .name = "mode-bg", { .name = "mode-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 3 .default_num = 3,
.style = "mode-style"
}, },
{ .name = "mode-fg", { .name = "mode-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 0 .default_num = 0,
.style = "mode-style"
}, },
{ .name = "mode-keys", { .name = "mode-keys",
@ -562,6 +619,11 @@ const struct options_table_entry window_options_table[] = {
.default_num = 0 .default_num = 0
}, },
{ .name = "mode-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "bg=yellow,fg=black"
},
{ .name = "monitor-activity", { .name = "monitor-activity",
.type = OPTIONS_TABLE_FLAG, .type = OPTIONS_TABLE_FLAG,
.default_num = 0 .default_num = 0
@ -617,72 +679,101 @@ const struct options_table_entry window_options_table[] = {
{ .name = "window-status-activity-attr", { .name = "window-status-activity-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = GRID_ATTR_REVERSE .default_num = GRID_ATTR_REVERSE,
.style = "window-status-activity-style"
}, },
{ .name = "window-status-activity-bg", { .name = "window-status-activity-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "window-status-activity-style"
}, },
{ .name = "window-status-activity-fg", { .name = "window-status-activity-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "window-status-activity-style"
}, },
{ .name = "window-status-bell-attr", { .name = "window-status-activity-style",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_STYLE,
.default_num = GRID_ATTR_REVERSE .default_str = "reverse"
},
{ .name = "window-status-bell-bg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8
},
{ .name = "window-status-bell-fg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8
},
{ .name = "window-status-content-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = GRID_ATTR_REVERSE
},
{ .name = "window-status-content-bg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8
},
{ .name = "window-status-content-fg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8
}, },
{ .name = "window-status-attr", { .name = "window-status-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0 .default_num = 0,
.style = "window-status-style"
},
{ .name = "window-status-bell-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = GRID_ATTR_REVERSE,
.style = "window-status-bell-style"
},
{ .name = "window-status-bell-bg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8,
.style = "window-status-bell-style"
},
{ .name = "window-status-bell-fg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8,
.style = "window-status-bell-style"
},
{ .name = "window-status-bell-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "reverse"
}, },
{ .name = "window-status-bg", { .name = "window-status-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "window-status-style"
},
{ .name = "window-status-content-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = GRID_ATTR_REVERSE,
.style = "window-status-content-style"
},
{ .name = "window-status-content-bg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8,
.style = "window-status-content-style"
},
{ .name = "window-status-content-fg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8,
.style = "window-status-content-style"
},
{ .name = "window-status-content-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "reverse"
}, },
{ .name = "window-status-current-attr", { .name = "window-status-current-attr",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0 .default_num = 0,
.style = "window-status-current-style"
}, },
{ .name = "window-status-current-bg", { .name = "window-status-current-bg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "window-status-current-style"
}, },
{ .name = "window-status-current-fg", { .name = "window-status-current-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "window-status-current-style"
}, },
{ .name = "window-status-current-format", { .name = "window-status-current-format",
@ -690,24 +781,15 @@ const struct options_table_entry window_options_table[] = {
.default_str = "#I:#W#F" .default_str = "#I:#W#F"
}, },
{ .name = "window-status-last-attr", { .name = "window-status-current-style",
.type = OPTIONS_TABLE_ATTRIBUTES, .type = OPTIONS_TABLE_STYLE,
.default_num = 0 .default_str = "default"
},
{ .name = "window-status-last-bg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8
},
{ .name = "window-status-last-fg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8
}, },
{ .name = "window-status-fg", { .name = "window-status-fg",
.type = OPTIONS_TABLE_COLOUR, .type = OPTIONS_TABLE_COLOUR,
.default_num = 8 .default_num = 8,
.style = "window-status-style"
}, },
{ .name = "window-status-format", { .name = "window-status-format",
@ -715,11 +797,39 @@ const struct options_table_entry window_options_table[] = {
.default_str = "#I:#W#F" .default_str = "#I:#W#F"
}, },
{ .name = "window-status-last-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
.default_num = 0,
.style = "window-status-last-style"
},
{ .name = "window-status-last-bg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8,
.style = "window-status-last-style"
},
{ .name = "window-status-last-fg",
.type = OPTIONS_TABLE_COLOUR,
.default_num = 8,
.style = "window-status-last-style"
},
{ .name = "window-status-last-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "default"
},
{ .name = "window-status-separator", { .name = "window-status-separator",
.type = OPTIONS_TABLE_STRING, .type = OPTIONS_TABLE_STRING,
.default_str = " " .default_str = " "
}, },
{ .name = "window-status-style",
.type = OPTIONS_TABLE_STYLE,
.default_str = "default"
},
{ .name = "wrap-search", { .name = "wrap-search",
.type = OPTIONS_TABLE_FLAG, .type = OPTIONS_TABLE_FLAG,
.default_num = 1 .default_num = 1
@ -741,10 +851,17 @@ options_table_populate_tree(
const struct options_table_entry *oe; const struct options_table_entry *oe;
for (oe = table; oe->name != NULL; oe++) { for (oe = table; oe->name != NULL; oe++) {
if (oe->default_str != NULL) switch (oe->type) {
case OPTIONS_TABLE_STRING:
options_set_string(oo, oe->name, "%s", oe->default_str); options_set_string(oo, oe->name, "%s", oe->default_str);
else break;
case OPTIONS_TABLE_STYLE:
options_set_style(oo, oe->name, oe->default_str);
break;
default:
options_set_number(oo, oe->name, oe->default_num); options_set_number(oo, oe->name, oe->default_num);
break;
}
} }
} }
@ -789,6 +906,10 @@ options_table_print_entry(const struct options_table_entry *oe,
s = oe->choices[o->num]; s = oe->choices[o->num];
xsnprintf(out, sizeof out, "%s", s); xsnprintf(out, sizeof out, "%s", s);
break; break;
case OPTIONS_TABLE_STYLE:
s = style_tostring(&o->style);
xsnprintf(out, sizeof out, "%s", s);
break;
} }
return (out); return (out);
} }

View File

@ -109,6 +109,7 @@ options_set_string(struct options *oo, const char *name, const char *fmt, ...)
o = xmalloc(sizeof *o); o = xmalloc(sizeof *o);
o->name = xstrdup(name); o->name = xstrdup(name);
RB_INSERT(options_tree, &oo->tree, o); RB_INSERT(options_tree, &oo->tree, o);
memcpy(&o->style, &grid_default_cell, sizeof o->style);
} else if (o->type == OPTIONS_STRING) } else if (o->type == OPTIONS_STRING)
free(o->str); free(o->str);
@ -140,6 +141,7 @@ options_set_number(struct options *oo, const char *name, long long value)
o = xmalloc(sizeof *o); o = xmalloc(sizeof *o);
o->name = xstrdup(name); o->name = xstrdup(name);
RB_INSERT(options_tree, &oo->tree, o); RB_INSERT(options_tree, &oo->tree, o);
memcpy(&o->style, &grid_default_cell, sizeof o->style);
} else if (o->type == OPTIONS_STRING) } else if (o->type == OPTIONS_STRING)
free(o->str); free(o->str);
@ -159,3 +161,37 @@ options_get_number(struct options *oo, const char *name)
fatalx("option not a number"); fatalx("option not a number");
return (o->num); return (o->num);
} }
struct options_entry *
options_set_style(struct options *oo, const char *name, const char *value,
int append)
{
struct options_entry *o;
if ((o = options_find1(oo, name)) == NULL) {
o = xmalloc(sizeof *o);
o->name = xstrdup(name);
RB_INSERT(options_tree, &oo->tree, o);
} else if (o->type == OPTIONS_STRING)
free(o->str);
if (!append)
memcpy(&o->style, &grid_default_cell, sizeof o->style);
o->type = OPTIONS_STYLE;
if (style_parse(&grid_default_cell, &o->style, value) == -1)
return (NULL);
return (o);
}
struct grid_cell *
options_get_style(struct options *oo, const char *name)
{
struct options_entry *o;
if ((o = options_find(oo, name)) == NULL)
fatalx("missing option");
if (o->type != OPTIONS_STYLE)
fatalx("option not a style");
return (&o->style);
}

View File

@ -224,7 +224,7 @@ screen_redraw_screen(struct client *c, int status_only, int borders_only)
struct window_pane *wp; struct window_pane *wp;
struct grid_cell active_gc, other_gc; struct grid_cell active_gc, other_gc;
u_int i, j, type, top; u_int i, j, type, top;
int status, spos, fg, bg; int status, spos;
/* Suspended clients should not be updated. */ /* Suspended clients should not be updated. */
if (c->flags & CLIENT_SUSPENDED) if (c->flags & CLIENT_SUSPENDED)
@ -251,17 +251,9 @@ screen_redraw_screen(struct client *c, int status_only, int borders_only)
} }
/* Set up pane border attributes. */ /* Set up pane border attributes. */
memcpy(&other_gc, &grid_marker_cell, sizeof other_gc); style_apply(&other_gc, oo, "pane-border-style");
memcpy(&active_gc, &grid_marker_cell, sizeof active_gc); style_apply(&active_gc, oo, "pane-active-border-style");
active_gc.attr = other_gc.attr = GRID_ATTR_CHARSET; active_gc.attr = other_gc.attr = GRID_ATTR_CHARSET; /* nuke existing */
fg = options_get_number(oo, "pane-border-fg");
colour_set_fg(&other_gc, fg);
bg = options_get_number(oo, "pane-border-bg");
colour_set_bg(&other_gc, bg);
fg = options_get_number(oo, "pane-active-border-fg");
colour_set_fg(&active_gc, fg);
bg = options_get_number(oo, "pane-active-border-bg");
colour_set_bg(&active_gc, bg);
/* Draw background and borders. */ /* Draw background and borders. */
for (j = 0; j < tty->sy - status; j++) { for (j = 0; j < tty->sy - status; j++) {
@ -368,7 +360,7 @@ screen_redraw_draw_number(struct client *c, struct window_pane *wp)
px -= len * 3; px -= len * 3;
py -= 2; py -= 2;
memcpy(&gc, &grid_marker_cell, sizeof gc); memcpy(&gc, &grid_default_cell, sizeof gc);
if (w->active == wp) if (w->active == wp)
colour_set_bg(&gc, active_colour); colour_set_bg(&gc, active_colour);
else else
@ -395,7 +387,7 @@ screen_redraw_draw_number(struct client *c, struct window_pane *wp)
tty_cursor(tty, xoff + wp->sx - len, yoff); tty_cursor(tty, xoff + wp->sx - len, yoff);
draw_text: draw_text:
memcpy(&gc, &grid_marker_cell, sizeof gc); memcpy(&gc, &grid_default_cell, sizeof gc);
if (w->active == wp) if (w->active == wp)
colour_set_fg(&gc, active_colour); colour_set_fg(&gc, active_colour);
else else

View File

@ -248,7 +248,7 @@ screen_write_cnputs(struct screen_write_ctx *ctx,
} }
*last = '\0'; *last = '\0';
screen_write_parsestyle(gc, &lgc, ptr); style_parse(gc, &lgc, ptr);
ptr = last + 1; ptr = last + 1;
continue; continue;
} }
@ -288,89 +288,6 @@ screen_write_cnputs(struct screen_write_ctx *ctx,
free(msg); free(msg);
} }
/* Parse an embedded style of the form "fg=colour,bg=colour,bright,...". */
void
screen_write_parsestyle(
struct grid_cell *defgc, struct grid_cell *gc, const char *in)
{
const char delimiters[] = " ,";
char tmp[32];
int val;
size_t end;
u_char fg, bg, attr, flags;
if (*in == '\0')
return;
if (strchr(delimiters, in[strlen(in) - 1]) != NULL)
return;
fg = gc->fg;
bg = gc->bg;
attr = gc->attr;
flags = gc->flags;
do {
end = strcspn(in, delimiters);
if (end > (sizeof tmp) - 1)
return;
memcpy(tmp, in, end);
tmp[end] = '\0';
if (strcasecmp(tmp, "default") == 0) {
fg = defgc->fg;
bg = defgc->bg;
attr = defgc->attr;
flags &= ~(GRID_FLAG_FG256|GRID_FLAG_BG256);
flags |=
defgc->flags & (GRID_FLAG_FG256|GRID_FLAG_BG256);
} else if (end > 3 && strncasecmp(tmp + 1, "g=", 2) == 0) {
if ((val = colour_fromstring(tmp + 3)) == -1)
return;
if (*in == 'f' || *in == 'F') {
if (val != 8) {
if (val & 0x100) {
flags |= GRID_FLAG_FG256;
val &= ~0x100;
} else
flags &= ~GRID_FLAG_FG256;
fg = val;
} else {
fg = defgc->fg;
flags &= ~GRID_FLAG_FG256;
flags |= defgc->flags & GRID_FLAG_FG256;
}
} else if (*in == 'b' || *in == 'B') {
if (val != 8) {
if (val & 0x100) {
flags |= GRID_FLAG_BG256;
val &= ~0x100;
} else
flags &= ~GRID_FLAG_BG256;
bg = val;
} else {
bg = defgc->bg;
flags &= ~GRID_FLAG_BG256;
flags |= defgc->flags & GRID_FLAG_BG256;
}
} else
return;
} else if (end > 2 && strncasecmp(tmp, "no", 2) == 0) {
if ((val = attributes_fromstring(tmp + 2)) == -1)
return;
attr &= ~val;
} else {
if ((val = attributes_fromstring(tmp)) == -1)
return;
attr |= val;
}
in += end + strspn(in + end, delimiters);
} while (*in != '\0');
gc->fg = fg;
gc->bg = bg;
gc->attr = attr;
gc->flags = flags;
}
/* Copy from another screen. */ /* Copy from another screen. */
void void
screen_write_copy(struct screen_write_ctx *ctx, screen_write_copy(struct screen_write_ctx *ctx,

118
status.c
View File

@ -80,18 +80,9 @@ status_redraw_get_left(struct client *c,
{ {
struct session *s = c->session; struct session *s = c->session;
char *left; char *left;
int fg, bg, attr;
size_t leftlen; size_t leftlen;
fg = options_get_number(&s->options, "status-left-fg"); style_apply_update(gc, &s->options, "status-left-style");
if (fg != 8)
colour_set_fg(gc, fg);
bg = options_get_number(&s->options, "status-left-bg");
if (bg != 8)
colour_set_bg(gc, bg);
attr = options_get_number(&s->options, "status-left-attr");
if (attr != 0)
gc->attr = attr;
left = status_replace(c, NULL, left = status_replace(c, NULL,
NULL, NULL, options_get_string(&s->options, "status-left"), t, 1); NULL, NULL, options_get_string(&s->options, "status-left"), t, 1);
@ -110,18 +101,9 @@ status_redraw_get_right(struct client *c,
{ {
struct session *s = c->session; struct session *s = c->session;
char *right; char *right;
int fg, bg, attr;
size_t rightlen; size_t rightlen;
fg = options_get_number(&s->options, "status-right-fg"); style_apply_update(gc, &s->options, "status-right-style");
if (fg != 8)
colour_set_fg(gc, fg);
bg = options_get_number(&s->options, "status-right-bg");
if (bg != 8)
colour_set_bg(gc, bg);
attr = options_get_number(&s->options, "status-right-attr");
if (attr != 0)
gc->attr = attr;
right = status_replace(c, NULL, right = status_replace(c, NULL,
NULL, NULL, options_get_string(&s->options, "status-right"), t, 1); NULL, NULL, options_get_string(&s->options, "status-right"), t, 1);
@ -177,10 +159,7 @@ status_redraw(struct client *c)
t = c->status_timer.tv_sec; t = c->status_timer.tv_sec;
/* Set up default colour. */ /* Set up default colour. */
memcpy(&stdgc, &grid_default_cell, sizeof gc); style_apply(&stdgc, &s->options, "status-style");
colour_set_fg(&stdgc, options_get_number(&s->options, "status-fg"));
colour_set_bg(&stdgc, options_get_number(&s->options, "status-bg"));
stdgc.attr |= options_get_number(&s->options, "status-attr");
/* Create the target screen. */ /* Create the target screen. */
memcpy(&old_status, &c->status, sizeof old_status); memcpy(&old_status, &c->status, sizeof old_status);
@ -646,73 +625,22 @@ status_print(
struct session *s = c->session; struct session *s = c->session;
const char *fmt; const char *fmt;
char *text; char *text;
int fg, bg, attr;
fg = options_get_number(oo, "window-status-fg"); style_apply_update(gc, oo, "window-status-style");
if (fg != 8)
colour_set_fg(gc, fg);
bg = options_get_number(oo, "window-status-bg");
if (bg != 8)
colour_set_bg(gc, bg);
attr = options_get_number(oo, "window-status-attr");
if (attr != 0)
gc->attr = attr;
fmt = options_get_string(oo, "window-status-format"); fmt = options_get_string(oo, "window-status-format");
if (wl == s->curw) { if (wl == s->curw) {
fg = options_get_number(oo, "window-status-current-fg"); style_apply_update(gc, oo, "window-status-current-style");
if (fg != 8)
colour_set_fg(gc, fg);
bg = options_get_number(oo, "window-status-current-bg");
if (bg != 8)
colour_set_bg(gc, bg);
attr = options_get_number(oo, "window-status-current-attr");
if (attr != 0)
gc->attr = attr;
fmt = options_get_string(oo, "window-status-current-format"); fmt = options_get_string(oo, "window-status-current-format");
} }
if (wl == TAILQ_FIRST(&s->lastw)) { if (wl == TAILQ_FIRST(&s->lastw))
fg = options_get_number(oo, "window-status-last-fg"); style_apply_update(gc, oo, "window-status-last-style");
if (fg != 8)
colour_set_fg(gc, fg);
bg = options_get_number(oo, "window-status-last-bg");
if (bg != 8)
colour_set_bg(gc, bg);
attr = options_get_number(oo, "window-status-last-attr");
if (attr != 0)
gc->attr = attr;
}
if (wl->flags & WINLINK_BELL) { if (wl->flags & WINLINK_BELL)
fg = options_get_number(oo, "window-status-bell-fg"); style_apply_update(gc, oo, "window-status-bell-style");
if (fg != 8) else if (wl->flags & WINLINK_CONTENT)
colour_set_fg(gc, fg); style_apply_update(gc, oo, "window-status-content-style");
bg = options_get_number(oo, "window-status-bell-bg"); else if (wl->flags & (WINLINK_ACTIVITY|WINLINK_SILENCE))
if (bg != 8) style_apply_update(gc, oo, "window-status-activity-style");
colour_set_bg(gc, bg);
attr = options_get_number(oo, "window-status-bell-attr");
if (attr != 0)
gc->attr = attr;
} else if (wl->flags & WINLINK_CONTENT) {
fg = options_get_number(oo, "window-status-content-fg");
if (fg != 8)
colour_set_fg(gc, fg);
bg = options_get_number(oo, "window-status-content-bg");
if (bg != 8)
colour_set_bg(gc, bg);
attr = options_get_number(oo, "window-status-content-attr");
if (attr != 0)
gc->attr = attr;
} else if (wl->flags & (WINLINK_ACTIVITY|WINLINK_SILENCE)) {
fg = options_get_number(oo, "window-status-activity-fg");
if (fg != 8)
colour_set_fg(gc, fg);
bg = options_get_number(oo, "window-status-activity-bg");
if (bg != 8)
colour_set_bg(gc, bg);
attr = options_get_number(oo, "window-status-activity-attr");
if (attr != 0)
gc->attr = attr;
}
text = status_replace(c, NULL, wl, NULL, fmt, t, 1); text = status_replace(c, NULL, wl, NULL, fmt, t, 1);
return (text); return (text);
@ -814,10 +742,7 @@ status_message_redraw(struct client *c)
if (len > c->tty.sx) if (len > c->tty.sx)
len = c->tty.sx; len = c->tty.sx;
memcpy(&gc, &grid_default_cell, sizeof gc); style_apply(&gc, &s->options, "message-style");
colour_set_fg(&gc, options_get_number(&s->options, "message-fg"));
colour_set_bg(&gc, options_get_number(&s->options, "message-bg"));
gc.attr |= options_get_number(&s->options, "message-attr");
screen_write_start(&ctx, NULL, &c->status); screen_write_start(&ctx, NULL, &c->status);
@ -935,18 +860,11 @@ status_prompt_redraw(struct client *c)
len = c->tty.sx; len = c->tty.sx;
off = 0; off = 0;
memcpy(&gc, &grid_default_cell, sizeof gc);
/* Change colours for command mode. */ /* Change colours for command mode. */
if (c->prompt_mdata.mode == 1) { if (c->prompt_mdata.mode == 1)
colour_set_fg(&gc, options_get_number(&s->options, "message-command-fg")); style_apply(&gc, &s->options, "message-command-style");
colour_set_bg(&gc, options_get_number(&s->options, "message-command-bg")); else
gc.attr |= options_get_number(&s->options, "message-command-attr"); style_apply(&gc, &s->options, "message-style");
} else {
colour_set_fg(&gc, options_get_number(&s->options, "message-fg"));
colour_set_bg(&gc, options_get_number(&s->options, "message-bg"));
gc.attr |= options_get_number(&s->options, "message-attr");
}
screen_write_start(&ctx, NULL, &c->status); screen_write_start(&ctx, NULL, &c->status);

224
style.c Normal file
View File

@ -0,0 +1,224 @@
/* $OpenBSD$ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
* Copyright (c) 2014 Tiago Cunha <tcunha@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <string.h>
#include "tmux.h"
/* Parse an embedded style of the form "fg=colour,bg=colour,bright,...". */
int
style_parse(const struct grid_cell *defgc, struct grid_cell *gc,
const char *in)
{
const char delimiters[] = " ,";
char tmp[32];
int val;
size_t end;
u_char fg, bg, attr, flags;
if (*in == '\0')
return (0);
if (strchr(delimiters, in[strlen(in) - 1]) != NULL)
return (-1);
fg = gc->fg;
bg = gc->bg;
attr = gc->attr;
flags = gc->flags;
do {
end = strcspn(in, delimiters);
if (end > (sizeof tmp) - 1)
return (-1);
memcpy(tmp, in, end);
tmp[end] = '\0';
if (strcasecmp(tmp, "default") == 0) {
fg = defgc->fg;
bg = defgc->bg;
attr = defgc->attr;
flags &= ~(GRID_FLAG_FG256|GRID_FLAG_BG256);
flags |=
defgc->flags & (GRID_FLAG_FG256|GRID_FLAG_BG256);
} else if (end > 3 && strncasecmp(tmp + 1, "g=", 2) == 0) {
if ((val = colour_fromstring(tmp + 3)) == -1)
return (-1);
if (*in == 'f' || *in == 'F') {
if (val != 8) {
if (val & 0x100) {
flags |= GRID_FLAG_FG256;
val &= ~0x100;
} else
flags &= ~GRID_FLAG_FG256;
fg = val;
} else {
fg = defgc->fg;
flags &= ~GRID_FLAG_FG256;
flags |= defgc->flags & GRID_FLAG_FG256;
}
} else if (*in == 'b' || *in == 'B') {
if (val != 8) {
if (val & 0x100) {
flags |= GRID_FLAG_BG256;
val &= ~0x100;
} else
flags &= ~GRID_FLAG_BG256;
bg = val;
} else {
bg = defgc->bg;
flags &= ~GRID_FLAG_BG256;
flags |= defgc->flags & GRID_FLAG_BG256;
}
} else
return (-1);
} else if (strcasecmp(tmp, "none") == 0)
attr = 0;
else if (end > 2 && strncasecmp(tmp, "no", 2) == 0) {
if ((val = attributes_fromstring(tmp + 2)) == -1)
return (-1);
attr &= ~val;
} else {
if ((val = attributes_fromstring(tmp)) == -1)
return (-1);
attr |= val;
}
in += end + strspn(in + end, delimiters);
} while (*in != '\0');
gc->fg = fg;
gc->bg = bg;
gc->attr = attr;
gc->flags = flags;
return (0);
}
/* Convert style to a string. */
const char *
style_tostring(struct grid_cell *gc)
{
int c, off = 0, comma = 0;
static char s[256];
*s = '\0';
if (gc->fg != 8) {
if (gc->flags & GRID_FLAG_FG256)
c = gc->fg | 0x100;
else
c = gc->fg;
off += xsnprintf(s, sizeof s, "fg=%s", colour_tostring(c));
comma = 1;
}
if (gc->bg != 8) {
if (gc->flags & GRID_FLAG_BG256)
c = gc->bg | 0x100;
else
c = gc->bg;
off += xsnprintf(s + off, sizeof s - off, "%sbg=%s",
comma ? "," : "", colour_tostring(c));
comma = 1;
}
if (gc->attr != 0 && gc->attr != GRID_ATTR_CHARSET) {
xsnprintf(s + off, sizeof s - off, "%s%s",
comma ? "," : "", attributes_tostring(gc->attr));
}
if (*s == '\0')
return ("default");
return (s);
}
/* Synchronize new -style option with the old one. */
void
style_update_new(struct options *oo, const char *name, const char *newname)
{
int value;
struct grid_cell *gc;
/* It's a colour or attribute, but with no -style equivalent. */
if (newname == NULL)
return;
gc = options_get_style(oo, newname);
value = options_get_number(oo, name);
if (strstr(name, "-bg") != NULL)
colour_set_bg(gc, value);
else if (strstr(name, "-fg") != NULL)
colour_set_fg(gc, value);
else if (strstr(name, "-attr") != NULL)
gc->attr = value;
}
/* Synchronize all the old options with the new -style one. */
void
style_update_old(struct options *oo, const char *name, struct grid_cell *gc)
{
char newname[128];
int c, size;
size = strrchr(name, '-') - name;
if (gc->flags & GRID_FLAG_BG256)
c = gc->bg | 0x100;
else
c = gc->bg;
xsnprintf(newname, sizeof newname, "%.*s-bg", size, name);
options_set_number(oo, newname, c);
if (gc->flags & GRID_FLAG_FG256)
c = gc->fg | 0x100;
else
c = gc->fg;
xsnprintf(newname, sizeof newname, "%.*s-fg", size, name);
options_set_number(oo, newname, c);
xsnprintf(newname, sizeof newname, "%.*s-attr", size, name);
options_set_number(oo, newname, gc->attr);
}
/* Apply a style. */
void
style_apply(struct grid_cell *gc, struct options *oo, const char *name)
{
struct grid_cell *gcp;
memcpy(gc, &grid_default_cell, sizeof *gc);
gcp = options_get_style(oo, name);
colour_set_fg(gc, gcp->fg);
colour_set_bg(gc, gcp->bg);
gc->attr |= gcp->attr;
}
/* Apply a style, updating if default. */
void
style_apply_update(struct grid_cell *gc, struct options *oo, const char *name)
{
struct grid_cell *gcp;
gcp = options_get_style(oo, name);
if (gcp->fg != 8)
colour_set_fg(gc, gcp->fg);
if (gcp->bg != 8)
colour_set_bg(gc, gcp->bg);
if (gcp->attr != 0)
gc->attr |= gcp->attr;
}

310
tmux.1
View File

@ -2060,11 +2060,6 @@ otherwise a session option.
If If
.Fl g .Fl g
is specified, the global session or window option is set. is specified, the global session or window option is set.
With
.Fl a ,
and if the option expects a string,
.Ar value
is appended to the existing setting.
The The
.Fl u .Fl u
flag unsets an option, so a session inherits the option from the global flag unsets an option, so a session inherits the option from the global
@ -2081,6 +2076,32 @@ flag suppresses the informational message (as if the
.Ic quiet .Ic quiet
server option was set). server option was set).
.Pp .Pp
With
.Fl a ,
and if the option expects a string or a style,
.Ar value
is appended to the existing setting.
For example:
.Bd -literal -offset indent
set -g status-left "foo"
set -ag status-left "bar"
.Ed
.Pp
Will result in
.Ql foobar .
And:
.Bd -literal -offset indent
set -g status-style "bg=red"
set -ag status-style "fg=blue"
.Ed
.Pp
Will result in a red background
.Em and
blue foreground.
Without
.Fl a ,
the result would be the default background and a blue foreground.
.Pp
Available window options are listed under Available window options are listed under
.Ic set-window-option . .Ic set-window-option .
.Pp .Pp
@ -2272,26 +2293,18 @@ the entire server will lock after
.Em all .Em all
sessions would have locked. sessions would have locked.
This has no effect as a session option; it must be set as a global option. This has no effect as a session option; it must be set as a global option.
.It Ic message-attr Ar attributes .It Ic message-command-style Ar style
Set status line message attributes, where Set status line message command style, where
.Ar attributes .Ar style
is either is a comma-separated list of characteristics to be specified.
.Ic none .Pp
or a comma-delimited list of one or more of: These may be
.Ic bright .Ql bg=colour
(or to set the background colour,
.Ic bold ) , .Ql fg=colour
.Ic dim , to set the foreground colour, and a list of attributes as specified below.
.Ic underscore , .Pp
.Ic blink , The colour is one of:
.Ic reverse ,
.Ic hidden ,
or
.Ic italics .
.It Ic message-bg Ar colour
Set status line message background colour, where
.Ar colour
is one of:
.Ic black , .Ic black ,
.Ic red , .Ic red ,
.Ic green , .Ic green ,
@ -2312,18 +2325,46 @@ from the 256-colour set,
or a hexadecimal RGB string such as or a hexadecimal RGB string such as
.Ql #ffffff , .Ql #ffffff ,
which chooses the closest match from the default 256-colour set. which chooses the closest match from the default 256-colour set.
.It Ic message-command-attr Ar attributes .Pp
Set status line message attributes when in command mode. The attributes is either
.It Ic message-command-bg Ar colour .Ic none
Set status line message background colour when in command mode. or a comma-delimited list of one or more of:
.It Ic message-command-fg Ar colour .Ic bright
Set status line message foreground colour when in command mode. (or
.It Ic message-fg Ar colour .Ic bold ) ,
Set status line message foreground colour. .Ic dim ,
.Ic underscore ,
.Ic blink ,
.Ic reverse ,
.Ic hidden ,
or
.Ic italics ,
to turn an attribute on, or an attribute prefixed with
.Ql no
to turn one off.
.Pp
Examples are:
.Bd -literal -offset indent
fg=yellow,bold,underscore,blink
bg=black,fg=default,noreverse
.Ed
.Pp
With the
.Fl a
flag to the
.Ic set-option
command the new style is added otherwise the existing style is replaced.
.It Ic message-limit Ar number .It Ic message-limit Ar number
Set the number of error or information messages to save in the message log for Set the number of error or information messages to save in the message log for
each client. each client.
The default is 20. The default is 20.
.It Ic message-style Ar style
Set status line message style.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.It Xo Ic mouse-resize-pane .It Xo Ic mouse-resize-pane
.Op Ic on | off .Op Ic on | off
.Xc .Xc
@ -2347,12 +2388,22 @@ window.
.Op Ic on | off .Op Ic on | off
.Xc .Xc
If enabled, request mouse input as UTF-8 on UTF-8 terminals. If enabled, request mouse input as UTF-8 on UTF-8 terminals.
.It Ic pane-active-border-bg Ar colour .It Ic pane-active-border-style Ar style
.It Ic pane-active-border-fg Ar colour Set the pane border style for the currently active pane.
Set the pane border colour for the currently active pane. For how to specify
.It Ic pane-border-bg Ar colour .Ar style ,
.It Ic pane-border-fg Ar colour see the
Set the pane border colour for panes aside from the active pane. .Ic message-command-style
option.
Attributes are ignored.
.It Ic pane-border-style Ar style
Set the pane border style for paneas aside from the active pane.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
Attributes are ignored.
.It Ic prefix Ar key .It Ic prefix Ar key
Set the key accepted as a prefix key. Set the key accepted as a prefix key.
.It Ic prefix2 Ar key .It Ic prefix2 Ar key
@ -2418,12 +2469,6 @@ option.
.Op Ic on | off .Op Ic on | off
.Xc .Xc
Show or hide the status line. Show or hide the status line.
.It Ic status-attr Ar attributes
Set status line attributes.
.It Ic status-bg Ar colour
Set status line background colour.
.It Ic status-fg Ar colour
Set status line foreground colour.
.It Ic status-interval Ar interval .It Ic status-interval Ar interval
Update the status bar every Update the status bar every
.Ar interval .Ar interval
@ -2481,19 +2526,10 @@ section).
For details on how the names and titles can be set see the For details on how the names and titles can be set see the
.Sx "NAMES AND TITLES" .Sx "NAMES AND TITLES"
section. section.
For a list of allowed attributes see the
.Ic message-command-style
option.
.Pp .Pp
#[attributes] allows a comma-separated list of attributes to be specified,
these may be
.Ql fg=colour
to set the foreground colour,
.Ql bg=colour
to set the background colour, the name of one of the attributes (listed under
the
.Ic message-attr
option) to turn an attribute on, or an attribute prefixed with
.Ql no
to turn one off, for example
.Ic nobright .
Examples are: Examples are:
.Bd -literal -offset indent .Bd -literal -offset indent
#(sysctl vm.loadavg) #(sysctl vm.loadavg)
@ -2509,17 +2545,18 @@ By default, UTF-8 in
is not interpreted, to enable UTF-8, use the is not interpreted, to enable UTF-8, use the
.Ic status-utf8 .Ic status-utf8
option. option.
.It Ic status-left-attr Ar attributes
Set the attribute of the left part of the status line.
.It Ic status-left-bg Ar colour
Set the background colour of the left part of the status line.
.It Ic status-left-fg Ar colour
Set the foreground colour of the left part of the status line.
.It Ic status-left-length Ar length .It Ic status-left-length Ar length
Set the maximum Set the maximum
.Ar length .Ar length
of the left component of the status bar. of the left component of the status bar.
The default is 10. The default is 10.
.It Ic status-left-style Ar style
Set the style of the left part of the status line.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.It Xo Ic status-position .It Xo Ic status-position
.Op Ic top | bottom .Op Ic top | bottom
.Xc .Xc
@ -2538,17 +2575,25 @@ will be passed to
character pairs are replaced, and UTF-8 is dependent on the character pairs are replaced, and UTF-8 is dependent on the
.Ic status-utf8 .Ic status-utf8
option. option.
.It Ic status-right-attr Ar attributes
Set the attribute of the right part of the status line.
.It Ic status-right-bg Ar colour
Set the background colour of the right part of the status line.
.It Ic status-right-fg Ar colour
Set the foreground colour of the right part of the status line.
.It Ic status-right-length Ar length .It Ic status-right-length Ar length
Set the maximum Set the maximum
.Ar length .Ar length
of the right component of the status bar. of the right component of the status bar.
The default is 40. The default is 40.
.It Ic status-right-style Ar style
Set the style of the right part of the status line.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.It Ic status-style Ar style
Set status line style.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.It Xo Ic status-utf8 .It Xo Ic status-utf8
.Op Ic on | off .Op Ic on | off
.Xc .Xc
@ -2775,15 +2820,6 @@ or
.Ic main-vertical .Ic main-vertical
layouts. layouts.
.Pp .Pp
.It Ic mode-attr Ar attributes
Set window modes attributes.
.Pp
.It Ic mode-bg Ar colour
Set window modes background colour.
.Pp
.It Ic mode-fg Ar colour
Set window modes foreground colour.
.Pp
.It Xo Ic mode-keys .It Xo Ic mode-keys
.Op Ic vi | emacs .Op Ic vi | emacs
.Xc .Xc
@ -2809,6 +2845,14 @@ If set to
the mouse behaves as set to on, but cannot be used to enter copy the mouse behaves as set to on, but cannot be used to enter copy
mode. mode.
.Pp .Pp
.It Ic mode-style Ar style
Set window modes style.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.Pp
.It Xo Ic monitor-activity .It Xo Ic monitor-activity
.Op Ic on | off .Op Ic on | off
.Xc .Xc
@ -2879,64 +2923,42 @@ Instructs
.Nm .Nm
to expect UTF-8 sequences to appear in this window. to expect UTF-8 sequences to appear in this window.
.Pp .Pp
.It Ic window-status-bell-attr Ar attributes .It Ic window-status-activity-style Ar style
Set status line attributes for windows which have a bell alert. Set status line style for windows with an activity alert.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.Pp .Pp
.It Ic window-status-bell-bg Ar colour .It Ic window-status-bell-style Ar style
Set status line background colour for windows with a bell alert. Set status line style for windows with a bell alert.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.Pp .Pp
.It Ic window-status-bell-fg Ar colour .It Ic window-status-content-style Ar style
Set status line foreground colour for windows with a bell alert. Set status line style for windows with a content alert.
.Pp For how to specify
.It Ic window-status-content-attr Ar attributes .Ar style ,
Set status line attributes for windows which have a content alert. see the
.Pp .Ic message-command-style
.It Ic window-status-content-bg Ar colour option.
Set status line background colour for windows with a content alert.
.Pp
.It Ic window-status-content-fg Ar colour
Set status line foreground colour for windows with a content alert.
.Pp
.It Ic window-status-activity-attr Ar attributes
Set status line attributes for windows which have an activity (or silence) alert.
.Pp
.It Ic window-status-activity-bg Ar colour
Set status line background colour for windows with an activity alert.
.Pp
.It Ic window-status-activity-fg Ar colour
Set status line foreground colour for windows with an activity alert.
.Pp
.It Ic window-status-attr Ar attributes
Set status line attributes for a single window.
.Pp
.It Ic window-status-bg Ar colour
Set status line background colour for a single window.
.Pp
.It Ic window-status-current-attr Ar attributes
Set status line attributes for the currently active window.
.Pp
.It Ic window-status-current-bg Ar colour
Set status line background colour for the currently active window.
.Pp
.It Ic window-status-current-fg Ar colour
Set status line foreground colour for the currently active window.
.Pp .Pp
.It Ic window-status-current-format Ar string .It Ic window-status-current-format Ar string
Like Like
.Ar window-status-format , .Ar window-status-format ,
but is the format used when the window is the current window. but is the format used when the window is the current window.
.Pp .Pp
.It Ic window-status-last-attr Ar attributes .It Ic window-status-current-style Ar style
Set status line attributes for the last active window. Set status line style for the currently active window.
.Pp For how to specify
.It Ic window-status-last-bg Ar colour .Ar style ,
Set status line background colour for the last active window. see the
.Pp .Ic message-command-style
.It Ic window-status-last-fg Ar colour option.
Set status line foreground colour for the last active window.
.Pp
.It Ic window-status-fg Ar colour
Set status line foreground colour for a single window.
.Pp .Pp
.It Ic window-status-format Ar string .It Ic window-status-format Ar string
Set the format in which the window is displayed in the status line window list. Set the format in which the window is displayed in the status line window list.
@ -2946,10 +2968,26 @@ option for details of special character sequences available.
The default is The default is
.Ql #I:#W#F . .Ql #I:#W#F .
.Pp .Pp
.It Ic window-status-last-style Ar style
Set status line style for the last active window.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.Pp
.It Ic window-status-separator Ar string .It Ic window-status-separator Ar string
Sets the separator drawn between windows in the status line. Sets the separator drawn between windows in the status line.
The default is a single space character. The default is a single space character.
.Pp .Pp
.It Ic window-status-style Ar style
Set status line style for a single window.
For how to specify
.Ar style ,
see the
.Ic message-command-style
option.
.Pp
.It Xo Ic xterm-keys .It Xo Ic xterm-keys
.Op Ic on | off .Op Ic on | off
.Xc .Xc
@ -3288,16 +3326,10 @@ content) is present.
.Pp .Pp
The colour and attributes of the status line may be configured, the entire The colour and attributes of the status line may be configured, the entire
status line using the status line using the
.Ic status-attr , .Ic status-style
.Ic status-fg session option and individual windows using the
and .Ic window-status-style
.Ic status-bg window option.
session options and individual windows using the
.Ic window-status-attr ,
.Ic window-status-fg
and
.Ic window-status-bg
window options.
.Pp .Pp
The status line is automatically refreshed at interval if it has changed, the The status line is automatically refreshed at interval if it has changed, the
interval may be controlled with the interval may be controlled with the
@ -3798,7 +3830,7 @@ bind-key C-a send-prefix
Turning the status line off, or changing its colour: Turning the status line off, or changing its colour:
.Bd -literal -offset indent .Bd -literal -offset indent
set-option -g status off set-option -g status off
set-option -g status-bg blue set-option -g status-style bg=blue
.Ed .Ed
.Pp .Pp
Setting other options, such as the default command, Setting other options, such as the default command,

36
tmux.h
View File

@ -726,11 +726,12 @@ struct options_entry {
enum { enum {
OPTIONS_STRING, OPTIONS_STRING,
OPTIONS_NUMBER, OPTIONS_NUMBER,
OPTIONS_DATA, OPTIONS_STYLE
} type; } type;
char *str; char *str;
long long num; long long num;
struct grid_cell style;
RB_ENTRY(options_entry) entry; RB_ENTRY(options_entry) entry;
}; };
@ -1453,7 +1454,8 @@ enum options_table_type {
OPTIONS_TABLE_COLOUR, OPTIONS_TABLE_COLOUR,
OPTIONS_TABLE_ATTRIBUTES, OPTIONS_TABLE_ATTRIBUTES,
OPTIONS_TABLE_FLAG, OPTIONS_TABLE_FLAG,
OPTIONS_TABLE_CHOICE OPTIONS_TABLE_CHOICE,
OPTIONS_TABLE_STYLE
}; };
struct options_table_entry { struct options_table_entry {
@ -1466,6 +1468,8 @@ struct options_table_entry {
const char *default_str; const char *default_str;
long long default_num; long long default_num;
const char *style;
}; };
/* Tree of format entries. */ /* Tree of format entries. */
@ -1577,12 +1581,15 @@ void options_free(struct options *);
struct options_entry *options_find1(struct options *, const char *); struct options_entry *options_find1(struct options *, const char *);
struct options_entry *options_find(struct options *, const char *); struct options_entry *options_find(struct options *, const char *);
void options_remove(struct options *, const char *); void options_remove(struct options *, const char *);
struct options_entry *printflike3 options_set_string( struct options_entry *printflike3 options_set_string(struct options *,
struct options *, const char *, const char *, ...); const char *, const char *, ...);
char *options_get_string(struct options *, const char *); char *options_get_string(struct options *, const char *);
struct options_entry *options_set_number( struct options_entry *options_set_number(struct options *, const char *,
struct options *, const char *, long long); long long);
long long options_get_number(struct options *, const char *); long long options_get_number(struct options *, const char *);
struct options_entry *options_set_style(struct options *, const char *,
const char *, int);
struct grid_cell *options_get_style(struct options *, const char *);
/* options-table.c */ /* options-table.c */
extern const struct options_table_entry server_options_table[]; extern const struct options_table_entry server_options_table[];
@ -2042,8 +2049,6 @@ void printflike5 screen_write_nputs(struct screen_write_ctx *,
ssize_t, struct grid_cell *, int, const char *, ...); ssize_t, struct grid_cell *, int, const char *, ...);
void screen_write_vnputs(struct screen_write_ctx *, void screen_write_vnputs(struct screen_write_ctx *,
ssize_t, struct grid_cell *, int, const char *, va_list); ssize_t, struct grid_cell *, int, const char *, va_list);
void screen_write_parsestyle(
struct grid_cell *, struct grid_cell *, const char *);
void screen_write_putc( void screen_write_putc(
struct screen_write_ctx *, struct grid_cell *, u_char); struct screen_write_ctx *, struct grid_cell *, u_char);
void screen_write_copy(struct screen_write_ctx *, void screen_write_copy(struct screen_write_ctx *,
@ -2173,7 +2178,6 @@ struct window_pane *window_pane_find_right(struct window_pane *);
void window_set_name(struct window *, const char *); void window_set_name(struct window *, const char *);
void window_remove_ref(struct window *); void window_remove_ref(struct window *);
void winlink_clear_flags(struct winlink *); void winlink_clear_flags(struct winlink *);
void window_mode_attrs(struct grid_cell *, struct options *);
/* layout.c */ /* layout.c */
u_int layout_count_cells(struct layout_cell *); u_int layout_count_cells(struct layout_cell *);
@ -2345,4 +2349,14 @@ int xvasprintf(char **, const char *, va_list);
int printflike3 xsnprintf(char *, size_t, const char *, ...); int printflike3 xsnprintf(char *, size_t, const char *, ...);
int xvsnprintf(char *, size_t, const char *, va_list); int xvsnprintf(char *, size_t, const char *, va_list);
/* style.c */
int style_parse(const struct grid_cell *,
struct grid_cell *, const char *);
const char *style_tostring(struct grid_cell *);
void style_update_new(struct options *, const char *, const char *);
void style_update_old(struct options *, const char *,
struct grid_cell *);
void style_apply(struct grid_cell *, struct options *, const char *);
void style_apply_update(struct grid_cell *, struct options *, const char *);
#endif /* TMUX_H */ #endif /* TMUX_H */

3
tty.c
View File

@ -1354,8 +1354,7 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc)
tty_putcode(tty, TTYC_BOLD); tty_putcode(tty, TTYC_BOLD);
if (changed & GRID_ATTR_DIM) if (changed & GRID_ATTR_DIM)
tty_putcode(tty, TTYC_DIM); tty_putcode(tty, TTYC_DIM);
if (changed & GRID_ATTR_ITALICS) if (changed & GRID_ATTR_ITALICS) {
{
if (tty_term_has(tty->term, TTYC_SITM)) if (tty_term_has(tty->term, TTYC_SITM))
tty_putcode(tty, TTYC_SITM); tty_putcode(tty, TTYC_SITM);
else else

View File

@ -736,7 +736,7 @@ window_choose_write_line(
utf8flag = options_get_number(&wp->window->options, "utf8"); utf8flag = options_get_number(&wp->window->options, "utf8");
memcpy(&gc, &grid_default_cell, sizeof gc); memcpy(&gc, &grid_default_cell, sizeof gc);
if (data->selected == data->top + py) if (data->selected == data->top + py)
window_mode_attrs(&gc, oo); style_apply(&gc, oo, "mode-style");
screen_write_cursormove(ctx, 0, py); screen_write_cursormove(ctx, 0, py);
if (data->top + py < ARRAY_LENGTH(&data->list)) { if (data->top + py < ARRAY_LENGTH(&data->list)) {
@ -763,7 +763,7 @@ window_choose_write_line(
screen_write_putc(ctx, &gc, ' '); screen_write_putc(ctx, &gc, ' ');
if (data->input_type != WINDOW_CHOOSE_NORMAL) { if (data->input_type != WINDOW_CHOOSE_NORMAL) {
window_mode_attrs(&gc, oo); style_apply(&gc, oo, "mode-style");
xoff = xsnprintf(hdr, sizeof hdr, xoff = xsnprintf(hdr, sizeof hdr,
"%s: %s", data->input_prompt, data->input_str); "%s: %s", data->input_prompt, data->input_str);

View File

@ -1173,7 +1173,7 @@ window_copy_write_line(
char hdr[512]; char hdr[512];
size_t last, xoff = 0, size = 0, limit; size_t last, xoff = 0, size = 0, limit;
window_mode_attrs(&gc, oo); style_apply(&gc, oo, "mode-style");
last = screen_size_y(s) - 1; last = screen_size_y(s) - 1;
if (py == 0) { if (py == 0) {
@ -1290,7 +1290,7 @@ window_copy_update_selection(struct window_pane *wp, int may_redraw)
return (0); return (0);
/* Set colours. */ /* Set colours. */
window_mode_attrs(&gc, oo); style_apply(&gc, oo, "mode-style");
/* Find top of screen. */ /* Find top of screen. */
ty = screen_hsize(data->backing) - data->oy; ty = screen_hsize(data->backing) - data->oy;

View File

@ -1315,13 +1315,3 @@ winlink_clear_flags(struct winlink *wl)
} }
} }
} }
/* Set the grid_cell with fg/bg/attr information when window is in a mode. */
void
window_mode_attrs(struct grid_cell *gc, struct options *oo)
{
memcpy(gc, &grid_default_cell, sizeof *gc);
colour_set_fg(gc, options_get_number(oo, "mode-fg"));
colour_set_bg(gc, options_get_number(oo, "mode-bg"));
gc->attr |= options_get_number(oo, "mode-attr");
}