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 |

commit25a60ee9a228faff7f1aa38a5821f6e6db46541b
parentefc956ad63c09f5934ccdf078091efeab162fec1
authorDimitrije Dobrota <mail@dimitrijedobrota.com>
dateSun, 25 Feb 2024 22:55:19 +0000

Set template name to lowercase and add _v suffix

Diffstat:
Mdemo/demo.cpp|++++++++++----------
Msrc/alec.hpp|++++++++++++++++++++++++++++++++--------------------------------------

2 files changed, 42 insertions(+), 48 deletions(-)


diff --git a/demo/demo.cpp b/demo/demo.cpp

@@ -6,23 +6,23 @@ using enum COLOR;

using enum DECOR;
int main(void) {
std::cout << ABUF_SHOW << CURSOR_HIDE;
std::cout << abuf_show_v << cursor_hide_v;
std::cout << CURSOR_POSITION<1, 1> << FOREGROUND<91> << "HELLO!\n";
std::cout << cursor_position_v<1, 1> << foreground_v<91> << "HELLO!\n";
std::cout << CURSOR_DOWN<3>;
std::cout << FOREGROUND<30> << BACKGROUND<196, 53, 64> << "WORLD!\n";
std::cout << cursor_down_v<3>;
std::cout << foreground_v<30> << background_v<196, 53, 64> << "WORLD!\n";
std::cout << BACKGROUND<DEFAULT> << "testing 1...\n" << FOREGROUND<DEFAULT>;
std::cout << DECOR_SET<INVERSE> << "testing 2...\n" << DECOR_RESET<INVERSE>;
std::cout << background_v<DEFAULT> << "testing 1...\n" << foreground_v<DEFAULT>;
std::cout << decor_set_v<INVERSE> << "testing 2...\n" << decor_reset_v<INVERSE>;
std::cout << CURSOR_UP<5> << "Hello there!" << CURSOR_SAVE;
std::cout << CURSOR_DOWN<10> << "General Kenobi!";
std::cout << CURSOR_POSITION<10, 40> << "no pain no gain" << CURSOR_LOAD << CURSOR_SHOW;
std::cout << cursor_up_v<5> << "Hello there!" << cursor_save_v;
std::cout << cursor_down_v<10> << "General Kenobi!";
std::cout << cursor_position_v<10, 40> << "no pain no gain" << cursor_load_v << cursor_show_v;
getchar();
std::cout << ABUF_HIDE;
std::cout << abuf_hide_v;
return 0;
}

diff --git a/src/alec.hpp b/src/alec.hpp

@@ -116,120 +116,114 @@ concept limit_pos = n >= 0;

