Fix scrollback pager history not being cleared when clearing the main scrollback buffer

Fixes #1387
This commit is contained in:
Kovid Goyal 2019-02-16 12:13:30 +05:30
parent 0833697c49
commit 718e6fa93d
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 22 additions and 3 deletions

View File

@ -50,6 +50,9 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
- macOS: Add a number of common macOS keyboard shortcuts
- Fix scrollback pager history not being cleared when clearing the
main scrollback buffer (:iss:`1387`)
0.13.3 [2019-01-19]
------------------------------

View File

@ -59,6 +59,7 @@ alloc_pagerhist(unsigned int pagerhist_sz) {
PagerHistoryBuf *ph;
if (!pagerhist_sz) return NULL;
ph = PyMem_Calloc(1, sizeof(PagerHistoryBuf));
if (!ph) return NULL;
ph->maxsz = pagerhist_sz / sizeof(Py_UCS4);
ph->bufsize = 1024*1024 / sizeof(Py_UCS4);
ph->buffer = PyMem_RawMalloc(1024*1024);
@ -66,6 +67,13 @@ alloc_pagerhist(unsigned int pagerhist_sz) {
return ph;
}
static inline void
free_pagerhist(HistoryBuf *self) {
if (self->pagerhist) PyMem_Free(self->pagerhist->buffer);
PyMem_Free(self->pagerhist);
self->pagerhist = NULL;
}
static inline bool
pagerhist_extend(PagerHistoryBuf *ph, size_t minsz) {
if (ph->bufsize >= ph->maxsz) return false;
@ -77,6 +85,14 @@ pagerhist_extend(PagerHistoryBuf *ph, size_t minsz) {
return true;
}
static inline void
pagerhist_clear(HistoryBuf *self) {
if (!self->pagerhist || !self->pagerhist->maxsz) return;
index_type pagerhist_sz = self->pagerhist->maxsz * sizeof(Py_UCS4);
free_pagerhist(self);
self->pagerhist = alloc_pagerhist(pagerhist_sz);
}
static PyObject *
new(PyTypeObject *type, PyObject *args, PyObject UNUSED *kwds) {
HistoryBuf *self;
@ -112,8 +128,7 @@ dealloc(HistoryBuf* self) {
PyMem_Free(self->segments[i].line_attrs);
}
PyMem_Free(self->segments);
if (self->pagerhist) PyMem_Free(self->pagerhist->buffer);
PyMem_Free(self->pagerhist);
free_pagerhist(self);
Py_TYPE(self)->tp_free((PyObject*)self);
}
@ -152,8 +167,9 @@ historybuf_mark_line_dirty(HistoryBuf *self, index_type y) {
*p |= TEXT_DIRTY_MASK;
}
inline void
void
historybuf_clear(HistoryBuf *self) {
pagerhist_clear(self);
self->count = 0;
self->start_of_data = 0;
}