From 18c80370b5fed57d151c55d186cb94be0a1e1ec6 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Mon, 27 Apr 2026 02:35:27 -0400 Subject: Reclaim a screen's lines when it gets closed. --- src/pool.c | 16 ++++++++++++++++ src/pool.h | 4 ++++ src/screen.c | 5 +---- 3 files changed, 21 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/pool.c b/src/pool.c index bd1111d..de79997 100644 --- a/src/pool.c +++ b/src/pool.c @@ -122,3 +122,19 @@ void add_line(char s) { screens[s].line_list = p; screens[s].line_count++; } + +void pool_reclaim_lines(char s) { + line_t *p, *q; + + p = screens[s].line_list; + while(p != (line_t *)END_MARKER) { + q = p; + p = p->next; + } + + q->next = pools[screens[s].pool].free_list; + pools[screens[s].pool].free_list = screens[s].line_list; + + /* theoretically this could be 0, but as a safety net... */ + screens[s].line_list = (line_t *)END_MARKER; +} diff --git a/src/pool.h b/src/pool.h index ba7e60f..d78e611 100644 --- a/src/pool.h +++ b/src/pool.h @@ -74,3 +74,7 @@ char get_smallest_pool(void); /* add a line to a screen */ void add_line(char s); + +/* called by scr_destroy(). returns a now-destroyed screen's + lines to the pool's free list. */ +void pool_reclaim_lines(char s); diff --git a/src/screen.c b/src/screen.c index d090e51..1bd239a 100644 --- a/src/screen.c +++ b/src/screen.c @@ -82,16 +82,13 @@ void scr_destroy(char s) { if(screens[s].status == SCR_UNUSED) return; - // pool_reclaim_lines(screens[s].pool, screens[s].line_list); + pool_reclaim_lines(s); pools[screens[s].pool].screen_count--; screens[s].title[0] = 0; screens[s].status = SCR_UNUSED; screens[s].pool = POOL_UNUSED; screens[s].line_count = screens[s].scrollback_pos = 0; - - /* theoretically this could be 0, but as a safety net... */ - screens[s].line_list = (line_t *)END_MARKER; } void render_vis_buf(void) { -- cgit v1.2.3