mirror of
https://github.com/tmux/tmux.git
synced 2024-12-14 10:58:48 +00:00
Merge branch 'obsd-master'
This commit is contained in:
commit
247ec2ad88
@ -67,8 +67,10 @@ cmd_refresh_client_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
cmdq_error(item, "not a control client");
|
cmdq_error(item, "not a control client");
|
||||||
return (CMD_RETURN_ERROR);
|
return (CMD_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
if (tty_set_size(&c->tty, w, h))
|
if (tty_set_size(&c->tty, w, h)) {
|
||||||
|
c->flags |= CLIENT_SIZECHANGED;
|
||||||
recalculate_sizes();
|
recalculate_sizes();
|
||||||
|
}
|
||||||
} else if (args_has(args, 'S')) {
|
} else if (args_has(args, 'S')) {
|
||||||
c->flags |= CLIENT_STATUSFORCE;
|
c->flags |= CLIENT_STATUSFORCE;
|
||||||
server_status_client(c);
|
server_status_client(c);
|
||||||
|
3
resize.c
3
resize.c
@ -60,6 +60,9 @@ recalculate_sizes(void)
|
|||||||
TAILQ_FOREACH(c, &clients, entry) {
|
TAILQ_FOREACH(c, &clients, entry) {
|
||||||
if (c->flags & CLIENT_SUSPENDED)
|
if (c->flags & CLIENT_SUSPENDED)
|
||||||
continue;
|
continue;
|
||||||
|
if ((c->flags & (CLIENT_CONTROL|CLIENT_SIZECHANGED)) ==
|
||||||
|
CLIENT_CONTROL)
|
||||||
|
continue;
|
||||||
if (c->session == s) {
|
if (c->session == s) {
|
||||||
if (c->tty.sx < ssx)
|
if (c->tty.sx < ssx)
|
||||||
ssx = c->tty.sx;
|
ssx = c->tty.sx;
|
||||||
|
1
tmux.h
1
tmux.h
@ -1349,6 +1349,7 @@ struct client {
|
|||||||
#define CLIENT_STATUSFORCE 0x80000
|
#define CLIENT_STATUSFORCE 0x80000
|
||||||
#define CLIENT_DOUBLECLICK 0x100000
|
#define CLIENT_DOUBLECLICK 0x100000
|
||||||
#define CLIENT_TRIPLECLICK 0x200000
|
#define CLIENT_TRIPLECLICK 0x200000
|
||||||
|
#define CLIENT_SIZECHANGED 0x400000
|
||||||
int flags;
|
int flags;
|
||||||
struct key_table *keytable;
|
struct key_table *keytable;
|
||||||
|
|
||||||
|
238
tty.c
238
tty.c
@ -754,6 +754,73 @@ tty_redraw_region(struct tty *tty, const struct tty_ctx *ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
tty_clear_line(struct tty *tty, const struct window_pane *wp, u_int py,
|
||||||
|
u_int px, u_int nx, u_int bg)
|
||||||
|
{
|
||||||
|
log_debug("%s: %u at %u,%u", __func__, nx, px, py);
|
||||||
|
|
||||||
|
/* Nothing to clear. */
|
||||||
|
if (nx == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* If genuine BCE is available, can try escape sequences. */
|
||||||
|
if (!tty_fake_bce(tty, wp, bg)) {
|
||||||
|
/* Off the end of the line, use EL if available. */
|
||||||
|
if (px + nx >= tty->sx && tty_term_has(tty->term, TTYC_EL)) {
|
||||||
|
tty_cursor(tty, px, py);
|
||||||
|
tty_putcode(tty, TTYC_EL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* At the start of the line. Use EL1. */
|
||||||
|
if (px == 0 && tty_term_has(tty->term, TTYC_EL1)) {
|
||||||
|
tty_cursor(tty, px + nx - 1, py);
|
||||||
|
tty_putcode(tty, TTYC_EL1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Section of line. Use ECH if possible. */
|
||||||
|
if (tty_term_has(tty->term, TTYC_ECH)) {
|
||||||
|
tty_cursor(tty, px, py);
|
||||||
|
tty_putcode1(tty, TTYC_ECH, nx);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Couldn't use an escape sequence, use spaces. */
|
||||||
|
tty_repeat_space(tty, nx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
tty_clear_area(struct tty *tty, const struct window_pane *wp, u_int py,
|
||||||
|
u_int ny, u_int px, u_int nx, u_int bg)
|
||||||
|
{
|
||||||
|
u_int yy;
|
||||||
|
|
||||||
|
log_debug("%s: %u,%u at %u,%u", __func__, nx, ny, px, py);
|
||||||
|
|
||||||
|
/* Nothing to clear. */
|
||||||
|
if (nx == 0 || ny == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* If genuine BCE is available, can try escape sequences. */
|
||||||
|
if (!tty_fake_bce(tty, wp, bg)) {
|
||||||
|
if (px == 0 &&
|
||||||
|
px + nx >= tty->sx &&
|
||||||
|
py + ny >= tty->sy &&
|
||||||
|
tty_term_has(tty->term, TTYC_ED)) {
|
||||||
|
tty_cursor(tty, 0, py);
|
||||||
|
tty_putcode(tty, TTYC_ED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Couldn't use an escape sequence, loop over the lines. */
|
||||||
|
for (yy = py; yy < py + ny; yy++)
|
||||||
|
tty_clear_line(tty, wp, yy, px, nx, bg);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tty_draw_pane(struct tty *tty, const struct window_pane *wp, u_int py, u_int ox,
|
tty_draw_pane(struct tty *tty, const struct window_pane *wp, u_int py, u_int ox,
|
||||||
u_int oy)
|
u_int oy)
|
||||||
@ -766,7 +833,7 @@ tty_draw_line(struct tty *tty, const struct window_pane *wp,
|
|||||||
struct screen *s, u_int py, u_int ox, u_int oy)
|
struct screen *s, u_int py, u_int ox, u_int oy)
|
||||||
{
|
{
|
||||||
struct grid_cell gc, last;
|
struct grid_cell gc, last;
|
||||||
u_int i, j, sx, width;
|
u_int i, j, sx, nx, width;
|
||||||
int flags, cleared = 0;
|
int flags, cleared = 0;
|
||||||
char buf[512];
|
char buf[512];
|
||||||
size_t len;
|
size_t len;
|
||||||
@ -857,16 +924,10 @@ tty_draw_line(struct tty *tty, const struct window_pane *wp,
|
|||||||
tty_putn(tty, buf, len, width);
|
tty_putn(tty, buf, len, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cleared && sx < tty->sx) {
|
nx = screen_size_x(s) - sx;
|
||||||
|
if (!cleared && sx < tty->sx && nx != 0) {
|
||||||
tty_default_attributes(tty, wp, 8);
|
tty_default_attributes(tty, wp, 8);
|
||||||
tty_cursor(tty, ox + sx, oy + py);
|
tty_clear_line(tty, wp, oy + py, ox + sx, nx, 8);
|
||||||
if (sx != screen_size_x(s) &&
|
|
||||||
ox + screen_size_x(s) >= tty->sx &&
|
|
||||||
tty_term_has(tty->term, TTYC_EL) &&
|
|
||||||
!tty_fake_bce(tty, wp, 8))
|
|
||||||
tty_putcode(tty, TTYC_EL);
|
|
||||||
else
|
|
||||||
tty_repeat_space(tty, screen_size_x(s) - sx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tty->flags = (tty->flags & ~TTY_NOCURSOR) | flags;
|
tty->flags = (tty->flags & ~TTY_NOCURSOR) | flags;
|
||||||
@ -1012,56 +1073,36 @@ void
|
|||||||
tty_cmd_clearline(struct tty *tty, const struct tty_ctx *ctx)
|
tty_cmd_clearline(struct tty *tty, const struct tty_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct window_pane *wp = ctx->wp;
|
struct window_pane *wp = ctx->wp;
|
||||||
struct screen *s = wp->screen;
|
u_int nx, py = ctx->yoff + ctx->ocy;
|
||||||
u_int sx = screen_size_x(s);
|
|
||||||
|
|
||||||
tty_default_attributes(tty, wp, ctx->bg);
|
tty_default_attributes(tty, wp, ctx->bg);
|
||||||
|
|
||||||
tty_cursor_pane(tty, ctx, 0, ctx->ocy);
|
nx = screen_size_x(wp->screen);
|
||||||
|
tty_clear_line(tty, wp, py, ctx->xoff, nx, ctx->bg);
|
||||||
if (tty_pane_full_width(tty, ctx) &&
|
|
||||||
!tty_fake_bce(tty, wp, ctx->bg) &&
|
|
||||||
tty_term_has(tty->term, TTYC_EL))
|
|
||||||
tty_putcode(tty, TTYC_EL);
|
|
||||||
else
|
|
||||||
tty_repeat_space(tty, sx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tty_cmd_clearendofline(struct tty *tty, const struct tty_ctx *ctx)
|
tty_cmd_clearendofline(struct tty *tty, const struct tty_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct window_pane *wp = ctx->wp;
|
struct window_pane *wp = ctx->wp;
|
||||||
struct screen *s = wp->screen;
|
u_int nx, py = ctx->yoff + ctx->ocy;
|
||||||
u_int sx = screen_size_x(s);
|
|
||||||
|
|
||||||
tty_default_attributes(tty, wp, ctx->bg);
|
tty_default_attributes(tty, wp, ctx->bg);
|
||||||
|
|
||||||
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
|
nx = screen_size_x(wp->screen) - ctx->ocx;
|
||||||
|
tty_clear_line(tty, wp, py, ctx->xoff + ctx->ocx, nx, ctx->bg);
|
||||||
if (tty_pane_full_width(tty, ctx) &&
|
|
||||||
tty_term_has(tty->term, TTYC_EL) &&
|
|
||||||
!tty_fake_bce(tty, wp, ctx->bg))
|
|
||||||
tty_putcode(tty, TTYC_EL);
|
|
||||||
else
|
|
||||||
tty_repeat_space(tty, sx - ctx->ocx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx)
|
tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct window_pane *wp = ctx->wp;
|
struct window_pane *wp = ctx->wp;
|
||||||
|
u_int nx, py = ctx->yoff + ctx->ocy;
|
||||||
|
|
||||||
tty_default_attributes(tty, wp, ctx->bg);
|
tty_default_attributes(tty, wp, ctx->bg);
|
||||||
|
|
||||||
if (ctx->xoff == 0 &&
|
nx = screen_size_x(wp->screen) - ctx->ocx;
|
||||||
tty_term_has(tty->term, TTYC_EL1) &&
|
tty_clear_line(tty, wp, py, ctx->xoff, ctx->ocx + 1, ctx->bg);
|
||||||
!tty_fake_bce(tty, ctx->wp, ctx->bg)) {
|
|
||||||
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
|
|
||||||
tty_putcode(tty, TTYC_EL1);
|
|
||||||
} else {
|
|
||||||
tty_cursor_pane(tty, ctx, 0, ctx->ocy);
|
|
||||||
tty_repeat_space(tty, ctx->ocx + 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1159,116 +1200,69 @@ void
|
|||||||
tty_cmd_clearendofscreen(struct tty *tty, const struct tty_ctx *ctx)
|
tty_cmd_clearendofscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct window_pane *wp = ctx->wp;
|
struct window_pane *wp = ctx->wp;
|
||||||
struct screen *s = wp->screen;
|
u_int px, py, nx, ny;
|
||||||
u_int i, j;
|
|
||||||
u_int sx = screen_size_x(s), sy = screen_size_y(s);
|
|
||||||
|
|
||||||
tty_default_attributes(tty, wp, ctx->bg);
|
tty_default_attributes(tty, wp, ctx->bg);
|
||||||
|
|
||||||
tty_region_pane(tty, ctx, 0, sy - 1);
|
tty_region_pane(tty, ctx, 0, screen_size_y(wp->screen) - 1);
|
||||||
tty_margin_off(tty);
|
tty_margin_off(tty);
|
||||||
|
|
||||||
if (tty_pane_full_width(tty, ctx) &&
|
px = ctx->xoff;
|
||||||
ctx->yoff + wp->sy >= tty->sy - 1 &&
|
nx = screen_size_x(wp->screen);
|
||||||
status_at_line(tty->client) <= 0 &&
|
py = ctx->yoff + ctx->ocy + 1;
|
||||||
tty_term_has(tty->term, TTYC_ED)) {
|
ny = screen_size_y(wp->screen) - ctx->ocy - 1;
|
||||||
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
|
|
||||||
tty_putcode(tty, TTYC_ED);
|
tty_clear_area(tty, wp, py, ny, px, nx, ctx->bg);
|
||||||
} else if (tty_pane_full_width(tty, ctx) &&
|
|
||||||
tty_term_has(tty->term, TTYC_EL) &&
|
px = ctx->xoff + ctx->ocx;
|
||||||
!tty_fake_bce(tty, wp, ctx->bg)) {
|
nx = screen_size_x(wp->screen) - ctx->ocx;
|
||||||
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
|
py = ctx->yoff + ctx->ocy;
|
||||||
tty_putcode(tty, TTYC_EL);
|
|
||||||
if (ctx->ocy != sy - 1) {
|
tty_clear_line(tty, wp, py, px, nx, ctx->bg);
|
||||||
tty_cursor_pane(tty, ctx, 0, ctx->ocy + 1);
|
|
||||||
for (i = ctx->ocy + 1; i < sy; i++) {
|
|
||||||
tty_putcode(tty, TTYC_EL);
|
|
||||||
if (i == sy - 1)
|
|
||||||
continue;
|
|
||||||
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1);
|
|
||||||
tty->cy++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
|
|
||||||
tty_repeat_space(tty, sx - ctx->ocx);
|
|
||||||
for (j = ctx->ocy + 1; j < sy; j++) {
|
|
||||||
tty_cursor_pane(tty, ctx, 0, j);
|
|
||||||
tty_repeat_space(tty, sx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tty_cmd_clearstartofscreen(struct tty *tty, const struct tty_ctx *ctx)
|
tty_cmd_clearstartofscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct window_pane *wp = ctx->wp;
|
struct window_pane *wp = ctx->wp;
|
||||||
struct screen *s = wp->screen;
|
u_int px, py, nx, ny;
|
||||||
u_int i, j;
|
|
||||||
u_int sx = screen_size_x(s), sy = screen_size_y(s);
|
|
||||||
|
|
||||||
tty_default_attributes(tty, wp, ctx->bg);
|
tty_default_attributes(tty, wp, ctx->bg);
|
||||||
|
|
||||||
tty_region_pane(tty, ctx, 0, sy - 1);
|
tty_region_pane(tty, ctx, 0, screen_size_y(wp->screen) - 1);
|
||||||
tty_margin_off(tty);
|
tty_margin_off(tty);
|
||||||
|
|
||||||
if (tty_pane_full_width(tty, ctx) &&
|
px = ctx->xoff;
|
||||||
tty_term_has(tty->term, TTYC_EL) &&
|
nx = screen_size_x(wp->screen);
|
||||||
!tty_fake_bce(tty, wp, ctx->bg)) {
|
py = ctx->yoff;
|
||||||
tty_cursor_pane(tty, ctx, 0, 0);
|
ny = ctx->ocy - 1;
|
||||||
for (i = 0; i < ctx->ocy; i++) {
|
|
||||||
tty_putcode(tty, TTYC_EL);
|
tty_clear_area(tty, wp, py, ny, px, nx, ctx->bg);
|
||||||
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1);
|
|
||||||
tty->cy++;
|
px = ctx->xoff;
|
||||||
}
|
nx = ctx->ocx + 1;
|
||||||
} else {
|
py = ctx->yoff + ctx->ocy;
|
||||||
tty_cursor_pane(tty, ctx, 0, 0);
|
|
||||||
for (j = 0; j < ctx->ocy; j++) {
|
tty_clear_line(tty, wp, py, px, nx, ctx->bg);
|
||||||
tty_cursor_pane(tty, ctx, 0, j);
|
|
||||||
tty_repeat_space(tty, sx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tty_cursor_pane(tty, ctx, 0, ctx->ocy);
|
|
||||||
tty_repeat_space(tty, ctx->ocx + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tty_cmd_clearscreen(struct tty *tty, const struct tty_ctx *ctx)
|
tty_cmd_clearscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||||
{
|
{
|
||||||
struct window_pane *wp = ctx->wp;
|
struct window_pane *wp = ctx->wp;
|
||||||
struct screen *s = wp->screen;
|
u_int px, py, nx, ny;
|
||||||
u_int i, j;
|
|
||||||
u_int sx = screen_size_x(s), sy = screen_size_y(s);
|
|
||||||
|
|
||||||
tty_default_attributes(tty, wp, ctx->bg);
|
tty_default_attributes(tty, wp, ctx->bg);
|
||||||
|
|
||||||
tty_region_pane(tty, ctx, 0, sy - 1);
|
tty_region_pane(tty, ctx, 0, screen_size_y(wp->screen) - 1);
|
||||||
tty_margin_off(tty);
|
tty_margin_off(tty);
|
||||||
|
|
||||||
if (tty_pane_full_width(tty, ctx) &&
|
px = ctx->xoff;
|
||||||
ctx->yoff + wp->sy >= tty->sy - 1 &&
|
nx = screen_size_x(wp->screen);
|
||||||
status_at_line(tty->client) <= 0 &&
|
py = ctx->yoff;
|
||||||
tty_term_has(tty->term, TTYC_ED)) {
|
ny = screen_size_y(wp->screen);
|
||||||
tty_cursor_pane(tty, ctx, 0, 0);
|
|
||||||
tty_putcode(tty, TTYC_ED);
|
tty_clear_area(tty, wp, py, ny, px, nx, ctx->bg);
|
||||||
} else if (tty_pane_full_width(tty, ctx) &&
|
|
||||||
tty_term_has(tty->term, TTYC_EL) &&
|
|
||||||
!tty_fake_bce(tty, wp, ctx->bg)) {
|
|
||||||
tty_cursor_pane(tty, ctx, 0, 0);
|
|
||||||
for (i = 0; i < sy; i++) {
|
|
||||||
tty_putcode(tty, TTYC_EL);
|
|
||||||
if (i != sy - 1) {
|
|
||||||
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1);
|
|
||||||
tty->cy++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tty_cursor_pane(tty, ctx, 0, 0);
|
|
||||||
for (j = 0; j < sy; j++) {
|
|
||||||
tty_cursor_pane(tty, ctx, 0, j);
|
|
||||||
tty_repeat_space(tty, sx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user