Rather than having status line information embedded directly into the session struct, factor out the status line information into its own structure and reference that instead.
Paves the way for future work with multistatus lines. --- screen-redraw.c | 2 +- server-client.c | 14 +++++------ status.c | 76 +++++++++++++++++++++++++++++++-------------------------- tmux.h | 11 ++++++--- window-client.c | 6 ++--- 5 files changed, 59 insertions(+), 50 deletions(-) diff --git a/screen-redraw.c b/screen-redraw.c index 1083642d..df966aff 100644 --- a/screen-redraw.c +++ b/screen-redraw.c @@ -563,7 +563,7 @@ screen_redraw_draw_status(struct client *c, u_int lines, u_int top) else y = tty->sy - lines; for (i = 0; i < lines; i++) - tty_draw_line(tty, NULL, &c->status, i, 0, y); + tty_draw_line(tty, NULL, &c->status.status, i, 0, y); } /* Draw number on a pane. */ diff --git a/server-client.c b/server-client.c index e144716a..4bee7616 100644 --- a/server-client.c +++ b/server-client.c @@ -193,7 +193,7 @@ server_client_create(int fd) c->tty.sx = 80; c->tty.sy = 24; - screen_init(&c->status, c->tty.sx, 1, 0); + screen_init(&c->status.status, c->tty.sx, 1, 0); c->message_string = NULL; TAILQ_INIT(&c->message_log); @@ -270,12 +270,12 @@ server_client_lost(struct client *c) if (c->stderr_data != c->stdout_data) evbuffer_free(c->stderr_data); - if (event_initialized(&c->status_timer)) - evtimer_del(&c->status_timer); - screen_free(&c->status); - if (c->old_status != NULL) { - screen_free(c->old_status); - free(c->old_status); + if (event_initialized(&c->status.timer)) + evtimer_del(&c->status.timer); + screen_free(&c->status.status); + if (c->status.old_status != NULL) { + screen_free(c->status.old_status); + free(c->status.old_status); } free(c->title); diff --git a/status.c b/status.c index 2f6fc4cb..275220c5 100644 --- a/status.c +++ b/status.c @@ -151,7 +151,7 @@ status_timer_callback(__unused int fd, __unused short events, void *arg) struct session *s = c->session; struct timeval tv; - evtimer_del(&c->status_timer); + evtimer_del(&c->status.timer); if (s == NULL) return; @@ -163,7 +163,7 @@ status_timer_callback(__unused int fd, __unused short events, void *arg) tv.tv_sec = options_get_number(s->options, "status-interval"); 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); } @@ -173,10 +173,11 @@ status_timer_start(struct client *c) { struct session *s = c->session; - if (event_initialized(&c->status_timer)) - evtimer_del(&c->status_timer); + if (event_initialized(&c->status.timer)) + evtimer_del(&c->status.timer); 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")) status_timer_callback(-1, 0, c); @@ -317,10 +318,10 @@ status_redraw(struct client *c) int larrow, rarrow; /* Delete the saved status line, if any. */ - if (c->old_status != NULL) { - screen_free(c->old_status); - free(c->old_status); - c->old_status = NULL; + if (c->status.old_status != NULL) { + screen_free(c->status.old_status); + free(c->status.old_status); + c->status.old_status = NULL; } /* No status line? */ @@ -337,9 +338,9 @@ status_redraw(struct client *c) style_apply(&stdgc, s->options, "status-style"); /* Create the target screen. */ - memcpy(&old_status, &c->status, sizeof old_status); - screen_init(&c->status, c->tty.sx, lines, 0); - screen_write_start(&ctx, NULL, &c->status); + memcpy(&old_status, &c->status.status, sizeof old_status); + screen_init(&c->status.status, c->tty.sx, lines, 0); + screen_write_start(&ctx, NULL, &c->status.status); for (offset = 0; offset < lines * c->tty.sx; offset++) screen_write_putc(&ctx, &stdgc, ' '); screen_write_stop(&ctx); @@ -462,7 +463,7 @@ status_redraw(struct client *c) draw: /* Begin drawing. */ - screen_write_start(&ctx, NULL, &c->status); + screen_write_start(&ctx, NULL, &c->status.status); /* Draw the left string and arrow. */ screen_write_cursormove(&ctx, 0, 0); @@ -517,7 +518,7 @@ out: free(left); 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); return (0); } @@ -590,10 +591,12 @@ status_message_set(struct client *c, const char *fmt, ...) status_message_clear(c); - if (c->old_status == NULL) { - c->old_status = xmalloc(sizeof *c->old_status); - memcpy(c->old_status, &c->status, sizeof *c->old_status); - screen_init(&c->status, c->tty.sx, 1, 0); + if (c->status.old_status == NULL) { + c->status.old_status = xmalloc(sizeof + *c->status.old_status); + memcpy(c->status.old_status, &c->status.status, + sizeof *c->status.old_status); + screen_init(&c->status.status, c->tty.sx, 1, 0); } va_start(ap, fmt); @@ -631,7 +634,7 @@ status_message_clear(struct client *c) c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); 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. */ @@ -656,14 +659,14 @@ status_message_redraw(struct client *c) if (c->tty.sx == 0 || c->tty.sy == 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); if (lines <= 1) { lines = 1; - screen_init(&c->status, c->tty.sx, 1, 0); + screen_init(&c->status.status, c->tty.sx, 1, 0); } 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); if (len > c->tty.sx) @@ -671,7 +674,7 @@ status_message_redraw(struct client *c) 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); for (offset = 0; offset < lines * c->tty.sx; offset++) screen_write_putc(&ctx, &gc, ' '); @@ -679,7 +682,7 @@ status_message_redraw(struct client *c) screen_write_nputs(&ctx, len, &gc, "%s", c->message_string); 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); return (0); } @@ -710,10 +713,12 @@ status_prompt_set(struct client *c, const char *msg, const char *input, status_message_clear(c); status_prompt_clear(c); - if (c->old_status == NULL) { - c->old_status = xmalloc(sizeof *c->old_status); - memcpy(c->old_status, &c->status, sizeof *c->old_status); - screen_init(&c->status, c->tty.sx, 1, 0); + if (c->status.old_status == NULL) { + c->status.old_status = xmalloc(sizeof + *c->status.old_status); + memcpy(c->status.old_status, &c->status.status, + sizeof *c->status.old_status); + screen_init(&c->status.status, c->tty.sx, 1, 0); } c->prompt_string = format_expand_time(ft, msg, t); @@ -763,7 +768,7 @@ status_prompt_clear(struct client *c) c->tty.flags &= ~(TTY_NOCURSOR|TTY_FREEZE); 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. */ @@ -809,14 +814,14 @@ status_prompt_redraw(struct client *c) if (c->tty.sx == 0 || c->tty.sy == 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); if (lines <= 1) { lines = 1; - screen_init(&c->status, c->tty.sx, 1, 0); + screen_init(&c->status.status, c->tty.sx, 1, 0); } 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); if (len > c->tty.sx) @@ -834,7 +839,7 @@ status_prompt_redraw(struct client *c) if (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); for (offset = 0; offset < lines * c->tty.sx; offset++) screen_write_putc(&ctx, &gc, ' '); @@ -880,13 +885,14 @@ status_prompt_redraw(struct client *c) 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, ' '); finished: 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); return (0); } diff --git a/tmux.h b/tmux.h index 85719c07..8c9ba561 100644 --- a/tmux.h +++ b/tmux.h @@ -1315,6 +1315,12 @@ struct cmd_entry { enum cmd_retval (*exec)(struct cmd *, struct cmdq_item *); }; +struct status_line { + struct event timer; + struct screen status; + struct screen *old_status; +}; + /* Client connection. */ typedef int (*prompt_input_cb)(struct client *, void *, const char *, int); typedef void (*prompt_free_cb)(void *); @@ -1357,10 +1363,7 @@ struct client { struct event click_timer; u_int click_button; - struct event status_timer; - struct screen status; - - struct screen *old_status; + struct status_line status; #define CLIENT_TERMINAL 0x1 #define CLIENT_LOGIN 0x2 diff --git a/window-client.c b/window-client.c index 76e536ec..aae9e0b4 100644 --- a/window-client.c +++ b/window-client.c @@ -229,10 +229,10 @@ window_client_draw(__unused void *modedata, void *itemdata, screen_write_hline(ctx, sx, 0, 0); screen_write_cursormove(ctx, cx, cy + sy - 1); - if (c->old_status != NULL) - screen_write_fast_copy(ctx, c->old_status, 0, 0, sx, 1); + if (c->status.old_status != NULL) + screen_write_fast_copy(ctx, c->status.old_status, 0, 0, sx, 1); else - screen_write_fast_copy(ctx, &c->status, 0, 0, sx, 1); + screen_write_fast_copy(ctx, &c->status.status, 0, 0, sx, 1); } static struct screen * -- 2.15.1 -- You received this message because you are subscribed to the Google Groups "tmux-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to tmux-users+unsubscr...@googlegroups.com. To post to this group, send an email to tmux-users@googlegroups.com. For more options, visit https://groups.google.com/d/optout.