aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2019-01-31 13:13:34 +0100
committerBjörn Linse <bjorn.linse@gmail.com>2019-02-02 16:31:49 +0100
commit0f96a21e3fd6ba989e27a992e48c084dd02d8885 (patch)
tree27dbcf4ac1a7a689724406741cfa843e80fed102
parentbfe24354595d02c3e537199d34fb07739150e516 (diff)
downloadrneovim-0f96a21e3fd6ba989e27a992e48c084dd02d8885.tar.gz
rneovim-0f96a21e3fd6ba989e27a992e48c084dd02d8885.tar.bz2
rneovim-0f96a21e3fd6ba989e27a992e48c084dd02d8885.zip
multigrid: reset win scrolling after swap message
-rw-r--r--src/nvim/globals.h15
-rw-r--r--src/nvim/memline.c4
-rw-r--r--src/nvim/message.c3
-rw-r--r--src/nvim/screen.c12
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);