multigrid: reset win scrolling after swap message

This commit is contained in:
Björn Linse 2019-01-31 13:13:34 +01:00
parent bfe2435459
commit 0f96a21e3f
4 changed files with 22 additions and 12 deletions

View File

@ -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 */

View File

@ -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);
}

View File

@ -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) {

View File

@ -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);