/* scroll the view and reflow the screen lines */
size_t pos = view->rows[0]->off, line = view->rows[0]->line;
if (!line || view->sync_lines) {
- line = buf_getln(&(view->buffer), pos);
+ line = buf_getln(&(view->buffer), buf_bol(&(view->buffer), pos));
view->sync_lines = false;
}
+
for (size_t y = 0; y < view->nrows; y++)
pos = fill_row(view, y, pos, &line);
if (view->sync_needed)
}
static void update_lines(View* view) {
- if (!view->nrows) return;
- if (view->selection.beg <= view->rows[0]->off ||
+ if (!view->nrows ||
+ view->selection.beg <= view->rows[0]->off ||
view->selection.end <= view->rows[0]->off)
view->sync_lines = true;
}
buf_undo(&(view->buffer), &(view->selection));
view_jumpto(view, true, view->selection.end);
view->sync_center = !selection_visible(view);
+ view->sync_lines = true;
}
void view_redo(View* view) {
buf_redo(&(view->buffer), &(view->selection));
view_jumpto(view, true, view->selection.end);
view->sync_center = !selection_visible(view);
+ view->sync_lines = true;
}
void view_putstr(View* view, char* str) {
Rune r = buf_get(&(view->buffer), pos++);
x += setcell(view, row, x, attr, r);
if (buf_iseol(&(view->buffer), pos-1)) {
- if (line)
- *line += 1;
+ if (line) *line += 1;
break;
}
}
static unsigned scroll_up(View* view) {
size_t first = view->rows[0]->off;
size_t bol = buf_bol(&(view->buffer), first);
- size_t prevln = (first == bol ? buf_byline(&(view->buffer), bol, -1) : bol);
+ size_t prevln = (first == bol ? buf_byline(&(view->buffer), bol, UP) : bol);
size_t linenum = (prevln < bol ? view->rows[0]->line-1 : view->rows[0]->line);
if (!first) return first;
prevln = prev_screen_line(view, prevln, first);