mirror of
https://github.com/tmate-io/tmate.git
synced 2024-11-30 12:04:38 +01:00
Sync OpenBSD patchset 1054:
Send secondary DA to terminals with XT in terminfo when starting up and parse it to work out the xterm version.
This commit is contained in:
parent
3b990ef6b2
commit
070d266aae
@ -88,12 +88,12 @@ cmd_server_info_exec(unused struct cmd *self, struct cmd_ctx *ctx)
|
|||||||
if (c == NULL || c->session == NULL)
|
if (c == NULL || c->session == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ctx->print(ctx,"%2d: %s (%d, %d): %s [%ux%u %s bs=%hho] "
|
ctx->print(ctx,"%2d: %s (%d, %d): %s [%ux%u %s bs=%hho "
|
||||||
"[flags=0x%x/0x%x, references=%u]", i, c->tty.path,
|
"xterm=%u] [flags=0x%x/0x%x, references=%u]", i,
|
||||||
c->ibuf.fd, c->tty.fd, c->session->name,
|
c->tty.path, c->ibuf.fd, c->tty.fd, c->session->name,
|
||||||
c->tty.sx, c->tty.sy, c->tty.termname,
|
c->tty.sx, c->tty.sy, c->tty.termname,
|
||||||
c->tty.tio.c_cc[VERASE], c->flags,
|
c->tty.tio.c_cc[VERASE], c->tty.xterm_version,
|
||||||
c->tty.flags, c->references);
|
c->flags, c->tty.flags, c->references);
|
||||||
}
|
}
|
||||||
ctx->print(ctx, "%s", "");
|
ctx->print(ctx, "%s", "");
|
||||||
|
|
||||||
|
1
tmux.h
1
tmux.h
@ -1009,6 +1009,7 @@ LIST_HEAD(tty_terms, tty_term);
|
|||||||
|
|
||||||
struct tty {
|
struct tty {
|
||||||
char *path;
|
char *path;
|
||||||
|
u_int xterm_version;
|
||||||
|
|
||||||
u_int sx;
|
u_int sx;
|
||||||
u_int sy;
|
u_int sy;
|
||||||
|
78
tty-keys.c
78
tty-keys.c
@ -19,6 +19,8 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -40,6 +42,7 @@ struct tty_key *tty_keys_find(struct tty *, const char *, size_t, size_t *);
|
|||||||
void tty_keys_callback(int, short, void *);
|
void tty_keys_callback(int, short, void *);
|
||||||
int tty_keys_mouse(struct tty *,
|
int tty_keys_mouse(struct tty *,
|
||||||
const char *, size_t, size_t *, struct mouse_event *);
|
const char *, size_t, size_t *, struct mouse_event *);
|
||||||
|
int tty_keys_device(struct tty *, const char *, size_t, size_t *);
|
||||||
|
|
||||||
struct tty_key_ent {
|
struct tty_key_ent {
|
||||||
enum tty_code_code code;
|
enum tty_code_code code;
|
||||||
@ -461,6 +464,19 @@ tty_keys_next(struct tty *tty)
|
|||||||
goto handle_key;
|
goto handle_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Is this device attributes response? */
|
||||||
|
switch (tty_keys_device(tty, buf, len, &size)) {
|
||||||
|
case 0: /* yes */
|
||||||
|
evbuffer_drain(tty->event->input, size);
|
||||||
|
key = KEYC_NONE;
|
||||||
|
goto handle_key;
|
||||||
|
case -1: /* no, or not valid */
|
||||||
|
break;
|
||||||
|
case 1: /* partial */
|
||||||
|
goto partial_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Is this a mouse key press? */
|
/* Is this a mouse key press? */
|
||||||
switch (tty_keys_mouse(tty, buf, len, &size, &mouse)) {
|
switch (tty_keys_mouse(tty, buf, len, &size, &mouse)) {
|
||||||
case 0: /* yes */
|
case 0: /* yes */
|
||||||
@ -559,7 +575,8 @@ found_key:
|
|||||||
handle_key:
|
handle_key:
|
||||||
evtimer_del(&tty->key_timer);
|
evtimer_del(&tty->key_timer);
|
||||||
|
|
||||||
tty->key_callback(key, &mouse, tty->key_data);
|
if (key != KEYC_NONE)
|
||||||
|
tty->key_callback(key, &mouse, tty->key_data);
|
||||||
|
|
||||||
tty->flags &= ~TTY_ESCAPE;
|
tty->flags &= ~TTY_ESCAPE;
|
||||||
return (1);
|
return (1);
|
||||||
@ -655,3 +672,62 @@ tty_keys_mouse(struct tty *tty,
|
|||||||
log_debug("mouse position: x=%u y=%u b=%u", m->x, m->y, m->b);
|
log_debug("mouse position: x=%u y=%u b=%u", m->x, m->y, m->b);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle device attributes input. Returns 0 for success, -1 for failure, 1 for
|
||||||
|
* partial.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
tty_keys_device(struct tty *tty, const char *buf, size_t len, size_t *size)
|
||||||
|
{
|
||||||
|
u_int i, a, b;
|
||||||
|
char tmp[64], *endptr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Secondary device attributes are \033[>a;b;c. We only request
|
||||||
|
* attributes on xterm, so we only care about the middle values which
|
||||||
|
* is the xterm version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
*size = 0;
|
||||||
|
|
||||||
|
/* First three bytes are always \033[>. */
|
||||||
|
if (buf[0] != '\033')
|
||||||
|
return (-1);
|
||||||
|
if (len == 1)
|
||||||
|
return (1);
|
||||||
|
if (buf[1] != '[')
|
||||||
|
return (-1);
|
||||||
|
if (len == 2)
|
||||||
|
return (1);
|
||||||
|
if (buf[2] != '>')
|
||||||
|
return (-1);
|
||||||
|
if (len == 3)
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
/* Copy the rest up to a 'c'. */
|
||||||
|
for (i = 0; i < (sizeof tmp) - 1 && buf[3 + i] != 'c'; i++) {
|
||||||
|
if (3 + i == len)
|
||||||
|
return (1);
|
||||||
|
tmp[i] = buf[3 + i];
|
||||||
|
}
|
||||||
|
if (i == (sizeof tmp) - 1)
|
||||||
|
return (-1);
|
||||||
|
tmp[i] = '\0';
|
||||||
|
*size = 4 + i;
|
||||||
|
|
||||||
|
/* Convert version numbers. */
|
||||||
|
a = strtoul(tmp, &endptr, 10);
|
||||||
|
if (*endptr == ';') {
|
||||||
|
b = strtoul(endptr + 1, &endptr, 10);
|
||||||
|
if (*endptr != '\0' && *endptr != ';')
|
||||||
|
b = 0;
|
||||||
|
} else
|
||||||
|
a = b = 0;
|
||||||
|
|
||||||
|
log_debug("received xterm version %u", b);
|
||||||
|
if (tty->xterm_version == 0)
|
||||||
|
tty->xterm_version = b;
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
3
tty.c
3
tty.c
@ -211,6 +211,9 @@ tty_start_tty(struct tty *tty)
|
|||||||
if (tty_term_has(tty->term, TTYC_KMOUS))
|
if (tty_term_has(tty->term, TTYC_KMOUS))
|
||||||
tty_puts(tty, "\033[?1000l");
|
tty_puts(tty, "\033[?1000l");
|
||||||
|
|
||||||
|
if (tty_term_has(tty->term, TTYC_XT))
|
||||||
|
tty_puts(tty, "\033[>c");
|
||||||
|
|
||||||
tty->cx = UINT_MAX;
|
tty->cx = UINT_MAX;
|
||||||
tty->cy = UINT_MAX;
|
tty->cy = UINT_MAX;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user