diff options
author | Benjamin Barenblat <bbarenblat@gmail.com> | 2021-12-26 15:57:13 -0500 |
---|---|---|
committer | Benjamin Barenblat <bbarenblat@gmail.com> | 2021-12-26 15:57:13 -0500 |
commit | 4590204701232f3bee50daf69a0d3e62b026c648 (patch) | |
tree | 5d7ad9da3f97f51b37b6331b8c57d02030c21280 /goldfishterm/simple.cc | |
parent | 56f7d79efdc8ad26f5e8e5508eb616144f04fea3 (diff) |
Make terminal-handling code purer by requiring the user pass TERM, a
termios struct, and an appropriate ostream rather than querying them
from the environment. This eliminates some error-handling code and
makes duplicate syscalls less likely.
Diffstat (limited to 'goldfishterm/simple.cc')
-rw-r--r-- | goldfishterm/simple.cc | 34 |
1 files changed, 7 insertions, 27 deletions
diff --git a/goldfishterm/simple.cc b/goldfishterm/simple.cc index 88ceef0..0afa08f 100644 --- a/goldfishterm/simple.cc +++ b/goldfishterm/simple.cc @@ -14,9 +14,7 @@ #include "goldfishterm/simple.h" -#include <stdlib.h> #include <termios.h> -#include <unistd.h> #include <stdexcept> #include <vector> @@ -33,22 +31,6 @@ namespace { using ::goldfishterm_internal::InterpretStringCapability; using ::goldfishterm_internal::InterpretStringCapabilityInput; -termios StdoutTermios() { - termios tty; - if (tcgetattr(STDOUT_FILENO, &tty) < 0) { - throw std::system_error(errno, std::system_category(), "tcgetattr"); - } - return tty; -} - -absl::string_view TerminalNameFromEnvironment() { - const char* name = getenv("TERM"); - if (name == nullptr) { - throw std::runtime_error("TERM unset"); - } - return name; -} - StringCapability CursorVisibilityCapability(CursorVisibility v) { switch (v) { case CursorVisibility::kInvisible: @@ -64,14 +46,12 @@ StringCapability CursorVisibilityCapability(CursorVisibility v) { } // namespace -SimpleTerminalOutput::SimpleTerminalOutput() - : SimpleTerminalOutput(StdoutTermios()) {} - -SimpleTerminalOutput::SimpleTerminalOutput(const termios& tty) - : terminfo_( - TerminfoEntry::FromSystemDatabase(TerminalNameFromEnvironment())) { - baud_ = cfgetospeed(&tty); -} +SimpleTerminalOutput::SimpleTerminalOutput(absl::string_view terminal_name, + const termios& tty, + std::ostream& out) + : terminfo_(TerminfoEntry::FromSystemDatabase(terminal_name)), + baud_(cfgetospeed(&tty)), + out_(out) {} void SimpleTerminalOutput::SetCursorVisibility(CursorVisibility v) { return Emit(CursorVisibilityCapability(v)); @@ -86,7 +66,7 @@ void SimpleTerminalOutput::Emit( std::move(parameters), /*baud=*/baud_, /*lines_affected=*/1)) .terms, - std::cout); + out_); } } // namespace goldfishterm |