Couple of fixes. BCE is a FLAG not a STRING, and we need to check with
tty_term_flag not tty_term_has (so it wasn't actually making use of BCE
at all even if the terminal supported it). Also don't use the pane
colours for the borders.
I like this, don't see any other problems so far.
Index: cmd-select-pane.c
===================================================================
RCS file: /cvs/src/usr.bin/tmux/cmd-select-pane.c,v
retrieving revision 1.20
diff -u -p -r1.20 cmd-select-pane.c
--- cmd-select-pane.c 21 Oct 2014 22:22:04 -0000 1.20
+++ cmd-select-pane.c 15 Apr 2015 22:12:41 -0000
@@ -28,8 +28,8 @@ enum cmd_retval cmd_select_pane_exec(st
const struct cmd_entry cmd_select_pane_entry = {
"select-pane", "selectp",
- "DdeLlRt:U", 0, 0,
- "[-DdeLlRU] " CMD_TARGET_PANE_USAGE,
+ "DdegLlP:Rt:U", 0, 0,
+ "[-DdegLlRU] [-P style] " CMD_TARGET_PANE_USAGE,
0,
cmd_select_pane_exec
};
@@ -48,6 +48,7 @@ cmd_select_pane_exec(struct cmd *self, s
struct args *args = self->args;
struct winlink *wl;
struct window_pane *wp;
+ const char *style;
if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) {
wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
@@ -80,6 +81,21 @@ cmd_select_pane_exec(struct cmd *self, s
if (!window_pane_visible(wp)) {
cmdq_error(cmdq, "pane not visible");
return (CMD_RETURN_ERROR);
+ }
+
+ if (args_has(self->args, 'P') || args_has(self->args, 'g')) {
+ 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(self->args, 'g'))
+ cmdq_print(cmdq, "%s", style_tostring(&wp->colgc));
+ return (CMD_RETURN_NORMAL);
}
if (args_has(self->args, 'L'))
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 15 Apr 2015 22:12:41 -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 15 Apr 2015 22:12:41 -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, NULL);
else
- tty_attributes(tty, &other_gc);
+ tty_attributes(tty, &other_gc, NULL);
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, NULL);
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 15 Apr 2015 22:12:42 -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.417
diff -u -p -r1.417 tmux.1
--- tmux.1 10 Apr 2015 16:00:08 -0000 1.417
+++ tmux.1 15 Apr 2015 22:12:43 -0000
@@ -1730,14 +1730,17 @@ and
.Ic previous-layout
commands.
.It Xo Ic select-pane
-.Op Fl DdeLlRU
+.Op Fl DdegLlRU
+.Op Fl P Ar style
.Op Fl t Ar target-pane
.Xc
.D1 (alias: Ic selectp )
Make pane
.Ar target-pane
the active pane in window
-.Ar target-window .
+.Ar target-window ,
+or set it's style (with
+.Fl P ) .
If one of
.Fl D ,
.Fl L ,
@@ -1754,6 +1757,22 @@ command.
enables or
.Fl d
disables input to the pane.
+.Pp
+Each pane has a style: by default the
+.Ic window-style
+and
+.Ic window-active-style
+options are used,
+.Ic select-pane
+.Fl P
+sets the style for a single pane.
+For example, to set the pane 1 background to red:
+.Bd -literal -offset indent
+select-pane -t:.1 -P 'bg=red'
+.Ed
+.Pp
+.Fl g
+shows the current pane style.
.It Xo Ic select-window
.Op Fl lnpT
.Op Fl t Ar target-window
@@ -2070,7 +2089,7 @@ also supports user options which are pre
User options may have any name, so long as they are prefixed with
.Ql \&@ ,
and be set to any string.
-For example
+For example:
.Bd -literal -offset indent
$ tmux setw -q @foo "abc123"
$ tmux showw -v @foo
@@ -2936,6 +2955,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
@@ -2987,6 +3014,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 15 Apr 2015 22:12:44 -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 15 Apr 2015 22:12:44 -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_FLAG, "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.174
diff -u -p -r1.174 tty.c
--- tty.c 15 Apr 2015 22:10:13 -0000 1.174
+++ tty.c 15 Apr 2015 22:12:44 -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_flag(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 15 Apr 2015 22:12:44 -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, Apr 13, 2015 at 07:57:59AM +0100, Nicholas Marriott wrote:
> On Sun, Apr 12, 2015 at 07:25:43PM -0500, J Raynor wrote:
> > This line in the patch for tmux.1 looks wrong:
> >
> > +.Fl P ).
> >
> > I think there has to be a space between the parenthesis and the
> > period. Without it, the parenthesis gets treated as a flag and a dash
> > is put before it.
>
> Whoops, yes, I had it like that and must have changed it back by
> accident.
>
> >
> > If -g or -P is passed to selectp, other flags are ignored. Is that
> > the intended behavior?
>
> Yes I think that is more useful than doing both.
------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users