alecAbstraction Layer for Escape Codes |
git clone git://git.dimitrijedobrota.com/alec.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING | |
commit | 945169ba2c508fb533f155c9915ff6476dfa9ef3 |
parent | 970f2676dd7c05d9a8b34e278b2778c2a393d1eb |
author | Dimitrije Dobrota <mail@dimitrijedobrota.com> |
date | Wed, 5 Feb 2025 10:59:33 +0100 |
Add function to determine the screen size
Diffstat:M | CMakeLists.txt | | | +- |
M | source/alec.rules.hpp | | | ++++++++++++++++++++++++++ |
2 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -4,7 +4,7 @@ include(cmake/prelude.cmake)
project(
alec
VERSION 0.1.13
VERSION 0.1.14
DESCRIPTION "Abstraction Layer for Escape Codes"
HOMEPAGE_URL "git://git.dimitrijedobrota.com/alec.git"
LANGUAGES CXX
diff --git a/source/alec.rules.hpp b/source/alec.rules.hpp
@@ -8,6 +8,7 @@
#include <stdexcept>
#include <string>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>
@@ -386,6 +387,8 @@ enum error_code_t // NOLINT
TERMIOSWR,
BUFFULL,
CHARRD,
IOCTL,
SCREENSZ
};
template<error_code_t e>
@@ -411,6 +414,10 @@ private:
return "Buffer is full";
case error_code_t::CHARRD:
return "Can't read character";
case error_code_t::IOCTL:
return "ioctl error";
case error_code_t::SCREENSZ:
return "Can't determine the screen size";
}
return "alec error, should not happen...";
@@ -533,6 +540,25 @@ inline void dest_buffer()
get_buffer().reset();
}
inline std::pair<std::uint16_t, std::uint16_t> get_screen_size()
{
#ifdef TIOCGSIZE
struct ttysize tts = {};
if (ioctl(STDIN_FILENO, TIOCGSIZE, &tts) == -1) { // NOLINT
throw error<error_code_t::IOCTL>();
}
return {tts.ts_cols, tts.ts_lines};
#elif defined(TIOCGWINSZ)
struct winsize tts = {};
if (ioctl(STDIN_FILENO, TIOCGWINSZ, &tts) == -1) { // NOLINT
throw error<error_code_t::IOCTL>();
}
return {tts.ws_col, tts.ws_row};
#endif /* TIOCGSIZE */
throw error<error_code_t::SCREENSZ>();
}
class event
{
public: