From e4c28a17392a00257bba896d59542e4c45dfd603 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 27 Mar 2013 13:39:13 +0100 Subject: [PATCH] terminal_mux: Free ncurses meta data --- gems/src/server/terminal_mux/main.cc | 13 +++++++++++++ gems/src/server/terminal_mux/ncurses.cc | 12 ++++++++++++ gems/src/server/terminal_mux/ncurses_cxx.h | 3 +++ 3 files changed, 28 insertions(+) diff --git a/gems/src/server/terminal_mux/main.cc b/gems/src/server/terminal_mux/main.cc index 7a000f8a4..da1ec1df6 100644 --- a/gems/src/server/terminal_mux/main.cc +++ b/gems/src/server/terminal_mux/main.cc @@ -190,6 +190,7 @@ namespace Terminal { Read_buffer _read_buffer; + Ncurses &_ncurses; Ncurses::Window &_window; struct Label @@ -223,6 +224,7 @@ namespace Terminal { Session_manager &session_manager, char const *label) : + _ncurses(ncurses), _window(*ncurses.create_window(0, 1, ncurses.columns(), ncurses.lines() - 1)), _label(label), _session_manager(session_manager), @@ -238,6 +240,7 @@ namespace Terminal { ~Session_component() { _session_manager.remove(this); + _ncurses.destroy_window(&_window); } @@ -406,6 +409,11 @@ class Status_window _label[0] = 0; } + ~Status_window() + { + _ncurses.destroy_window(&_window); + } + void label(char const *label) { Genode::strncpy(_label, label, sizeof(_label)); @@ -501,6 +509,11 @@ class Menu : public Registry::Entry _max_idx(0) { } + ~Menu() + { + _ncurses.destroy_window(&_window); + } + void reset_selection() { _selected_idx = 0; } void flush() { } diff --git a/gems/src/server/terminal_mux/ncurses.cc b/gems/src/server/terminal_mux/ncurses.cc index 47e698294..23541ab3f 100644 --- a/gems/src/server/terminal_mux/ncurses.cc +++ b/gems/src/server/terminal_mux/ncurses.cc @@ -29,6 +29,12 @@ Ncurses::Window::Window(unsigned x, unsigned y, unsigned w, unsigned h) { } +Ncurses::Window::~Window() +{ + delwin(_window); +} + + void Ncurses::Window::move_cursor(unsigned x, unsigned y) { wmove(_window, y, x); @@ -66,6 +72,12 @@ Ncurses::Window *Ncurses::create_window(int x, int y, int w, int h) } +void Ncurses::destroy_window(Ncurses::Window *window) +{ + Genode::destroy(Genode::env()->heap(), window); +} + + void Ncurses::clear_ok() { clearok(stdscr, true); diff --git a/gems/src/server/terminal_mux/ncurses_cxx.h b/gems/src/server/terminal_mux/ncurses_cxx.h index 949784488..b83e8ee95 100644 --- a/gems/src/server/terminal_mux/ncurses_cxx.h +++ b/gems/src/server/terminal_mux/ncurses_cxx.h @@ -32,6 +32,8 @@ class Ncurses public: + ~Window(); + void move_cursor(unsigned x, unsigned y); void print_char(unsigned long const c, bool highlight, bool inverse); @@ -44,6 +46,7 @@ class Ncurses }; Window *create_window(int x, int y, int w, int h); + void destroy_window(Ncurses::Window *window); void clear_ok();