Cache status line position to reduce option lookups during output.

pull/757/head
nicm 2017-02-03 21:01:02 +00:00
parent 75adf8368a
commit 5e6a8177e5
5 changed files with 23 additions and 6 deletions

View File

@ -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

View File

@ -89,6 +89,8 @@ recalculate_sizes(void)
s->sx = ssx;
s->sy = ssy;
status_update_saved(s);
}
RB_FOREACH(w, windows, &windows) {

View File

@ -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);

View File

@ -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);
}

4
tmux.h
View File

@ -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 *);