alec

Abstraction Layer for Escape Codes
git clone git://git.dimitrijedobrota.com/alec.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |

commit945169ba2c508fb533f155c9915ff6476dfa9ef3
parent970f2676dd7c05d9a8b34e278b2778c2a393d1eb
authorDimitrije Dobrota <mail@dimitrijedobrota.com>
dateWed, 5 Feb 2025 10:59:33 +0100

Add function to determine the screen size

Diffstat:
MCMakeLists.txt|+-
Msource/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: