1
0
mirror of https://github.com/tmate-io/tmate-ssh-server.git synced 2020-11-18 19:53:51 -08:00

Sync OpenBSD patchset 915:

Support xterm(1) cursor colour change sequences through terminfo(5) Cc
(set) and Cr (reset) extensions. Originally by Sean Estabrooks, tweaked
by me and Ailin Nemui.
This commit is contained in:
Tiago Cunha 2011-05-22 16:25:02 +00:00
parent 89f35125b4
commit 719755574d
8 changed files with 110 additions and 24 deletions

38
input.c
View File

@ -1,4 +1,4 @@
/* $Id: input.c,v 1.117 2011-03-19 23:30:37 tcunha Exp $ */ /* $Id: input.c,v 1.118 2011-05-22 16:25:02 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -1445,17 +1445,39 @@ input_enter_osc(struct input_ctx *ictx)
void void
input_exit_osc(struct input_ctx *ictx) input_exit_osc(struct input_ctx *ictx)
{ {
u_char *p = ictx->input_buf;
int option;
if (ictx->flags & INPUT_DISCARD) if (ictx->flags & INPUT_DISCARD)
return; return;
log_debug("%s: \"%s\"", __func__, ictx->input_buf); if (ictx->input_len < 1 || *p < '0' || *p > '9')
if (ictx->input_len < 2 || ictx->input_buf[1] != ';')
return;
if (ictx->input_buf[0] != '0' && ictx->input_buf[0] != '2')
return; return;
screen_set_title(ictx->ctx.s, ictx->input_buf + 2); log_debug("%s: \"%s\"", __func__, p);
server_status_window(ictx->wp->window);
option = 0;
while (*p >= '0' && *p <= '9')
option = option * 10 + *p++ - '0';
if (*p == ';')
p++;
switch (option) {
case 0:
case 2:
screen_set_title(ictx->ctx.s, p);
server_status_window(ictx->wp->window);
break;
case 12:
screen_set_cursor_colour(ictx->ctx.s, p);
break;
case 112:
if (*p == '\0') /* No arguments allowed. */
screen_set_cursor_colour(ictx->ctx.s, "");
break;
default:
log_debug("%s: unknown '%u'", __func__, option);
break;
}
} }
/* APC string started. */ /* APC string started. */

View File

@ -1,4 +1,4 @@
/* $Id: options-table.c,v 1.10 2011-05-22 16:23:07 tcunha Exp $ */ /* $Id: options-table.c,v 1.11 2011-05-22 16:25:02 tcunha Exp $ */
/* /*
* Copyright (c) 2011 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2011 Nicholas Marriott <nicm@users.sourceforge.net>
@ -365,13 +365,14 @@ const struct options_table_entry session_options_table[] = {
{ .name = "terminal-overrides", { .name = "terminal-overrides",
.type = OPTIONS_TABLE_STRING, .type = OPTIONS_TABLE_STRING,
.default_str = "*88col*:colors=88,*256col*:colors=256" .default_str = "*88col*:colors=88,*256col*:colors=256"
",xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007" ",xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007"
":Cc=\\E]12;%p1%s\\007:Cr=\\E]112\\007"
}, },
{ .name = "update-environment", { .name = "update-environment",
.type = OPTIONS_TABLE_STRING, .type = OPTIONS_TABLE_STRING,
.default_str = "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID " .default_str = "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID "
"SSH_CONNECTION WINDOWID XAUTHORITY" "SSH_CONNECTION WINDOWID XAUTHORITY"
}, },

View File

@ -1,4 +1,4 @@
/* $Id: screen.c,v 1.104 2011-05-05 10:10:57 tcunha Exp $ */ /* $Id: screen.c,v 1.105 2011-05-22 16:25:02 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -41,6 +41,7 @@ screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit)
else else
s->title = xstrdup(""); s->title = xstrdup("");
s->ccolour = xstrdup("");
s->tabs = NULL; s->tabs = NULL;
screen_reinit(s); screen_reinit(s);
@ -72,6 +73,7 @@ screen_free(struct screen *s)
if (s->tabs != NULL) if (s->tabs != NULL)
xfree(s->tabs); xfree(s->tabs);
xfree(s->title); xfree(s->title);
xfree(s->ccolour);
grid_destroy(s->grid); grid_destroy(s->grid);
} }
@ -90,6 +92,14 @@ screen_reset_tabs(struct screen *s)
bit_set(s->tabs, i); bit_set(s->tabs, i);
} }
/* Set screen cursor colour. */
void
screen_set_cursor_colour(struct screen *s, const char *colour_string)
{
xfree(s->ccolour);
s->ccolour = xstrdup(colour_string);
}
/* Set screen title. */ /* Set screen title. */
void void
screen_set_title(struct screen *s, const char *title) screen_set_title(struct screen *s, const char *title)

