From 2c46c1fbbb58def2042c59a83b549cef28f2bb59 Mon Sep 17 00:00:00 2001 From: nicm Date: Sun, 19 Aug 2018 20:13:07 +0000 Subject: [PATCH] Add a flag to force redrawing of the status line even if the content hasn't changed, needed for resizing. --- usr.bin/tmux/screen-redraw.c | 23 +++++++++++++---------- usr.bin/tmux/server-client.c | 8 +++++++- usr.bin/tmux/tmux.h | 8 ++++++-- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/usr.bin/tmux/screen-redraw.c b/usr.bin/tmux/screen-redraw.c index 4cb21452db3..f0cf2a8cfaf 100644 --- a/usr.bin/tmux/screen-redraw.c +++ b/usr.bin/tmux/screen-redraw.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen-redraw.c,v 1.53 2018/08/19 16:45:03 nicm Exp $ */ +/* $OpenBSD: screen-redraw.c,v 1.54 2018/08/19 20:13:07 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -344,8 +344,8 @@ screen_redraw_draw_pane_status(struct screen_redraw_ctx *ctx) } /* Update status line and change flags if unchanged. */ -static void -screen_redraw_update(struct client *c) +static int +screen_redraw_update(struct client *c, int flags) { struct window *w = c->session->curw->window; struct window_pane *wp; @@ -358,8 +358,8 @@ screen_redraw_update(struct client *c) redraw = status_prompt_redraw(c); else redraw = status_redraw(c); - if (!redraw) - c->flags &= ~CLIENT_REDRAWSTATUS; + if (!redraw && (~flags & CLIENT_REDRAWSTATUSALWAYS)) + flags &= ~CLIENT_REDRAWSTATUS; if (options_get_number(wo, "pane-border-status") != CELL_STATUS_OFF) { redraw = 0; @@ -368,8 +368,9 @@ screen_redraw_update(struct client *c) redraw = 1; } if (redraw) - c->flags |= CLIENT_REDRAWBORDERS; + flags |= CLIENT_REDRAWBORDERS; } + return (flags); } /* Set up redraw context. */ @@ -398,21 +399,23 @@ void screen_redraw_screen(struct client *c) { struct screen_redraw_ctx ctx; + int flags; if (c->flags & CLIENT_SUSPENDED) return; - screen_redraw_update(c); + flags = screen_redraw_update(c, c->flags); screen_redraw_set_context(c, &ctx); - if (c->flags & (CLIENT_REDRAWWINDOW|CLIENT_REDRAWBORDERS)) { + if (flags & (CLIENT_REDRAWWINDOW|CLIENT_REDRAWBORDERS)) { if (ctx.pane_status != CELL_STATUS_OFF) screen_redraw_draw_pane_status(&ctx); screen_redraw_draw_borders(&ctx); } - if (c->flags & CLIENT_REDRAWWINDOW) + if (flags & CLIENT_REDRAWWINDOW) screen_redraw_draw_panes(&ctx); - if (ctx.lines != 0 && (c->flags & CLIENT_REDRAWSTATUS)) + if (ctx.lines != 0 && + (flags & (CLIENT_REDRAWSTATUS|CLIENT_REDRAWSTATUSALWAYS))) screen_redraw_draw_status(&ctx); tty_reset(&c->tty); } diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index 87062ed7ee6..804ed58761d 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.256 2018/08/19 16:45:03 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.257 2018/08/19 20:13:07 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -1319,6 +1319,12 @@ server_client_check_redraw(struct client *c) if (c->flags & (CLIENT_CONTROL|CLIENT_SUSPENDED)) return; + if (c->flags & CLIENT_ALLREDRAWFLAGS) { + log_debug("%s: redraw%s%s%s", c->name, + (c->flags & CLIENT_REDRAWWINDOW) ? " window" : "", + (c->flags & CLIENT_REDRAWSTATUS) ? " status" : "", + (c->flags & CLIENT_REDRAWBORDERS) ? " borders" : ""); + } /* * If there is outstanding data, defer the redraw until it has been diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 58b0cb36819..c34eab2ca1c 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.840 2018/08/19 16:45:03 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.841 2018/08/19 20:13:07 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1350,8 +1350,12 @@ struct client { #define CLIENT_TRIPLECLICK 0x200000 #define CLIENT_SIZECHANGED 0x400000 #define CLIENT_STATUSOFF 0x800000 +#define CLIENT_REDRAWSTATUSALWAYS 0x1000000 #define CLIENT_ALLREDRAWFLAGS \ - (CLIENT_REDRAWWINDOW|CLIENT_REDRAWSTATUS|CLIENT_REDRAWBORDERS) + (CLIENT_REDRAWWINDOW| \ + CLIENT_REDRAWSTATUS| \ + CLIENT_REDRAWSTATUSALWAYS| \ + CLIENT_REDRAWBORDERS) int flags; struct key_table *keytable; -- 2.20.1