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
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 - 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] 0.13.3 [2019-01-19]
------------------------------ ------------------------------

View File

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