From 3bc08b0dc0c9868ba5acaa7b8f12159a9a66cf4a Mon Sep 17 00:00:00 2001 From: nicm Date: Sat, 18 Aug 2018 16:14:03 +0000 Subject: [PATCH] Some tidying and helper functions. --- cmd-resize-pane.c | 18 ++++++------- format.c | 11 ++++---- screen-redraw.c | 67 ++++++++++++++++++++--------------------------- tmux.h | 1 + tty.c | 15 +++++++++++ 5 files changed, 59 insertions(+), 53 deletions(-) diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c index 6b991aa6..31474f3f 100644 --- a/cmd-resize-pane.c +++ b/cmd-resize-pane.c @@ -91,9 +91,8 @@ cmd_resize_pane_exec(struct cmd *self, struct cmdq_item *item) } } - if (args_has(self->args, 'x')) { - x = args_strtonum(self->args, 'x', PANE_MINIMUM, INT_MAX, - &cause); + if (args_has(args, 'x')) { + x = args_strtonum(args, 'x', PANE_MINIMUM, INT_MAX, &cause); if (cause != NULL) { cmdq_error(item, "width %s", cause); free(cause); @@ -101,9 +100,8 @@ cmd_resize_pane_exec(struct cmd *self, struct cmdq_item *item) } layout_resize_pane_to(wp, LAYOUT_LEFTRIGHT, x); } - if (args_has(self->args, 'y')) { - y = args_strtonum(self->args, 'y', PANE_MINIMUM, INT_MAX, - &cause); + if (args_has(args, 'y')) { + y = args_strtonum(args, 'y', PANE_MINIMUM, INT_MAX, &cause); if (cause != NULL) { cmdq_error(item, "height %s", cause); free(cause); @@ -112,13 +110,13 @@ cmd_resize_pane_exec(struct cmd *self, struct cmdq_item *item) layout_resize_pane_to(wp, LAYOUT_TOPBOTTOM, y); } - if (args_has(self->args, 'L')) + if (args_has(args, 'L')) layout_resize_pane(wp, LAYOUT_LEFTRIGHT, -adjust, 1); - else if (args_has(self->args, 'R')) + else if (args_has(args, 'R')) layout_resize_pane(wp, LAYOUT_LEFTRIGHT, adjust, 1); - else if (args_has(self->args, 'U')) + else if (args_has(args, 'U')) layout_resize_pane(wp, LAYOUT_TOPBOTTOM, -adjust, 1); - else if (args_has(self->args, 'D')) + else if (args_has(args, 'D')) layout_resize_pane(wp, LAYOUT_TOPBOTTOM, adjust, 1); server_redraw_window(wl->window); diff --git a/format.c b/format.c index 0ad8f836..ccf6c1ca 100644 --- a/format.c +++ b/format.c @@ -1447,12 +1447,13 @@ format_defaults_winlink(struct format_tree *ft, struct winlink *wl) void format_defaults_pane(struct format_tree *ft, struct window_pane *wp) { + struct window *w = wp->window; struct grid *gd = wp->base.grid; int status = wp->status; u_int idx; if (ft->w == NULL) - ft->w = wp->window; + ft->w = w; ft->wp = wp; format_add(ft, "history_size", "%u", gd->hsize); @@ -1467,7 +1468,7 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp) format_add(ft, "pane_height", "%u", wp->sy); format_add(ft, "pane_title", "%s", wp->base.title); format_add(ft, "pane_id", "%%%u", wp->id); - format_add(ft, "pane_active", "%d", wp == wp->window->active); + format_add(ft, "pane_active", "%d", wp == w->active); format_add(ft, "pane_input_off", "%d", !!(wp->flags & PANE_INPUTOFF)); format_add(ft, "pane_pipe", "%d", wp->pipe_fd != -1); @@ -1483,9 +1484,9 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp) format_add(ft, "pane_at_left", "%d", wp->xoff == 0); format_add(ft, "pane_at_top", "%d", wp->yoff == 0); format_add(ft, "pane_at_right", "%d", - wp->xoff + wp->sx == wp->window->sx); + wp->xoff + wp->sx == w->sx); format_add(ft, "pane_at_bottom", "%d", - wp->yoff + wp->sy == wp->window->sy); + wp->yoff + wp->sy == w->sy); } format_add(ft, "pane_in_mode", "%d", wp->screen != &wp->base); @@ -1493,7 +1494,7 @@ format_defaults_pane(struct format_tree *ft, struct window_pane *wp) format_add(ft, "pane_mode", "%s", wp->mode->name); format_add(ft, "pane_synchronized", "%d", - !!options_get_number(wp->window->options, "synchronize-panes")); + !!options_get_number(w->options, "synchronize-panes")); if (wp->searchstr != NULL) format_add(ft, "pane_search_string", "%s", wp->searchstr); diff --git a/screen-redraw.c b/screen-redraw.c index 931bb20f..3aa0c22a 100644 --- a/screen-redraw.c +++ b/screen-redraw.c @@ -35,17 +35,6 @@ struct screen_redraw_ctx { u_int sy; }; -static int screen_redraw_cell_border1(struct window_pane *, u_int, u_int); -static int screen_redraw_cell_border(struct client *, u_int, u_int); -static int screen_redraw_check_cell(struct client *, u_int, u_int, int, - struct window_pane **); -static int screen_redraw_check_is(u_int, u_int, int, int, struct window *, - struct window_pane *, struct window_pane *); - -static int screen_redraw_make_pane_status(struct client *, struct window *, - struct window_pane *); -static void screen_redraw_draw_pane_status(struct client *, int); - static void screen_redraw_draw_borders(struct screen_redraw_ctx *); static void screen_redraw_draw_panes(struct screen_redraw_ctx *); static void screen_redraw_draw_status(struct screen_redraw_ctx *); @@ -327,8 +316,9 @@ screen_redraw_make_pane_status(struct client *c, struct window *w, /* Draw pane status. */ static void -screen_redraw_draw_pane_status(struct client *c, int pane_status) +screen_redraw_draw_pane_status(struct screen_redraw_ctx *ctx) { + struct client *c = ctx->c; struct window *w = c->session->curw->window; struct options *oo = c->session->options; struct tty *tty = &c->tty; @@ -340,7 +330,7 @@ screen_redraw_draw_pane_status(struct client *c, int pane_status) TAILQ_FOREACH(wp, &w->panes, entry) { if (!window_pane_visible(wp)) continue; - if (pane_status == CELL_STATUS_TOP) + if (ctx->pane_status == CELL_STATUS_TOP) yoff = wp->yoff - 1; else yoff = wp->yoff + wp->sy; @@ -382,50 +372,51 @@ screen_redraw_update(struct client *c) } } +/* Set up redraw context. */ +static void +screen_redraw_set_context(struct client *c, struct screen_redraw_ctx *ctx) +{ + struct session *s = c->session; + struct options *oo = s->options; + struct window *w = s->curw->window; + struct options *wo = w->options; + + memset(ctx, 0, sizeof *ctx); + ctx->c = c; + + ctx->lines = tty_status_lines(c); + if (ctx->lines != 0 && options_get_number(oo, "status-position") == 0) + ctx->top = 1; + ctx->pane_status = options_get_number(wo, "pane-border-status"); + + ctx->sx = c->tty.sx; + ctx->sy = c->tty.sy - ctx->lines; +} + /* Redraw entire screen. */ void screen_redraw_screen(struct client *c, int draw_panes, int draw_status, int draw_borders) { - struct options *oo = c->session->options; - struct tty *tty = &c->tty; - struct window *w = c->session->curw->window; - struct options *wo = w->options; struct screen_redraw_ctx ctx; if (c->flags & CLIENT_SUSPENDED) return; - memset(&ctx, 0, sizeof ctx); - ctx.c = c; - - if (c->flags & CLIENT_STATUSOFF) - ctx.lines = 0; - else - ctx.lines = status_line_size(c->session); - if (c->message_string != NULL || c->prompt_string != NULL) - ctx.lines = (ctx.lines == 0) ? 1 : ctx.lines; - - if (ctx.lines != 0 && options_get_number(oo, "status-position") == 0) - ctx.top = 1; - ctx.pane_status = options_get_number(wo, "pane-border-status"); - - ctx.sx = tty->sx; - ctx.sy = tty->sy - ctx.lines; + screen_redraw_set_context(c, &ctx); if (ctx.lines == 0) draw_status = 0; - if (draw_borders) { - if (ctx.pane_status != CELL_STATUS_OFF) - screen_redraw_draw_pane_status(c, ctx.pane_status); + if (draw_borders) screen_redraw_draw_borders(&ctx); - } + if (draw_borders && ctx.pane_status != CELL_STATUS_OFF) + screen_redraw_draw_pane_status(&ctx); if (draw_panes) screen_redraw_draw_panes(&ctx); if (draw_status) screen_redraw_draw_status(&ctx); - tty_reset(tty); + tty_reset(&c->tty); } /* Draw a single pane. */ diff --git a/tmux.h b/tmux.h index a612fa46..711b3ec6 100644 --- a/tmux.h +++ b/tmux.h @@ -1638,6 +1638,7 @@ struct environ *environ_for_session(struct session *, int); /* tty.c */ void tty_create_log(void); +u_int tty_status_lines(struct client *); void tty_raw(struct tty *, const char *); void tty_attributes(struct tty *, const struct grid_cell *, const struct window_pane *); diff --git a/tty.c b/tty.c index 4d543537..b02cefc7 100644 --- a/tty.c +++ b/tty.c @@ -698,6 +698,21 @@ tty_repeat_space(struct tty *tty, u_int n) tty_putn(tty, s, n, n); } +/* How many lines are taken up by the status line on this client? */ +u_int +tty_status_lines(struct client *c) +{ + u_int lines; + + if (c->flags & CLIENT_STATUSOFF) + lines = 0; + else + lines = status_line_size(c->session); + if (c->message_string != NULL || c->prompt_string != NULL) + lines = (lines == 0) ? 1 : lines; + return (lines); +} + /* * Is the region large enough to be worth redrawing once later rather than * probably several times now? Currently yes if it is more than 50% of the