diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2019-01-25 16:43:02 +0100 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2019-01-27 12:07:06 +0100 |
commit | d9406f4b643843160ed3e9ffe4331169dbccb135 (patch) | |
tree | a7a8fb450ac209af38daf4209125e81c4f7b3f41 | |
parent | f2398a766e094d74ab19f3037872abbc97c16728 (diff) | |
download | rneovim-d9406f4b643843160ed3e9ffe4331169dbccb135.tar.gz rneovim-d9406f4b643843160ed3e9ffe4331169dbccb135.tar.bz2 rneovim-d9406f4b643843160ed3e9ffe4331169dbccb135.zip |
terminal: simplify sizing logic
-rw-r--r-- | src/nvim/option.c | 2 | ||||
-rw-r--r-- | src/nvim/screen.c | 4 | ||||
-rw-r--r-- | src/nvim/terminal.c | 32 | ||||
-rw-r--r-- | src/nvim/window.c | 11 |
4 files changed, 20 insertions, 29 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c index 6b1c5c998f..88401d3974 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -4339,7 +4339,7 @@ static char *set_num_option(int opt_idx, char_u *varp, long value, } else if (pp == &curbuf->b_p_scbk || pp == &p_scbk) { if (curbuf->terminal) { // Force the scrollback to take effect. - terminal_resize(curbuf->terminal, UINT16_MAX, UINT16_MAX); + terminal_check_size(curbuf->terminal); } } else if (pp == &curwin->w_p_nuw) { curwin->w_nrwidth_line_count = 0; diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 2467cf192f..610a1d7b12 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -629,9 +629,7 @@ static void win_update(win_T *wp) wp->w_nrwidth = i; if (buf->terminal) { - terminal_resize(buf->terminal, - (uint16_t)(MAX(0, wp->w_grid.Columns - win_col_off(wp))), - (uint16_t)wp->w_grid.Rows); + terminal_check_size(buf->terminal); } } else if (buf->b_mod_set && buf->b_mod_xlines != 0 diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c index eae0f7ca13..489e39f784 100644 --- a/src/nvim/terminal.c +++ b/src/nvim/terminal.c @@ -334,34 +334,22 @@ void terminal_close(Terminal *term, char *msg) } } -void terminal_resize(Terminal *term, uint16_t width, uint16_t height) +void terminal_check_size(Terminal *term) { if (term->closed) { + // TODO: WTF does this mean: // If two windows display the same terminal and one is closed by keypress. return; } - bool force = width == UINT16_MAX || height == UINT16_MAX; int curwidth, curheight; vterm_get_size(term->vt, &curheight, &curwidth); + uint16_t width = 0, height = 0; - if (force || !width) { - width = (uint16_t)curwidth; - } - - if (force || !height) { - height = (uint16_t)curheight; - } - - if (!force && curheight == height && curwidth == width) { - return; - } - - if (height == 0 || width == 0) { - return; - } + bool window_seen = false; FOR_ALL_TAB_WINDOWS(tp, wp) { if (wp->w_buffer && wp->w_buffer->terminal == term) { + window_seen = true; const uint16_t win_width = (uint16_t)(MAX(0, wp->w_width - win_col_off(wp))); width = MAX(width, win_width); @@ -369,6 +357,10 @@ void terminal_resize(Terminal *term, uint16_t width, uint16_t height) } } + if ((curheight == height && curwidth == width) || height == 0 || width == 0) { + return; + } + vterm_set_size(term->vt, height, width); vterm_screen_flush_damage(term->vts); term->pending_resize = true; @@ -383,8 +375,10 @@ void terminal_enter(void) memset(s, 0, sizeof(TerminalState)); s->term = buf->terminal; - // Ensure the terminal is properly sized. - terminal_resize(s->term, 0, 0); + // Ensure the terminal is properly sized. Ideally window size management + // code should always have resized the terminal already, but check here to + // be sure. + terminal_check_size(s->term); int save_state = State; s->save_rd = RedrawingDisabled; diff --git a/src/nvim/window.c b/src/nvim/window.c index a2e3825274..f88b36615a 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -5026,7 +5026,8 @@ void scroll_to_fraction(win_T *wp, int prev_height) invalidate_botline_win(wp); if (wp->w_buffer->terminal) { - terminal_resize(wp->w_buffer->terminal, 0, wp->w_height); + terminal_check_size(wp->w_buffer->terminal); + // TODO: terminal should this itself: redraw_win_later(wp, NOT_VALID); } } @@ -5048,8 +5049,8 @@ void win_new_width(win_T *wp, int width) wp->w_width = width; // TODO(bfredl): refactor this. There should be some variable // wp->w_inner_width which always contains the final actual width. - // Alternatively use wp->w_width for this and introduce wp->w_outer_width - // Then use this to fix terminal_resize. + // Alternatively use wp->w_width for this and introduce wp->w_outer_width. + // Then use this to fix terminal_check_size. if (!ui_is_external(kUIMultigrid) || wp->w_grid.requested_cols == 0) { win_inner_width_changed(wp); } @@ -5059,9 +5060,7 @@ void win_new_width(win_T *wp, int width) if (wp->w_buffer->terminal) { if (wp->w_height != 0) { - terminal_resize(wp->w_buffer->terminal, - (uint16_t)(MAX(0, wp->w_width - win_col_off(wp))), - 0); + terminal_check_size(wp->w_buffer->terminal); } } wp->w_pos_changed = true; |