Hi

This looks good. I've made a few changes, notably adding a tty_draw_pane
wrapper around tty_draw_line since it is mostly called with wp->screen.

Also I think there is no reason -g and -P can't be used together.

We'll need both these diffs together or it won't work in tmux itself so
I've put them together.

On thing that occurred to me now is that display-panes uses a
target-client but this diff makes it need a target-pane sometimes which
is an issue for hooks command parsing. Not sure if we can workaround it
easily enough with extra flags for hooks or if we should try to find a
different command to add this to.

Anyway I will look at this further when I have time but here's the
latest diff with my changes.


Index: cmd-display-panes.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/cmd-display-panes.c,v
retrieving revision 1.8
diff -u -p -r1.8 cmd-display-panes.c
--- cmd-display-panes.c 20 Oct 2014 22:29:25 -0000      1.8
+++ cmd-display-panes.c 1 Apr 2015 20:30:58 -0000
@@ -18,18 +18,21 @@
 
 #include <sys/types.h>
 
+#include <stdlib.h>
+#include <string.h>
+
 #include "tmux.h"
 
 /*
- * Display panes on a client.
+ * Display panes on a client or change pane default colours.
  */
 
 enum cmd_retval         cmd_display_panes_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_display_panes_entry = {
        "display-panes", "displayp",
-       "t:", 0, 0,
-       CMD_TARGET_CLIENT_USAGE,
+       "gt:P:", 0, 0,
+       "[-g] [-P style] " CMD_TARGET_CLIENT_USAGE,
        0,
        cmd_display_panes_exec
 };
@@ -37,13 +40,34 @@ const struct cmd_entry cmd_display_panes
 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;
+       const char              *style;
+
+       if (!args_has(args, 'g') && !args_has(args, 'P')) {
+               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, 'P')) {
+               style = args_get(args, 'P');
+               if (style_parse(&grid_default_cell, &wp->colgc, style) == -1) {
+                       cmdq_error(cmdq, "bad style: %s", style);
+                       return (CMD_RETURN_ERROR);
+               }
+               wp->flags |= PANE_REDRAW;
+       }
+       if (args_has(args, 'g'))
+               cmdq_print(cmdq, "%s", style_tostring(&wp->colgc));
 
        return (CMD_RETURN_NORMAL);
 }
Index: options-table.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/options-table.c,v
retrieving revision 1.53
diff -u -p -r1.53 options-table.c
--- options-table.c     6 Feb 2015 15:09:34 -0000       1.53
+++ options-table.c     1 Apr 2015 20:30:58 -0000
@@ -668,6 +668,16 @@ const struct options_table_entry window_
          .default_num = 0 /* overridden in main() */
        },
 
+       { .name = "window-active-style",
+         .type = OPTIONS_TABLE_STYLE,
+         .default_str = "default"
+       },
+
+       { .name = "window-style",
+         .type = OPTIONS_TABLE_STYLE,
+         .default_str = "default"
+       },
+
        { .name = "window-status-activity-attr",
          .type = OPTIONS_TABLE_ATTRIBUTES,
          .default_num = GRID_ATTR_REVERSE,
Index: screen-redraw.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/screen-redraw.c,v
retrieving revision 1.29
diff -u -p -r1.29 screen-redraw.c
--- screen-redraw.c     6 Feb 2015 15:09:34 -0000       1.29
+++ screen-redraw.c     1 Apr 2015 20:30:59 -0000
@@ -266,7 +266,7 @@ screen_redraw_pane(struct client *c, str
                yoff++;
 
        for (i = 0; i < wp->sy; i++)
-               tty_draw_line(&c->tty, wp->screen, i, wp->xoff, yoff);
+               tty_draw_pane(&c->tty, wp, i, wp->xoff, yoff);
        tty_reset(&c->tty);
 }
 
@@ -323,9 +323,9 @@ screen_redraw_draw_borders(struct client
                            small && i > msgx && j == msgy)
                                continue;
                        if (screen_redraw_check_active(i, j, type, w, wp))
-                               tty_attributes(tty, &active_gc);
+                               tty_attributes(tty, &active_gc, wp);
                        else
-                               tty_attributes(tty, &other_gc);
+                               tty_attributes(tty, &other_gc, wp);
                        tty_cursor(tty, i, top + j);
                        tty_putc(tty, CELL_BORDERS[type]);
                }
