aboutsummaryrefslogtreecommitdiff
path: root/src/engine/graphics/scene.cpp
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-05-22 23:13:29 +0200
committerHampusM <hampus@hampusmat.com>2022-06-13 17:56:59 +0200
commitb74611d2b20fc071b8a699f2ce25e61f60118d6e (patch)
tree55d4dbf727724f7f527f2acebea83abd34317329 /src/engine/graphics/scene.cpp
parentb1183c712d94d38f75068bd62df006f73bd3550f (diff)
refactor: improve input handling & remove commands
Diffstat (limited to 'src/engine/graphics/scene.cpp')
-rw-r--r--src/engine/graphics/scene.cpp34
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;
}