View File

@ -1,4 +1,4 @@
/* $Id: server-client.c,v 1.61 2011-05-18 20:31:32 tcunha Exp $ */ /* $Id: server-client.c,v 1.62 2011-05-22 16:25:02 tcunha Exp $ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@ -520,7 +520,7 @@ server_client_reset_state(struct client *c)
mode &= ~MODE_MOUSE_UTF8; mode &= ~MODE_MOUSE_UTF8;
/* Set the terminal mode and reset attributes. */ /* Set the terminal mode and reset attributes. */
tty_update_mode(&c->tty, mode); tty_update_mode(&c->tty, mode, s);
tty_reset(&c->tty); tty_reset(&c->tty);
} }

13
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.314 2011-05-22 16:23:07 tcunha Exp $ .\" $Id: tmux.1,v 1.315 2011-05-22 16:25:02 tcunha Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\" .\"
@ -14,7 +14,7 @@
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: May 18 2011 $ .Dd $Mdocdate: May 20 2011 $
.Dt TMUX 1 .Dt TMUX 1
.Os .Os
.Sh NAME .Sh NAME
@ -2836,6 +2836,15 @@ See the
option above and the option above and the
.Xr xterm 1 .Xr xterm 1
man page. man page.
.It Em Cc, Cr
The first takes one string argument and is used to set the cursor colour;
the second takes no arguments and restores the default cursor colour.
If they present, a sequence such as this may be used to change the
cursor colour from inside
.Nm :
.Bd -literal -offset indent
$ printf '\e033]12;red\e033\e\e'
.Ed
.El .El
.Sh FILES .Sh FILES
.Bl -tag -width "/etc/tmux.confXXX" -compact .Bl -tag -width "/etc/tmux.confXXX" -compact

