Skip to content

Commit ba5fee6

Browse files
committed
version 0.5.4, see changelog.md for changes
1 parent 0e17f77 commit ba5fee6

File tree

9 files changed

+316
-46
lines changed

9 files changed

+316
-46
lines changed

ChangeLog.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
# 0.5.4
2+
- Added environment variables to pass through chafa options.
3+
- Added environment variable `TERM_EVERYTHING_PIXEL_TYPE` to workaround certain cases where there is a bgr/rgb swap.
4+
- Added `--max-frame-rate` option to ...set the maximum frame rate.
5+
- Fixed a build bug with node_canvas's included version of libstdc++.so
16
# 0.5.3
27
fixed right mouse click and sub menus
38
Set XDG_SESSION_TYPE to wayland so app that have

Taskfile.dist.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,17 @@ tasks:
5252
silent: true
5353

5454
build:
55+
silent: true
5556
deps:
5657
- scripts:bun-install-types:run
5758
- c-interop:build
5859
- scripts:gen-protocol:build
5960
- print-licenses
61+
cmds:
62+
# remove the libstdc++ that canvas ships with and use the system one
63+
# TODO find a way to do this only when needed
64+
# TODO There is probably a better step to put this in rather than build
65+
- rm node_modules/canvas/build/Release/libstdc++.so.6 || true
6066
desc: Build everything need to run term.everything!mmulet.com
6167

6268

c_interop/include/ChafaInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ class ChafaInfo
1515
gint width_cells, height_cells;
1616
gint width_of_a_cell_in_pixels, height_of_a_cell_in_pixels; /* Size of each character cell, in pixels */
1717
bool session_type_is_x11;
18+
ChafaPixelType pixel_type_override;
19+
1820

1921
ChafaInfo(gint width_cells,
2022
gint height_cells,
2123
gint width_of_a_cell_in_pixels,
2224
gint height_of_a_cell_in_pixels,
2325
bool session_type_is_x11);
26+
ChafaPixelType get_pixel_type();
2427

