#ifdef HAVE_NCURSES
#define Uses_TColorAttr
#include <tvision/tv.h>
#include <internal/ncurdisp.h>
#include <internal/conctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>
namespace
tvision
{
NcursesDisplay::NcursesDisplay(ConsoleCtl &aCon)
noexcept
:
TerminalDisplay(aCon),
ansiScreenWriter(aCon)
{
term = newterm(
nullptr
, con.fout(), con.fin());
if
(!term)
{
fputs
(
"Cannot initialize Ncurses: 'newterm' failed.\n"
, stderr);
exit
(1);
}
if
(has_colors())
{
start_color();
use_default_colors();
}
initCapabilities();
wrefresh(stdscr);
}
NcursesDisplay::~NcursesDisplay()
{
endwin();
delscreen(term);
}
void
NcursesDisplay::reloadScreenInfo()
noexcept
{
TPoint size = con.getSize();
resize_term(size.y, size.x);
ansiScreenWriter.resetAttributes();
}
TPoint NcursesDisplay::getScreenSize()
noexcept
{
int
y, x;
getmaxyx(stdscr, y, x);
return
{max(x, 0), max(y, 0)};
}
int
NcursesDisplay::getCaretSize()
noexcept
{
int
size = curs_set(0);
curs_set(size);
return
size <= 0 ? 0 : size == 1 ? 1 : 100;
}
int
NcursesDisplay::getColorCount()
noexcept
{
return
COLORS;
}
void
NcursesDisplay::clearScreen()
noexcept
{
ansiScreenWriter.clearScreen();
}
void
NcursesDisplay::lowlevelWriteChars(TStringView chars, TColorAttr attr)
noexcept
{
ansiScreenWriter.lowlevelWriteChars(chars, attr, termcap);
}
void
NcursesDisplay::lowlevelMoveCursor(uint x, uint y)
noexcept
{
ansiScreenWriter.lowlevelMoveCursor(x, y);
}
void
NcursesDisplay::lowlevelMoveCursorX(uint x, uint)
noexcept
{
ansiScreenWriter.lowlevelMoveCursorX(x);
}
void
NcursesDisplay::lowlevelCursorSize(
int
size)
noexcept
{
curs_set(size > 0 ? size == 100 ? 2 : 1 : 0);
}
void
NcursesDisplay::lowlevelFlush()
noexcept
{
ansiScreenWriter.lowlevelFlush();
}
}
#endif // HAVE_NCURSES