14
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.625 2011-05-22 16:23:07 tcunha Exp $ */ /* $Id: tmux.h,v 1.626 2011-05-22 16:25:02 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -179,10 +179,12 @@ enum tty_code_code {
TTYC_BEL, /* bell, bl */ TTYC_BEL, /* bell, bl */
TTYC_BLINK, /* enter_blink_mode, mb */ TTYC_BLINK, /* enter_blink_mode, mb */
TTYC_BOLD, /* enter_bold_mode, md */ TTYC_BOLD, /* enter_bold_mode, md */
TTYC_CC, /* set colour cursor, Cc */
TTYC_CIVIS, /* cursor_invisible, vi */ TTYC_CIVIS, /* cursor_invisible, vi */
TTYC_CLEAR, /* clear_screen, cl */ TTYC_CLEAR, /* clear_screen, cl */
TTYC_CNORM, /* cursor_normal, ve */ TTYC_CNORM, /* cursor_normal, ve */
TTYC_COLORS, /* max_colors, Co */ TTYC_COLORS, /* max_colors, Co */
TTYC_CR, /* restore cursor colour, Cr */
TTYC_CSR, /* change_scroll_region, cs */ TTYC_CSR, /* change_scroll_region, cs */
TTYC_CUB, /* parm_left_cursor, LE */ TTYC_CUB, /* parm_left_cursor, LE */
TTYC_CUB1, /* cursor_left, le */ TTYC_CUB1, /* cursor_left, le */
@ -710,6 +712,8 @@ struct screen {
u_int cx; /* cursor x */ u_int cx; /* cursor x */
u_int cy; /* cursor y */ u_int cy; /* cursor y */
char *ccolour; /* cursor colour string */
u_int rupper; /* scroll region top */ u_int rupper; /* scroll region top */
u_int rlower; /* scroll region bottom */ u_int rlower; /* scroll region bottom */
@ -1006,6 +1010,7 @@ struct tty {
u_int cx; u_int cx;
u_int cy; u_int cy;
char *ccolour;
int mode; int mode;
@ -1410,6 +1415,7 @@ void tty_cursor(struct tty *, u_int, u_int);
void tty_putcode(struct tty *, enum tty_code_code); void tty_putcode(struct tty *, enum tty_code_code);
void tty_putcode1(struct tty *, enum tty_code_code, int); void tty_putcode1(struct tty *, enum tty_code_code, int);
void tty_putcode2(struct tty *, enum tty_code_code, int, int); void tty_putcode2(struct tty *, enum tty_code_code, int, int);
void tty_putcode_ptr1(struct tty *, enum tty_code_code, const void *);
void tty_putcode_ptr2(struct tty *, enum tty_code_code, const void *, const void *); void tty_putcode_ptr2(struct tty *, enum tty_code_code, const void *, const void *);
void tty_puts(struct tty *, const char *); void tty_puts(struct tty *, const char *);
void tty_putc(struct tty *, u_char); void tty_putc(struct tty *, u_char);
@ -1419,7 +1425,8 @@ int tty_resize(struct tty *);
void tty_start_tty(struct tty *); void tty_start_tty(struct tty *);
void tty_stop_tty(struct tty *); void tty_stop_tty(struct tty *);
void tty_set_title(struct tty *, const char *); void tty_set_title(struct tty *, const char *);
void tty_update_mode(struct tty *, int); 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_line(struct tty *, struct screen *, u_int, u_int, u_int);
int tty_open(struct tty *, const char *, char **); int tty_open(struct tty *, const char *, char **);
void tty_close(struct tty *); void tty_close(struct tty *);
@ -1455,6 +1462,8 @@ const char *tty_term_string(struct tty_term *, enum tty_code_code);
const char *tty_term_string1(struct tty_term *, enum tty_code_code, int); const char *tty_term_string1(struct tty_term *, enum tty_code_code, int);
const char *tty_term_string2( const char *tty_term_string2(
struct tty_term *, enum tty_code_code, int, int); struct tty_term *, enum tty_code_code, int, int);
const char *tty_term_ptr1(
struct tty_term *, enum tty_code_code, const void *);
const char *tty_term_ptr2( const char *tty_term_ptr2(
struct tty_term *, enum tty_code_code, const void *, const void *); struct tty_term *, enum tty_code_code, const void *, const void *);
int tty_term_number(struct tty_term *, enum tty_code_code); int tty_term_number(struct tty_term *, enum tty_code_code);
@ -1837,6 +1846,7 @@ void screen_init(struct screen *, u_int, u_int, u_int);
void screen_reinit(struct screen *); void screen_reinit(struct screen *);
void screen_free(struct screen *); void screen_free(struct screen *);
void screen_reset_tabs(struct screen *); void screen_reset_tabs(struct screen *);
void screen_set_cursor_colour(struct screen *, const char *);
void screen_set_title(struct screen *, const char *); void screen_set_title(struct screen *, const char *);
void screen_resize(struct screen *, u_int, u_int); void screen_resize(struct screen *, u_int, u_int);
void screen_set_selection(struct screen *, void screen_set_selection(struct screen *,

View File

@ -1,4 +1,4 @@
/* $Id: tty-term.c,v 1.49 2011-05-22 16:23:07 tcunha Exp $ */ /* $Id: tty-term.c,v 1.50 2011-05-22 16:25:02 tcunha Exp $ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@ -41,10 +41,12 @@ const struct tty_term_code_entry tty_term_codes[NTTYCODE] = {
{ TTYC_BEL, TTYCODE_STRING, "bel" }, { TTYC_BEL, TTYCODE_STRING, "bel" },
{ TTYC_BLINK, TTYCODE_STRING, "blink" }, { TTYC_BLINK, TTYCODE_STRING, "blink" },
{ TTYC_BOLD, TTYCODE_STRING, "bold" }, { TTYC_BOLD, TTYCODE_STRING, "bold" },
{ TTYC_CC, TTYCODE_STRING, "Cc" },
{ TTYC_CIVIS, TTYCODE_STRING, "civis" }, { TTYC_CIVIS, TTYCODE_STRING, "civis" },
{ TTYC_CLEAR, TTYCODE_STRING, "clear" }, { TTYC_CLEAR, TTYCODE_STRING, "clear" },
{ TTYC_CNORM, TTYCODE_STRING, "cnorm" }, { TTYC_CNORM, TTYCODE_STRING, "cnorm" },
{ TTYC_COLORS, TTYCODE_NUMBER, "colors" }, { TTYC_COLORS, TTYCODE_NUMBER, "colors" },
{ TTYC_CR, TTYCODE_STRING, "Cr" },
{ TTYC_CSR, TTYCODE_STRING, "csr" }, { TTYC_CSR, TTYCODE_STRING, "csr" },
{ TTYC_CUB, TTYCODE_STRING, "cub" }, { TTYC_CUB, TTYCODE_STRING, "cub" },
{ TTYC_CUB1, TTYCODE_STRING, "cub1" }, { TTYC_CUB1, TTYCODE_STRING, "cub1" },
@ -498,6 +500,12 @@ tty_term_string2(struct tty_term *term, enum tty_code_code code, int a, int b)
return (tparm((char *) tty_term_string(term, code), a, b)); return (tparm((char *) tty_term_string(term, code), a, b));
} }
const char *
tty_term_ptr1(struct tty_term *term, enum tty_code_code code, const void *a)
{
return (tparm((char *) tty_term_string(term, code), a));
}
const char * const char *
tty_term_ptr2(struct tty_term *term, enum tty_code_code code, const void *a, const void *b) tty_term_ptr2(struct tty_term *term, enum tty_code_code code, const void *a, const void *b)
{ {

36
tty.c
View File

@ -1,4 +1,4 @@
/* $Id: tty.c,v 1.210 2011-05-22 16:23:07 tcunha Exp $ */ /* $Id: tty.c,v 1.211 2011-05-22 16:25:02 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -69,6 +69,7 @@ tty_init(struct tty *tty, int fd, char *term)
if ((path = ttyname(fd)) == NULL) if ((path = ttyname(fd)) == NULL)
fatalx("ttyname failed"); fatalx("ttyname failed");
tty->path = xstrdup(path); tty->path = xstrdup(path);
tty->ccolour = xstrdup("");
tty->flags = 0; tty->flags = 0;
tty->term_flags = 0; tty->term_flags = 0;
@ -210,6 +211,8 @@ tty_start_tty(struct tty *tty)
tty->mode = MODE_CURSOR; tty->mode = MODE_CURSOR;
tty->flags |= TTY_STARTED; tty->flags |= TTY_STARTED;
tty_force_cursor_colour(tty, "");
} }
void void
@ -241,6 +244,7 @@ tty_stop_tty(struct tty *tty)
tty_raw(tty, tty_term_string(tty->term, TTYC_SGR0)); tty_raw(tty, tty_term_string(tty->term, TTYC_SGR0));
tty_raw(tty, tty_term_string(tty->term, TTYC_RMKX)); tty_raw(tty, tty_term_string(tty->term, TTYC_RMKX));
tty_raw(tty, tty_term_string(tty->term, TTYC_CLEAR)); tty_raw(tty, tty_term_string(tty->term, TTYC_CLEAR));
tty_raw(tty, tty_term_string(tty->term, TTYC_CR));
tty_raw(tty, tty_term_string(tty->term, TTYC_CNORM)); tty_raw(tty, tty_term_string(tty->term, TTYC_CNORM));
if (tty_term_has(tty->term, TTYC_KMOUS)) if (tty_term_has(tty->term, TTYC_KMOUS))
@ -280,6 +284,7 @@ tty_free(struct tty *tty)
{ {
tty_close(tty); tty_close(tty);
xfree(tty->ccolour);
if (tty->path != NULL) if (tty->path != NULL)
xfree(tty->path); xfree(tty->path);
if (tty->termname != NULL) if (tty->termname != NULL)
@ -314,6 +319,13 @@ tty_putcode2(struct tty *tty, enum tty_code_code code, int a, int b)
tty_puts(tty, tty_term_string2(tty->term, code, a, b)); tty_puts(tty, tty_term_string2(tty->term, code, a, b));
} }
void
tty_putcode_ptr1(struct tty *tty, enum tty_code_code code, const void *a)
{
if (a != NULL)
tty_puts(tty, tty_term_ptr1(tty->term, code, a));
}
void void
tty_putcode_ptr2(struct tty *tty, enum tty_code_code code, const void *a, const void *b) tty_putcode_ptr2(struct tty *tty, enum tty_code_code code, const void *a, const void *b)
{ {
@ -389,10 +401,24 @@ tty_set_title(struct tty *tty, const char *title)
} }
void void
tty_update_mode(struct tty *tty, int mode) tty_force_cursor_colour(struct tty *tty, const char *ccolour)
{
if (*ccolour == '\0')
tty_putcode(tty, TTYC_CR);
else
tty_putcode_ptr1(tty, TTYC_CC, ccolour);
xfree(tty->ccolour);
tty->ccolour = xstrdup(ccolour);
}
void
tty_update_mode(struct tty *tty, int mode, struct screen *s)
{ {
int changed; int changed;
if (strcmp(s->ccolour, tty->ccolour))
tty_force_cursor_colour(tty, s->ccolour);
if (tty->flags & TTY_NOCURSOR) if (tty->flags & TTY_NOCURSOR)
mode &= ~MODE_CURSOR; mode &= ~MODE_CURSOR;
@ -486,7 +512,7 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy)
const struct grid_utf8 *gu; const struct grid_utf8 *gu;
u_int i, sx; u_int i, sx;
tty_update_mode(tty, tty->mode & ~MODE_CURSOR); tty_update_mode(tty, tty->mode & ~MODE_CURSOR, s);
sx = screen_size_x(s); sx = screen_size_x(s);
if (sx > s->grid->linedata[s->grid->hsize + py].cellsize) if (sx > s->grid->linedata[s->grid->hsize + py].cellsize)
@ -526,7 +552,7 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy)
} }
if (sx >= tty->sx) { if (sx >= tty->sx) {
tty_update_mode(tty, tty->mode); tty_update_mode(tty, tty->mode, s);
return; return;
} }
tty_reset(tty); tty_reset(tty);
@ -538,7 +564,7 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy)
for (i = sx; i < screen_size_x(s); i++) for (i = sx; i < screen_size_x(s); i++)
tty_putc(tty, ' '); tty_putc(tty, ' ');
} }
tty_update_mode(tty, tty->mode); tty_update_mode(tty, tty->mode, s);
} }
void void