diff options
author | HampusM <hampus@hampusmat.com> | 2022-05-22 23:13:29 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-06-13 17:56:59 +0200 |
commit | b74611d2b20fc071b8a699f2ce25e61f60118d6e (patch) | |
tree | 55d4dbf727724f7f527f2acebea83abd34317329 /src/engine/graphics/scene.cpp | |
parent | b1183c712d94d38f75068bd62df006f73bd3550f (diff) |
refactor: improve input handling & remove commands
Diffstat (limited to 'src/engine/graphics/scene.cpp')
-rw-r--r-- | src/engine/graphics/scene.cpp | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/engine/graphics/scene.cpp b/src/engine/graphics/scene.cpp index 52613d8..b0d77b8 100644 --- a/src/engine/graphics/scene.cpp +++ b/src/engine/graphics/scene.cpp @@ -13,36 +13,60 @@ Scene::Scene( IMatrixFactory<std::string_view> matrix_factory, std::shared_ptr<ICursorController> cursor_controller) noexcept - : _is_shown(false), - _matrix(matrix_factory(size() - Bounds({.width = 0U, .height = 1U}))), - _cursor_controller(std::move(cursor_controller)) + : _matrix(matrix_factory(size() - Bounds({.width = 0U, .height = 1U}))), + _cursor_controller(std::move(cursor_controller)), + _is_shown(false) { _matrix->fill(" "); } void Scene::enter() noexcept { - if (_is_shown) + if (_is_shown || _original_termios != nullptr) { return; } + // Enable alternative buffer fmt::print(ENABLE_ALT_BUFFER, fmt::arg("esc", ESC)); std::cout.flush(); + // Create a backup of the current terminal state + _original_termios = std::make_shared<termios>(); + tcgetattr(STDIN_FILENO, _original_termios.get()); + + auto new_termios = termios(*_original_termios); + + // Set the local mode flags of the new termios structure + // + // The following flags are disabled: + // ECHO - Echoing input characters + // ICANON - Canonical mode (line by line input) + // ISIG - Generate the corresponding signals for the characters + // INTR, QUIT, SUSP and DSUSP + new_termios.c_lflag &= static_cast<uint32_t>(~(ECHO | ICANON | ISIG)); + + // Set a new terminal state + tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_termios); + _is_shown = true; } void Scene::leave() noexcept { - if (!_is_shown) + if (!_is_shown || _original_termios == nullptr) { return; } + // Disable alternative buffer fmt::print(DISABLE_ALT_BUFFER, fmt::arg("esc", ESC)); std::cout.flush(); + // Restore the original terminal state + tcsetattr(STDIN_FILENO, TCSAFLUSH, _original_termios.get()); + + _original_termios = nullptr; _is_shown = false; } |