Scroll the window only once during reflow
ncurses implements scrolling as a memmove of the array of lines pointers, which happens each time a line is added to the bottom of the window, causing a scroll. This would get noticeably slow if WindowLines were increased to just 1024. Should've used a ring buffer, I think.master
parent
b20be7cbad
commit
fa29c37911
11
ui.c
11
ui.c
|
@ -621,18 +621,21 @@ void uiFormat(
|
||||||
|
|
||||||
static void reflow(struct Window *window) {
|
static void reflow(struct Window *window) {
|
||||||
werase(window->pad);
|
werase(window->pad);
|
||||||
wmove(window->pad, WindowLines - 1, 0);
|
wmove(window->pad, 0, 0);
|
||||||
|
int flowed = 0;
|
||||||
window->unreadLines = 0;
|
window->unreadLines = 0;
|
||||||
for (size_t i = 0; i < BufferCap; ++i) {
|
for (size_t i = 0; i < BufferCap; ++i) {
|
||||||
const char *line = bufferLine(&window->buffer, i);
|
const char *line = bufferLine(&window->buffer, i);
|
||||||
if (!line) continue;
|
if (!line) continue;
|
||||||
waddch(window->pad, '\n');
|
waddch(window->pad, '\n');
|
||||||
|
int lines = 1 + wordWrap(window->pad, line);
|
||||||
if (i >= (size_t)(BufferCap - window->unreadTotal)) {
|
if (i >= (size_t)(BufferCap - window->unreadTotal)) {
|
||||||
window->unreadLines += 1 + wordWrap(window->pad, line);
|
window->unreadLines += lines;
|
||||||
} else {
|
|
||||||
wordWrap(window->pad, line);
|
|
||||||
}
|
}
|
||||||
|
flowed += lines;
|
||||||
}
|
}
|
||||||
|
wscrl(window->pad, -(WindowLines - 1 - flowed));
|
||||||
|
wmove(window->pad, WindowLines - 1, RIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void resize(void) {
|
static void resize(void) {
|
||||||
|
|
Loading…
Reference in New Issue