genode/gems/src/server/terminal_mux/ncurses.cc

131 lines
2.0 KiB
C++

/*
* \brief C++ wrapper for ncurses API
* \author Norman Feske
* \date 2013-02-21
*/
/* Genode includes */
#include <base/printf.h>
#include <base/env.h>
/* libc and ncurses includes */
#include <ncurses.h>
#include <stdlib.h> /* for 'setenv()' */
#include <sys/types.h> /* for 'open()' */
#include <fcntl.h>
#include <unistd.h> /* for 'dup2()' */
/* local includes */
#include <ncurses_cxx.h>
struct Ncurses::Window::Ncurses_window : WINDOW { };
Ncurses::Window::Window(unsigned x, unsigned y, unsigned w, unsigned h)
:
_window(static_cast<Ncurses::Window::Ncurses_window *>(newwin(h, w, y, x))),
_w(w)
{ }
Ncurses::Window::~Window()
{
delwin(_window);
}
void Ncurses::Window::move_cursor(unsigned x, unsigned y)
{
wmove(_window, y, x);
}
void Ncurses::Window::print_char(unsigned long const c, bool highlight, bool inverse)
{
waddch(_window, c | (highlight ? A_STANDOUT : 0)
| (inverse ? A_REVERSE : 0));
}
void Ncurses::Window::refresh()
{
wnoutrefresh(_window);
}
void Ncurses::Window::erase()
{
werase(_window);
}
void Ncurses::Window::horizontal_line(int line)
{
mvwhline(_window, line, 0, ' ' | A_REVERSE, _w);
}
Ncurses::Window *Ncurses::create_window(int x, int y, int w, int h)
{
return new (Genode::env()->heap()) Ncurses::Window(x, y, w, h);
}
void Ncurses::destroy_window(Ncurses::Window *window)
{
Genode::destroy(Genode::env()->heap(), window);
}
void Ncurses::clear_ok()
{
clearok(stdscr, true);
}
void Ncurses::do_update()
{
doupdate();
}
void Ncurses::cursor_visible(bool visible)
{
if (!visible)
wmove(stdscr, _lines - 1, 0);
}
int Ncurses::read_character()
{
return getch();
}
Ncurses::Ncurses()
{
/*
* Redirect stdio to terminal
*/
char const *device_name = "/dev/terminal";
int fd = open(device_name, O_RDWR);
if (fd < 0) {
PERR("Error: could not open %s", device_name);
return;
}
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
setenv("TERM", "vt102", 1);
initscr();
nonl();
noecho();
nodelay(stdscr, true);
cbreak();
getmaxyx(stdscr, _lines, _columns);
}