aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2018-02-23 13:08:13 +0100
committerBjörn Linse <bjorn.linse@gmail.com>2018-02-24 09:10:00 +0100
commite18177692ab48e5ffc0c11184c723a52eed1248e (patch)
tree3f1d31a1fdcf226a560c2e2eaf171ad1af902e49
parentf3f1970597211c784190c4a1e1990d2386ac76a1 (diff)
downloadrneovim-e18177692ab48e5ffc0c11184c723a52eed1248e.tar.gz
rneovim-e18177692ab48e5ffc0c11184c723a52eed1248e.tar.bz2
rneovim-e18177692ab48e5ffc0c11184c723a52eed1248e.zip
screen.c: make negative 'writedelay' show all redraws
Currently writedelay shows the sequence of characters that are sent to the UI/TUI module. Here nvim has already applied an optimization: when attempting to put a char in a screen cell, if the same char already was there with the same attributes, UI output is disabled. When debugging redrawing it it sometimes more useful to inspect the redraw stream one step earlier, what region of the screen nvim actually is recomputing from buffer contents (win_line) and from evaluating statusline expressions. Take the popupmenu as an example. When closing the popupmenu (in the TUI), currently 'writedelay' looks like vim only is redrawing the region which the pum covered. This is not what happens internally: vim redraws the entire screen, even if only outputs the changed region. This commit allows negative values of 'writedelay', which causes a delay for all redrawn characters, even if the character already was displayed by the UI before.
-rw-r--r--runtime/doc/options.txt5
-rw-r--r--src/nvim/screen.c3
-rw-r--r--src/nvim/ui.c5
3 files changed, 7 insertions, 6 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index fbc055ddd5..9ef5ccb5c5 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -6922,7 +6922,8 @@ A jump table for the options with a short description can be found at |Q_op|.
'writedelay' 'wd' number (default 0)
global
The number of milliseconds to wait for each character sent to the
- screen. When non-zero, characters are sent to the terminal one by
- one. For debugging purposes.
+ screen. When positive, characters are sent to the UI one by one.
+ When negative, all redrawn characters cause a delay, even if the
+ character already was displayed by the UI. For debugging purposes.
vim:tw=78:ts=8:ft=help:noet:norl:
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index b4cdbbd824..c13e68f8a1 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -4361,7 +4361,8 @@ static int char_needs_redraw(int off_from, int off_to, int cols)
&& comp_char_differs(off_from, off_to))
|| ((*mb_off2cells)(off_from, off_from + cols) > 1
&& ScreenLines[off_from + 1]
- != ScreenLines[off_to + 1])))));
+ != ScreenLines[off_to + 1])))
+ || p_wd < 0));
}
/*
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index 241d70e1b1..f4d3cd987d 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -437,9 +437,8 @@ void ui_puts(uint8_t *str)
if (p_wd) { // 'writedelay': flush & delay each time.
ui_flush();
- assert(p_wd >= 0
- && (sizeof(long) <= sizeof(uint64_t) || p_wd <= UINT64_MAX));
- os_delay((uint64_t)p_wd, false);
+ uint64_t wd = (uint64_t)labs(p_wd);
+ os_delay(wd, false);
}
}
}