From 7f4513ec34862805b06b2ff776785a36fdfec796 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 5 Feb 2018 08:21:54 +0000 Subject: [PATCH] Add struct status_line to hold status line members of struct client, not used yet but will be soon. From Thomas Adam. --- screen-redraw.c | 2 +- server-client.c | 14 +++++----- status.c | 73 +++++++++++++++++++++++++------------------------ tmux.h | 12 +++++--- window-client.c | 6 ++-- 5 files changed, 57 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 87f40018..ee9472d3 100644 --- a/server-client.c +++ b/server-client.c @@ -195,7 +195,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); @@ -272,12 +272,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..55e331fa 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,10 @@ 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 +317,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 +337,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 +462,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 +517,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 +590,11 @@ 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 +632,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 +657,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 +672,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 +680,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 +711,11 @@ 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 +765,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 +811,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 +836,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 +882,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 aab21fc4..61032b3f 100644 --- a/tmux.h +++ b/tmux.h @@ -1312,6 +1312,13 @@ struct cmd_entry { enum cmd_retval (*exec)(struct cmd *, struct cmdq_item *); }; +/* Status line. */ +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 *); @@ -1354,10 +1361,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 *