// Move cursor up/down/frwd/back
template <int n>
requires limit_pos<n>
static constexpr auto CURSOR_UP = details::escape<n, 'A'>;
static constexpr auto cursor_up_v = details::escape<n, 'A'>;
template <int n>
requires limit_pos<n>
static constexpr auto CURSOR_DOWN = details::escape<n, 'B'>;
static constexpr auto cursor_down_v = details::escape<n, 'B'>;
template <int n>
requires limit_pos<n>
static constexpr auto CURSOR_FRWD = details::escape<n, 'C'>;
static constexpr auto cursor_frwd_v = details::escape<n, 'C'>;
template <int n>
requires limit_pos<n>
static constexpr auto CURSOR_BACK = details::escape<n, 'D'>;
static constexpr auto cursor_back_v = details::escape<n, 'D'>;
// Move cursor to the next/prev line
template <int n>
requires limit_pos<n>
static constexpr auto CURSOR_LINE_NEXT = details::escape<n, 'E'>;
static constexpr auto cursor_line_next_v = details::escape<n, 'E'>;
template <int n>
requires limit_pos<n>
static constexpr auto CURSOR_LINE_PREV = details::escape<n, 'F'>;
static constexpr auto cursor_line_prev_v = details::escape<n, 'F'>;
// Set cursor to specific column
template <int n>
requires limit_pos<n>
static constexpr auto CURSOR_COLUMN = details::escape<n, 'G'>;
static constexpr auto cursor_column_v = details::escape<n, 'G'>;
// Erase functions
template <MOTION m>
static constexpr auto ERASE_DISPLAY = details::escape<int(m), 'J'>;
template <MOTION m>
static constexpr auto ERASE_LINE = details::escape<int(m), 'K'>;
template <MOTION m> static constexpr auto erase_display_v = details::escape<int(m), 'J'>;
template <MOTION m> static constexpr auto erase_line_v = details::escape<int(m), 'K'>;
// Scroll up/down
template <int n>
requires limit_pos<n>
static constexpr auto SCROLL_UP = details::escape<n, 'S'>;
static constexpr auto scroll_up_v = details::escape<n, 'S'>;
template <int n>
requires limit_pos<n>
static constexpr auto SCROLL_DOWN = details::escape<n, 'T'>;
static constexpr auto scroll_down_v = details::escape<n, 'T'>;
// Set cursor to a specific position
template <int n, int m>
requires limit_pos<n> && limit_pos<m>
static constexpr auto CURSOR_POSITION = details::escape<n, ';', m, 'H'>;
static constexpr auto cursor_position_v = details::escape<n, ';', m, 'H'>;
// color
template <auto... val> static const char *FOREGROUND;
template <auto... val> static const char *BACKGROUND;
template <auto... val> static const char *foreground_v;
template <auto... val> static const char *background_v;
// palet colors
template <COLOR color> static constexpr auto FOREGROUND<color> = details::escape<(int)color + 30, 'm'>;
template <COLOR color> static constexpr auto BACKGROUND<color> = details::escape<(int)color + 40, 'm'>;
template <COLOR color> static constexpr auto foreground_v<color> = details::escape<(int)color + 30, 'm'>;
template <COLOR color> static constexpr auto background_v<color> = details::escape<(int)color + 40, 'm'>;
// 256-color palette
template <int idx>
requires limit_256<idx>
static constexpr auto FOREGROUND<idx> = details::escape<int(38), ';', int(5), ';', idx, 'm'>;
static constexpr auto foreground_v<idx> = details::escape<int(38), ';', int(5), ';', idx, 'm'>;
template <int idx>
requires limit_256<idx>
static constexpr auto BACKGROUND<idx> = details::escape<int(48), ';', int(5), ';', idx, 'm'>;
static constexpr auto background_v<idx> = details::escape<int(48), ';', int(5), ';', idx, 'm'>;
// RGB colors
template <int R, int G, int B>
requires limit_256<R> && limit_256<G> && limit_256<B>
static constexpr auto FOREGROUND<R, G, B> =
static constexpr auto foreground_v<R, G, B> =
details::escape<int(38), ';', int(5), ';', R, ';', G, ';', B, 'm'>;
template <int R, int G, int B>
requires limit_256<R> && limit_256<G> && limit_256<B>
static constexpr auto BACKGROUND<R, G, B> =
static constexpr auto background_v<R, G, B> =
details::escape<int(48), ';', int(5), ';', R, ';', G, ';', B, 'm'>;
// Set/reset text decorators
template <DECOR decor> static constexpr auto DECOR_SET = details::escape<(int)decor, 'm'>;
template <DECOR decor> static constexpr auto DECOR_RESET = details::escape<(int)decor + 20, 'm'>;
template <DECOR decor> static constexpr auto decor_set_v = details::escape<(int)decor, 'm'>;
template <DECOR decor> static constexpr auto decor_reset_v = details::escape<(int)decor + 20, 'm'>;
// Save/load cursor position;
static constexpr auto CURSOR_SAVE = details::escape<'s'>;
static constexpr auto CURSOR_LOAD = details::escape<'u'>;
static constexpr auto cursor_save_v = details::escape<'s'>;
static constexpr auto cursor_load_v = details::escape<'u'>;
// Set screen modes
template <int n>
requires limit_pos<n>
static constexpr auto SCREEN_MODE_SET = details::escape<'=', n, 'h'>;
static constexpr auto screen_mode_set_v = details::escape<'=', n, 'h'>;
template <int n>
requires limit_pos<n>
static constexpr auto SCREEN_MODE_RESET = details::escape<'=', n, 'l'>;
static constexpr auto screen_mode_reset_v = details::escape<'=', n, 'l'>;
// Private screen modes supported by most terminals
// Save/load screen
static constexpr auto SCREEN_SHOW = details::escape_literal<"?47h">;
static constexpr auto SCREEN_HIDE = details::escape_literal<"?47l">;
static constexpr auto screen_show_v = details::escape_literal<"?47h">;
static constexpr auto screen_hide_v = details::escape_literal<"?47l">;
// Show/hide cursor
static constexpr auto CURSOR_SHOW = details::escape_literal<"?25h">;
static constexpr auto CURSOR_HIDE = details::escape_literal<"?25l">;
static constexpr auto cursor_show_v = details::escape_literal<"?25h">;
static constexpr auto cursor_hide_v = details::escape_literal<"?25l">;
// Show/hide alternate buffer
static constexpr auto ABUF_SHOW = details::escape_literal<"?1049h">;
static constexpr auto ABUF_HIDE = details::escape_literal<"?1049l">;
static constexpr auto abuf_show_v = details::escape_literal<"?1049h">;
static constexpr auto abuf_hide_v = details::escape_literal<"?1049l">;
// Keyboard string TODO
} // namespace ALEC
#endif