@@ -333,7 +333,7 @@ screen_redraw_draw_borders(struct client
 
        if (small) {
                memcpy(&msg_gc, &grid_default_cell, sizeof msg_gc);
-               tty_attributes(tty, &msg_gc);
+               tty_attributes(tty, &msg_gc, wp);
                tty_cursor(tty, msgx, msgy);
                tty_puts(tty, msg);
        }
@@ -346,15 +346,13 @@ screen_redraw_draw_panes(struct client *
        struct window           *w = c->session->curw->window;
        struct tty              *tty = &c->tty;
        struct window_pane      *wp;
-       struct screen           *s;
        u_int                    i;
 
        TAILQ_FOREACH(wp, &w->panes, entry) {
                if (!window_pane_visible(wp))
                        continue;
-               s = wp->screen;
                for (i = 0; i < wp->sy; i++)
-                       tty_draw_line(tty, s, i, wp->xoff, top + wp->yoff);
+                       tty_draw_pane(tty, wp, i, wp->xoff, top + wp->yoff);
                if (c->flags & CLIENT_IDENTIFY)
                        screen_redraw_draw_number(c, wp);
        }
@@ -367,9 +365,9 @@ screen_redraw_draw_status(struct client 
        struct tty      *tty = &c->tty;
 
        if (top)
-               tty_draw_line(tty, &c->status, 0, 0, 0);
+               tty_draw_line(tty, NULL, &c->status, 0, 0, 0);
        else
-               tty_draw_line(tty, &c->status, 0, 0, tty->sy - 1);
+               tty_draw_line(tty, NULL, &c->status, 0, 0, tty->sy - 1);
 }
 
 /* Draw number on a pane. */
@@ -411,7 +409,7 @@ screen_redraw_draw_number(struct client 
                colour_set_bg(&gc, active_colour);
        else
                colour_set_bg(&gc, colour);
-       tty_attributes(tty, &gc);
+       tty_attributes(tty, &gc, wp);
        for (ptr = buf; *ptr != '\0'; ptr++) {
                if (*ptr < '0' || *ptr > '9')
                        continue;
@@ -438,7 +436,7 @@ draw_text:
                colour_set_fg(&gc, active_colour);
        else
                colour_set_fg(&gc, colour);
-       tty_attributes(tty, &gc);
+       tty_attributes(tty, &gc, wp);
        tty_puts(tty, buf);
 
        tty_cursor(tty, 0, 0);
Index: server-client.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/server-client.c,v
retrieving revision 1.129
diff -u -p -r1.129 server-client.c
--- server-client.c     31 Mar 2015 17:45:10 -0000      1.129
+++ server-client.c     1 Apr 2015 20:30:59 -0000
@@ -329,8 +329,7 @@ server_client_check_mouse(struct client 
        if (options_get_number(oo, "mouse-select-pane") &&
            (m->event == MOUSE_EVENT_DOWN || m->event == MOUSE_EVENT_WHEEL)) {
                window_set_active_at(wp->window, m->x, m->y);
-               server_status_window(wp->window);
-               server_redraw_window_borders(wp->window);
+               server_redraw_window(wp->window);
                wp = wp->window->active; /* may have changed */
        }
 
Index: tmux.1
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tmux.1,v
retrieving revision 1.415
diff -u -p -r1.415 tmux.1
--- tmux.1      31 Mar 2015 17:58:36 -0000      1.415
+++ tmux.1      1 Apr 2015 20:31:00 -0000
@@ -1301,9 +1301,13 @@ 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 P Ar style
+.Op Fl t Ar target-client
+.Xc
 .D1 (alias: Ic displayp )
-Display a visible indicator of each pane shown by
+With no flags, display a visible indicator of each pane shown by
 .Ar target-client .
 See the
 .Ic display-panes-time ,
@@ -1316,6 +1320,16 @@ While the indicator is on screen, a pane
 to
 .Ql 9
 keys.
+.Pp
+With
+.Fl P,
+set the pane style (overriding the
+.Ic window-style
+and
+.Ic window-active-style
+options).
+.Fl g
+shows the current pane style.
 .It Xo Ic find-window
 .Op Fl CNT
 .Op Fl F Ar format
@@ -2924,6 +2938,14 @@ Instructs
 .Nm
 to expect UTF-8 sequences to appear in this window.
 .Pp
+.It Ic window-active-style Ar style
+Set the style for the window's active pane.
+For how to specify
+.Ar style ,
+see the
+.Ic message-command-style
+option.
+.Pp
 .It Ic window-status-activity-style Ar style
 Set status line style for windows with an activity alert.
 For how to specify
@@ -2975,6 +2997,14 @@ The default is a single space character.
 .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 Ic window-style Ar style
+Set the default window style.
 For how to specify
 .Ar style ,
 see the
Index: tmux.h
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tmux.h,v
retrieving revision 1.490
diff -u -p -r1.490 tmux.h
--- tmux.h      6 Feb 2015 17:21:08 -0000       1.490
+++ tmux.h      1 Apr 2015 20:31:01 -0000
@@ -156,6 +156,7 @@ enum key_code {
 enum tty_code_code {
        TTYC_AX = 0,
        TTYC_ACSC,      /* acs_chars, ac */
+       TTYC_BCE,       /* back_color_erase, ut */
        TTYC_BEL,       /* bell, bl */
        TTYC_BLINK,     /* enter_blink_mode, mb */
        TTYC_BOLD,      /* enter_bold_mode, md */
@@ -902,6 +903,8 @@ struct window_pane {
 
        struct input_ctx ictx;
 
+       struct grid_cell colgc;
+
        int              pipe_fd;
        struct bufferevent *pipe_event;
        size_t           pipe_off;
@@ -1606,7 +1609,8 @@ void      environ_push(struct environ *);
 /* tty.c */
 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_attributes(struct tty *, const struct grid_cell *,
+           const struct window_pane *);
 void   tty_reset(struct tty *);
 void   tty_region_pane(struct tty *, const struct tty_ctx *, u_int, u_int);
 void   tty_region(struct tty *, u_int, u_int);
@@ -1630,7 +1634,10 @@ 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_pane(struct tty *, const struct window_pane *, u_int, u_int,
+           u_int);
+void   tty_draw_line(struct tty *, const struct window_pane *, struct screen *,
+           u_int, u_int, u_int);
 int    tty_open(struct tty *, char **);
 void   tty_close(struct tty *);
 void   tty_free(struct tty *);
Index: tty-term.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tty-term.c,v
retrieving revision 1.36
diff -u -p -r1.36 tty-term.c
--- tty-term.c  20 Jan 2015 08:18:04 -0000      1.36
+++ tty-term.c  1 Apr 2015 20:31:01 -0000
@@ -35,6 +35,7 @@ struct tty_terms tty_terms = LIST_HEAD_I
 const struct tty_term_code_entry tty_term_codes[NTTYCODE] = {
        { TTYC_ACSC, TTYCODE_STRING, "acsc" },
        { TTYC_AX, TTYCODE_FLAG, "AX" },
+       { TTYC_BCE, TTYCODE_STRING, "bce" },
        { TTYC_BEL, TTYCODE_STRING, "bel" },
        { TTYC_BLINK, TTYCODE_STRING, "blink" },
        { TTYC_BOLD, TTYCODE_STRING, "bold" },
Index: tty.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/tty.c,v
retrieving revision 1.173
diff -u -p -r1.173 tty.c
--- tty.c       5 Feb 2015 11:46:57 -0000       1.173
+++ tty.c       1 Apr 2015 20:31:01 -0000
@@ -43,11 +43,14 @@ void        tty_colours_fg(struct tty *, const 
 void   tty_colours_bg(struct tty *, const struct grid_cell *);
 
 int    tty_large_region(struct tty *, const struct tty_ctx *);
+int    tty_fake_bce(const struct tty *, const struct window_pane *);
 void   tty_redraw_region(struct tty *, const struct tty_ctx *);
 void   tty_emulate_repeat(
            struct tty *, enum tty_code_code, enum tty_code_code, u_int);
 void   tty_repeat_space(struct tty *, u_int);
-void   tty_cell(struct tty *, const struct grid_cell *);
+void   tty_cell(struct tty *, const struct grid_cell *,
+           const struct window_pane *);
+void   tty_default_colours(struct grid_cell *, const struct window_pane *);
 
 #define tty_use_acs(tty) \
        (tty_term_has((tty)->term, TTYC_ACSC) && !((tty)->flags & TTY_UTF8))
@@ -582,6 +585,23 @@ tty_large_region(unused struct tty *tty,
 }
 
 /*
+ * Return if BCE is needed but the terminal doesn't have it - it'll need to be
+ * emulated.
+ */
+int
+tty_fake_bce(const struct tty *tty, const struct window_pane *wp)
+{
+       struct grid_cell        gc;
+
+       memcpy(&gc, &grid_default_cell, sizeof gc);
+       tty_default_colours(&gc, wp);
+
+       if (gc.bg == 8 && !(gc.flags & GRID_FLAG_BG256))
+               return (0);
+       return (!tty_term_has(tty->term, TTYC_BCE));
+}
+
+/*
  * Redraw scroll region using data from screen (already updated). Used when
  * CSR not supported, or window is a pane that doesn't take up the full
  * width of the terminal.
@@ -604,15 +624,23 @@ tty_redraw_region(struct tty *tty, const
 
        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_pane(tty, wp, i, ctx->xoff, ctx->yoff);
        } else {
                for (i = ctx->orupper; i <= ctx->orlower; i++)
-                       tty_draw_line(tty, s, i, ctx->xoff, ctx->yoff);
+                       tty_draw_pane(tty, wp, i, ctx->xoff, ctx->yoff);
        }
 }
 
 void
-tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy)
+tty_draw_pane(struct tty *tty, const struct window_pane *wp, u_int py, u_int 
ox,
+    u_int oy)
+{
+       tty_draw_line(tty, wp, wp->screen, py, ox, oy);
+}
+
+void
+tty_draw_line(struct tty *tty, const struct window_pane *wp,
+    struct screen *s, u_int py, u_int ox, u_int oy)
 {
        const struct grid_cell  *gc;
        struct grid_line        *gl;
@@ -650,20 +678,20 @@ tty_draw_line(struct tty *tty, struct sc
                            ~(GRID_FLAG_FG256|GRID_FLAG_BG256);
                        tmpgc.flags |= s->sel.cell.flags &
                            (GRID_FLAG_FG256|GRID_FLAG_BG256);
-                       tty_cell(tty, &tmpgc);
+                       tty_cell(tty, &tmpgc, wp);
                } else
-                       tty_cell(tty, gc);
+                       tty_cell(tty, gc, wp);
        }
 
        if (sx >= tty->sx) {
                tty_update_mode(tty, tty->mode, s);
                return;
        }
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_cursor(tty, ox + sx, oy + py);
        if (sx != screen_size_x(s) && ox + screen_size_x(s) >= tty->sx &&
-           tty_term_has(tty->term, TTYC_EL))
+           tty_term_has(tty->term, TTYC_EL) && !tty_fake_bce(tty, wp))
                tty_putcode(tty, TTYC_EL);
        else
                tty_repeat_space(tty, screen_size_x(s) - sx);
@@ -713,19 +741,19 @@ tty_cmd_insertcharacter(struct tty *tty,
        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_pane(tty, wp, ctx->ocy, ctx->xoff, ctx->yoff);
                return;
        }
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
 
-       if (tty_term_has(tty->term, TTYC_ICH) ||
-           tty_term_has(tty->term, TTYC_ICH1))
+       if (!tty_fake_bce(tty, wp) && (tty_term_has(tty->term, TTYC_ICH) ||
+           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_pane(tty, wp, ctx->ocy, ctx->xoff, ctx->yoff);
 }
 
 void
@@ -733,14 +761,14 @@ tty_cmd_deletecharacter(struct tty *tty,
 {
        struct window_pane      *wp = ctx->wp;
 
-       if (!tty_pane_full_width(tty, ctx) ||
+       if (!tty_pane_full_width(tty, ctx) || tty_fake_bce(tty, wp) ||
            (!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_pane(tty, wp, ctx->ocy, ctx->xoff, ctx->yoff);
                return;
        }
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
 
@@ -754,11 +782,11 @@ tty_cmd_clearcharacter(struct tty *tty, 
 {
        u_int   i;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, ctx->wp);
 
        tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
 
-       if (tty_term_has(tty->term, TTYC_ECH))
+       if (tty_term_has(tty->term, TTYC_ECH) && !tty_fake_bce(tty, ctx->wp))
                tty_putcode1(tty, TTYC_ECH, ctx->num);
        else {
                for (i = 0; i < ctx->num; i++)
@@ -769,14 +797,14 @@ tty_cmd_clearcharacter(struct tty *tty, 
 void
 tty_cmd_insertline(struct tty *tty, const struct tty_ctx *ctx)
 {
-       if (!tty_pane_full_width(tty, ctx) ||
+       if (!tty_pane_full_width(tty, ctx) || tty_fake_bce(tty, ctx->wp) ||
            !tty_term_has(tty->term, TTYC_CSR) ||
            !tty_term_has(tty->term, TTYC_IL1)) {
                tty_redraw_region(tty, ctx);
                return;
        }
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, ctx->wp);
 
        tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
        tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -787,14 +815,14 @@ tty_cmd_insertline(struct tty *tty, cons
 void
 tty_cmd_deleteline(struct tty *tty, const struct tty_ctx *ctx)
 {
-       if (!tty_pane_full_width(tty, ctx) ||
+       if (!tty_pane_full_width(tty, ctx) || tty_fake_bce(tty, ctx->wp) ||
            !tty_term_has(tty->term, TTYC_CSR) ||
            !tty_term_has(tty->term, TTYC_DL1)) {
                tty_redraw_region(tty, ctx);
                return;
        }
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, ctx->wp);
 
        tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
        tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -808,11 +836,12 @@ tty_cmd_clearline(struct tty *tty, const
        struct window_pane      *wp = ctx->wp;
        struct screen           *s = wp->screen;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        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_fake_bce(tty, wp) &&
+           tty_term_has(tty->term, TTYC_EL))
                tty_putcode(tty, TTYC_EL);
        else
                tty_repeat_space(tty, screen_size_x(s));
@@ -824,11 +853,12 @@ tty_cmd_clearendofline(struct tty *tty, 
        struct window_pane      *wp = ctx->wp;
        struct screen           *s = wp->screen;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_cursor_pane(tty, ctx, ctx->ocx, 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) && !tty_fake_bce(tty, wp))
                tty_putcode(tty, TTYC_EL);
        else
                tty_repeat_space(tty, screen_size_x(s) - ctx->ocx);
@@ -837,9 +867,10 @@ tty_cmd_clearendofline(struct tty *tty, 
 void
 tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx)
 {
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, ctx->wp);
 
-       if (ctx->xoff == 0 && tty_term_has(tty->term, TTYC_EL1)) {
+       if (ctx->xoff == 0 && tty_term_has(tty->term, TTYC_EL1) &&
+           !tty_fake_bce(tty, ctx->wp)) {
                tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
                tty_putcode(tty, TTYC_EL1);
        } else {
@@ -854,14 +885,14 @@ tty_cmd_reverseindex(struct tty *tty, co
        if (ctx->ocy != ctx->orupper)
                return;
 
-       if (!tty_pane_full_width(tty, ctx) ||
+       if (!tty_pane_full_width(tty, ctx) || tty_fake_bce(tty, ctx->wp) ||
            !tty_term_has(tty->term, TTYC_CSR) ||
            !tty_term_has(tty->term, TTYC_RI)) {
                tty_redraw_region(tty, ctx);
                return;
        }
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, ctx->wp);
 
        tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
        tty_cursor_pane(tty, ctx, ctx->ocx, ctx->orupper);
@@ -877,7 +908,7 @@ tty_cmd_linefeed(struct tty *tty, const 
        if (ctx->ocy != ctx->orlower)
                return;
 
-       if (!tty_pane_full_width(tty, ctx) ||
+       if (!tty_pane_full_width(tty, ctx) || tty_fake_bce(tty, wp) ||
            !tty_term_has(tty->term, TTYC_CSR)) {
                if (tty_large_region(tty, ctx))
                        wp->flags |= PANE_REDRAW;
@@ -894,7 +925,7 @@ tty_cmd_linefeed(struct tty *tty, const 
        if (ctx->num && !(tty->term->flags & TERM_EARLYWRAP))
                return;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
        tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
@@ -909,12 +940,13 @@ tty_cmd_clearendofscreen(struct tty *tty
        struct screen           *s = wp->screen;
        u_int                    i, j;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
        tty_cursor_pane(tty, ctx, ctx->ocx, 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) && !tty_fake_bce(tty, wp)) {
                tty_putcode(tty, TTYC_EL);
                if (ctx->ocy != screen_size_y(s) - 1) {
                        tty_cursor_pane(tty, ctx, 0, ctx->ocy + 1);
@@ -942,12 +974,13 @@ tty_cmd_clearstartofscreen(struct tty *t
        struct screen           *s = wp->screen;
        u_int                    i, j;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
        tty_cursor_pane(tty, ctx, 0, 0);
 
-       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) && !tty_fake_bce(tty, wp)) {
                for (i = 0; i < ctx->ocy; i++) {
                        tty_putcode(tty, TTYC_EL);
                        tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1);
@@ -969,12 +1002,13 @@ tty_cmd_clearscreen(struct tty *tty, con
        struct screen           *s = wp->screen;
        u_int                    i, j;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
        tty_cursor_pane(tty, ctx, 0, 0);
 
-       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) && !tty_fake_bce(tty, wp)) {
                for (i = 0; i < screen_size_y(s); i++) {
                        tty_putcode(tty, TTYC_EL);
                        if (i != screen_size_y(s) - 1) {
@@ -997,7 +1031,7 @@ tty_cmd_alignmenttest(struct tty *tty, c
        struct screen           *s = wp->screen;
        u_int                    i, j;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, wp);
 
        tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
 
@@ -1038,12 +1072,12 @@ tty_cmd_cell(struct tty *tty, const stru
                         */
                        cx = screen_size_x(s) - 
grid_cell_width(&ctx->last_cell);
                        tty_cursor_pane(tty, ctx, cx, ctx->ocy);
-                       tty_cell(tty, &ctx->last_cell);
+                       tty_cell(tty, &ctx->last_cell, wp);
                }
        } else
                tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
 
-       tty_cell(tty, ctx->cell);
+       tty_cell(tty, ctx->cell, wp);
 }
 
 void
@@ -1055,7 +1089,7 @@ tty_cmd_utf8character(struct tty *tty, c
         * 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_pane(tty, wp, ctx->ocy, ctx->xoff, ctx->yoff);
 }
 
 void
@@ -1088,12 +1122,13 @@ tty_cmd_rawstring(struct tty *tty, const
        tty->cx = tty->cy = UINT_MAX;
        tty->rupper = tty->rlower = UINT_MAX;
 
-       tty_reset(tty);
+       tty_attributes(tty, &grid_default_cell, ctx->wp);
        tty_cursor(tty, 0, 0);
 }
 
 void
-tty_cell(struct tty *tty, const struct grid_cell *gc)
+tty_cell(struct tty *tty, const struct grid_cell *gc,
+    const struct window_pane *wp)
 {
        struct utf8_data        ud;
        u_int                   i;
@@ -1108,7 +1143,7 @@ tty_cell(struct tty *tty, const struct g
                return;
 
        /* Set the attributes. */
-       tty_attributes(tty, gc);
+       tty_attributes(tty, gc, wp);
 
        /* Get the cell and if ASCII write with putc to do ACS translation. */
        grid_cell_get(gc, &ud);
@@ -1312,12 +1347,14 @@ out:
 }
 
 void
-tty_attributes(struct tty *tty, const struct grid_cell *gc)
+tty_attributes(struct tty *tty, const struct grid_cell *gc,
+    const struct window_pane *wp)
 {
        struct grid_cell        *tc = &tty->cell, gc2;
        u_char                   changed;
 
        memcpy(&gc2, gc, sizeof gc2);
+       tty_default_colours(&gc2, wp);
 
        /*
         * If no setab, try to use the reverse attribute as a best-effort for a
@@ -1607,6 +1644,47 @@ tty_try_256(struct tty *tty, u_char colo
        }
 
        return (-1);
+}
+
+void
+tty_default_colours(struct grid_cell *gc, const struct window_pane *wp)
+{
+       const struct grid_cell        *agc, *pgc, *wgc;
+
+       if (wp == NULL)
+               return;
+
+       pgc = &wp->colgc;
+       agc = options_get_style(&wp->window->options, "window-active-style");
+       wgc = options_get_style(&wp->window->options, "window-style");
+
+       if (gc->fg == 8 && !(gc->flags & GRID_FLAG_FG256)) {
+               if (pgc->fg != 8 || (pgc->flags & GRID_FLAG_FG256)) {
+                       gc->fg = pgc->fg;
+                       gc->flags |= (pgc->flags & GRID_FLAG_FG256);
+               } else if (wp == wp->window->active &&
+                   (agc->fg != 8 || (agc->flags & GRID_FLAG_FG256))) {
+                       gc->fg = agc->fg;
+                       gc->flags |= (agc->flags & GRID_FLAG_FG256);
+               } else {
+                       gc->fg = wgc->fg;
+                       gc->flags |= (wgc->flags & GRID_FLAG_FG256);
+               }
+       }
+
+       if (gc->bg == 8 && !(gc->flags & GRID_FLAG_BG256)) {
+               if (pgc->bg != 8 || (pgc->flags & GRID_FLAG_BG256)) {
+                       gc->bg = pgc->bg;
+                       gc->flags |= (pgc->flags & GRID_FLAG_BG256);
+               } else if (wp == wp->window->active &&
+                   (agc->bg != 8 || (agc->flags & GRID_FLAG_BG256))) {
+                       gc->bg = agc->bg;
+                       gc->flags |= (agc->flags & GRID_FLAG_BG256);
+               } else {
+                       gc->bg = wgc->bg;
+                       gc->flags |= (wgc->flags & GRID_FLAG_BG256);
+               }
+       }
 }
 
 void
Index: window.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/window.c,v
retrieving revision 1.116
diff -u -p -r1.116 window.c
--- window.c    9 Feb 2015 12:47:18 -0000       1.116
+++ window.c    1 Apr 2015 20:31:01 -0000
@@ -705,6 +705,8 @@ window_pane_create(struct window *w, u_i
 
        wp->saved_grid = NULL;
 
+       memcpy(&wp->colgc, &grid_default_cell, sizeof wp->colgc);
+
        screen_init(&wp->base, sx, sy, hlimit);
        wp->screen = &wp->base;
 



On Mon, Feb 23, 2015 at 10:33:51PM -0600, J Raynor wrote:
> I've attached a patch that adds the BCE functionality I did before.
> It's more concise this time.  You have to apply the other patch first,
> the one that does pane colors for bce terminals.
> 
> As for the other stuff, I misunderstood what you were referring to.  I
> thought you were looking for a different implementation of bce support
> for what I had already done.  I'll take a look at getting full
> support.

> diff --git a/tmux.h b/tmux.h
> index 4751cbd..c21fbb4 100644
> --- a/tmux.h
> +++ b/tmux.h
> @@ -154,6 +154,7 @@ enum key_code {
>  enum tty_code_code {
>       TTYC_AX = 0,
>       TTYC_ACSC,      /* acs_chars, ac */
> +     TTYC_BCE,       /* background colour erase */
>       TTYC_BEL,       /* bell, bl */
>       TTYC_BLINK,     /* enter_blink_mode, mb */
>       TTYC_BOLD,      /* enter_bold_mode, md */
> diff --git a/tty-term.c b/tty-term.c
> index 365da5f..456f81e 100644
> --- a/tty-term.c
> +++ b/tty-term.c
> @@ -38,6 +38,7 @@ struct tty_terms tty_terms = 
> LIST_HEAD_INITIALIZER(tty_terms);
>  const struct tty_term_code_entry tty_term_codes[NTTYCODE] = {
>       { TTYC_ACSC, TTYCODE_STRING, "acsc" },
>       { TTYC_AX, TTYCODE_FLAG, "AX" },
> +     { TTYC_BCE, TTYCODE_STRING, "bce" },
>       { TTYC_BEL, TTYCODE_STRING, "bel" },
>       { TTYC_BLINK, TTYCODE_STRING, "blink" },
>       { TTYC_BOLD, TTYCODE_STRING, "bold" },
> diff --git a/tty.c b/tty.c
> index 257ebf8..0f33f15 100644
> --- a/tty.c
> +++ b/tty.c
> @@ -50,6 +50,7 @@ void        tty_repeat_space(struct tty *, u_int);
>  void tty_cell(struct tty *, const struct grid_cell *,
>           const struct window_pane *);
>  void tty_default_colours(struct grid_cell *, const struct window_pane *);
> +int  need_fake_bce(const struct tty *, const struct window_pane *);
>  
>  #define tty_use_acs(tty) \
>       (tty_term_has((tty)->term, TTYC_ACSC) && !((tty)->flags & TTY_UTF8))
> @@ -666,7 +667,7 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int 
> py, u_int ox, u_int oy,
>  
>       tty_cursor(tty, ox + sx, oy + py);
>       if (sx != screen_size_x(s) && ox + screen_size_x(s) >= tty->sx &&
> -         tty_term_has(tty->term, TTYC_EL))
> +         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) - sx);
> @@ -725,8 +726,8 @@ tty_cmd_insertcharacter(struct tty *tty, const struct 
> tty_ctx *ctx)
>  
>       tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
>  
> -     if (tty_term_has(tty->term, TTYC_ICH) ||
> -         tty_term_has(tty->term, TTYC_ICH1))
> +     if (!need_fake_bce(tty, wp) && (tty_term_has(tty->term, TTYC_ICH) ||
> +         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,
> @@ -738,7 +739,7 @@ tty_cmd_deletecharacter(struct tty *tty, const struct 
> tty_ctx *ctx)
>  {
>       struct window_pane      *wp = ctx->wp;
>  
> -     if (!tty_pane_full_width(tty, ctx) ||
> +     if (!tty_pane_full_width(tty, ctx) || need_fake_bce(tty, wp) ||
>           (!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,
> @@ -764,7 +765,7 @@ tty_cmd_clearcharacter(struct tty *tty, const struct 
> tty_ctx *ctx)
>  
>       tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
>  
> -     if (tty_term_has(tty->term, TTYC_ECH))
> +     if (tty_term_has(tty->term, TTYC_ECH) && !need_fake_bce(tty, ctx->wp))
>               tty_putcode1(tty, TTYC_ECH, ctx->num);
>       else {
>               for (i = 0; i < ctx->num; i++)
> @@ -775,7 +776,7 @@ tty_cmd_clearcharacter(struct tty *tty, const struct 
> tty_ctx *ctx)
>  void
>  tty_cmd_insertline(struct tty *tty, const struct tty_ctx *ctx)
>  {
> -     if (!tty_pane_full_width(tty, ctx) ||
> +     if (!tty_pane_full_width(tty, ctx) || need_fake_bce(tty, ctx->wp) ||
>           !tty_term_has(tty->term, TTYC_CSR) ||
>           !tty_term_has(tty->term, TTYC_IL1)) {
>               tty_redraw_region(tty, ctx);
> @@ -793,7 +794,7 @@ tty_cmd_insertline(struct tty *tty, const struct tty_ctx 
> *ctx)
>  void
>  tty_cmd_deleteline(struct tty *tty, const struct tty_ctx *ctx)
>  {
> -     if (!tty_pane_full_width(tty, ctx) ||
> +     if (!tty_pane_full_width(tty, ctx) || need_fake_bce(tty, ctx->wp) ||
>           !tty_term_has(tty->term, TTYC_CSR) ||
>           !tty_term_has(tty->term, TTYC_DL1)) {
>               tty_redraw_region(tty, ctx);
> @@ -818,7 +819,8 @@ tty_cmd_clearline(struct tty *tty, const struct tty_ctx 
> *ctx)
>  
>       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) && !need_fake_bce(tty, wp) &&
> +         tty_term_has(tty->term, TTYC_EL))
>               tty_putcode(tty, TTYC_EL);
>       else
>               tty_repeat_space(tty, screen_size_x(s));
> @@ -834,7 +836,8 @@ tty_cmd_clearendofline(struct tty *tty, const struct 
> tty_ctx *ctx)
>  
>       tty_cursor_pane(tty, ctx, ctx->ocx, 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) - ctx->ocx);
> @@ -845,7 +848,8 @@ tty_cmd_clearstartofline(struct tty *tty, const struct 
> tty_ctx *ctx)
>  {
>       tty_attributes(tty, &grid_default_cell, ctx->wp);
>  
> -     if (ctx->xoff == 0 && tty_term_has(tty->term, TTYC_EL1)) {
> +     if (ctx->xoff == 0 && tty_term_has(tty->term, TTYC_EL1) &&
> +         !need_fake_bce(tty, ctx->wp)) {
>               tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
>               tty_putcode(tty, TTYC_EL1);
>       } else {
> @@ -860,7 +864,7 @@ tty_cmd_reverseindex(struct tty *tty, const struct 
> tty_ctx *ctx)
>       if (ctx->ocy != ctx->orupper)
>               return;
>  
> -     if (!tty_pane_full_width(tty, ctx) ||
> +     if (!tty_pane_full_width(tty, ctx) || need_fake_bce(tty, ctx->wp) ||
>           !tty_term_has(tty->term, TTYC_CSR) ||
>           !tty_term_has(tty->term, TTYC_RI)) {
>               tty_redraw_region(tty, ctx);
> @@ -883,7 +887,7 @@ tty_cmd_linefeed(struct tty *tty, const struct tty_ctx 
> *ctx)
>       if (ctx->ocy != ctx->orlower)
>               return;
>  
> -     if (!tty_pane_full_width(tty, ctx) ||
> +     if (!tty_pane_full_width(tty, ctx) || need_fake_bce(tty, wp) ||
>           !tty_term_has(tty->term, TTYC_CSR)) {
>               if (tty_large_region(tty, ctx))
>                       wp->flags |= PANE_REDRAW;
> @@ -920,7 +924,8 @@ tty_cmd_clearendofscreen(struct tty *tty, const struct 
> tty_ctx *ctx)
>       tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
>       tty_cursor_pane(tty, ctx, ctx->ocx, 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);
>               if (ctx->ocy != screen_size_y(s) - 1) {
>                       tty_cursor_pane(tty, ctx, 0, ctx->ocy + 1);
> @@ -953,7 +958,8 @@ tty_cmd_clearstartofscreen(struct tty *tty, const struct 
> tty_ctx *ctx)
>       tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
>       tty_cursor_pane(tty, ctx, 0, 0);
>  
> -     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)) {
>               for (i = 0; i < ctx->ocy; i++) {
>                       tty_putcode(tty, TTYC_EL);
>                       tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1);
> @@ -980,7 +986,8 @@ tty_cmd_clearscreen(struct tty *tty, const struct tty_ctx 
> *ctx)
>       tty_region_pane(tty, ctx, 0, screen_size_y(s) - 1);
>       tty_cursor_pane(tty, ctx, 0, 0);
>  
> -     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)) {
>               for (i = 0; i < screen_size_y(s); i++) {
>                       tty_putcode(tty, TTYC_EL);
>                       if (i != screen_size_y(s) - 1) {
> @@ -1664,3 +1671,17 @@ tty_default_colours(struct grid_cell *gc, const struct 
> window_pane *wp)
>               }
>       }
>  }
> +
> +int
> +need_fake_bce(const struct tty *tty, const struct window_pane *wp)
> +{
> +     struct grid_cell        gc;
> +
> +     memcpy(&gc, &grid_default_cell, sizeof gc);
> +     tty_default_colours(&gc, wp);
> +
> +     if (gc.bg == 8 && !(gc.flags & GRID_FLAG_BG256))
> +             return (0);
> +     else
> +             return (!tty_term_has(tty->term, TTYC_BCE));
> +}


------------------------------------------------------------------------------
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