2528
GString *convert_image(uint8_t *texture_pixels,
2629
uint32_t texture_width,

c_interop/src/ChafaInfo.cpp

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ GString *ChafaInfo::convert_image(uint8_t *texture_pixels,
88
{
99

1010
chafa_canvas_draw_all_pixels(canvas,
11-
pixel_mode == CHAFA_PIXEL_MODE_KITTY && !session_type_is_x11 ? CHAFA_PIXEL_RGBA8_UNASSOCIATED : CHAFA_PIXEL_BGRA8_UNASSOCIATED,
11+
get_pixel_type(),
1212
// CHAFA_PIXEL_BGRA8_UNASSOCIATED,
1313
// CHAFA_PIXEL_RGBA8_UNASSOCIATED,
1414
// CHAFA_PIXEL_ARGB8_UNASSOCIATED,
@@ -20,6 +20,106 @@ GString *ChafaInfo::convert_image(uint8_t *texture_pixels,
2020
return printable;
2121
}
2222

23+
static ChafaPixelType get_chafa_pixel_type(gchar** envp) {
24+
auto pixel_type_override = g_getenv("TERM_EVERYTHING_PIXEL_TYPE");
25+
if (pixel_type_override == nullptr) {
26+
return CHAFA_PIXEL_MAX; // No override
27+
}
28+
if (g_strcmp0(pixel_type_override, "RGBA8") == 0) {
29+
return CHAFA_PIXEL_RGBA8_UNASSOCIATED;
30+
} else if (g_strcmp0(pixel_type_override, "BGRA8") == 0) {
31+
return CHAFA_PIXEL_BGRA8_UNASSOCIATED;
32+
} else if (g_strcmp0(pixel_type_override, "ARGB8") == 0) {
33+
return CHAFA_PIXEL_ARGB8_UNASSOCIATED;
34+
} else if (g_strcmp0(pixel_type_override, "ABGR8") == 0) {
35+
return CHAFA_PIXEL_ABGR8_UNASSOCIATED;
36+
} else if (g_strcmp0(pixel_type_override, "RGBA8_PREMULTIPLIED") == 0) {
37+
return CHAFA_PIXEL_RGBA8_PREMULTIPLIED;
38+
} else if (g_strcmp0(pixel_type_override, "BGRA8_PREMULTIPLIED") == 0) {
39+
return CHAFA_PIXEL_BGRA8_PREMULTIPLIED;
40+
} else if (g_strcmp0(pixel_type_override, "ARGB8_PREMULTIPLIED") == 0) {
41+
return CHAFA_PIXEL_ARGB8_PREMULTIPLIED;
42+
} else if (g_strcmp0(pixel_type_override, "ABGR8_PREMULTIPLIED") == 0) {
43+
return CHAFA_PIXEL_ABGR8_PREMULTIPLIED;
44+
}
45+
return CHAFA_PIXEL_MAX; // No override
46+
47+
}
48+
49+
static const auto default_symbol_tags = CHAFA_SYMBOL_TAG_ALL;
50+
51+
static ChafaSymbolTags get_chafa_symbol_tags(gchar** envp) {
52+
auto symbol_tags_override = g_getenv("TERM_EVERYTHING_SYMBOLS");
53+
if (symbol_tags_override == nullptr) {
54+
return default_symbol_tags; // No override
55+
}
56+
57+
if (g_strcmp0(symbol_tags_override, "NONE") == 0) {
58+
return CHAFA_SYMBOL_TAG_NONE;
59+
} else if (g_strcmp0(symbol_tags_override, "SPACE") == 0) {
60+
return CHAFA_SYMBOL_TAG_SPACE;
61+
} else if (g_strcmp0(symbol_tags_override, "SOLID") == 0) {
62+
return CHAFA_SYMBOL_TAG_SOLID;
63+
} else if (g_strcmp0(symbol_tags_override, "STIPPLE") == 0) {
64+
return CHAFA_SYMBOL_TAG_STIPPLE;
65+
} else if (g_strcmp0(symbol_tags_override, "BLOCK") == 0) {
66+
return CHAFA_SYMBOL_TAG_BLOCK;
67+
} else if (g_strcmp0(symbol_tags_override, "BORDER") == 0) {
68+
return CHAFA_SYMBOL_TAG_BORDER;
69+
} else if (g_strcmp0(symbol_tags_override, "DIAGONAL") == 0) {
70+
return CHAFA_SYMBOL_TAG_DIAGONAL;
71+
} else if (g_strcmp0(symbol_tags_override, "DOT") == 0) {
72+
return CHAFA_SYMBOL_TAG_DOT;
73+
} else if (g_strcmp0(symbol_tags_override, "QUAD") == 0) {
74+
return CHAFA_SYMBOL_TAG_QUAD;
75+
} else if (g_strcmp0(symbol_tags_override, "HHALF") == 0) {
76+
return CHAFA_SYMBOL_TAG_HHALF;
77+
} else if (g_strcmp0(symbol_tags_override, "VHALF") == 0) {
78+
return CHAFA_SYMBOL_TAG_VHALF;
79+
} else if (g_strcmp0(symbol_tags_override, "HALF") == 0) {
80+
return CHAFA_SYMBOL_TAG_HALF;
81+
} else if (g_strcmp0(symbol_tags_override, "INVERTED") == 0) {
82+
return CHAFA_SYMBOL_TAG_INVERTED;
83+
} else if (g_strcmp0(symbol_tags_override, "BRAILLE") == 0) {
84+
return CHAFA_SYMBOL_TAG_BRAILLE;
85+
} else if (g_strcmp0(symbol_tags_override, "TECHNICAL") == 0) {
86+
return CHAFA_SYMBOL_TAG_TECHNICAL;
87+
} else if (g_strcmp0(symbol_tags_override, "GEOMETRIC") == 0) {
88+
return CHAFA_SYMBOL_TAG_GEOMETRIC;
89+
} else if (g_strcmp0(symbol_tags_override, "ASCII") == 0) {
90+
return CHAFA_SYMBOL_TAG_ASCII;
91+
} else if (g_strcmp0(symbol_tags_override, "ALPHA") == 0) {
92+
return CHAFA_SYMBOL_TAG_ALPHA;
93+
} else if (g_strcmp0(symbol_tags_override, "DIGIT") == 0) {
94+
return CHAFA_SYMBOL_TAG_DIGIT;
95+
} else if (g_strcmp0(symbol_tags_override, "ALNUM") == 0) {
96+
return CHAFA_SYMBOL_TAG_ALNUM;
97+
} else if (g_strcmp0(symbol_tags_override, "NARROW") == 0) {
98+
return CHAFA_SYMBOL_TAG_NARROW;
99+
} else if (g_strcmp0(symbol_tags_override, "WIDE") == 0) {
100+
return CHAFA_SYMBOL_TAG_WIDE;
101+
} else if (g_strcmp0(symbol_tags_override, "AMBIGUOUS") == 0) {
102+
return CHAFA_SYMBOL_TAG_AMBIGUOUS;
103+
} else if (g_strcmp0(symbol_tags_override, "UGLY") == 0) {
104+
return CHAFA_SYMBOL_TAG_UGLY;
105+
} else if (g_strcmp0(symbol_tags_override, "LEGACY") == 0) {
106+
return CHAFA_SYMBOL_TAG_LEGACY;
107+
} else if (g_strcmp0(symbol_tags_override, "SEXTANT") == 0) {
108+
return CHAFA_SYMBOL_TAG_SEXTANT;
109+
} else if (g_strcmp0(symbol_tags_override, "WEDGE") == 0) {
110+
return CHAFA_SYMBOL_TAG_WEDGE;
111+
} else if (g_strcmp0(symbol_tags_override, "LATIN") == 0) {
112+
return CHAFA_SYMBOL_TAG_LATIN;
113+
} else if (g_strcmp0(symbol_tags_override, "IMPORTED") == 0) {
114+
return CHAFA_SYMBOL_TAG_IMPORTED;
115+
} else if (g_strcmp0(symbol_tags_override, "OCTANT") == 0) {
116+
return CHAFA_SYMBOL_TAG_OCTANT;
117+
} else if (g_strcmp0(symbol_tags_override, "ALL") == 0) {
118+
return CHAFA_SYMBOL_TAG_ALL;
119+
}
120+
return default_symbol_tags; // No override
121+
}
122+
23123
ChafaInfo::ChafaInfo(gint width_cells,
24124
gint height_cells,
25125
gint width_of_a_cell_in_pixels,
@@ -32,13 +132,14 @@ ChafaInfo::ChafaInfo(gint width_cells,
32132
{
33133
{
34134
detect_terminal(&term_info, &mode, &pixel_mode);
135+
auto envp = g_get_environ();
35136

36137
/* Specify the symbols we want */
37138

38139
symbol_map = chafa_symbol_map_new();
39140
// chafa_symbol_map_add_by_tags(symbol_map, CHAFA_SYMBOL_TAG_BLOCK);
40141
// chafa_symbol_map_add_by_tags(symbol_map, CHAFA_SYMBOL_TAG_ASCII);
41-
chafa_symbol_map_add_by_tags(symbol_map, CHAFA_SYMBOL_TAG_ALL);
142+
chafa_symbol_map_add_by_tags(symbol_map, get_chafa_symbol_tags(envp));
42143

43144
/* Set up a configuration with the symbols and the canvas size in characters */
44145

@@ -60,7 +161,25 @@ ChafaInfo::ChafaInfo(gint width_cells,
60161
}
61162

62163
canvas = chafa_canvas_new(config);
164+
165+
this->pixel_type_override = get_chafa_pixel_type(envp);
166+
167+
g_strfreev(envp);
168+
}
169+
}
170+
171+
ChafaPixelType ChafaInfo::get_pixel_type()
172+
{
173+
if (pixel_type_override != CHAFA_PIXEL_MAX)
174+
{
175+
return pixel_type_override;
176+
}
177+
178+
if (pixel_mode == CHAFA_PIXEL_MODE_KITTY && !session_type_is_x11)
179+
{
180+
return CHAFA_PIXEL_RGBA8_UNASSOCIATED;
63181
}
182+
return CHAFA_PIXEL_BGRA8_UNASSOCIATED;
64183
}
65184

66185
ChafaInfo::~ChafaInfo()

c_interop/src/detect_terminal.cpp

Lines changed: 96 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,125 @@
11
#include "detect_terminal.h"
22

3-
void detect_terminal(ChafaTermInfo **term_info_out,
4-
ChafaCanvasMode *mode_out,
5-
ChafaPixelMode *pixel_mode_out)
63

4+
static ChafaPixelMode get_default_pixel_mode(ChafaTermInfo *term_info)
75
{
8-
9-
// ChafaTermInfo *fallback_info;
10-
11-
/* Examine the environment variables and guess what the terminal can do */
12-
13-
auto envp = g_get_environ();
14-
15-
16-
17-
auto term_info = chafa_term_db_detect(chafa_term_db_get_default(), envp);
18-
ChafaPixelMode pixel_mode;
19-
ChafaCanvasMode mode;
20-
21-
/* See which control sequences were defined, and use that to pick the most
22-
* high-quality rendering possible */
236
if (chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_BEGIN_ITERM2_IMAGE))
247
{
25-
pixel_mode = CHAFA_PIXEL_MODE_ITERM2;
26-
mode = CHAFA_CANVAS_MODE_TRUECOLOR;
8+
return CHAFA_PIXEL_MODE_ITERM2;
279
}
2810
else if (chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_BEGIN_KITTY_IMMEDIATE_IMAGE_V1))
2911
{
30-
pixel_mode = CHAFA_PIXEL_MODE_KITTY;
31-
mode = CHAFA_CANVAS_MODE_TRUECOLOR;
12+
return CHAFA_PIXEL_MODE_KITTY;
3213
}
3314
else if (chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_BEGIN_SIXELS))
3415
{
35-
pixel_mode = CHAFA_PIXEL_MODE_SIXELS;
36-
mode = CHAFA_CANVAS_MODE_TRUECOLOR;
16+
return CHAFA_PIXEL_MODE_SIXELS;
17+
}
18+
else
19+
{
20+
return CHAFA_PIXEL_MODE_SYMBOLS;
21+
}
22+
}
23+
24+
static ChafaPixelMode get_pixel_mode(ChafaTermInfo *term_info, gchar **envp)
25+
{
26+
auto pixel_mode_override = g_getenv("TERM_EVERYTHING_PIXEL_MODE");
27+
if (pixel_mode_override == nullptr)
28+
{
29+
return get_default_pixel_mode(term_info);
30+
}
31+
if (g_strcmp0(pixel_mode_override, "SYMBOLS") == 0)
32+
{
33+
return CHAFA_PIXEL_MODE_SYMBOLS;
34+
}
35+
else if (g_strcmp0(pixel_mode_override, "SIXELS") == 0)
36+
{
37+
return CHAFA_PIXEL_MODE_SIXELS;
38+
}
39+
else if (g_strcmp0(pixel_mode_override, "KITTY") == 0)
40+
{
41+
return CHAFA_PIXEL_MODE_KITTY;
42+
}
43+
else if (g_strcmp0(pixel_mode_override, "ITERM2") == 0)
44+
{
45+
return CHAFA_PIXEL_MODE_ITERM2;
3746
}
3847
else
3948
{
40-
pixel_mode = CHAFA_PIXEL_MODE_SYMBOLS;
49+
return get_default_pixel_mode(term_info);
50+
}
51+
}
4152

53+
54+
static ChafaCanvasMode get_default_canvas_mode(ChafaTermInfo *term_info, ChafaPixelMode pixel_mode)
55+
{
56+
switch (pixel_mode)
57+
{
58+
case CHAFA_PIXEL_MODE_ITERM2:
59+
case CHAFA_PIXEL_MODE_SIXELS:
60+
case CHAFA_PIXEL_MODE_KITTY:
61+
return CHAFA_CANVAS_MODE_TRUECOLOR;
62+
case CHAFA_PIXEL_MODE_SYMBOLS:
63+
default:
4264
if (chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_FGBG_DIRECT) && chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_FG_DIRECT) && chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_BG_DIRECT))
43-
mode = CHAFA_CANVAS_MODE_TRUECOLOR;
65+
return CHAFA_CANVAS_MODE_TRUECOLOR;
4466
else if (chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_FGBG_256) && chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_FG_256) && chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_BG_256))
45-
mode = CHAFA_CANVAS_MODE_INDEXED_240;
67+
return CHAFA_CANVAS_MODE_INDEXED_240;
4668
else if (chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_FGBG_16) && chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_FG_16) && chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_SET_COLOR_BG_16))
47-
mode = CHAFA_CANVAS_MODE_INDEXED_16;
69+
return CHAFA_CANVAS_MODE_INDEXED_16;
4870
else if (chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_INVERT_COLORS) && chafa_term_info_have_seq(term_info, CHAFA_TERM_SEQ_RESET_ATTRIBUTES))
49-
mode = CHAFA_CANVAS_MODE_FGBG_BGFG;
71+
return CHAFA_CANVAS_MODE_FGBG_BGFG;
5072
else
51-
mode = CHAFA_CANVAS_MODE_FGBG;
73+
return CHAFA_CANVAS_MODE_FGBG;
5274
}
75+
}
76+
77+
static ChafaCanvasMode get_canvas_mode(ChafaTermInfo *term_info, ChafaPixelMode pixel_mode) {
78+
auto canvas_mode_override = g_getenv("TERM_EVERYTHING_CANVAS_MODE");
79+
if (canvas_mode_override == nullptr) {
80+
return get_default_canvas_mode(term_info, pixel_mode);
81+
}
82+
if (g_strcmp0(canvas_mode_override, "TRUECOLOR") == 0) {
83+
return CHAFA_CANVAS_MODE_TRUECOLOR;
84+
} else if (g_strcmp0(canvas_mode_override, "INDEXED_256") == 0) {
85+
return CHAFA_CANVAS_MODE_INDEXED_256;
86+
} else if (g_strcmp0(canvas_mode_override, "INDEXED_240") == 0) {
87+
return CHAFA_CANVAS_MODE_INDEXED_240;
88+
} else if (g_strcmp0(canvas_mode_override, "INDEXED_16") == 0) {
89+
return CHAFA_CANVAS_MODE_INDEXED_16;
90+
} else if (g_strcmp0(canvas_mode_override, "FGBG_BGFG") == 0) {
91+
return CHAFA_CANVAS_MODE_FGBG_BGFG;
92+
} else if (g_strcmp0(canvas_mode_override, "FGBG") == 0) {
93+
return CHAFA_CANVAS_MODE_FGBG;
94+
} else if (g_strcmp0(canvas_mode_override, "INDEXED_8") == 0) {
95+
return CHAFA_CANVAS_MODE_INDEXED_8;
96+
} else if (g_strcmp0(canvas_mode_override, "INDEXED_16_8") == 0) {
97+
return CHAFA_CANVAS_MODE_INDEXED_16_8;
98+
} else {
99+
return get_default_canvas_mode(term_info, pixel_mode);
100+
}
101+
102+
}
103+
104+
void detect_terminal(ChafaTermInfo **term_info_out,
105+
ChafaCanvasMode *mode_out,
106+
ChafaPixelMode *pixel_mode_out)
107+
108+
{
109+
110+
// ChafaTermInfo *fallback_info;
111+
112+
/* Examine the environment variables and guess what the terminal can do */
113+
114+
auto envp = g_get_environ();
115+
116+
auto term_info = chafa_term_db_detect(chafa_term_db_get_default(), envp);
53117

54118
/* Hand over the information to caller */
55119

56120
*term_info_out = term_info;
57-
*mode_out = mode;
58-
*pixel_mode_out = pixel_mode;
121+
*pixel_mode_out = get_pixel_mode(term_info, envp);
122+
*mode_out = get_canvas_mode(term_info, *pixel_mode_out);
59123

60124
/* Cleanup */
61125

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "0.5.3",
2+
"version": "0.5.4",
33
"dependencies": {
44
"canvas": "3.2.0",
55
"open": "10.2.0"

0 commit comments

Comments
 (0)