In fact, since you will need to change tty_reset to call
tty_attributes(&grid_default_cell) instead of sending SGR0, you will
only need to check the default colours in tty_attributes itself.


On Sat, Feb 14, 2015 at 09:16:35AM +0000, Nicholas Marriott wrote:
> I was thinking that you do this in tty_open:
> 
>         if (!tty_term_has(tty->term, TTYC_BCE)
>                 tty->flags |= TTY_NOBCE;
> 
> And use that instead of calling tty_term_has all the time. But actually
> it probably makes little difference, just using tty_term_has is probably
> fine.
> 
> As far as the diff below goes:
> 
> - I don't think you need to allocate the gc with malloc, just put it
>   inside the wp directly and initialize it to grid_default_cell.
> 
> - You only need to swap it in if the current fg == 8 || bg == 8. You can
>   do this just in tty_reset and tty_attributes and it should catch
>   everything. You shouldn't need to change tty_draw_line except to take
>   a struct window_pane argument.
> 
> - I think the window colour can still be a window option but I would
>   drop it (or drop the pane colours and just do the window) for now and
>   add it as a separate change after one is working.
> 
> - I would drop get_wp_default_grid_colours in favour of a function in
>   tty.c that did something like:
> 
> void
> tty_default_colours(struct grid_cell *gc, struct window_pane *wp)
> {
>       if (wp == NULL)
>               return;
> 
>         if (gc->fg == 8 && !(gc->flags & GRID_FLAG_FG256)) {
>               gc.fg = wp->colgc.fg;
>               gc.flags &= ~GRID_FLAG_FG256;
>               gc.flags |= (wp->colgc.flags & GRID_FLAG_FG256);
>       }
>       /* same for bg, you get the idea */
> }
> 
>    This relies on BCE working properly so you can set the cell defaults to
>    anything of course.
> 
> 
> On Fri, Feb 13, 2015 at 06:50:55PM -0600, J Raynor wrote:
> > 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

Reply via email to