Reimplement split scrolling

master
C. McEnroe 2020-09-02 16:06:34 -04:00
parent a0c8a46c75
commit 9679c7474e
1 changed files with 23 additions and 6 deletions

29
ui.c
View File

@ -447,19 +447,24 @@ void uiHide(void) {
endwin(); endwin();
} }
static void mainAdd(int y, const char *str) {
int ny, nx;
wmove(main, y, 0);
styleAdd(main, str);
getyx(main, ny, nx);
if (ny == y) wclrtoeol(main);
}
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 = MAIN_LINES - 1;
for (size_t i = BufferCap - 1 - window->scroll; i < BufferCap; --i) { size_t bottom = BufferCap - 1 - window->scroll + !!window->scroll;
for (size_t i = bottom; i < BufferCap; --i) {
const struct Line *line = bufferHard(window->buffer, i); const struct Line *line = bufferHard(window->buffer, i);
if (!line) continue; if (!line) continue;
if (line->heat < Cold && window->ignore) continue; if (line->heat < Cold && window->ignore) continue;
wmove(main, y, 0); mainAdd(y, line->str);
styleAdd(main, line->str);
int ny, nx;
getyx(main, ny, nx);
if (ny == y) wclrtoeol(main);
if (!y--) break; if (!y--) break;
} }
@ -467,6 +472,18 @@ static void windowUpdate(void) {
wmove(main, y--, 0); wmove(main, y--, 0);
wclrtoeol(main); wclrtoeol(main);
} }
if (!window->scroll) return;
y = MAIN_LINES - 1;
for (size_t i = BufferCap - 1; i < BufferCap; --i) {
const struct Line *line = bufferHard(window->buffer, i);
if (!line) continue;
if (line->heat < Cold && window->ignore) continue;
mainAdd(y, line->str);
if (--y < MAIN_LINES - SplitLines) break;
}
wattr_set(main, A_NORMAL, 0, NULL);
mvwhline(main, y, 0, ACS_BULLET, COLS);
} }
static void windowScroll(struct Window *window, int n) { static void windowScroll(struct Window *window, int n) {