mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-08 14:18:26 +02:00
Fix history buffer not clearing lines when rewrapping and the number of lines is larger than size of buffer
This commit is contained in:
@@ -286,18 +286,23 @@ pagerhist_push(HistoryBuf *self, ANSIBuf *as_ansi_buf) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static index_type
|
static index_type
|
||||||
historybuf_push(HistoryBuf *self, ANSIBuf *as_ansi_buf) {
|
historybuf_push(HistoryBuf *self, ANSIBuf *as_ansi_buf, bool *needs_clear) {
|
||||||
index_type idx = (self->start_of_data + self->count) % self->ynum;
|
index_type idx = (self->start_of_data + self->count) % self->ynum;
|
||||||
if (self->count == self->ynum) {
|
if (self->count == self->ynum) {
|
||||||
pagerhist_push(self, as_ansi_buf);
|
pagerhist_push(self, as_ansi_buf);
|
||||||
self->start_of_data = (self->start_of_data + 1) % self->ynum;
|
self->start_of_data = (self->start_of_data + 1) % self->ynum;
|
||||||
} else self->count++;
|
*needs_clear = true;
|
||||||
|
} else {
|
||||||
|
self->count++;
|
||||||
|
*needs_clear = false;
|
||||||
|
}
|
||||||
return idx;
|
return idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
historybuf_add_line(HistoryBuf *self, const Line *line, ANSIBuf *as_ansi_buf) {
|
historybuf_add_line(HistoryBuf *self, const Line *line, ANSIBuf *as_ansi_buf) {
|
||||||
index_type idx = historybuf_push(self, as_ansi_buf);
|
bool needs_clear;
|
||||||
|
index_type idx = historybuf_push(self, as_ansi_buf, &needs_clear);
|
||||||
init_line(self, idx, self->line);
|
init_line(self, idx, self->line);
|
||||||
copy_line(line, self->line);
|
copy_line(line, self->line);
|
||||||
*attrptr(self, idx) = line->attrs;
|
*attrptr(self, idx) = line->attrs;
|
||||||
@@ -621,9 +626,14 @@ history_buf_set_last_char_as_continuation(HistoryBuf *self, index_type y, bool w
|
|||||||
index_type
|
index_type
|
||||||
historybuf_next_dest_line(HistoryBuf *self, ANSIBuf *as_ansi_buf, Line *src_line, index_type dest_y, Line *dest_line, bool continued) {
|
historybuf_next_dest_line(HistoryBuf *self, ANSIBuf *as_ansi_buf, Line *src_line, index_type dest_y, Line *dest_line, bool continued) {
|
||||||
history_buf_set_last_char_as_continuation(self, 0, continued);
|
history_buf_set_last_char_as_continuation(self, 0, continued);
|
||||||
index_type idx = historybuf_push(self, as_ansi_buf);
|
bool needs_clear;
|
||||||
|
index_type idx = historybuf_push(self, as_ansi_buf, &needs_clear);
|
||||||
*attrptr(self, idx) = src_line->attrs;
|
*attrptr(self, idx) = src_line->attrs;
|
||||||
init_line(self, idx, dest_line);
|
init_line(self, idx, dest_line);
|
||||||
|
if (needs_clear) {
|
||||||
|
zero_at_ptr_count(dest_line->cpu_cells, dest_line->xnum);
|
||||||
|
zero_at_ptr_count(dest_line->gpu_cells, dest_line->xnum);
|
||||||
|
}
|
||||||
return dest_y + 1;
|
return dest_y + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user