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

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: