diff options
-rw-r--r-- | src/nvim/globals.h | 15 | ||||
-rw-r--r-- | src/nvim/memline.c | 4 | ||||
-rw-r--r-- | src/nvim/message.c | 3 | ||||
-rw-r--r-- | src/nvim/screen.c | 12 |
4 files changed, 22 insertions, 12 deletions
diff --git a/src/nvim/globals.h b/src/nvim/globals.h index ccdf8f87ab..f47697b190 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -194,12 +194,15 @@ EXTERN int compl_cont_status INIT(= 0); EXTERN int cmdmsg_rl INIT(= false); // cmdline is drawn right to left EXTERN int msg_col; EXTERN int msg_row; -EXTERN int msg_scrolled; /* Number of screen lines that windows have - * scrolled because of printing messages. */ -EXTERN int msg_scrolled_ign INIT(= FALSE); -/* when TRUE don't set need_wait_return in - msg_puts_attr() when msg_scrolled is - non-zero */ +EXTERN int msg_scrolled; // Number of screen lines that windows have + // scrolled because of printing messages. +// when true don't set need_wait_return in msg_puts_attr() +// when msg_scrolled is non-zero +EXTERN bool msg_scrolled_ign INIT(= false); +// Whether the screen is damaged due to scrolling. Sometimes msg_scrolled +// is reset before the screen is redrawn, so we need to keep track of this. +EXTERN bool msg_did_scroll INIT(= false); + EXTERN char_u *keep_msg INIT(= NULL); /* msg to be shown after redraw */ EXTERN int keep_msg_attr INIT(= 0); /* highlight attr for keep_msg */ diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 4c4f7d65bd..662eda3c7c 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -3412,7 +3412,9 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, # endif xfree(name); - /* pretend screen didn't scroll, need redraw anyway */ + // pretend screen didn't scroll, need redraw anyway + // TODO(bfredl): when doing the message grid refactor, + // simplify this special case. msg_scrolled = 0; redraw_all_later(NOT_VALID); } diff --git a/src/nvim/message.c b/src/nvim/message.c index 1330460867..4552999256 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -1960,8 +1960,9 @@ int msg_scrollsize(void) */ static void msg_scroll_up(void) { - if (msg_scrolled == 0) { + if (!msg_did_scroll) { ui_call_win_scroll_over_start(); + msg_did_scroll = true; } if (dy_flags & DY_MSGSEP) { if (msg_scrolled == 0) { diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 7252289e0e..759eefaecc 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -307,11 +307,15 @@ void update_screen(int type) ++display_tick; /* let syntax code know we're in a next round of * display updating */ - /* - * if the screen was scrolled up when displaying a message, scroll it down - */ - if (msg_scrolled) { + // Tricky: vim code can reset msg_scrolled behind our back, so need + // separate bookkeeping for now. + if (msg_did_scroll) { ui_call_win_scroll_over_reset(); + msg_did_scroll = false; + } + + // if the screen was scrolled up when displaying a message, scroll it down + if (msg_scrolled) { clear_cmdline = true; if (dy_flags & DY_MSGSEP) { int valid = MAX(Rows - msg_scrollsize(), 0); |