mirror of
https://github.com/tmux/tmux.git
synced 2025-01-07 16:28:48 +00:00
Pass attributes around as flags rather than as a list of escape codes.
This commit is contained in:
parent
9d563c340b
commit
872696f781
2
TODO
2
TODO
@ -37,3 +37,5 @@
|
|||||||
- store_attr/colr could be two-pass and avoid reverse_add/remove games
|
- store_attr/colr could be two-pass and avoid reverse_add/remove games
|
||||||
- window creation/idle time
|
- window creation/idle time
|
||||||
- attributes could be 8 not 16 bits
|
- attributes could be 8 not 16 bits
|
||||||
|
- put title setting back
|
||||||
|
- profile/optimise, particularly (i suspect) input.c
|
||||||
|
13
input.c
13
input.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: input.c,v 1.14 2007-09-30 13:29:28 nicm Exp $ */
|
/* $Id: input.c,v 1.15 2007-10-01 14:18:42 nicm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -953,20 +953,13 @@ input_handle_sequence_sgr(struct input_ctx *ictx)
|
|||||||
uint16_t m;
|
uint16_t m;
|
||||||
|
|
||||||
n = ARRAY_LENGTH(&ictx->args);
|
n = ARRAY_LENGTH(&ictx->args);
|
||||||
|
|
||||||
input_store_zero(ictx->b, CODE_ATTRIBUTES);
|
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
ictx->s->attr = 0;
|
ictx->s->attr = 0;
|
||||||
ictx->s->colr = SCREEN_DEFCOLR;
|
ictx->s->colr = SCREEN_DEFCOLR;
|
||||||
input_store16(ictx->b, 1);
|
|
||||||
input_store16(ictx->b, 0);
|
|
||||||
} else {
|
} else {
|
||||||
input_store16(ictx->b, n);
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
if (input_get_argument(ictx, i, &m, 0) != 0) {
|
if (input_get_argument(ictx, i, &m, 0) != 0)
|
||||||
/* XXX XXX partial write to client */
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
switch (m) {
|
switch (m) {
|
||||||
case 0:
|
case 0:
|
||||||
case 10:
|
case 10:
|
||||||
@ -1031,9 +1024,9 @@ input_handle_sequence_sgr(struct input_ctx *ictx)
|
|||||||
ictx->s->colr |= 0x08;
|
ictx->s->colr |= 0x08;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
input_store16(ictx->b, m);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
input_store_two(ictx->b, CODE_ATTRIBUTES, ictx->s->attr, ictx->s->colr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
182
local.c
182
local.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: local.c,v 1.11 2007-09-29 14:25:49 nicm Exp $ */
|
/* $Id: local.c,v 1.12 2007-10-01 14:18:42 nicm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -37,6 +37,7 @@
|
|||||||
int local_cmp(const void *, const void *);
|
int local_cmp(const void *, const void *);
|
||||||
int local_putc(int);
|
int local_putc(int);
|
||||||
void local_putp(const char *);
|
void local_putp(const char *);
|
||||||
|
void local_attributes(u_char, u_char);
|
||||||
|
|
||||||
/* Local key types and key codes. */
|
/* Local key types and key codes. */
|
||||||
struct local_key {
|
struct local_key {
|
||||||
@ -204,6 +205,8 @@ int local_fd;
|
|||||||
struct buffer *local_in;
|
struct buffer *local_in;
|
||||||
struct buffer *local_out;
|
struct buffer *local_out;
|
||||||
struct termios local_tio;
|
struct termios local_tio;
|
||||||
|
u_char local_attr;
|
||||||
|
u_char local_colr;
|
||||||
|
|
||||||
/* Initialise local terminal. */
|
/* Initialise local terminal. */
|
||||||
int
|
int
|
||||||
@ -260,6 +263,9 @@ local_init(struct buffer **in, struct buffer **out)
|
|||||||
qsort(local_keys, sizeof local_keys /
|
qsort(local_keys, sizeof local_keys /
|
||||||
sizeof local_keys[0], sizeof local_keys[0], local_cmp);
|
sizeof local_keys[0], sizeof local_keys[0], local_cmp);
|
||||||
|
|
||||||
|
local_attr = 0;
|
||||||
|
local_colr = 0x88;
|
||||||
|
|
||||||
return (local_fd);
|
return (local_fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,7 +310,7 @@ local_done(void)
|
|||||||
int
|
int
|
||||||
local_putc(int c)
|
local_putc(int c)
|
||||||
{
|
{
|
||||||
FILE *f;
|
/* XXX FILE *f;*/
|
||||||
u_char ch = c;
|
u_char ch = c;
|
||||||
|
|
||||||
if (c < 0 || c > (int) UCHAR_MAX)
|
if (c < 0 || c > (int) UCHAR_MAX)
|
||||||
@ -635,115 +641,77 @@ local_output(struct buffer *b, size_t size)
|
|||||||
buffer_remove(b, ua);
|
buffer_remove(b, ua);
|
||||||
break;
|
break;
|
||||||
case CODE_ATTRIBUTES:
|
case CODE_ATTRIBUTES:
|
||||||
if (size < 2)
|
if (size < 4)
|
||||||
fatalx("CODE_ATTRIBUTES underflow");
|
fatalx("CODE_ATTRIBUTES underflow");
|
||||||
size -= 2;
|
size -= 4;
|
||||||
ua = input_extract16(b);
|
ua = input_extract16(b);
|
||||||
|
ub = input_extract16(b);
|
||||||
|
|
||||||
if (exit_attribute_mode == NULL) {
|
local_attributes(ua, ub);
|
||||||
log_warnx("exit_attribute_mode not supported");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ua == 0) {
|
|
||||||
local_putp(exit_attribute_mode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (ua-- != 0) {
|
|
||||||
if (size < 2)
|
|
||||||
fatalx("CODE_ATTRIBUTES underflow");
|
|
||||||
size -= 2;
|
|
||||||
ub = input_extract16(b);
|
|
||||||
|
|
||||||
switch (ub) {
|
|
||||||
case 0:
|
|
||||||
case 10:
|
|
||||||
if (exit_attribute_mode)
|
|
||||||
local_putp(exit_attribute_mode);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
if (enter_bold_mode)
|
|
||||||
local_putp(enter_bold_mode);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if (enter_dim_mode)
|
|
||||||
local_putp(enter_dim_mode);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if (enter_standout_mode)
|
|
||||||
local_putp(enter_standout_mode);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
if (enter_underline_mode)
|
|
||||||
local_putp(enter_underline_mode);
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
if (enter_blink_mode)
|
|
||||||
local_putp(enter_blink_mode);
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
if (enter_reverse_mode)
|
|
||||||
local_putp(enter_reverse_mode);
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
if (enter_secure_mode)
|
|
||||||
local_putp(enter_secure_mode);
|
|
||||||
break;
|
|
||||||
case 23:
|
|
||||||
if (exit_standout_mode)
|
|
||||||
local_putp(exit_standout_mode);
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
if (exit_underline_mode)
|
|
||||||
local_putp(exit_underline_mode);
|
|
||||||
break;
|
|
||||||
case 30:
|
|
||||||
case 31:
|
|
||||||
case 32:
|
|
||||||
case 33:
|
|
||||||
case 34:
|
|
||||||
case 35:
|
|
||||||
case 36:
|
|
||||||
case 37:
|
|
||||||
if (set_a_foreground == NULL)
|
|
||||||
break;
|
|
||||||
local_putp(
|
|
||||||
tparm(set_a_foreground, ub - 30));
|
|
||||||
break;
|
|
||||||
case 39:
|
|
||||||
if (set_a_foreground == NULL)
|
|
||||||
break;
|
|
||||||
if (tigetflag("AX") == TRUE) {
|
|
||||||
local_putp("\e[39m");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
local_putp(tparm(set_a_foreground, 7));
|
|
||||||
break;
|
|
||||||
case 40:
|
|
||||||
case 41:
|
|
||||||
case 42:
|
|
||||||
case 43:
|
|
||||||
case 44:
|
|
||||||
case 45:
|
|
||||||
case 46:
|
|
||||||
case 47:
|
|
||||||
if (set_a_background == NULL)
|
|
||||||
break;
|
|
||||||
local_putp(
|
|
||||||
tparm(set_a_background, ub - 40));
|
|
||||||
break;
|
|
||||||
case 49:
|
|
||||||
if (set_a_background == NULL)
|
|
||||||
break;
|
|
||||||
if (tigetflag("AX") == TRUE) {
|
|
||||||
local_putp("\e[49m");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
local_putp(tparm(set_a_background, 0));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
local_attributes(u_char attr, u_char colr)
|
||||||
|
{
|
||||||
|
u_char fg, bg;
|
||||||
|
|
||||||
|
if (attr == local_attr && colr == local_colr)
|
||||||
|
return;
|
||||||
|
if (exit_attribute_mode == NULL) {
|
||||||
|
log_warnx("exit_attribute_mode not supported");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If any bits are being cleared, reset everything. */
|
||||||
|
if (local_attr & ~attr) {
|
||||||
|
local_putp(exit_attribute_mode);
|
||||||
|
local_colr = 0x88;
|
||||||
|
local_attr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Filter out bits already set. */
|
||||||
|
attr &= ~local_attr;
|
||||||
|
local_attr |= attr;
|
||||||
|
|
||||||
|
if ((attr & ATTR_BRIGHT) && enter_bold_mode != NULL)
|
||||||
|
local_putp(enter_bold_mode);
|
||||||
|
if ((attr & ATTR_DIM) && enter_dim_mode != NULL)
|
||||||
|
local_putp(enter_dim_mode);
|
||||||
|
if ((attr & ATTR_ITALICS) && enter_standout_mode != NULL)
|
||||||
|
local_putp(enter_standout_mode);
|
||||||
|
if ((attr & ATTR_UNDERSCORE) && enter_underline_mode != NULL)
|
||||||
|
local_putp(enter_underline_mode);
|
||||||
|
if ((attr & ATTR_BLINK) && enter_blink_mode != NULL)
|
||||||
|
local_putp(enter_blink_mode);
|
||||||
|
if ((attr & ATTR_REVERSE) && enter_reverse_mode != NULL)
|
||||||
|
local_putp(enter_reverse_mode);
|
||||||
|
if ((attr & ATTR_HIDDEN) && enter_secure_mode != NULL)
|
||||||
|
local_putp(enter_secure_mode);
|
||||||
|
|
||||||
|
fg = (colr >> 4) & 0xf;
|
||||||
|
if (fg != ((local_colr >> 4) & 0xf)) {
|
||||||
|
if (fg == 8) {
|
||||||
|
if (tigetflag("AX") == TRUE)
|
||||||
|
local_putp("\e[39m");
|
||||||
|
else if (set_a_foreground != NULL)
|
||||||
|
local_putp(tparm(set_a_foreground, 7));
|
||||||
|
} else if (set_a_foreground != NULL)
|
||||||
|
local_putp(tparm(set_a_foreground, fg));
|
||||||
|
}
|
||||||
|
|
||||||
|
bg = colr & 0xf;
|
||||||
|
if (bg != (local_colr & 0xf)) {
|
||||||
|
if (bg == 8) {
|
||||||
|
if (tigetflag("AX") == TRUE)
|
||||||
|
local_putp("\e[49m");
|
||||||
|
else if (set_a_background != NULL)
|
||||||
|
local_putp(tparm(set_a_background, 0));
|
||||||
|
} else if (set_a_background != NULL)
|
||||||
|
local_putp(tparm(set_a_background, bg));
|
||||||
|
}
|
||||||
|
|
||||||
|
local_colr = colr;
|
||||||
|
}
|
||||||
|
99
screen.c
99
screen.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: screen.c,v 1.18 2007-10-01 14:15:48 nicm Exp $ */
|
/* $Id: screen.c,v 1.19 2007-10-01 14:18:42 nicm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -172,9 +172,7 @@ void
|
|||||||
screen_draw(struct screen *s, struct buffer *b, u_int uy, u_int ly)
|
screen_draw(struct screen *s, struct buffer *b, u_int uy, u_int ly)
|
||||||
{
|
{
|
||||||
u_char attr, colr;
|
u_char attr, colr;
|
||||||
size_t size;
|
|
||||||
u_int i, j;
|
u_int i, j;
|
||||||
uint16_t n;
|
|
||||||
|
|
||||||
if (uy > screen_last_y(s) || ly > screen_last_y(s) || ly < uy)
|
if (uy > screen_last_y(s) || ly > screen_last_y(s) || ly < uy)
|
||||||
fatalx("bad range");
|
fatalx("bad range");
|
||||||
@ -186,112 +184,29 @@ screen_draw(struct screen *s, struct buffer *b, u_int uy, u_int ly)
|
|||||||
input_store_two(b, CODE_SCROLLREGION, s->ry_upper + 1, s->ry_lower + 1);
|
input_store_two(b, CODE_SCROLLREGION, s->ry_upper + 1, s->ry_lower + 1);
|
||||||
|
|
||||||
input_store_zero(b, CODE_CURSOROFF);
|
input_store_zero(b, CODE_CURSOROFF);
|
||||||
|
input_store_two(b, CODE_ATTRIBUTES, attr, colr);
|
||||||
input_store_one(b, CODE_ATTRIBUTES, 0);
|
|
||||||
|
|
||||||
for (j = uy; j <= ly; j++) {
|
for (j = uy; j <= ly; j++) {
|
||||||
input_store_two(b, CODE_CURSORMOVE, j + 1, 1);
|
input_store_two(b, CODE_CURSORMOVE, j + 1, 1);
|
||||||
|
|
||||||
for (i = 0; i <= screen_last_x(s); i++) {
|
for (i = 0; i <= screen_last_x(s); i++) {
|
||||||
size = BUFFER_USED(b);
|
if (s->grid_attr[j][i] != attr ||
|
||||||
input_store_one(b, CODE_ATTRIBUTES, 0);
|
s->grid_colr[j][i] != colr) {
|
||||||
|
input_store_two(b, CODE_ATTRIBUTES,
|
||||||
n = 0;
|
s->grid_attr[j][i], s->grid_colr[j][i]);
|
||||||
if (s->grid_attr[j][i] != attr) {
|
|
||||||
attr = s->grid_attr[j][i];
|
attr = s->grid_attr[j][i];
|
||||||
n += screen_store_attributes(b, attr);
|
|
||||||
if (attr == 0)
|
|
||||||
colr = SCREEN_DEFCOLR;
|
|
||||||
}
|
|
||||||
if (s->grid_colr[j][i] != colr) {
|
|
||||||
colr = s->grid_colr[j][i];
|
colr = s->grid_colr[j][i];
|
||||||
n += screen_store_colours(b, colr);
|
|
||||||
}
|
}
|
||||||
if (n == 0)
|
|
||||||
buffer_reverse_add(b, 4);
|
|
||||||
else {
|
|
||||||
size = BUFFER_USED(b) - size;
|
|
||||||
memcpy(BUFFER_IN(b) - size + 2, &n, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
input_store8(b, s->grid_data[j][i]);
|
input_store8(b, s->grid_data[j][i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size = BUFFER_USED(b);
|
|
||||||
input_store_one(b, CODE_ATTRIBUTES, 0);
|
|
||||||
n = screen_store_attributes(b, s->attr);
|
|
||||||
n += screen_store_colours(b, s->colr);
|
|
||||||
size = BUFFER_USED(b) - size;
|
|
||||||
memcpy(BUFFER_IN(b) - size + 2, &n, 2);
|
|
||||||
|
|
||||||
input_store_two(b, CODE_CURSORMOVE, s->cy + 1, s->cx + 1);
|
input_store_two(b, CODE_CURSORMOVE, s->cy + 1, s->cx + 1);
|
||||||
|
|
||||||
|
input_store_two(b, CODE_ATTRIBUTES, s->attr, s->colr);
|
||||||
if (s->mode & MODE_CURSOR)
|
if (s->mode & MODE_CURSOR)
|
||||||
input_store_zero(b, CODE_CURSORON);
|
input_store_zero(b, CODE_CURSORON);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store screen atttributes in buffer. */
|
|
||||||
size_t
|
|
||||||
screen_store_attributes(struct buffer *b, u_char attr)
|
|
||||||
{
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
if (attr == 0) {
|
|
||||||
input_store16(b, 0);
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
n = 0;
|
|
||||||
if (attr & ATTR_BRIGHT) {
|
|
||||||
input_store16(b, 1);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (attr & ATTR_DIM) {
|
|
||||||
input_store16(b, 2);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (attr & ATTR_ITALICS) {
|
|
||||||
input_store16(b, 3);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (attr & ATTR_UNDERSCORE) {
|
|
||||||
input_store16(b, 4);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (attr & ATTR_BLINK) {
|
|
||||||
input_store16(b, 5);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (attr & ATTR_REVERSE) {
|
|
||||||
input_store16(b, 7);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
if (attr & ATTR_HIDDEN) {
|
|
||||||
input_store16(b, 8);
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
return (n);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Store screen colours in buffer. */
|
|
||||||
size_t
|
|
||||||
screen_store_colours(struct buffer *b, u_char colr)
|
|
||||||
{
|
|
||||||
uint16_t v;
|
|
||||||
|
|
||||||
v = colr >> 4;
|
|
||||||
if (v == 8)
|
|
||||||
v = 9;
|
|
||||||
input_store16(b, 30 + v);
|
|
||||||
v = colr & 0xf;
|
|
||||||
if (v == 8)
|
|
||||||
v = 9;
|
|
||||||
input_store16(b, 40 + v);
|
|
||||||
|
|
||||||
return (2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make a range of lines. */
|
/* Make a range of lines. */
|
||||||
void
|
void
|
||||||
screen_make_lines(struct screen *s, u_int py, u_int ny)
|
screen_make_lines(struct screen *s, u_int py, u_int ny)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: server-fn.c,v 1.8 2007-09-29 13:22:15 nicm Exp $ */
|
/* $Id: server-fn.c,v 1.9 2007-10-01 14:18:42 nicm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -203,9 +203,7 @@ server_write_message(struct client *c, const char *fmt, ...)
|
|||||||
|
|
||||||
input_store_zero(c->out, CODE_CURSOROFF);
|
input_store_zero(c->out, CODE_CURSOROFF);
|
||||||
input_store_two(c->out, CODE_CURSORMOVE, c->sy, 1);
|
input_store_two(c->out, CODE_CURSORMOVE, c->sy, 1);
|
||||||
input_store_one(c->out, CODE_ATTRIBUTES, 2);
|
input_store_two(c->out, CODE_ATTRIBUTES, ATTR_REVERSE, 0x88);
|
||||||
input_store16(c->out, 0);
|
|
||||||
input_store16(c->out, 7);
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
xvasprintf(&msg, fmt, ap);
|
xvasprintf(&msg, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
4
tmux.h
4
tmux.h
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tmux.h,v 1.29 2007-10-01 14:15:48 nicm Exp $ */
|
/* $Id: tmux.h,v 1.30 2007-10-01 14:18:42 nicm Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -568,8 +568,6 @@ void screen_create(struct screen *, u_int, u_int);
|
|||||||
void screen_destroy(struct screen *);
|
void screen_destroy(struct screen *);
|
||||||
void screen_resize(struct screen *, u_int, u_int);
|
void screen_resize(struct screen *, u_int, u_int);
|
||||||
void screen_draw(struct screen *, struct buffer *, u_int, u_int);
|
void screen_draw(struct screen *, struct buffer *, u_int, u_int);
|
||||||
size_t screen_store_attributes(struct buffer *, u_char);
|
|
||||||
size_t screen_store_colours(struct buffer *, u_char);
|
|
||||||
void screen_write_character(struct screen *, u_char);
|
void screen_write_character(struct screen *, u_char);
|
||||||
void screen_insert_lines(struct screen *, u_int, u_int);
|
void screen_insert_lines(struct screen *, u_int, u_int);
|
||||||
void screen_insert_lines_region(struct screen *, u_int, u_int);
|
void screen_insert_lines_region(struct screen *, u_int, u_int);
|
||||||
|
Loading…
Reference in New Issue
Block a user