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 cmdmsg_rl INIT(= false); // cmdline is drawn right to left
EXTERN int msg_col; EXTERN int msg_col;
EXTERN int msg_row; EXTERN int msg_row;
EXTERN int msg_scrolled; /* Number of screen lines that windows have EXTERN int msg_scrolled; // Number of screen lines that windows have
* scrolled because of printing messages. */ // 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 TRUE don't set need_wait_return in // when msg_scrolled is non-zero
msg_puts_attr() when msg_scrolled is EXTERN bool msg_scrolled_ign INIT(= false);
non-zero */ // 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 char_u *keep_msg INIT(= NULL); /* msg to be shown after redraw */
EXTERN int keep_msg_attr INIT(= 0); /* highlight attr for keep_msg */ 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 # endif
xfree(name); 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; msg_scrolled = 0;
redraw_all_later(NOT_VALID); redraw_all_later(NOT_VALID);
} }

View File

@ -1960,8 +1960,9 @@ int msg_scrollsize(void)
*/ */
static void msg_scroll_up(void) static void msg_scroll_up(void)
{ {
if (msg_scrolled == 0) { if (!msg_did_scroll) {
ui_call_win_scroll_over_start(); ui_call_win_scroll_over_start();
msg_did_scroll = true;
} }
if (dy_flags & DY_MSGSEP) { if (dy_flags & DY_MSGSEP) {
if (msg_scrolled == 0) { 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_tick; /* let syntax code know we're in a next round of
* display updating */ * display updating */
/* // Tricky: vim code can reset msg_scrolled behind our back, so need
* if the screen was scrolled up when displaying a message, scroll it down // separate bookkeeping for now.
*/ if (msg_did_scroll) {
if (msg_scrolled) {
ui_call_win_scroll_over_reset(); 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; clear_cmdline = true;
if (dy_flags & DY_MSGSEP) { if (dy_flags & DY_MSGSEP) {
int valid = MAX(Rows - msg_scrollsize(), 0); int valid = MAX(Rows - msg_scrollsize(), 0);