From 5e6a8177e55a8e30e0cd67c7ee3039aa22ff1c0e Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 3 Feb 2017 21:01:02 +0000 Subject: [PATCH] Cache status line position to reduce option lookups during output. --- cmd-set-option.c | 2 ++ resize.c | 2 ++ session.c | 2 ++ status.c | 19 ++++++++++++++----- tmux.h | 4 +++- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/cmd-set-option.c b/cmd-set-option.c index c7cef42c..cc8b7570 100644 --- a/cmd-set-option.c +++ b/cmd-set-option.c @@ -248,6 +248,8 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item) RB_FOREACH(w, windows, &windows) layout_fix_panes(w, w->sx, w->sy); } + RB_FOREACH (s, sessions, &sessions) + status_update_saved(s); /* * Update sizes and redraw. May not always be necessary but do it diff --git a/resize.c b/resize.c index 2d3f02cc..ba8078bc 100644 --- a/resize.c +++ b/resize.c @@ -89,6 +89,8 @@ recalculate_sizes(void) s->sx = ssx; s->sy = ssy; + + status_update_saved(s); } RB_FOREACH(w, windows, &windows) { diff --git a/session.c b/session.c index 19a6f139..09c2dc26 100644 --- a/session.c +++ b/session.c @@ -131,6 +131,8 @@ session_create(const char *name, int argc, char **argv, const char *path, s->options = options_create(global_s_options); s->hooks = hooks_create(global_hooks); + status_update_saved(s); + s->tio = NULL; if (tio != NULL) { s->tio = xmalloc(sizeof *s->tio); diff --git a/status.c b/status.c index c4f79050..6cc1ee37 100644 --- a/status.c +++ b/status.c @@ -192,17 +192,26 @@ status_timer_start_all(void) status_timer_start(c); } +/* Update status cache. */ +void +status_update_saved(struct session *s) +{ + if (!options_get_number(s->options, "status")) + s->statusat = -1; + else if (options_get_number(s->options, "status-position") == 0) + s->statusat = 0; + else + s->statusat = 1; +} + /* Get screen line of status line. -1 means off. */ int status_at_line(struct client *c) { struct session *s = c->session; - if (!options_get_number(s->options, "status")) - return (-1); - - if (options_get_number(s->options, "status-position") == 0) - return (0); + if (s->statusat != 1) + return (s->statusat); return (c->tty.sy - 1); } diff --git a/tmux.h b/tmux.h index 533a5476..c980f9bb 100644 --- a/tmux.h +++ b/tmux.h @@ -545,7 +545,6 @@ struct grid_cell { int fg; int bg; struct utf8_data data; - }; struct grid_cell_entry { u_char flags; @@ -936,6 +935,8 @@ struct session { struct winlink_stack lastw; struct winlinks windows; + int statusat; + struct hooks *hooks; struct options *options; @@ -1864,6 +1865,7 @@ void server_unzoom_window(struct window *); /* status.c */ void status_timer_start(struct client *); void status_timer_start_all(void); +void status_update_saved(struct session *s); int status_at_line(struct client *); struct window *status_get_window_at(struct client *, u_int); int status_redraw(struct client *);