42 const Driver&) =
delete;
44 const Driver&) =
delete;
49 virtual void setForeground(
50 std::streambuf& buffer_,
52 virtual void setBackground(
53 std::streambuf& buffer_,
55 virtual void setTextStyle(
56 std::streambuf& buffer_,
58 virtual void cleanAttributes(
59 std::streambuf& buffer_) = 0;
62 static void printSequence(
63 std::streambuf& buffer_,
64 const char* sequence_);
67 Driver::Driver() =
default;
68 Driver::~Driver() =
default;
70 void Driver::printSequence(
71 std::streambuf& buffer_,
72 const char* sequence_) {
73 while(*sequence_ != 0) {
74 buffer_.sputc(*sequence_);
79 class DriverNull :
public Driver {
83 const DriverNull&) =
delete;
84 DriverNull& operator =(
85 const DriverNull&) =
delete;
88 virtual ~DriverNull();
90 virtual void setForeground(
91 std::streambuf& buffer_,
92 Color color_)
override;
93 virtual void setBackground(
94 std::streambuf& buffer_,
95 Color color_)
override;
96 virtual void setTextStyle(
97 std::streambuf& buffer_,
98 Style style_)
override;
99 virtual void cleanAttributes(
100 std::streambuf& buffer_)
override;
103 DriverNull::DriverNull() =
default;
104 DriverNull::~DriverNull() =
default;
106 void DriverNull::setForeground(
107 std::streambuf& buffer_,
112 void DriverNull::setBackground(
113 std::streambuf& buffer_,
118 void DriverNull::setTextStyle(
119 std::streambuf& buffer_,
124 void DriverNull::cleanAttributes(
125 std::streambuf& buffer_) {
129 class DriverTerminfo :
public Driver {
131 const std::string sgr0;
132 const std::string setaf;
133 const std::string setf;
134 const std::string setab;
135 const std::string setb;
136 const std::string bold;
137 const std::string dim;
139 static std::string initSequence(
140 const char* seq_id_);
142 static int convertAnsiColor(
144 static int convertLegacyColor(
150 const DriverTerminfo&) =
delete;
151 DriverTerminfo& operator =(
152 const DriverTerminfo&) =
delete;
154 explicit DriverTerminfo();
155 virtual ~DriverTerminfo();
157 virtual void setForeground(
158 std::streambuf& buffer_,
159 Color color_)
override;
160 virtual void setBackground(
161 std::streambuf& buffer_,
162 Color color_)
override;
163 virtual void setTextStyle(
164 std::streambuf& buffer_,
165 Style style_)
override;
166 virtual void cleanAttributes(
167 std::streambuf& buffer_)
override;
170 std::string DriverTerminfo::initSequence(
171 const char* seq_id_) {
172 const char* sequence_(tigetstr(seq_id_));
173 if(sequence_ !=
nullptr)
174 return std::string(sequence_);
176 return std::string();
179 int DriverTerminfo::convertAnsiColor(
204 int DriverTerminfo::convertLegacyColor(
229 DriverTerminfo::DriverTerminfo() :
230 sgr0(initSequence(
"sgr0")),
231 setaf(initSequence(
"setaf")),
232 setf(initSequence(
"setf")),
233 setab(initSequence(
"setab")),
234 setb(initSequence(
"setb")),
235 bold(initSequence(
"bold")),
236 dim(initSequence(
"dim")) {
240 DriverTerminfo::~DriverTerminfo() =
default;
242 void DriverTerminfo::setForeground(
243 std::streambuf& buffer_,
251 printSequence(buffer_, tparm(setaf.c_str(), convertAnsiColor(color_)));
257 printSequence(buffer_, tparm(setf.c_str(), convertLegacyColor(color_)));
262 void DriverTerminfo::setBackground(
263 std::streambuf& buffer_,
271 printSequence(buffer_, tparm(setab.c_str(), convertAnsiColor(color_)));
277 printSequence(buffer_, tparm(setb.c_str(), convertLegacyColor(color_)));
282 void DriverTerminfo::setTextStyle(
283 std::streambuf& buffer_,
292 printSequence(buffer_, tparm(bold.c_str()));
297 printSequence(buffer_, tparm(dim.c_str()));
306 void DriverTerminfo::cleanAttributes(
307 std::streambuf& buffer_) {
309 printSequence(buffer_, tparm(sgr0.c_str()));
315 struct TerminalDriver::Impl {
317 std::unique_ptr<Driver> driver;
321 const Impl&) =
delete;
323 const Impl&) =
delete;
330 TerminalDriver::Impl::Impl(
333 if(handle_ >= 0 && isatty(handle_)) {
335 int info_(setupterm(
nullptr, handle_, &err_));
336 if(info_ == OK && err_ == 1) {
337 driver = ::OTest2::make_unique<DriverTerminfo>();
343 driver = ::OTest2::make_unique<DriverNull>();
346 TerminalDriver::Impl::~Impl() {
352 pimpl(new Impl(handle_)) {
361 std::streambuf& buffer_,
363 pimpl->driver->setForeground(buffer_, color_);
367 std::streambuf& buffer_,
369 pimpl->driver->setBackground(buffer_, color_);
373 std::streambuf& buffer_,
375 pimpl->driver->setTextStyle(buffer_, style_);
379 std::streambuf& buffer_) {
380 pimpl->driver->cleanAttributes(buffer_);