From b74611d2b20fc071b8a699f2ce25e61f60118d6e Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 22 May 2022 23:13:29 +0200 Subject: refactor: improve input handling & remove commands --- src/engine/graphics/scene.cpp | 34 +++++++++++++++++++++++++++++----- src/engine/graphics/scene.hpp | 6 ++++-- 2 files changed, 33 insertions(+), 7 deletions(-) (limited to 'src/engine/graphics') 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 matrix_factory, std::shared_ptr 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(); + 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(~(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; } diff --git a/src/engine/graphics/scene.hpp b/src/engine/graphics/scene.hpp index 268f8dc..e57e1f8 100644 --- a/src/engine/graphics/scene.hpp +++ b/src/engine/graphics/scene.hpp @@ -8,6 +8,7 @@ #include #include +#include constexpr fmt::string_view ENABLE_ALT_BUFFER = "{esc}[?1049h"; constexpr fmt::string_view DISABLE_ALT_BUFFER = "{esc}[?1049l"; @@ -29,8 +30,9 @@ public: -> const std::shared_ptr> & override; private: - bool _is_shown; - std::shared_ptr> _matrix; std::shared_ptr _cursor_controller; + + bool _is_shown; + std::shared_ptr _original_termios = nullptr; }; -- cgit v1.2.3-18-g5258