Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam
2020-04-16 18:01:32 +01:00
4 changed files with 76 additions and 63 deletions

View File

@ -23,8 +23,6 @@
#include "tmux.h" #include "tmux.h"
static void screen_write_initctx(struct screen_write_ctx *,
struct tty_ctx *);
static void screen_write_collect_clear(struct screen_write_ctx *, u_int, static void screen_write_collect_clear(struct screen_write_ctx *, u_int,
u_int); u_int);
static void screen_write_collect_scroll(struct screen_write_ctx *); static void screen_write_collect_scroll(struct screen_write_ctx *);
@ -95,12 +93,35 @@ screen_write_set_cursor(struct screen_write_ctx *ctx, int cx, int cy)
evtimer_add(&w->offset_timer, &tv); evtimer_add(&w->offset_timer, &tv);
} }
/* Set up context for TTY command. */
static void
screen_write_initctx(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx,
int sync)
{
struct screen *s = ctx->s;
memset(ttyctx, 0, sizeof *ttyctx);
ttyctx->wp = ctx->wp;
ttyctx->ocx = s->cx;
ttyctx->ocy = s->cy;
ttyctx->orlower = s->rlower;
ttyctx->orupper = s->rupper;
if (sync && !ctx->sync && ttyctx->wp != NULL) {
log_debug("%s: starting sync", __func__);
tty_write(tty_cmd_syncstart, ttyctx);
ctx->sync = 1;
}
}
/* Initialize writing with a window. */ /* Initialize writing with a window. */
void void
screen_write_start(struct screen_write_ctx *ctx, struct window_pane *wp, screen_write_start(struct screen_write_ctx *ctx, struct window_pane *wp,
struct screen *s) struct screen *s)
{ {
struct tty_ctx ttyctx;
u_int y; u_int y;
memset(ctx, 0, sizeof *ctx); memset(ctx, 0, sizeof *ctx);
@ -130,9 +151,6 @@ screen_write_start(struct screen_write_ctx *ctx, struct window_pane *wp,
screen_size_y(ctx->s)); screen_size_y(ctx->s));
} }
} }
screen_write_initctx(ctx, &ttyctx);
tty_write(tty_cmd_syncstart, &ttyctx);
} }
/* Finish writing. */ /* Finish writing. */
@ -147,8 +165,11 @@ screen_write_stop(struct screen_write_ctx *ctx)
log_debug("%s: %u cells (%u written, %u skipped)", __func__, log_debug("%s: %u cells (%u written, %u skipped)", __func__,
ctx->cells, ctx->written, ctx->skipped); ctx->cells, ctx->written, ctx->skipped);
screen_write_initctx(ctx, &ttyctx); if (ctx->sync) {
screen_write_initctx(ctx, &ttyctx, 0);
tty_write(tty_cmd_syncend, &ttyctx); tty_write(tty_cmd_syncend, &ttyctx);
log_debug("%s: ending sync", __func__);
}
free(ctx->item); free(ctx->item);
free(ctx->list); /* flush will have emptied */ free(ctx->list); /* flush will have emptied */
@ -557,23 +578,6 @@ screen_write_preview(struct screen_write_ctx *ctx, struct screen *src, u_int nx,
} }
} }
/* Set up context for TTY command. */
static void
screen_write_initctx(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx)
{
struct screen *s = ctx->s;
memset(ttyctx, 0, sizeof *ttyctx);
ttyctx->wp = ctx->wp;
ttyctx->ocx = s->cx;
ttyctx->ocy = s->cy;
ttyctx->orlower = s->rlower;
ttyctx->orupper = s->rupper;
}
/* Set a mode. */ /* Set a mode. */
void void
screen_write_mode_set(struct screen_write_ctx *ctx, int mode) screen_write_mode_set(struct screen_write_ctx *ctx, int mode)
@ -732,7 +736,7 @@ screen_write_alignmenttest(struct screen_write_ctx *ctx)
s->rupper = 0; s->rupper = 0;
s->rlower = screen_size_y(s) - 1; s->rlower = screen_size_y(s) - 1;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
screen_write_collect_clear(ctx, 0, screen_size_y(s) - 1); screen_write_collect_clear(ctx, 0, screen_size_y(s) - 1);
tty_write(tty_cmd_alignmenttest, &ttyctx); tty_write(tty_cmd_alignmenttest, &ttyctx);
@ -756,7 +760,7 @@ screen_write_insertcharacter(struct screen_write_ctx *ctx, u_int nx, u_int bg)
if (s->cx > screen_size_x(s) - 1) if (s->cx > screen_size_x(s) - 1)
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 0);
ttyctx.bg = bg; ttyctx.bg = bg;
grid_view_insert_cells(s->grid, s->cx, s->cy, nx, bg); grid_view_insert_cells(s->grid, s->cx, s->cy, nx, bg);
@ -784,7 +788,7 @@ screen_write_deletecharacter(struct screen_write_ctx *ctx, u_int nx, u_int bg)
if (s->cx > screen_size_x(s) - 1) if (s->cx > screen_size_x(s) - 1)
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 0);
ttyctx.bg = bg; ttyctx.bg = bg;
grid_view_delete_cells(s->grid, s->cx, s->cy, nx, bg); grid_view_delete_cells(s->grid, s->cx, s->cy, nx, bg);
@ -812,7 +816,7 @@ screen_write_clearcharacter(struct screen_write_ctx *ctx, u_int nx, u_int bg)
if (s->cx > screen_size_x(s) - 1) if (s->cx > screen_size_x(s) - 1)
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 0);
ttyctx.bg = bg; ttyctx.bg = bg;
grid_view_clear(s->grid, s->cx, s->cy, nx, 1, bg); grid_view_clear(s->grid, s->cx, s->cy, nx, 1, bg);
@ -839,7 +843,7 @@ screen_write_insertline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
if (ny == 0) if (ny == 0)
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
grid_view_insert_lines(gd, s->cy, ny, bg); grid_view_insert_lines(gd, s->cy, ny, bg);
@ -855,7 +859,7 @@ screen_write_insertline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
if (ny == 0) if (ny == 0)
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
if (s->cy < s->rupper || s->cy > s->rlower) if (s->cy < s->rupper || s->cy > s->rlower)
@ -885,7 +889,7 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
if (ny == 0) if (ny == 0)
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
grid_view_delete_lines(gd, s->cy, ny, bg); grid_view_delete_lines(gd, s->cy, ny, bg);
@ -901,7 +905,7 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny, u_int bg)
if (ny == 0) if (ny == 0)
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
if (s->cy < s->rupper || s->cy > s->rlower) if (s->cy < s->rupper || s->cy > s->rlower)
@ -927,7 +931,7 @@ screen_write_clearline(struct screen_write_ctx *ctx, u_int bg)
if (gl->cellsize == 0 && COLOUR_DEFAULT(bg)) if (gl->cellsize == 0 && COLOUR_DEFAULT(bg))
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
grid_view_clear(s->grid, 0, s->cy, sx, 1, bg); grid_view_clear(s->grid, 0, s->cy, sx, 1, bg);
@ -950,7 +954,7 @@ screen_write_clearendofline(struct screen_write_ctx *ctx, u_int bg)
if (s->cx > sx - 1 || (s->cx >= gl->cellsize && COLOUR_DEFAULT(bg))) if (s->cx > sx - 1 || (s->cx >= gl->cellsize && COLOUR_DEFAULT(bg)))
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
grid_view_clear(s->grid, s->cx, s->cy, sx - s->cx, 1, bg); grid_view_clear(s->grid, s->cx, s->cy, sx - s->cx, 1, bg);
@ -969,7 +973,7 @@ screen_write_clearstartofline(struct screen_write_ctx *ctx, u_int bg)
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
u_int sx = screen_size_x(s); u_int sx = screen_size_x(s);
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
if (s->cx > sx - 1) if (s->cx > sx - 1)
@ -1012,7 +1016,7 @@ screen_write_reverseindex(struct screen_write_ctx *ctx, u_int bg)
struct screen *s = ctx->s; struct screen *s = ctx->s;
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
if (s->cy == s->rupper) if (s->cy == s->rupper)
@ -1111,7 +1115,7 @@ screen_write_scrolldown(struct screen_write_ctx *ctx, u_int lines, u_int bg)
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
u_int i; u_int i;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
if (lines == 0) if (lines == 0)
@ -1143,7 +1147,7 @@ screen_write_clearendofscreen(struct screen_write_ctx *ctx, u_int bg)
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
u_int sx = screen_size_x(s), sy = screen_size_y(s); u_int sx = screen_size_x(s), sy = screen_size_y(s);
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
/* Scroll into history if it is enabled and clearing entire screen. */ /* Scroll into history if it is enabled and clearing entire screen. */
@ -1168,7 +1172,7 @@ screen_write_clearstartofscreen(struct screen_write_ctx *ctx, u_int bg)
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
u_int sx = screen_size_x(s); u_int sx = screen_size_x(s);
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
if (s->cy > 0) if (s->cy > 0)
@ -1191,7 +1195,7 @@ screen_write_clearscreen(struct screen_write_ctx *ctx, u_int bg)
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
u_int sx = screen_size_x(s), sy = screen_size_y(s); u_int sx = screen_size_x(s), sy = screen_size_y(s);
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.bg = bg; ttyctx.bg = bg;
/* Scroll into history if it is enabled. */ /* Scroll into history if it is enabled. */
@ -1267,7 +1271,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only)
if (ctx->scrolled > s->rlower - s->rupper + 1) if (ctx->scrolled > s->rlower - s->rupper + 1)
ctx->scrolled = s->rlower - s->rupper + 1; ctx->scrolled = s->rlower - s->rupper + 1;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 1);
ttyctx.num = ctx->scrolled; ttyctx.num = ctx->scrolled;
ttyctx.bg = ctx->bg; ttyctx.bg = ctx->bg;
tty_write(tty_cmd_scrollup, &ttyctx); tty_write(tty_cmd_scrollup, &ttyctx);
@ -1282,7 +1286,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only)
for (y = 0; y < screen_size_y(s); y++) { for (y = 0; y < screen_size_y(s); y++) {
TAILQ_FOREACH_SAFE(ci, &ctx->list[y].items, entry, tmp) { TAILQ_FOREACH_SAFE(ci, &ctx->list[y].items, entry, tmp) {
screen_write_set_cursor(ctx, ci->x, y); screen_write_set_cursor(ctx, ci->x, y);
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 0);
ttyctx.cell = &ci->gc; ttyctx.cell = &ci->gc;
ttyctx.wrapped = ci->wrapped; ttyctx.wrapped = ci->wrapped;
ttyctx.ptr = ci->data; ttyctx.ptr = ci->data;
@ -1425,7 +1429,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
if ((gc = screen_write_combine(ctx, &gc->data, &xx)) != 0) { if ((gc = screen_write_combine(ctx, &gc->data, &xx)) != 0) {
cx = s->cx; cy = s->cy; cx = s->cx; cy = s->cy;
screen_write_set_cursor(ctx, xx, s->cy); screen_write_set_cursor(ctx, xx, s->cy);
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 0);
ttyctx.cell = gc; ttyctx.cell = gc;
tty_write(tty_cmd_cell, &ttyctx); tty_write(tty_cmd_cell, &ttyctx);
s->cx = cx; s->cy = cy; s->cx = cx; s->cy = cy;
@ -1459,7 +1463,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
/* Sanity check cursor position. */ /* Sanity check cursor position. */
if (s->cx > sx - width || s->cy > sy - 1) if (s->cx > sx - width || s->cy > sy - 1)
return; return;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 0);
/* Handle overwriting of UTF-8 characters. */ /* Handle overwriting of UTF-8 characters. */
gl = grid_get_line(s->grid, s->grid->hsize + s->cy); gl = grid_get_line(s->grid, s->grid->hsize + s->cy);
@ -1662,7 +1666,7 @@ screen_write_setselection(struct screen_write_ctx *ctx, u_char *str, u_int len)
{ {
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 0);
ttyctx.ptr = str; ttyctx.ptr = str;
ttyctx.num = len; ttyctx.num = len;
@ -1675,7 +1679,7 @@ screen_write_rawstring(struct screen_write_ctx *ctx, u_char *str, u_int len)
{ {
struct tty_ctx ttyctx; struct tty_ctx ttyctx;
screen_write_initctx(ctx, &ttyctx); screen_write_initctx(ctx, &ttyctx, 0);
ttyctx.ptr = str; ttyctx.ptr = str;
ttyctx.num = len; ttyctx.num = len;

2
tmux.h
View File

@ -779,6 +779,7 @@ struct screen_write_collect_line;
struct screen_write_ctx { struct screen_write_ctx {
struct window_pane *wp; struct window_pane *wp;
struct screen *s; struct screen *s;
int sync;
struct screen_write_collect_item *item; struct screen_write_collect_item *item;
struct screen_write_collect_line *list; struct screen_write_collect_line *list;
@ -1263,6 +1264,7 @@ struct tty {
struct event key_timer; struct event key_timer;
struct tty_key *key_tree; struct tty_key *key_tree;
}; };
#define tty_term_flags(tty) (tty->term->flags|tty->term_flags)
/* TTY command context. */ /* TTY command context. */
struct tty_ctx { struct tty_ctx {

View File

@ -1007,8 +1007,8 @@ tty_keys_clipboard(__unused struct tty *tty, const char *buf, size_t len,
} }
/* /*
* Handle device attributes input. Returns 0 for success, -1 for failure, 1 for * Handle secondary device attributes input. Returns 0 for success, -1 for
* partial. * failure, 1 for partial.
*/ */
static int static int
tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len, tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
@ -1032,7 +1032,7 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
return (-1); return (-1);
if (len == 2) if (len == 2)
return (1); return (1);
if (buf[2] != '?') if (buf[2] != '>')
return (-1); return (-1);
if (len == 3) if (len == 3)
return (1); return (1);
@ -1048,7 +1048,7 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
tmp[i] = '\0'; tmp[i] = '\0';
*size = 4 + i; *size = 4 + i;
/* Convert version numbers. */ /* Convert all arguments to numbers. */
cp = tmp; cp = tmp;
while ((next = strsep(&cp, ";")) != NULL) { while ((next = strsep(&cp, ";")) != NULL) {
p[n] = strtoul(next, &endptr, 10); p[n] = strtoul(next, &endptr, 10);
@ -1059,13 +1059,20 @@ tty_keys_device_attributes(struct tty *tty, const char *buf, size_t len,
/* Set terminal flags. */ /* Set terminal flags. */
switch (p[0]) { switch (p[0]) {
case 64: /* VT420 */ case 41: /* VT420 */
flags |= (TERM_DECFRA|TERM_DECSLRM); flags |= (TERM_DECFRA|TERM_DECSLRM);
break; break;
case 'M': /* mintty */
flags |= (TERM_256COLOURS|TERM_RGBCOLOURS);
break;
case 'T': /* tmux - if newer will have the DSR as well */
flags |= (TERM_UTF8|TERM_256COLOURS);
break;
case 'U': /* rxvt-unicode */
flags |= (TERM_UTF8);
break;
} }
for (i = 1; i < n; i++) log_debug("%s: received secondary DA %.*s", c->name, (int)*size, buf);
log_debug("%s: DA feature: %d", c->name, p[i]);
log_debug("%s: received DA %.*s", c->name, (int)*size, buf);
tty_set_flags(tty, flags); tty_set_flags(tty, flags);
tty->flags |= TTY_HAVEDA; tty->flags |= TTY_HAVEDA;
@ -1116,10 +1123,11 @@ tty_keys_device_status_report(struct tty *tty, const char *buf, size_t len,
*size = 3 + i; *size = 3 + i;
/* Set terminal flags. */ /* Set terminal flags. */
if (strncmp(tmp, "ITERM2 ", 7) == 0) if (strncmp(tmp, "ITERM2 ", 7) == 0) {
flags |= (TERM_DECSLRM|TERM_256COLOURS|TERM_RGBCOLOURS|TERM_SYNC); flags |= (TERM_UTF8|TERM_DECSLRM|TERM_SYNC|TERM_256COLOURS|
if (strncmp(tmp, "TMUX ", 5) == 0) TERM_RGBCOLOURS);
flags |= (TERM_256COLOURS|TERM_RGBCOLOURS); } else if (strncmp(tmp, "TMUX ", 5) == 0)
flags |= (TERM_UTF8|TERM_256COLOURS|TERM_RGBCOLOURS);
log_debug("%s: received DSR %.*s", c->name, (int)*size, buf); log_debug("%s: received DSR %.*s", c->name, (int)*size, buf);
tty_set_flags(tty, flags); tty_set_flags(tty, flags);

5
tty.c
View File

@ -364,7 +364,7 @@ tty_send_requests(struct tty *tty)
if (tty_term_flag(tty->term, TTYC_XT)) { if (tty_term_flag(tty->term, TTYC_XT)) {
if (~tty->flags & TTY_HAVEDA) if (~tty->flags & TTY_HAVEDA)
tty_puts(tty, "\033[c"); tty_puts(tty, "\033[>c");
if (~tty->flags & TTY_HAVEDSR) if (~tty->flags & TTY_HAVEDSR)
tty_puts(tty, "\033[1337n"); tty_puts(tty, "\033[1337n");
} else } else
@ -1175,8 +1175,7 @@ tty_clear_area(struct tty *tty, struct window_pane *wp, u_int py, u_int ny,
* background colour isn't default (because it doesn't work * background colour isn't default (because it doesn't work
* after SGR 0). * after SGR 0).
*/ */
if ((tty_get_flags(tty) & TERM_DECFRA) && if ((tty_get_flags(tty) & TERM_DECFRA) && !COLOUR_DEFAULT(bg)) {
!COLOUR_DEFAULT(bg)) {
xsnprintf(tmp, sizeof tmp, "\033[32;%u;%u;%u;%u$x", xsnprintf(tmp, sizeof tmp, "\033[32;%u;%u;%u;%u$x",
py + 1, px + 1, py + ny, px + nx); py + 1, px + 1, py + ny, px + nx);
tty_puts(tty, tmp); tty_puts(tty, tmp);