Simplify windowUpdate loops and factor out windowTop
No idea why I made that more complicated than it had to be looping backwards.master
parent
6a6456a0dc
commit
6ee0aea9e5
38
ui.c
38
ui.c
|
@ -463,33 +463,31 @@ static void mainAdd(int y, const char *str) {
|
||||||
(void)nx;
|
(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) {
|
static void windowUpdate(void) {
|
||||||
struct Window *window = windows.ptrs[windows.show];
|
struct Window *window = windows.ptrs[windows.show];
|
||||||
|
|
||||||
int y = MAIN_LINES - 1;
|
int y = 0;
|
||||||
size_t bottom = BufferCap - 1 - window->scroll + !!window->scroll;
|
int marker = MAIN_LINES - SplitLines - MarkerLines;
|
||||||
for (size_t i = bottom; i < BufferCap; --i) {
|
for (size_t i = windowTop(window); i < BufferCap; ++i) {
|
||||||
const struct Line *line = bufferHard(window->buffer, i);
|
const struct Line *line = bufferHard(window->buffer, i);
|
||||||
if (!line) break;
|
mainAdd(y++, (line ? line->str : ""));
|
||||||
mainAdd(y, line->str);
|
if (window->scroll && y == marker) break;
|
||||||
if (!y--) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (y >= 0) {
|
|
||||||
wmove(main, y--, 0);
|
|
||||||
wclrtoeol(main);
|
|
||||||
}
|
}
|
||||||
if (!window->scroll) return;
|
if (!window->scroll) return;
|
||||||
|
|
||||||
y = MAIN_LINES - 1;
|
y = MAIN_LINES - SplitLines;
|
||||||
for (size_t i = BufferCap - 1; i < BufferCap; --i) {
|
for (size_t i = BufferCap - SplitLines; i < BufferCap; ++i) {
|
||||||
const struct Line *line = bufferHard(window->buffer, i);
|
const struct Line *line = bufferHard(window->buffer, i);
|
||||||
if (!line) break;
|
mainAdd(y++, (line ? line->str : ""));
|
||||||
mainAdd(y, line->str);
|
|
||||||
if (--y < MAIN_LINES - SplitLines) break;
|
|
||||||
}
|
}
|
||||||
wattr_set(main, A_NORMAL, 0, NULL);
|
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) {
|
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) {
|
static void windowScrollHot(struct Window *window, int dir) {
|
||||||
size_t from = BufferCap - window->scroll - MAIN_LINES + MarkerLines + dir;
|
for (size_t i = windowTop(window) + dir; i < BufferCap; i += dir) {
|
||||||
for (size_t i = from; i < BufferCap; i += dir) {
|
|
||||||
const struct Line *line = bufferHard(window->buffer, i);
|
const struct Line *line = bufferHard(window->buffer, i);
|
||||||
const struct Line *prev = bufferHard(window->buffer, i - 1);
|
const struct Line *prev = bufferHard(window->buffer, i - 1);
|
||||||
if (!line || line->heat < Hot) continue;
|
if (!line || line->heat < Hot) continue;
|
||||||
|
@ -526,8 +523,7 @@ static void windowScrollHot(struct Window *window, int dir) {
|
||||||
|
|
||||||
static void
|
static void
|
||||||
windowScrollSearch(struct Window *window, const char *str, int dir) {
|
windowScrollSearch(struct Window *window, const char *str, int dir) {
|
||||||
size_t from = BufferCap - window->scroll - MAIN_LINES + MarkerLines + dir;
|
for (size_t i = windowTop(window) + dir; i < BufferCap; i += dir) {
|
||||||
for (size_t i = from; i < BufferCap; i += dir) {
|
|
||||||
const struct Line *line = bufferHard(window->buffer, i);
|
const struct Line *line = bufferHard(window->buffer, i);
|
||||||
if (!line || !strcasestr(line->str, str)) continue;
|
if (!line || !strcasestr(line->str, str)) continue;
|
||||||
windowScrollTo(window, BufferCap - i);
|
windowScrollTo(window, BufferCap - i);
|
||||||
|
|
Loading…
Reference in New Issue