version 1.174, 2018/01/01 11:03:54 |
version 1.175, 2018/02/05 08:21:54 |
|
|
struct session *s = c->session; |
struct session *s = c->session; |
struct timeval tv; |
struct timeval tv; |
|
|
evtimer_del(&c->status_timer); |
evtimer_del(&c->status.timer); |
|
|
if (s == NULL) |
if (s == NULL) |
return; |
return; |
|
|
tv.tv_sec = options_get_number(s->options, "status-interval"); |
tv.tv_sec = options_get_number(s->options, "status-interval"); |
|
|
if (tv.tv_sec != 0) |
if (tv.tv_sec != 0) |
evtimer_add(&c->status_timer, &tv); |
evtimer_add(&c->status.timer, &tv); |
log_debug("client %p, status interval %d", c, (int)tv.tv_sec); |
log_debug("client %p, status interval %d", c, (int)tv.tv_sec); |
} |
} |
|
|
|
|
{ |
{ |
struct session *s = c->session; |
struct session *s = c->session; |
|
|
if (event_initialized(&c->status_timer)) |
if (event_initialized(&c->status.timer)) |
evtimer_del(&c->status_timer); |
evtimer_del(&c->status.timer); |
else |
else |
evtimer_set(&c->status_timer, status_timer_callback, c); |
evtimer_set(&c->status.timer, status_timer_callback, c); |
|
|
if (s != NULL && options_get_number(s->options, "status")) |
if (s != NULL && options_get_number(s->options, "status")) |
status_timer_callback(-1, 0, c); |
status_timer_callback(-1, 0, c); |
|
|
int larrow, rarrow; |
int larrow, rarrow; |
|
|
/* Delete the saved status line, if any. */ |
/* Delete the saved status line, if any. */ |
if (c->old_status != NULL) { |
if (c->status.old_status != NULL) { |
screen_free(c->old_status); |
screen_free(c->status.old_status); |
free(c->old_status); |
free(c->status.old_status); |
c->old_status = NULL; |
c->status.old_status = NULL; |
} |
} |
|
|
/* No status line? */ |
/* No status line? */ |
|
|
style_apply(&stdgc, s->options, "status-style"); |
style_apply(&stdgc, s->options, "status-style"); |
|
|
/* Create the target screen. */ |
/* Create the target screen. */ |
memcpy(&old_status, &c->status, sizeof old_status); |
memcpy(&old_status, &c->status.status, sizeof old_status); |
screen_init(&c->status, c->tty.sx, lines, 0); |
screen_init(&c->status.status, c->tty.sx, lines, 0); |
screen_write_start(&ctx, NULL, &c->status); |
screen_write_start(&ctx, NULL, &c->status.status); |
for (offset = 0; offset < lines * c->tty.sx; offset++) |
for (offset = 0; offset < lines * c->tty.sx; offset++) |
screen_write_putc(&ctx, &stdgc, ' '); |
screen_write_putc(&ctx, &stdgc, ' '); |
screen_write_stop(&ctx); |
screen_write_stop(&ctx); |
|
|
|
|
draw: |
draw: |
/* Begin drawing. */ |
/* Begin drawing. */ |
screen_write_start(&ctx, NULL, &c->status); |
screen_write_start(&ctx, NULL, &c->status.status); |
|
|
/* Draw the left string and arrow. */ |
/* Draw the left string and arrow. */ |
screen_write_cursormove(&ctx, 0, 0); |
screen_write_cursormove(&ctx, 0, 0); |
|
|
free(left); |
free(left); |
free(right); |
free(right); |
|
|
if (grid_compare(c->status.grid, old_status.grid) == 0) { |
if (grid_compare(c->status.status.grid, old_status.grid) == 0) { |
screen_free(&old_status); |
screen_free(&old_status); |
return (0); |
return (0); |
} |
} |
|
|
|
|
status_message_clear(c); |
status_message_clear(c); |
|
|
if (c->old_status == NULL) { |
if (c->status.old_status == NULL) { |
c->old_status = xmalloc(sizeof *c->old_status); |
c->status.old_status = xmalloc(sizeof *c->status.old_status); |
memcpy(c->old_status, &c->status, sizeof *c->old_status); |
memcpy(c->status.old_status, &c->status.status, |
screen_init(&c->status, c->tty.sx, 1, 0); |
sizeof *c->status.old_status); |
|
screen_init(&c->status.status, c->tty.sx, 1, 0); |
} |
} |
|
|
va_start(ap, fmt); |
va_start(ap, fmt); |
|
|
c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); |
c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); |
c->flags |= CLIENT_REDRAW; /* screen was frozen and may have changed */ |
c->flags |= CLIENT_REDRAW; /* screen was frozen and may have changed */ |
|
|
screen_reinit(&c->status); |
screen_reinit(&c->status.status); |
} |
} |
|
|
/* Clear status line message after timer expires. */ |
/* Clear status line message after timer expires. */ |
|
|
|
|
if (c->tty.sx == 0 || c->tty.sy == 0) |
if (c->tty.sx == 0 || c->tty.sy == 0) |
return (0); |
return (0); |
memcpy(&old_status, &c->status, sizeof old_status); |
memcpy(&old_status, &c->status.status, sizeof old_status); |
|
|
lines = status_line_size(c->session); |
lines = status_line_size(c->session); |
if (lines <= 1) { |
if (lines <= 1) { |
lines = 1; |
lines = 1; |
screen_init(&c->status, c->tty.sx, 1, 0); |
screen_init(&c->status.status, c->tty.sx, 1, 0); |
} else |
} else |
screen_init(&c->status, c->tty.sx, lines, 0); |
screen_init(&c->status.status, c->tty.sx, lines, 0); |
|
|
len = screen_write_strlen("%s", c->message_string); |
len = screen_write_strlen("%s", c->message_string); |
if (len > c->tty.sx) |
if (len > c->tty.sx) |
|
|
|
|
style_apply(&gc, s->options, "message-style"); |
style_apply(&gc, s->options, "message-style"); |
|
|
screen_write_start(&ctx, NULL, &c->status); |
screen_write_start(&ctx, NULL, &c->status.status); |
screen_write_cursormove(&ctx, 0, 0); |
screen_write_cursormove(&ctx, 0, 0); |
for (offset = 0; offset < lines * c->tty.sx; offset++) |
for (offset = 0; offset < lines * c->tty.sx; offset++) |
screen_write_putc(&ctx, &gc, ' '); |
screen_write_putc(&ctx, &gc, ' '); |
|
|
screen_write_nputs(&ctx, len, &gc, "%s", c->message_string); |
screen_write_nputs(&ctx, len, &gc, "%s", c->message_string); |
screen_write_stop(&ctx); |
screen_write_stop(&ctx); |
|
|
if (grid_compare(c->status.grid, old_status.grid) == 0) { |
if (grid_compare(c->status.status.grid, old_status.grid) == 0) { |
screen_free(&old_status); |
screen_free(&old_status); |
return (0); |
return (0); |
} |
} |
|
|
status_message_clear(c); |
status_message_clear(c); |
status_prompt_clear(c); |
status_prompt_clear(c); |
|
|
if (c->old_status == NULL) { |
if (c->status.old_status == NULL) { |
c->old_status = xmalloc(sizeof *c->old_status); |
c->status.old_status = xmalloc(sizeof *c->status.old_status); |
memcpy(c->old_status, &c->status, sizeof *c->old_status); |
memcpy(c->status.old_status, &c->status.status, |
screen_init(&c->status, c->tty.sx, 1, 0); |
sizeof *c->status.old_status); |
|
screen_init(&c->status.status, c->tty.sx, 1, 0); |
} |
} |
|
|
c->prompt_string = format_expand_time(ft, msg, t); |
c->prompt_string = format_expand_time(ft, msg, t); |
|
|
c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); |
c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); |
c->flags |= CLIENT_REDRAW; /* screen was frozen and may have changed */ |
c->flags |= CLIENT_REDRAW; /* screen was frozen and may have changed */ |
|
|
screen_reinit(&c->status); |
screen_reinit(&c->status.status); |
} |
} |
|
|
/* Update status line prompt with a new prompt string. */ |
/* Update status line prompt with a new prompt string. */ |
|
|
|
|
if (c->tty.sx == 0 || c->tty.sy == 0) |
if (c->tty.sx == 0 || c->tty.sy == 0) |
return (0); |
return (0); |
memcpy(&old_status, &c->status, sizeof old_status); |
memcpy(&old_status, &c->status.status, sizeof old_status); |
|
|
lines = status_line_size(c->session); |
lines = status_line_size(c->session); |
if (lines <= 1) { |
if (lines <= 1) { |
lines = 1; |
lines = 1; |
screen_init(&c->status, c->tty.sx, 1, 0); |
screen_init(&c->status.status, c->tty.sx, 1, 0); |
} else |
} else |
screen_init(&c->status, c->tty.sx, lines, 0); |
screen_init(&c->status.status, c->tty.sx, lines, 0); |
|
|
len = screen_write_strlen("%s", c->prompt_string); |
len = screen_write_strlen("%s", c->prompt_string); |
if (len > c->tty.sx) |
if (len > c->tty.sx) |
|
|
if (start > c->tty.sx) |
if (start > c->tty.sx) |
start = c->tty.sx; |
start = c->tty.sx; |
|
|
screen_write_start(&ctx, NULL, &c->status); |
screen_write_start(&ctx, NULL, &c->status.status); |
screen_write_cursormove(&ctx, 0, 0); |
screen_write_cursormove(&ctx, 0, 0); |
for (offset = 0; offset < lines * c->tty.sx; offset++) |
for (offset = 0; offset < lines * c->tty.sx; offset++) |
screen_write_putc(&ctx, &gc, ' '); |
screen_write_putc(&ctx, &gc, ' '); |
|
|
screen_write_cell(&ctx, &cursorgc); |
screen_write_cell(&ctx, &cursorgc); |
} |
} |
} |
} |
if (c->status.cx < screen_size_x(&c->status) && c->prompt_index >= i) |
if (c->status.status.cx < screen_size_x(&c->status.status) && |
|
c->prompt_index >= i) |
screen_write_putc(&ctx, &cursorgc, ' '); |
screen_write_putc(&ctx, &cursorgc, ' '); |
|
|
finished: |
finished: |
screen_write_stop(&ctx); |
screen_write_stop(&ctx); |
|
|
if (grid_compare(c->status.grid, old_status.grid) == 0) { |
if (grid_compare(c->status.status.grid, old_status.grid) == 0) { |
screen_free(&old_status); |
screen_free(&old_status); |
return (0); |
return (0); |
} |
} |