summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2014-01-28 23:07:09 +0000
committernicm <nicm>2014-01-28 23:07:09 +0000
commit945339b443affdaaca260605e15b5a3b9a3c6e16 (patch)
treed04a4ccbdb9d83ded880cda1277911f6cf436197
parentc930fd5ff696f5a60e93ed503f0ff57e0bbf6e4d (diff)
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.
-rw-r--r--Makefile1
-rw-r--r--cmd-set-option.c28
-rw-r--r--grid.c1
-rw-r--r--options-table.c231
-rw-r--r--options.c36
-rw-r--r--screen-redraw.c20
-rw-r--r--screen-write.c85
-rw-r--r--status.c120
-rw-r--r--style.c224
-rw-r--r--tmux.1310
-rw-r--r--tmux.h36
-rw-r--r--tty.c3
-rw-r--r--window-choose.c4
-rw-r--r--window-copy.c4
-rw-r--r--window.c10
15 files changed, 692 insertions, 421 deletions
diff --git a/Makefile b/Makefile
index a0736bdf..e566bb2a 100644
--- a/Makefile
+++ b/Makefile
@@ -113,6 +113,7 @@ SRCS= arguments.c \
session.c \
signal.c \
status.c \
+ style.c \
tmux.c \
tty-acs.c \
tty-keys.c \
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 1b25fac0..b661913f 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -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 *,
const struct options_table_entry *, struct options *,
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 = {
"set-option", "set",
@@ -304,9 +307,11 @@ cmd_set_option_set(struct cmd *self, struct cmd_q *cmdq,
break;
case OPTIONS_TABLE_COLOUR:
o = cmd_set_option_colour(self, cmdq, oe, oo, value);
+ style_update_new(oo, o->name, oe->style);
break;
case OPTIONS_TABLE_ATTRIBUTES:
o = cmd_set_option_attributes(self, cmdq, oe, oo, value);
+ style_update_new(oo, o->name, oe->style);
break;
case OPTIONS_TABLE_FLAG:
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:
o = cmd_set_option_choice(self, cmdq, oe, oo, value);
break;
+ case OPTIONS_TABLE_STYLE:
+ o = cmd_set_option_style(self, cmdq, oe, oo, value);
+ break;
}
if (o == NULL)
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));
}
+
+/* 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);
+}
diff --git a/grid.c b/grid.c
index 852423b5..fb838adf 100644
--- a/grid.c
+++ b/grid.c
@@ -37,7 +37,6 @@
/* Default grid cell data. */
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 { \
memcpy(&gd->linedata[py].celldata[px], \
diff --git a/options-table.c b/options-table.c
index 97ca90be..4480b344 100644
--- a/options-table.c
+++ b/options-table.c
@@ -196,32 +196,43 @@ const struct options_table_entry session_options_table[] = {
{ .name = "message-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
+ .default_num = 0,
+ .style = "message-style"
},
{ .name = "message-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 3
+ .default_num = 3,
+ .style = "message-style"
},
{ .name = "message-command-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
+ .default_num = 0,
+ .style = "message-command-style"
},
{ .name = "message-command-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 0
+ .default_num = 0,
+ .style = "message-command-style"
},
{ .name = "message-command-fg",
.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",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 0
+ .default_num = 0,
+ .style = "message-style"
},
{ .name = "message-limit",
@@ -231,6 +242,11 @@ const struct options_table_entry session_options_table[] = {
.default_num = 20
},
+ { .name = "message-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "bg=yellow,fg=black"
+ },
+
{ .name = "mouse-resize-pane",
.type = OPTIONS_TABLE_FLAG,
.default_num = 0
@@ -253,22 +269,36 @@ const struct options_table_entry session_options_table[] = {
{ .name = "pane-active-border-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "pane-active-border-style"
},
{ .name = "pane-active-border-fg",
.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",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "pane-border-style"
},
{ .name = "pane-border-fg",
.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",
@@ -315,17 +345,20 @@ const struct options_table_entry session_options_table[] = {
{ .name = "status-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
+ .default_num = 0,
+ .style = "status-style"
},
{ .name = "status-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 2
+ .default_num = 2,
+ .style = "status-style"
},
{ .name = "status-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 0
+ .default_num = 0,
+ .style = "status-style"
},
{ .name = "status-interval",
@@ -354,17 +387,20 @@ const struct options_table_entry session_options_table[] = {
{ .name = "status-left-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
+ .default_num = 0,
+ .style = "status-left-style"
},
{ .name = "status-left-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "status-left-style"
},
{ .name = "status-left-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "status-left-style"
},
{ .name = "status-left-length",
@@ -374,6 +410,11 @@ const struct options_table_entry session_options_table[] = {
.default_num = 10
},
+ { .name = "status-left-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "default"
+ },
+
{ .name = "status-position",
.type = OPTIONS_TABLE_CHOICE,
.choices = options_table_status_position_list,
@@ -387,17 +428,20 @@ const struct options_table_entry session_options_table[] = {
{ .name = "status-right-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
+ .default_num = 0,
+ .style = "status-right-style"
},
{ .name = "status-right-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "status-right-style"
},
{ .name = "status-right-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "status-right-style"
},
{ .name = "status-right-length",
@@ -407,6 +451,16 @@ const struct options_table_entry session_options_table[] = {
.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",
.type = OPTIONS_TABLE_FLAG,
.default_num = 0 /* overridden in main() */
@@ -537,17 +591,20 @@ const struct options_table_entry window_options_table[] = {
{ .name = "mode-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
+ .default_num = 0,
+ .style = "mode-style"
},
{ .name = "mode-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 3
+ .default_num = 3,
+ .style = "mode-style"
},
{ .name = "mode-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 0
+ .default_num = 0,
+ .style = "mode-style"
},
{ .name = "mode-keys",
@@ -562,6 +619,11 @@ const struct options_table_entry window_options_table[] = {
.default_num = 0
},
+ { .name = "mode-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "bg=yellow,fg=black"
+ },
+
{ .name = "monitor-activity",
.type = OPTIONS_TABLE_FLAG,
.default_num = 0
@@ -617,72 +679,101 @@ const struct options_table_entry window_options_table[] = {
{ .name = "window-status-activity-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = GRID_ATTR_REVERSE
+ .default_num = GRID_ATTR_REVERSE,
+ .style = "window-status-activity-style"
},
{ .name = "window-status-activity-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-activity-style"
},
{ .name = "window-status-activity-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-activity-style"
+ },
+
+ { .name = "window-status-activity-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "reverse"
+ },
+
+ { .name = "window-status-attr",
+ .type = OPTIONS_TABLE_ATTRIBUTES,
+ .default_num = 0,
+ .style = "window-status-style"
},
{ .name = "window-status-bell-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = GRID_ATTR_REVERSE
+ .default_num = GRID_ATTR_REVERSE,
+ .style = "window-status-bell-style"
},
{ .name = "window-status-bell-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-bell-style"
},
{ .name = "window-status-bell-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-bell-style"
+ },
+
+ { .name = "window-status-bell-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "reverse"
+ },
+
+ { .name = "window-status-bg",
+ .type = OPTIONS_TABLE_COLOUR,
+ .default_num = 8,
+ .style = "window-status-style"
},
{ .name = "window-status-content-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = GRID_ATTR_REVERSE
+ .default_num = GRID_ATTR_REVERSE,
+ .style = "window-status-content-style"
},
{ .name = "window-status-content-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-content-style"
},
{ .name = "window-status-content-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-content-style"
},
- { .name = "window-status-attr",
- .type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
- },
-
- { .name = "window-status-bg",
- .type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ { .name = "window-status-content-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "reverse"
},
{ .name = "window-status-current-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
+ .default_num = 0,
+ .style = "window-status-current-style"
},
{ .name = "window-status-current-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-current-style"
},
{ .name = "window-status-current-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-current-style"
},
{ .name = "window-status-current-format",
@@ -690,29 +781,43 @@ const struct options_table_entry window_options_table[] = {
.default_str = "#I:#W#F"
},
+ { .name = "window-status-current-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "default"
+ },
+
+ { .name = "window-status-fg",
+ .type = OPTIONS_TABLE_COLOUR,
+ .default_num = 8,
+ .style = "window-status-style"
+ },
+
+ { .name = "window-status-format",
+ .type = OPTIONS_TABLE_STRING,
+ .default_str = "#I:#W#F"
+ },
+
{ .name = "window-status-last-attr",
.type = OPTIONS_TABLE_ATTRIBUTES,
- .default_num = 0
+ .default_num = 0,
+ .style = "window-status-last-style"
},
{ .name = "window-status-last-bg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-last-style"
},
{ .name = "window-status-last-fg",
.type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
+ .default_num = 8,
+ .style = "window-status-last-style"
},
- { .name = "window-status-fg",
- .type = OPTIONS_TABLE_COLOUR,
- .default_num = 8
- },
-
- { .name = "window-status-format",
- .type = OPTIONS_TABLE_STRING,
- .default_str = "#I:#W#F"
+ { .name = "window-status-last-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "default"
},
{ .name = "window-status-separator",
@@ -720,6 +825,11 @@ const struct options_table_entry window_options_table[] = {
.default_str = " "
},
+ { .name = "window-status-style",
+ .type = OPTIONS_TABLE_STYLE,
+ .default_str = "default"
+ },
+
{ .name = "wrap-search",
.type = OPTIONS_TABLE_FLAG,
.default_num = 1
@@ -741,10 +851,17 @@ options_table_populate_tree(
const struct options_table_entry *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);
- 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);
+ break;
+ }
}
}
@@ -789,6 +906,10 @@ options_table_print_entry(const struct options_table_entry *oe,
s = oe->choices[o->num];
xsnprintf(out, sizeof out, "%s", s);
break;
+ case OPTIONS_TABLE_STYLE:
+ s = style_tostring(&o->style);
+ xsnprintf(out, sizeof out, "%s", s);
+ break;
}
return (out);
}
diff --git a/options.c b/options.c
index 51a6608e..699dd9b0 100644
--- a/options.c
+++ b/options.c
@@ -109,6 +109,7 @@ options_set_string(struct options *oo, const char *name, const char *fmt, ...)
o = xmalloc(sizeof *o);
o->name = xstrdup(name);
RB_INSERT(options_tree, &oo->tree, o);
+ memcpy(&o->style, &grid_default_cell, sizeof o->style);
} else if (o->type == OPTIONS_STRING)
free(o->str);
@@ -140,6 +141,7 @@ options_set_number(struct options *oo, const char *name, long long value)
o = xmalloc(sizeof *o);
o->name = xstrdup(name);
RB_INSERT(options_tree, &oo->tree, o);
+ memcpy(&o->style, &grid_default_cell, sizeof o->style);
} else if (o->type == OPTIONS_STRING)
free(o->str);
@@ -159,3 +161,37 @@ options_get_number(struct options *oo, const char *name)
fatalx("option not a number");
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);
+}
diff --git a/screen-redraw.c b/screen-redraw.c
index 4601c6f3..a67cb952 100644
--- a/screen-redraw.c
+++ b/screen-redraw.c
@@ -224,7 +224,7 @@ screen_redraw_screen(struct client *c, int status_only, int borders_only)
struct window_pane *wp;
struct grid_cell active_gc, other_gc;
u_int i, j, type, top;
- int status, spos, fg, bg;
+ int status, spos;
/* Suspended clients should not be updated. */
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. */
- memcpy(&other_gc, &grid_marker_cell, sizeof other_gc);
- memcpy(&active_gc, &grid_marker_cell, sizeof active_gc);
- active_gc.attr = other_gc.attr = GRID_ATTR_CHARSET;
- 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);
+ style_apply(&other_gc, oo, "pane-border-style");
+ style_apply(&active_gc, oo, "pane-active-border-style");
+ active_gc.attr = other_gc.attr = GRID_ATTR_CHARSET; /* nuke existing */
/* Draw background and borders. */
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;
py -= 2;
- memcpy(&gc, &grid_marker_cell, sizeof gc);
+ memcpy(&gc, &grid_default_cell, sizeof gc);
if (w->active == wp)
colour_set_bg(&gc, active_colour);
else
@@ -395,7 +387,7 @@ screen_redraw_draw_number(struct client *c, struct window_pane *wp)
tty_cursor(tty, xoff + wp->sx - len, yoff);
draw_text:
- memcpy(&gc, &grid_marker_cell, sizeof gc);
+ memcpy(&gc, &grid_default_cell, sizeof gc);
if (w->active == wp)
colour_set_fg(&gc, active_colour);
else
diff --git a/screen-write.c b/screen-write.c
index 7fcfc5ee..3da145e8 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -248,7 +248,7 @@ screen_write_cnputs(struct screen_write_ctx *ctx,
}
*last = '\0';
- screen_write_parsestyle(gc, &lgc, ptr);
+ style_parse(gc, &lgc, ptr);
ptr = last + 1;
continue;
}
@@ -288,89 +288,6 @@ screen_write_cnputs(struct screen_write_ctx *ctx,
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. */
void
screen_write_copy(struct screen_write_ctx *ctx,
diff --git a/status.c b/status.c
index c5572b74..e14c1a81 100644
--- a/status.c
+++ b/status.c
@@ -80,18 +80,9 @@ status_redraw_get_left(struct client *c,
{
struct session *s = c->session;
char *left;
- int fg, bg, attr;
size_t leftlen;
- fg = options_get_number(&s->options, "status-left-fg");
- 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;
+ style_apply_update(gc, &s->options, "status-left-style");
left = status_replace(c, NULL,
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;
char *right;
- int fg, bg, attr;
size_t rightlen;
- fg = options_get_number(&s->options, "status-right-fg");
- 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;
+ style_apply_update(gc, &s->options, "status-right-style");
right = status_replace(c, NULL,
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;
/* Set up default colour. */
- memcpy(&stdgc, &grid_default_cell, sizeof gc);
- 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");
+ style_apply(&stdgc, &s->options, "status-style");
/* Create the target screen. */
memcpy(&old_status, &c->status, sizeof old_status);
@@ -646,73 +625,22 @@ status_print(
struct session *s = c->session;
const char *fmt;
char *text;
- int fg, bg, attr;
-
- fg = options_get_number(oo, "window-status-fg");
- 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;
+
+ style_apply_update(gc, oo, "window-status-style");
fmt = options_get_string(oo, "window-status-format");
if (wl == s->curw) {
- fg = options_get_number(oo, "window-status-current-fg");
- 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;
+ style_apply_update(gc, oo, "window-status-current-style");
fmt = options_get_string(oo, "window-status-current-format");
}
- if (wl == TAILQ_FIRST(&s->lastw)) {
- fg = options_get_number(oo, "window-status-last-fg");
- 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 == TAILQ_FIRST(&s->lastw))
+ style_apply_update(gc, oo, "window-status-last-style");
- if (wl->flags & WINLINK_BELL) {
- fg = options_get_number(oo, "window-status-bell-fg");
- if (fg != 8)
- colour_set_fg(gc, fg);
- bg = options_get_number(oo, "window-status-bell-bg");
- if (bg != 8)
- 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;
- }
+ if (wl->flags & WINLINK_BELL)
+ style_apply_update(gc, oo, "window-status-bell-style");
+ else if (wl->flags & WINLINK_CONTENT)
+ style_apply_update(gc, oo, "window-status-content-style");
+ else if (wl->flags & (WINLINK_ACTIVITY|WINLINK_SILENCE))
+ style_apply_update(gc, oo, "window-status-activity-style");
text = status_replace(c, NULL, wl, NULL, fmt, t, 1);
return (text);
@@ -814,10 +742,7 @@ status_message_redraw(struct client *c)
if (len > c->tty.sx)
len = c->tty.sx;
- memcpy(&gc, &grid_default_cell, sizeof gc);
- 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");
+ style_apply(&gc, &s->options, "message-style");
screen_write_start(&ctx, NULL, &c->status);
@@ -935,18 +860,11 @@ status_prompt_redraw(struct client *c)
len = c->tty.sx;
off = 0;
- memcpy(&gc, &grid_default_cell, sizeof gc);
-
/* Change colours for command mode. */
- if (c->prompt_mdata.mode == 1) {
- colour_set_fg(&gc, options_get_number(&s->options, "message-command-fg"));
- colour_set_bg(&gc, options_get_number(&s->options, "message-command-bg"));
- gc.attr |= options_get_number(&s->options, "message-command-attr");
- } 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");
- }
+ if (c->prompt_mdata.mode == 1)
+ style_apply(&gc, &s->options, "message-command-style");
+ else
+ style_apply(&gc, &s->options, "message-style");
screen_write_start(&ctx, NULL, &c->status);
diff --git a/style.c b/style.c
new file mode 100644
index 00000000..97d5576e
--- /dev/null
+++ b/style.c
@@ -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->flag