I've attached a new patch for pane colors. You use the display-panes
command to set the colors now, and the color changes take place in
tty_reset.
There's no bce stuff in this patch.
For bce, you mentioned a TTY_NOBCE flag. Could you give a little more
detail about what you're looking for? Where would this flag be set or
passed in?
For functions that need to check for bce support, like
tty_cmd_insertcharacter, the function needs to check whether there's
bce support, but also whether a default color has been set, unless you
want a tty without bce support to always fake things like ICH, EL, and
DCH, even if no color has been set. If you don't want to always fake
bce, then it seems a single flag won't work.
If you're just looking to keep things concise, there could be a
function that returns whether bce needs to be faked. For example, if
the patch attached to this email has been applied, here's a diff for
what tty_cmd_clearline would look like with this proposed function:
--- tty.c 2015-02-13 16:37:48.000000000 -0600
+++ tty.c.new 2015-02-13 18:34:49.000000000 -0600
@@ -830,7 +830,9 @@
tty_cursor_pane(tty, ctx, 0, ctx->ocy);
- if (tty_pane_full_width(tty, ctx) && tty_term_has(tty->term, TTYC_EL))
+ if (tty_pane_full_width(tty, ctx) &&
+ tty_term_has(tty->term, TTYC_EL) &&
+ !need_fake_bce(tty, wp))
tty_putcode(tty, TTYC_EL);
else
tty_repeat_space(tty, screen_size_x(s));
No need to declare and set a fake_bce variable, or to do a color
check. The need_fake_bce function would take care of returning the
right info. Should I pursue a patch with bce support implemented
using that function?
diff --git a/cmd-display-panes.c b/cmd-display-panes.c
index 9ce8971..1994aa4 100644
--- a/cmd-display-panes.c
+++ b/cmd-display-panes.c
@@ -18,18 +18,23 @@
#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+
#include "tmux.h"
/*
- * Display panes on a client.
+ * Display panes on a client, or get/set pane default fg/bg colours.
*/
enum cmd_retval cmd_display_panes_exec(struct cmd *, struct cmd_q *);
+int cmd_display_panes_initgc(const char *, struct grid_cell **);
+
const struct cmd_entry cmd_display_panes_entry = {
"display-panes", "displayp",
- "t:", 0, 0,
- CMD_TARGET_CLIENT_USAGE,
+ "gt:A:P:W:", 0, 0,
+ "[-g] [-A style] [-P style] [-W style] " CMD_TARGET_CLIENT_USAGE,
0,
cmd_display_panes_exec
};
@@ -37,13 +42,120 @@ const struct cmd_entry cmd_display_panes_entry = {
enum cmd_retval
cmd_display_panes_exec(struct cmd *self, struct cmd_q *cmdq)
{
- struct args *args = self->args;
- struct client *c;
+ struct args *args = self->args;
+ struct client *c;
+ struct session *s;
+ struct winlink *wl;
+ struct window_pane *wp;
+ int nflags = 0;
+ struct grid_cell *gc;
+ const char *str;
+
+ if (args_has(args, 'g')) nflags++;
+ if (args_has(args, 'A')) nflags++;
+ if (args_has(args, 'P')) nflags++;
+ if (args_has(args, 'W')) nflags++;
+
+ if (nflags == 0) {
+
+ if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
+ return (CMD_RETURN_ERROR);
+
+ server_set_identify(c);
+
+ return (CMD_RETURN_NORMAL);
+ }
- if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
+
+ if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
return (CMD_RETURN_ERROR);
- server_set_identify(c);
+ if (args_has(args, 'g')) {
+
+ if (nflags > 1) {
+ cmdq_error(cmdq, "don't use -A, -P, or -W with -g");
+ return (CMD_RETURN_ERROR);
+ }
+
+ gc = wp->window->apcolgc;
+ if (gc == NULL)
+ str = "\"\"";
+ else
+ str = style_tostring(gc);
+ cmdq_print(cmdq, "active-pane %s", str);
+
+
+ gc = wp->colgc;
+ if (gc == NULL)
+ str = "\"\"";
+ else
+ str = style_tostring(gc);
+ cmdq_print(cmdq, "pane %s", str);
+
+
+ gc = wp->window->colgc;
+ if (gc == NULL)
+ str = "\"\"";
+ else
+ str = style_tostring(gc);
+ cmdq_print(cmdq, "window %s", str);
+
+ return (CMD_RETURN_NORMAL);
+ }
+
+
+ if (args_has(args, 'A')) {
+ if (cmd_display_panes_initgc(args_get(args, 'A'), &gc) == -1) {
+ cmdq_error(cmdq, "bad colour style");
+ return (CMD_RETURN_ERROR);
+ }
+ free(wp->window->apcolgc);
+ wp->window->apcolgc = gc;
+ server_redraw_window(wp->window);
+ }
+
+ if (args_has(args, 'P')) {
+ if (cmd_display_panes_initgc(args_get(args, 'P'), &gc) == -1) {
+ cmdq_error(cmdq, "bad colour style");
+ return (CMD_RETURN_ERROR);
+ }
+ free(wp->colgc);
+ wp->colgc = gc;
+ wp->flags |= PANE_REDRAW;
+ }
+
+ if (args_has(args, 'W')) {
+ if (cmd_display_panes_initgc(args_get(args, 'W'), &gc) == -1) {
+ cmdq_error(cmdq, "bad colour style");
+ return (CMD_RETURN_ERROR);
+ }
+ free(wp->window->colgc);
+ wp->window->colgc = gc;
+ server_redraw_window(wp->window);
+ }
return (CMD_RETURN_NORMAL);
}
+
+int
+cmd_display_panes_initgc(const char *str, struct grid_cell **gcp)
+{
+ int ret;
+
+ if (*str == '\0')
+ *gcp = NULL;
+ else {
+ *gcp = xmalloc(sizeof **gcp);
+ memcpy(*gcp, &grid_default_cell, sizeof **gcp);
+ ret = style_parse(&grid_default_cell, *gcp, str);
+
+ if (ret == -1) {
+ free(*gcp);
+ return (ret);
+ }
+
+ (*gcp)->attr = grid_default_cell.attr;
+ }
+
+ return (0);
+}
diff --git a/colour.c b/colour.c
index 9e90596..eeb6625 100644
--- a/colour.c
+++ b/colour.c
@@ -287,3 +287,16 @@ colour_256to16(u_char c)
return (table[c]);
}
+
+const struct grid_cell *
+get_wp_default_grid_colours(const struct window_pane *wp)
+{
+ if (wp->colgc != NULL)
+ return (wp->colgc);
+
+ if (wp == wp->window->active && wp->window->apcolgc != NULL)
+ return (wp->window->apcolgc);
+
+
+ return (wp->window->colgc);
+}
diff --git a/screen-redraw.c b/screen-redraw.c
index c2b2ece..9b1bb83 100644
--- a/screen-redraw.c
+++ b/screen-redraw.c
@@ -249,7 +249,7 @@ screen_redraw_screen(struct client *c, int draw_panes, int draw_status,
screen_redraw_draw_panes(c, top);
if (draw_status)
screen_redraw_draw_status(c, top);
- tty_reset(tty);
+ tty_reset(tty, NULL);
}
/* Draw a single pane. */
@@ -266,8 +266,8 @@ screen_redraw_pane(struct client *c, struct window_pane *wp)
yoff++;
for (i = 0; i < wp->sy; i++)
- tty_draw_line(&c->tty, wp->screen, i, wp->xoff, yoff);
- tty_reset(&c->tty);
+ tty_draw_line(&c->tty, wp->screen, i, wp->xoff, yoff, wp);
+ tty_reset(&c->tty, NULL);
}
/* Draw the borders. */
@@ -354,7 +354,7 @@ screen_redraw_draw_panes(struct client *c, u_int top)
continue;
s = wp->screen;
for (i = 0; i < wp->sy; i++)
- tty_draw_line(tty, s, i, wp->xoff, top + wp->yoff);
+ tty_draw_line(tty, s, i, wp->xoff, top + wp->yoff, wp);
if (c->flags & CLIENT_IDENTIFY)
screen_redraw_draw_number(c, wp);
}
@@ -367,9 +367,9 @@ screen_redraw_draw_status(struct client *c, u_int top)
struct tty *tty = &c->tty;
if (top)
- tty_draw_line(tty, &c->status, 0, 0, 0);
+ tty_draw_line(tty, &c->status, 0, 0, 0, NULL);
else
- tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1);
+ tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1, NULL);
}
/* Draw number on a pane. */
diff --git a/server-client.c b/server-client.c
index 3ca9907..3206b6e 100644
--- a/server-client.c
+++ b/server-client.c
@@ -691,7 +691,7 @@ server_client_reset_state(struct client *c)
/* Set the terminal mode and reset attributes. */
tty_update_mode(&c->tty, mode, s);
- tty_reset(&c->tty);
+ tty_reset(&c->tty, NULL);
}
/* Repeat time callback. */
diff --git a/tmux.1 b/tmux.1
index f615dd0..ec13752 100644
--- a/tmux.1
+++ b/tmux.1
@@ -1305,9 +1305,16 @@ flag, see the
.Sx FORMATS
section.
This command works only if at least one client is attached.
-.It Ic display-panes Op Fl t Ar target-client
+.It Xo Ic display-panes
+.Op Fl g
+.Op Fl A Ar style
+.Op Fl P Ar style
+.Op Fl W Ar style
+.Op Fl t Ar target-client
+.Xc
.D1 (alias: Ic displayp )
-Display a visible indicator of each pane shown by
+If no flags have been specified, display a visible indicator of
+each pane shown by
.Ar target-client .
See the
.Ic display-panes-time ,
@@ -1320,6 +1327,29 @@ While the indicator is on screen, a pane may be selected with the
to
.Ql 9
keys.
+.Pp
+With
+.Fl A
+,
+.Fl P
+, or
+.Fl W
+a style argument can be passed to change a window or pane's
+default foreground and background colour. The
+.Fl W
+flag will set the default colour style for panes in the window. The
+.Fl A
+flag will set the colour style a pane will have whenever it becomes the
+active pane in the window. The
+.Fl P
+flag will set the colour style for a pane, overriding whatever
+style has been set with
+.Fl W
+or
+.Fl A
+\&. To clear a style, specify the empty string. The
+.Fl g
+flag will show what colour styles have been set.
.It Xo Ic find-window
.Op Fl CNT
.Op Fl F Ar format
diff --git a/tmux.h b/tmux.h
index e296ac7..7635de7 100644
--- a/tmux.h
+++ b/tmux.h
@@ -900,6 +900,9 @@ struct window_pane {
struct input_ctx ictx;
+ /* Default fg/bg grid cell colours */
+ struct grid_cell *colgc;
+
int pipe_fd;
struct bufferevent *pipe_event;
size_t pipe_off;
@@ -953,6 +956,10 @@ struct window {
struct options options;
+ /* Default fg/bg grid cell colours for window and active pane */
+ struct grid_cell *colgc;
+ struct grid_cell *apcolgc;
+
u_int references;
};
ARRAY_DECL(windows, struct window *);
@@ -1605,7 +1612,7 @@ void environ_push(struct environ *);
void tty_init_termios(int, struct termios *, struct bufferevent *);
void tty_raw(struct tty *, const char *);
void tty_attributes(struct tty *, const struct grid_cell *);
-void tty_reset(struct tty *);
+void tty_reset(struct tty *, const struct window_pane *);
void tty_region_pane(struct tty *, const struct tty_ctx *, u_int, u_int);
void tty_region(struct tty *, u_int, u_int);
void tty_cursor_pane(struct tty *, const struct tty_ctx *, u_int, u_int);
@@ -1628,7 +1635,8 @@ void tty_stop_tty(struct tty *);
void tty_set_title(struct tty *, const char *);
void tty_update_mode(struct tty *, int, struct screen *);
void tty_force_cursor_colour(struct tty *, const char *);
-void tty_draw_line(struct tty *, struct screen *, u_int, u_int, u_int);
+void tty_draw_line(struct tty *, struct screen *, u_int, u_int, u_int,
+ const struct window_pane *);
int tty_open(struct tty *, char **);
void tty_close(struct tty *);
void tty_free(struct tty *);
@@ -1956,6 +1964,7 @@ void colour_set_bg(struct grid_cell *, int);
const char *colour_tostring(int);
int colour_fromstring(const char *);
u_char colour_256to16(u_char);
+const struct grid_cell *get_wp_default_grid_colours(const struct window_pane *);
/* attributes.c */
const char *attributes_tostring(u_char);
diff --git a/tty.c b/tty.c
index 1bb8981..da1010e 100644
--- a/tty.c
+++ b/tty.c
@@ -604,19 +604,20 @@ tty_redraw_region(struct tty *tty, const struct tty_ctx *ctx)
if (ctx->ocy < ctx->orupper || ctx->ocy > ctx->orlower) {
for (i = ctx->ocy; i < screen_size_y(s); i++)
- tty_draw_line(tty, s, i, ctx->xoff, ctx->yoff);
+ tty_draw_line(tty, s, i, ctx->xoff, ctx->yoff, wp);
} else {
for (i = ctx->orupper; i <= ctx->orlower; i++)
- tty_draw_line(tty, s, i, ctx->xoff, ctx->yoff);
+ tty_draw_line(tty, s, i, ctx->xoff, ctx->yoff, wp);
}
}
void
-tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy)
+tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy,
+ const struct window_pane *wp)
{
- const struct grid_cell *gc;
+ const struct grid_cell *gc, *colgc = NULL;
struct grid_line *gl;
- struct grid_cell tmpgc;
+ struct grid_cell tmpgc, colourgc;
struct utf8_data ud;
u_int i, sx;
@@ -640,26 +641,40 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy)
(oy + py != tty->cy + 1 && tty->cy != s->rlower + oy))
tty_cursor(tty, ox, oy + py);
+ if (wp != NULL)
+ colgc = get_wp_default_grid_colours(wp);
+
for (i = 0; i < sx; i++) {
gc = grid_view_peek_cell(s->grid, i, py);
+ memcpy(&colourgc, gc, sizeof *gc);
+ if (colgc != NULL && colourgc.fg == 8) {
+ colourgc.fg = colgc->fg;
+ colourgc.flags &= ~GRID_FLAG_FG256;
+ colourgc.flags |= (colgc->flags & GRID_FLAG_FG256);
+ }
+ if (colgc != NULL && colourgc.bg == 8) {
+ colourgc.bg = colgc->bg;
+ colourgc.flags &= ~GRID_FLAG_BG256;
+ colourgc.flags |= (colgc->flags & GRID_FLAG_BG256);
+ }
if (screen_check_selection(s, i, py)) {
memcpy(&tmpgc, &s->sel.cell, sizeof tmpgc);
- grid_cell_get(gc, &ud);
+ grid_cell_get(&colourgc, &ud);
grid_cell_set(&tmpgc, &ud);
- tmpgc.flags = gc->flags &
+ tmpgc.flags = colourgc.flags &
~(GRID_FLAG_FG256|GRID_FLAG_BG256);
tmpgc.flags |= s->sel.cell.flags &
(GRID_FLAG_FG256|GRID_FLAG_BG256);
tty_cell(tty, &tmpgc);
} else
- tty_cell(tty, gc);
+ tty_cell(tty, &colourgc);
}
if (sx >= tty->sx) {
tty_update_mode(tty, tty->mode, s);
return;
}
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_cursor(tty, ox + sx, oy + py);
if (sx != screen_size_x(s) && ox + screen_size_x(s) >= tty->sx &&
@@ -713,11 +728,12 @@ tty_cmd_insertcharacter(struct tty *tty, const struct tty_ctx *ctx)
struct window_pane *wp = ctx->wp;
if (!tty_pane_full_width(tty, ctx)) {
- tty_draw_line(tty, wp->screen, ctx->ocy, ctx->xoff, ctx->yoff);
+ tty_draw_line(tty, wp->screen, ctx->ocy, ctx->xoff, ctx->yoff,
+ wp);
return;
}
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -725,7 +741,8 @@ tty_cmd_insertcharacter(struct tty *tty, const struct tty_ctx *ctx)
tty_term_has(tty->term, TTYC_ICH1))
tty_emulate_repeat(tty, TTYC_ICH, TTYC_ICH1, ctx->num);
else
- tty_draw_line(tty, wp->screen, ctx->ocy, ctx->xoff, ctx->yoff);
+ tty_draw_line(tty, wp->screen, ctx->ocy, ctx->xoff, ctx->yoff,
+ wp);
}
void
@@ -736,11 +753,12 @@ tty_cmd_deletecharacter(struct tty *tty, const struct tty_ctx *ctx)
if (!tty_pane_full_width(tty, ctx) ||
(!tty_term_has(tty->term, TTYC_DCH) &&
!tty_term_has(tty->term, TTYC_DCH1))) {
- tty_draw_line(tty, wp->screen, ctx->ocy, ctx->xoff, ctx->yoff);
+ tty_draw_line(tty, wp->screen, ctx->ocy, ctx->xoff, ctx->yoff,
+ wp);
return;
}
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -754,7 +772,7 @@ tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx)
{
u_int i;
- tty_reset(tty);
+ tty_reset(tty, ctx->wp);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -776,7 +794,7 @@ tty_cmd_insertline(struct tty *tty, const struct tty_ctx *ctx)
return;
}
- tty_reset(tty);
+ tty_reset(tty, ctx->wp);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -794,7 +812,7 @@ tty_cmd_deleteline(struct tty *tty, const struct tty_ctx *ctx)
return;
}
- tty_reset(tty);
+ tty_reset(tty, ctx->wp);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -808,7 +826,7 @@ tty_cmd_clearline(struct tty *tty, const struct tty_ctx *ctx)
struct window_pane *wp = ctx->wp;
struct screen *s = wp->screen;
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_cursor_pane(tty, ctx, 0, ctx->ocy);
@@ -824,7 +842,7 @@ tty_cmd_clearendofline(struct tty *tty, const struct tty_ctx *ctx)
struct window_pane *wp = ctx->wp;
struct screen *s = wp->screen;
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -837,7 +855,7 @@ tty_cmd_clearendofline(struct tty *tty, const struct tty_ctx *ctx)
void
tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx)
{
- tty_reset(tty);
+ tty_reset(tty, ctx->wp);
if (ctx->xoff == 0 && tty_term_has(tty->term, TTYC_EL1)) {
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -861,7 +879,7 @@ tty_cmd_reverseindex(struct tty *tty, const struct tty_ctx *ctx)
return;
}
- tty_reset(tty);
+ tty_reset(tty, ctx->wp);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->orupper);
@@ -894,7 +912,7 @@ tty_cmd_linefeed(struct tty *tty, const struct tty_ctx *ctx)
if (ctx->num && !(tty->term->flags & TERM_EARLYWRAP))
return;
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -909,7 +927,7 @@ tty_cmd_clearendofscreen(struct tty *tty, const struct tty_ctx *ctx)
struct screen *s = wp->screen;
u_int i, j;
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -942,7 +960,7 @@ tty_cmd_clearstartofscreen(struct tty *tty, const struct tty_ctx *ctx)
struct screen *s = wp->screen;
u_int i, j;
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
tty_cursor_pane(tty, ctx, 0, 0);
@@ -969,7 +987,7 @@ tty_cmd_clearscreen(struct tty *tty, const struct tty_ctx *ctx)
struct screen *s = wp->screen;
u_int i, j;
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
tty_cursor_pane(tty, ctx, 0, 0);
@@ -997,7 +1015,7 @@ tty_cmd_alignmenttest(struct tty *tty, const struct tty_ctx *ctx)
struct screen *s = wp->screen;
u_int i, j;
- tty_reset(tty);
+ tty_reset(tty, wp);
tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
@@ -1015,6 +1033,10 @@ tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx)
struct screen *s = wp->screen;
u_int cx;
u_int width;
+ struct grid_cell tmpgc;
+ const struct grid_cell *colgc;
+
+ colgc = get_wp_default_grid_colours(wp);
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
@@ -1043,7 +1065,22 @@ tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx)
} else
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
- tty_cell(tty, ctx->cell);
+
+ memcpy(&tmpgc, ctx->cell, sizeof tmpgc);
+ if (colgc != NULL) {
+ if (ctx->cell->fg == 8) {
+ tmpgc.fg = colgc->fg;
+ tmpgc.flags &= ~GRID_FLAG_FG256;
+ tmpgc.flags |= (colgc->flags & GRID_FLAG_FG256);
+ }
+ if (ctx->cell->bg == 8) {
+ tmpgc.bg = colgc->bg;
+ tmpgc.flags &= ~GRID_FLAG_BG256;
+ tmpgc.flags |= (colgc->flags & GRID_FLAG_BG256);
+ }
+ }
+
+ tty_cell(tty, &tmpgc);
}
void
@@ -1055,7 +1092,7 @@ tty_cmd_utf8character(struct tty *tty, const struct tty_ctx *ctx)
* Cannot rely on not being a partial character, so just redraw the
* whole line.
*/
- tty_draw_line(tty, wp->screen, ctx->ocy, ctx->xoff, ctx->yoff);
+ tty_draw_line(tty, wp->screen, ctx->ocy, ctx->xoff, ctx->yoff, wp);
}
void
@@ -1088,7 +1125,7 @@ tty_cmd_rawstring(struct tty *tty, const struct tty_ctx *ctx)
tty->cx = tty->cy = UINT_MAX;
tty->rupper = tty->rlower = UINT_MAX;
- tty_reset(tty);
+ tty_reset(tty, ctx->wp);
tty_cursor(tty, 0, 0);
}
@@ -1131,17 +1168,26 @@ tty_cell(struct tty *tty, const struct grid_cell *gc)
}
void
-tty_reset(struct tty *tty)
+tty_reset(struct tty *tty, const struct window_pane *wp)
{
struct grid_cell *gc = &tty->cell;
+ const struct grid_cell *colgc = NULL;
- if (memcmp(gc, &grid_default_cell, sizeof *gc) == 0)
+ if (wp != NULL)
+ colgc = get_wp_default_grid_colours(wp);
+
+ if (colgc == NULL &&
+ memcmp(gc, &grid_default_cell, sizeof *gc) == 0)
return;
if ((gc->attr & GRID_ATTR_CHARSET) && tty_use_acs(tty))
tty_putcode(tty, TTYC_RMACS);
tty_putcode(tty, TTYC_SGR0);
memcpy(gc, &grid_default_cell, sizeof *gc);
+
+ if (colgc != NULL)
+ tty_attributes(tty, colgc);
+
}
/* Set region inside pane. */
@@ -1340,7 +1386,7 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc)
/* If any bits are being cleared, reset everything. */
if (tc->attr & ~gc2.attr)
- tty_reset(tty);
+ tty_reset(tty, NULL);
/*
* Set the colours. This may call tty_reset() (so it comes next) and
@@ -1409,7 +1455,7 @@ tty_colours(struct tty *tty, const struct grid_cell *gc)
*/
have_ax = tty_term_has(tty->term, TTYC_AX);
if (!have_ax && tty_term_has(tty->term, TTYC_OP))
- tty_reset(tty);
+ tty_reset(tty, NULL);
else {
if (fg_default &&
(tc->fg != 8 || tc->flags & GRID_FLAG_FG256)) {
diff --git a/window.c b/window.c
index 5412963..ca44cbe 100644
--- a/window.c
+++ b/window.c
@@ -288,6 +288,9 @@ window_create1(u_int sx, u_int sy)
w->sx = sx;
w->sy = sy;
+ w->colgc = NULL;
+ w->apcolgc = NULL;
+
options_init(&w->options, &global_w_options);
if (options_get_number(&w->options, "automatic-rename"))
queue_window_name(w);
@@ -357,6 +360,8 @@ window_destroy(struct window *w)
window_destroy_panes(w);
free(w->name);
+ free(w->colgc);
+ free(w->apcolgc);
free(w);
}
@@ -704,6 +709,8 @@ window_pane_create(struct window *w, u_int sx, u_int sy, u_int hlimit)
wp->saved_grid = NULL;
+ wp->colgc = NULL;
+
screen_init(&wp->base, sx, sy, hlimit);
wp->screen = &wp->base;
@@ -742,6 +749,7 @@ window_pane_destroy(struct window_pane *wp)
RB_REMOVE(window_pane_tree, &all_window_panes, wp);
close(wp->cwd);
+ free(wp->colgc);
free(wp->shell);
cmd_free_argv(wp->argc, wp->argv);
free(wp);
------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users