Simplify windowUpdate loops and factor out windowTop

No idea why I made that more complicated than it had to be looping
backwards.
master
C. McEnroe 2021-01-21 11:39:23 -05:00
parent 6a6456a0dc
commit 6ee0aea9e5
1 changed files with 17 additions and 21 deletions

38
ui.c
View File

@ -463,33 +463,31 @@ static void mainAdd(int y, const char *str) {
(void)nx;
}
static size_t windowTop(const struct Window *window) {
size_t top = BufferCap - MAIN_LINES - window->scroll;
if (window->scroll) top += MarkerLines;
return top;
}
static void windowUpdate(void) {
struct Window *window = windows.ptrs[windows.show];
int y = MAIN_LINES - 1;
size_t bottom = BufferCap - 1 - window->scroll + !!window->scroll;
for (size_t i = bottom; i < BufferCap; --i) {
int y = 0;
int marker = MAIN_LINES - SplitLines - MarkerLines;
for (size_t i = windowTop(window); i < BufferCap; ++i) {
const struct Line *line = bufferHard(window->buffer, i);
if (!line) break;
mainAdd(y, line->str);
if (!y--) break;
}
while (y >= 0) {
wmove(main, y--, 0);
wclrtoeol(main);
mainAdd(y++, (line ? line->str : ""));
if (window->scroll && y == marker) break;
}
if (!window->scroll) return;
y = MAIN_LINES - 1;
for (size_t i = BufferCap - 1; i < BufferCap; --i) {
y = MAIN_LINES - SplitLines;
for (size_t i = BufferCap - SplitLines; i < BufferCap; ++i) {
const struct Line *line = bufferHard(window->buffer, i);
if (!line) break;
mainAdd(y, line->str);
if (--y < MAIN_LINES - SplitLines) break;
mainAdd(y++, (line ? line->str : ""));
}
wattr_set(main, A_NORMAL, 0, NULL);
mvwhline(main, y, 0, ACS_BULLET, COLS);
mvwhline(main, marker, 0, ACS_BULLET, COLS);
}
static void windowScroll(struct Window *window, int n) {
@ -513,8 +511,7 @@ static void windowScrollTo(struct Window *window, int top) {
}
static void windowScrollHot(struct Window *window, int dir) {
size_t from = BufferCap - window->scroll - MAIN_LINES + MarkerLines + dir;
for (size_t i = from; i < BufferCap; i += dir) {
for (size_t i = windowTop(window) + dir; i < BufferCap; i += dir) {
const struct Line *line = bufferHard(window->buffer, i);
const struct Line *prev = bufferHard(window->buffer, i - 1);
if (!line || line->heat < Hot) continue;
@ -526,8 +523,7 @@ static void windowScrollHot(struct Window *window, int dir) {
static void
windowScrollSearch(struct Window *window, const char *str, int dir) {
size_t from = BufferCap - window->scroll - MAIN_LINES + MarkerLines + dir;
for (size_t i = from; i < BufferCap; i += dir) {
for (size_t i = windowTop(window) + dir; i < BufferCap; i += dir) {
const struct Line *line = bufferHard(window->buffer, i);
if (!line || !strcasestr(line->str, str)) continue;
windowScrollTo(window, BufferCap - i);