diff --git a/docs/changelog.rst b/docs/changelog.rst index 6aae6dbc6..8f78e9b2e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -50,6 +50,9 @@ To update |kitty|, :doc:`follow the instructions `. - 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] ------------------------------ diff --git a/kitty/history.c b/kitty/history.c index bf7d04280..142b08fcb 100644 --- a/kitty/history.c +++ b/kitty/history.c @@ -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; }