version 1.228, 2017/02/06 19:45:23 |
version 1.229, 2017/02/06 22:05:11 |
|
|
static int tty_fake_bce(const struct tty *, const struct window_pane *, |
static int tty_fake_bce(const struct tty *, const struct window_pane *, |
u_int); |
u_int); |
static void tty_redraw_region(struct tty *, const struct tty_ctx *); |
static void tty_redraw_region(struct tty *, const struct tty_ctx *); |
|
static void tty_clear_area(struct tty *, const struct tty_ctx *ctx, u_int, |
|
u_int, u_int, u_int); |
static void tty_emulate_repeat(struct tty *, enum tty_code_code, |
static void tty_emulate_repeat(struct tty *, enum tty_code_code, |
enum tty_code_code, u_int); |
enum tty_code_code, u_int); |
static void tty_repeat_space(struct tty *, u_int); |
static void tty_repeat_space(struct tty *, u_int); |
|
|
#define tty_use_margin(tty) \ |
#define tty_use_margin(tty) \ |
((tty)->term_type == TTY_VT420) |
((tty)->term_type == TTY_VT420) |
|
|
#define tty_pane_full_width(tty, ctx) \ |
#define tty_pane_full_width(tty, ctx) \ |
((ctx)->xoff == 0 && screen_size_x((ctx)->wp->screen) >= (tty)->sx) |
((ctx)->xoff == 0 && screen_size_x((ctx)->wp->screen) >= (tty)->sx) |
|
|
void |
void |
|
|
} |
} |
} |
} |
|
|
|
static void |
|
tty_clear_area(struct tty *tty, const struct tty_ctx *ctx, u_int sx, u_int sy, |
|
u_int ex, u_int ey) |
|
{ |
|
char s[64]; |
|
|
|
snprintf (s, sizeof s, "\033[32;%u;%u;%u;%u$x", ctx->yoff + sy + 1, |
|
ctx->xoff + sx + 1, ctx->yoff + ey + 1, ctx->xoff + ex + 1); |
|
tty_puts(tty, s); |
|
} |
|
|
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) |
|
|
{ |
{ |
struct window_pane *wp = ctx->wp; |
struct window_pane *wp = ctx->wp; |
struct screen *s = wp->screen; |
struct screen *s = wp->screen; |
|
u_int sx = screen_size_x(s); |
|
|
tty_default_attributes(tty, wp, ctx->bg); |
tty_default_attributes(tty, wp, ctx->bg); |
|
|
|
|
!tty_fake_bce(tty, wp, ctx->bg) && |
!tty_fake_bce(tty, wp, ctx->bg) && |
tty_term_has(tty->term, TTYC_EL)) |
tty_term_has(tty->term, TTYC_EL)) |
tty_putcode(tty, TTYC_EL); |
tty_putcode(tty, TTYC_EL); |
|
else if (tty->term_type == TTY_VT420 && |
|
!tty_fake_bce(tty, wp, ctx->bg)) |
|
tty_clear_area(tty, ctx, 0, ctx->ocy, sx - 1, ctx->ocy); |
else |
else |
tty_repeat_space(tty, screen_size_x(s)); |
tty_repeat_space(tty, sx); |
} |
} |
|
|
void |
void |
|
|
{ |
{ |
struct window_pane *wp = ctx->wp; |
struct window_pane *wp = ctx->wp; |
struct screen *s = wp->screen; |
struct screen *s = wp->screen; |
|
u_int sx = screen_size_x(s); |
|
|
tty_default_attributes(tty, wp, ctx->bg); |
tty_default_attributes(tty, wp, ctx->bg); |
|
|
|
|
tty_term_has(tty->term, TTYC_EL) && |
tty_term_has(tty->term, TTYC_EL) && |
!tty_fake_bce(tty, wp, ctx->bg)) |
!tty_fake_bce(tty, wp, ctx->bg)) |
tty_putcode(tty, TTYC_EL); |
tty_putcode(tty, TTYC_EL); |
|
else if (tty->term_type == TTY_VT420 && |
|
!tty_fake_bce(tty, wp, ctx->bg)) |
|
tty_clear_area(tty, ctx, ctx->ocx, ctx->ocy, sx - 1, ctx->ocy); |
else |
else |
tty_repeat_space(tty, screen_size_x(s) - ctx->ocx); |
tty_repeat_space(tty, sx - ctx->ocx); |
} |
} |
|
|
void |
void |
|
|
!tty_fake_bce(tty, ctx->wp, ctx->bg)) { |
!tty_fake_bce(tty, ctx->wp, ctx->bg)) { |
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); |
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); |
tty_putcode(tty, TTYC_EL1); |
tty_putcode(tty, TTYC_EL1); |
} else { |
} else if (tty->term_type == TTY_VT420 && |
|
!tty_fake_bce(tty, wp, ctx->bg)) |
|
tty_clear_area(tty, ctx, 0, ctx->ocy, ctx->ocx, ctx->ocy); |
|
else { |
tty_cursor_pane(tty, ctx, 0, ctx->ocy); |
tty_cursor_pane(tty, ctx, 0, ctx->ocy); |
tty_repeat_space(tty, ctx->ocx + 1); |
tty_repeat_space(tty, ctx->ocx + 1); |
} |
} |
|
|
struct window_pane *wp = ctx->wp; |
struct window_pane *wp = ctx->wp; |
struct screen *s = wp->screen; |
struct screen *s = wp->screen; |
u_int i, j; |
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, screen_size_y(s) - 1); |
tty_region_pane(tty, ctx, 0, sy - 1); |
tty_margin_off(tty); |
tty_margin_off(tty); |
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); |
|
|
|
if (tty_pane_full_width(tty, ctx) && |
if (tty_pane_full_width(tty, ctx) && |
|
status_at_line(tty->client) <= 0 && |
|
tty_term_has(tty->term, TTYC_ED)) { |
|
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); |
|
tty_putcode(tty, TTYC_ED); |
|
} else if (tty->term_type == TTY_VT420 && |
|
!tty_fake_bce(tty, wp, ctx->bg)) { |
|
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); |
|
if (tty_pane_full_width(tty, ctx) && |
|
tty_term_has(tty->term, TTYC_EL)) |
|
tty_putcode(tty, TTYC_EL); |
|
else |
|
tty_repeat_space(tty, sx - ctx->ocx); |
|
if (ctx->ocy != sy - 1) { |
|
tty_clear_area(tty, ctx, 0, ctx->ocy + 1, sx - 1, |
|
sy - 1); |
|
} |
|
} else if (tty_pane_full_width(tty, ctx) && |
tty_term_has(tty->term, TTYC_EL) && |
tty_term_has(tty->term, TTYC_EL) && |
!tty_fake_bce(tty, wp, ctx->bg)) { |
!tty_fake_bce(tty, wp, ctx->bg)) { |
|
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); |
tty_putcode(tty, TTYC_EL); |
tty_putcode(tty, TTYC_EL); |
if (ctx->ocy != screen_size_y(s) - 1) { |
if (ctx->ocy != sy - 1) { |
tty_cursor_pane(tty, ctx, 0, ctx->ocy + 1); |
tty_cursor_pane(tty, ctx, 0, ctx->ocy + 1); |
for (i = ctx->ocy + 1; i < screen_size_y(s); i++) { |
for (i = ctx->ocy + 1; i < sy; i++) { |
tty_putcode(tty, TTYC_EL); |
tty_putcode(tty, TTYC_EL); |
if (i == screen_size_y(s) - 1) |
if (i == sy - 1) |
continue; |
continue; |
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1); |
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1); |
tty->cy++; |
tty->cy++; |
} |
} |
} |
} |
} else { |
} else { |
tty_repeat_space(tty, screen_size_x(s) - ctx->ocx); |
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy); |
for (j = ctx->ocy + 1; j < screen_size_y(s); j++) { |
tty_repeat_space(tty, sx - ctx->ocx); |
|
for (j = ctx->ocy + 1; j < sy; j++) { |
tty_cursor_pane(tty, ctx, 0, j); |
tty_cursor_pane(tty, ctx, 0, j); |
tty_repeat_space(tty, screen_size_x(s)); |
tty_repeat_space(tty, sx); |
} |
} |
} |
} |
} |
} |
|
|
struct window_pane *wp = ctx->wp; |
struct window_pane *wp = ctx->wp; |
struct screen *s = wp->screen; |
struct screen *s = wp->screen; |
u_int i, j; |
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, screen_size_y(s) - 1); |
tty_region_pane(tty, ctx, 0, sy - 1); |
tty_margin_off(tty); |
tty_margin_off(tty); |
tty_cursor_pane(tty, ctx, 0, 0); |
|
|
|
if (tty_pane_full_width(tty, ctx) && |
if (tty->term_type == TTY_VT420 && |
|
!tty_fake_bce(tty, wp, ctx->bg)) |
|
tty_clear_area(tty, ctx, 0, 0, sx - 1, ctx->ocy - 1); |
|
else if (tty_pane_full_width(tty, ctx) && |
tty_term_has(tty->term, TTYC_EL) && |
tty_term_has(tty->term, TTYC_EL) && |
!tty_fake_bce(tty, wp, ctx->bg)) { |
!tty_fake_bce(tty, wp, ctx->bg)) { |
|
tty_cursor_pane(tty, ctx, 0, 0); |
for (i = 0; i < ctx->ocy; i++) { |
for (i = 0; i < ctx->ocy; i++) { |
tty_putcode(tty, TTYC_EL); |
tty_putcode(tty, TTYC_EL); |
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1); |
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1); |
tty->cy++; |
tty->cy++; |
} |
} |
} else { |
} else { |
|
tty_cursor_pane(tty, ctx, 0, 0); |
for (j = 0; j < ctx->ocy; j++) { |
for (j = 0; j < ctx->ocy; j++) { |
tty_cursor_pane(tty, ctx, 0, j); |
tty_cursor_pane(tty, ctx, 0, j); |
tty_repeat_space(tty, screen_size_x(s)); |
tty_repeat_space(tty, sx); |
} |
} |
} |
} |
|
tty_cursor_pane(tty, ctx, 0, ctx->ocy); |
tty_repeat_space(tty, ctx->ocx + 1); |
tty_repeat_space(tty, ctx->ocx + 1); |
} |
} |
|
|
|
|
struct window_pane *wp = ctx->wp; |
struct window_pane *wp = ctx->wp; |
struct screen *s = wp->screen; |
struct screen *s = wp->screen; |
u_int i, j; |
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, screen_size_y(s) - 1); |
tty_region_pane(tty, ctx, 0, sy - 1); |
tty_margin_off(tty); |
tty_margin_off(tty); |
tty_cursor_pane(tty, ctx, 0, 0); |
|
|
|
if (tty_pane_full_width(tty, ctx) && |
if (tty_pane_full_width(tty, ctx) && |
|
status_at_line(tty->client) <= 0 && |
|
tty_term_has(tty->term, TTYC_ED)) { |
|
tty_cursor_pane(tty, ctx, 0, 0); |
|
tty_putcode(tty, TTYC_ED); |
|
} else if (tty->term_type == TTY_VT420 && |
|
!tty_fake_bce(tty, wp, ctx->bg)) |
|
tty_clear_area(tty, ctx, 0, 0, sx - 1, sy - 1); |
|
else if (tty_pane_full_width(tty, ctx) && |
tty_term_has(tty->term, TTYC_EL) && |
tty_term_has(tty->term, TTYC_EL) && |
!tty_fake_bce(tty, wp, ctx->bg)) { |
!tty_fake_bce(tty, wp, ctx->bg)) { |
for (i = 0; i < screen_size_y(s); i++) { |
tty_cursor_pane(tty, ctx, 0, 0); |
|
for (i = 0; i < sy; i++) { |
tty_putcode(tty, TTYC_EL); |
tty_putcode(tty, TTYC_EL); |
if (i != screen_size_y(s) - 1) { |
if (i != sy - 1) { |
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1); |
tty_emulate_repeat(tty, TTYC_CUD, TTYC_CUD1, 1); |
tty->cy++; |
tty->cy++; |
} |
} |
} |
} |
} else { |
} else { |
for (j = 0; j < screen_size_y(s); j++) { |
tty_cursor_pane(tty, ctx, 0, 0); |
|
for (j = 0; j < sy; j++) { |
tty_cursor_pane(tty, ctx, 0, j); |
tty_cursor_pane(tty, ctx, 0, j); |
tty_repeat_space(tty, screen_size_x(s)); |
tty_repeat_space(tty, sx); |
} |
} |
} |
} |
} |
} |