Hi!

This diff lets one style the inactive panes in tmux without forcing a default
style.

Before this diff I was using a combo of 'window-style' and
'window-active-style' to mimic this feature. This method isn't ideal because
window-active-style becomes the "default", while window-style is the
"inactive" style. This is confusing and also "bypasses" the colors defined in
the terminal being used (adding another layer of confusion!).

I have been running it on a few machines without issue.

OK? Clue sticks?

diff --git a/usr.bin/tmux/cmd-set-option.c b/usr.bin/tmux/cmd-set-option.c
index f3622017830..97b21f01e58 100644
--- a/usr.bin/tmux/cmd-set-option.c
+++ b/usr.bin/tmux/cmd-set-option.c
@@ -254,6 +254,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item 
*item)
        if (strcmp(name, "monitor-silence") == 0)
                alerts_reset_all();
        if (strcmp(name, "window-style") == 0 ||
+           strcmp(name, "window-inactive-style") == 0 ||
            strcmp(name, "window-active-style") == 0) {
                RB_FOREACH(w, windows, &windows)
                        w->flags |= WINDOW_STYLECHANGED;
diff --git a/usr.bin/tmux/options-table.c b/usr.bin/tmux/options-table.c
index b8ca7f1c8b6..a8171d3de8b 100644
--- a/usr.bin/tmux/options-table.c
+++ b/usr.bin/tmux/options-table.c
@@ -771,6 +771,12 @@ const struct options_table_entry options_table[] = {
          .default_str = "default"
        },
 
+       { .name = "window-inactive-style",
+         .type = OPTIONS_TABLE_STYLE,
+         .scope = OPTIONS_TABLE_WINDOW,
+         .default_str = "default"
+       },
+
        { .name = "window-style",
          .type = OPTIONS_TABLE_STYLE,
          .scope = OPTIONS_TABLE_WINDOW,
diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1
index eca8e2afeec..12487d8d637 100644
--- a/usr.bin/tmux/tmux.1
+++ b/usr.bin/tmux/tmux.1
@@ -2026,9 +2026,10 @@ and
 .Ic swap-window .
 .Pp
 Each pane has a style: by default the
-.Ic window-style
-and
+.Ic window-style ,
 .Ic window-active-style
+and
+.Ic window-inactive-style
 options are used,
 .Ic select-pane
 .Fl P
@@ -3251,6 +3252,14 @@ see the
 .Ic message-command-style
 option.
 .Pp
+.It Ic window-inactive-style Ar style
+Set the style for the window's inactive panes.
+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
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 3c348b1fb29..75e2cae6c5a 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -808,6 +808,7 @@ struct window {
 
        struct grid_cell style;
        struct grid_cell active_style;
+       struct grid_cell inactive_style;
 
        u_int            references;
        TAILQ_HEAD(, winlink) winlinks;
diff --git a/usr.bin/tmux/tty.c b/usr.bin/tmux/tty.c
index 754614b27de..80bb9f6307c 100644
--- a/usr.bin/tmux/tty.c
+++ b/usr.bin/tmux/tty.c
@@ -2146,17 +2146,20 @@ tty_default_colours(struct grid_cell *gc, const struct 
window_pane *wp)
 {
        struct window           *w = wp->window;
        struct options          *oo = w->options;
-       const struct grid_cell  *agc, *pgc, *wgc;
+       const struct grid_cell  *agc, *igc, *pgc, *wgc;
        int                      c;
 
        if (w->flags & WINDOW_STYLECHANGED) {
                w->flags &= ~WINDOW_STYLECHANGED;
                agc = options_get_style(oo, "window-active-style");
                memcpy(&w->active_style, agc, sizeof w->active_style);
+               igc = options_get_style(oo, "window-inactive-style");
+               memcpy(&w->inactive_style, igc, sizeof w->inactive_style);
                wgc = options_get_style(oo, "window-style");
                memcpy(&w->style, wgc, sizeof w->style);
        } else {
                agc = &w->active_style;
+               igc = &w->inactive_style;
                wgc = &w->style;
        }
        pgc = &wp->colgc;
@@ -2166,6 +2169,8 @@ tty_default_colours(struct grid_cell *gc, const struct 
window_pane *wp)
                        gc->fg = pgc->fg;
                else if (wp == w->active && agc->fg != 8)
                        gc->fg = agc->fg;
+               else if (wp != w->active && igc->fg != 8)
+                       gc->fg = igc->fg;
                else
                        gc->fg = wgc->fg;
 
@@ -2179,6 +2184,8 @@ tty_default_colours(struct grid_cell *gc, const struct 
window_pane *wp)
                        gc->bg = pgc->bg;
                else if (wp == w->active && agc->bg != 8)
                        gc->bg = agc->bg;
+               else if (wp != w->active && igc->bg != 8)
+                       gc->bg = igc->bg;
                else
                        gc->bg = wgc->bg;
 
diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c
index f94724fdbf1..f0ec870a5fa 100644
--- a/usr.bin/tmux/window.c
+++ b/usr.bin/tmux/window.c
@@ -476,17 +476,19 @@ window_set_active_pane(struct window *w, struct 
window_pane *wp)
 void
 window_redraw_active_switch(struct window *w, struct window_pane *wp)
 {
-       const struct grid_cell  *gc;
+       const struct grid_cell  *gc, *igc;
 
        if (wp == w->active)
                return;
 
        /*
-        * If window-style and window-active-style are the same, we don't need
-        * to redraw panes when switching active panes.
+        * If window-style and window-{in}active-style are the same, we don't
+        * need to redraw panes when switching active panes.
         */
        gc = options_get_style(w->options, "window-active-style");
-       if (style_equal(gc, options_get_style(w->options, "window-style")))
+       igc = options_get_style(w->options, "window-inactive-style");
+       if (style_equal(gc, options_get_style(w->options, "window-style")) &&
+           style_equal(igc, gc))
                return;
 
        /*

-- 
PGP: 0x1F81112D62A9ADCE / 3586 3350 BFEA C101 DB1A  4AF0 1F81 112D 62A9 ADCE

Reply via email to