fix a memory leak when resizing the window - sfeed_curses - sfeed curses UI (now part of sfeed, development is in sfeed)
(HTM) git clone git://git.codemadness.org/sfeed_curses
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit ddf5df16b38ffae681dea75408146b51c0daeda0
(DIR) parent d59a1ec6aa2733c24906e37a0cf18170ceb14f5f
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Fri, 19 Mar 2021 22:19:19 +0100
fix a memory leak when resizing the window
This happened because setupterm() was called on each resize. ncurses internally
then allocates a new structure every time on calling setupterm(). It also
rereads the terminfo file and entries which is wasteful.
Now it is setup once and only rereads the terminal dimensions using the ioctl
directly. The global curses variables `columns` and `lines` are not used
anymore.
Note: the contents of the rows and columns are checked, because the ioctl can
succeed, but return zero values, for example on serial consoles.
Diffstat:
M sfeed_curses.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
---
(DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
@@ -1,3 +1,4 @@
+#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
@@ -622,9 +623,11 @@ win_update(struct win *w, int width, int height)
void
resizewin(void)
{
- setupterm(NULL, 1, NULL);
- /* termios globals are changed: `lines` and `columns` */
- win_update(&win, columns, lines);
+ struct winsize winsz;
+
+ if (ioctl(1, TIOCGWINSZ, &winsz) != -1 &&
+ winsz.ws_col > 0 && winsz.ws_row > 0)
+ win_update(&win, winsz.ws_col, winsz.ws_row);
if (win.dirty)
alldirty();
}
@@ -641,6 +644,7 @@ init(void)
tcur.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &tcur);
+ setupterm(NULL, 1, NULL);
resizewin();
appmode(1);