diff --git a/grid.c b/grid.c index af555e6d..25b0d016 100644 --- a/grid.c +++ b/grid.c @@ -675,8 +675,7 @@ grid_string_cells_code(const struct grid_cell *lastgc, { int oldc[64], newc[64], s[128]; size_t noldc, nnewc, n, i; - u_int attr = gc->attr; - u_int lastattr = lastgc->attr; + u_int attr = gc->attr, lastattr = lastgc->attr; char tmp[64]; struct { @@ -708,23 +707,7 @@ grid_string_cells_code(const struct grid_cell *lastgc, s[n++] = attrs[i].code; } - /* If the foreground colour changed, append its parameters. */ - nnewc = grid_string_cells_fg(gc, newc); - noldc = grid_string_cells_fg(lastgc, oldc); - if (nnewc != noldc || memcmp(newc, oldc, nnewc * sizeof newc[0]) != 0) { - for (i = 0; i < nnewc; i++) - s[n++] = newc[i]; - } - - /* If the background colour changed, append its parameters. */ - nnewc = grid_string_cells_bg(gc, newc); - noldc = grid_string_cells_bg(lastgc, oldc); - if (nnewc != noldc || memcmp(newc, oldc, nnewc * sizeof newc[0]) != 0) { - for (i = 0; i < nnewc; i++) - s[n++] = newc[i]; - } - - /* If there are any parameters, append an SGR code. */ + /* Write the attributes. */ *buf = '\0'; if (n > 0) { if (escape_c0) @@ -741,16 +724,56 @@ grid_string_cells_code(const struct grid_cell *lastgc, strlcat(buf, "m", len); } + /* If the foreground colour changed, write its parameters. */ + nnewc = grid_string_cells_fg(gc, newc); + noldc = grid_string_cells_fg(lastgc, oldc); + if (nnewc != noldc || + memcmp(newc, oldc, nnewc * sizeof newc[0]) != 0 || + (n != 0 && s[0] == 0)) { + if (escape_c0) + strlcat(buf, "\\033[", len); + else + strlcat(buf, "\033[", len); + for (i = 0; i < nnewc; i++) { + if (i + 1 < nnewc) + xsnprintf(tmp, sizeof tmp, "%d;", newc[i]); + else + xsnprintf(tmp, sizeof tmp, "%d", newc[i]); + strlcat(buf, tmp, len); + } + strlcat(buf, "m", len); + } + + /* If the background colour changed, append its parameters. */ + nnewc = grid_string_cells_bg(gc, newc); + noldc = grid_string_cells_bg(lastgc, oldc); + if (nnewc != noldc || + memcmp(newc, oldc, nnewc * sizeof newc[0]) != 0 || + (n != 0 && s[0] == 0)) { + if (escape_c0) + strlcat(buf, "\\033[", len); + else + strlcat(buf, "\033[", len); + for (i = 0; i < nnewc; i++) { + if (i + 1 < nnewc) + xsnprintf(tmp, sizeof tmp, "%d;", newc[i]); + else + xsnprintf(tmp, sizeof tmp, "%d", newc[i]); + strlcat(buf, tmp, len); + } + strlcat(buf, "m", len); + } + /* Append shift in/shift out if needed. */ if ((attr & GRID_ATTR_CHARSET) && !(lastattr & GRID_ATTR_CHARSET)) { if (escape_c0) - strlcat(buf, "\\016", len); /* SO */ + strlcat(buf, "\\016", len); /* SO */ else strlcat(buf, "\016", len); /* SO */ } if (!(attr & GRID_ATTR_CHARSET) && (lastattr & GRID_ATTR_CHARSET)) { if (escape_c0) - strlcat(buf, "\\017", len); /* SI */ + strlcat(buf, "\\017", len); /* SI */ else strlcat(buf, "\017", len); /* SI */ } diff --git a/tmux.h b/tmux.h index b9ee9516..829772c9 100644 --- a/tmux.h +++ b/tmux.h @@ -1470,7 +1470,6 @@ void proc_kill_peer(struct tmuxpeer *); /* cfg.c */ extern int cfg_finished; -extern struct client *cfg_client; void start_cfg(void); int load_cfg(const char *, struct client *, struct cmdq_item *, int); void set_cfg_file(const char *);