1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
4 #include "glyph-util.h"
5 #include "locale-util.h"
8 bool emoji_enabled(void) {
9 static int cached_emoji_enabled
= -1;
11 if (cached_emoji_enabled
< 0) {
14 val
= getenv_bool("SYSTEMD_EMOJI");
16 cached_emoji_enabled
=
18 !STRPTR_IN_SET(getenv("TERM"), "dumb", "linux");
20 cached_emoji_enabled
= val
;
23 return cached_emoji_enabled
;
26 const char *special_glyph(SpecialGlyph code
) {
28 /* A list of a number of interesting unicode glyphs we can use to decorate our output. It's probably wise to be
29 * conservative here, and primarily stick to the glyphs defined in the eurlatgr font, so that display still
30 * works reasonably well on the Linux console. For details see:
32 * http://git.altlinux.org/people/legion/packages/kbd.git?p=kbd.git;a=blob;f=data/consolefonts/README.eurlatgr
35 static const char* const draw_table
[2][_SPECIAL_GLYPH_MAX
] = {
38 [SPECIAL_GLYPH_TREE_VERTICAL
] = "| ",
39 [SPECIAL_GLYPH_TREE_BRANCH
] = "|-",
40 [SPECIAL_GLYPH_TREE_RIGHT
] = "`-",
41 [SPECIAL_GLYPH_TREE_SPACE
] = " ",
42 [SPECIAL_GLYPH_TRIANGULAR_BULLET
] = ">",
43 [SPECIAL_GLYPH_BLACK_CIRCLE
] = "*",
44 [SPECIAL_GLYPH_WHITE_CIRCLE
] = "*",
45 [SPECIAL_GLYPH_MULTIPLICATION_SIGN
] = "x",
46 [SPECIAL_GLYPH_CIRCLE_ARROW
] = "*",
47 [SPECIAL_GLYPH_BULLET
] = "*",
48 [SPECIAL_GLYPH_MU
] = "u",
49 [SPECIAL_GLYPH_CHECK_MARK
] = "+",
50 [SPECIAL_GLYPH_CROSS_MARK
] = "-",
51 [SPECIAL_GLYPH_LIGHT_SHADE
] = "-",
52 [SPECIAL_GLYPH_DARK_SHADE
] = "X",
53 [SPECIAL_GLYPH_SIGMA
] = "S",
54 [SPECIAL_GLYPH_ARROW
] = "->",
55 [SPECIAL_GLYPH_ELLIPSIS
] = "...",
56 [SPECIAL_GLYPH_EXTERNAL_LINK
] = "[LNK]",
57 [SPECIAL_GLYPH_ECSTATIC_SMILEY
] = ":-]",
58 [SPECIAL_GLYPH_HAPPY_SMILEY
] = ":-}",
59 [SPECIAL_GLYPH_SLIGHTLY_HAPPY_SMILEY
] = ":-)",
60 [SPECIAL_GLYPH_NEUTRAL_SMILEY
] = ":-|",
61 [SPECIAL_GLYPH_SLIGHTLY_UNHAPPY_SMILEY
] = ":-(",
62 [SPECIAL_GLYPH_UNHAPPY_SMILEY
] = ":-{",
63 [SPECIAL_GLYPH_DEPRESSED_SMILEY
] = ":-[",
64 [SPECIAL_GLYPH_LOCK_AND_KEY
] = "o-,",
65 [SPECIAL_GLYPH_TOUCH
] = "O=", /* Yeah, not very convincing, can you do it better? */
66 [SPECIAL_GLYPH_RECYCLING
] = "~",
67 [SPECIAL_GLYPH_DOWNLOAD
] = "\\",
68 [SPECIAL_GLYPH_SPARKLES
] = "*",
73 /* The following are multiple glyphs in both ASCII and in UNICODE */
74 [SPECIAL_GLYPH_TREE_VERTICAL
] = "\342\224\202 ", /* │ */
75 [SPECIAL_GLYPH_TREE_BRANCH
] = "\342\224\234\342\224\200", /* ├─ */
76 [SPECIAL_GLYPH_TREE_RIGHT
] = "\342\224\224\342\224\200", /* └─ */
77 [SPECIAL_GLYPH_TREE_SPACE
] = " ", /* */
79 /* Single glyphs in both cases */
80 [SPECIAL_GLYPH_TRIANGULAR_BULLET
] = "\342\200\243", /* ‣ */
81 [SPECIAL_GLYPH_BLACK_CIRCLE
] = "\342\227\217", /* ● */
82 [SPECIAL_GLYPH_WHITE_CIRCLE
] = "\u25CB", /* ○ */
83 [SPECIAL_GLYPH_MULTIPLICATION_SIGN
] = "\u00D7", /* × */
84 [SPECIAL_GLYPH_CIRCLE_ARROW
] = "\u21BB", /* ↻ */
85 [SPECIAL_GLYPH_BULLET
] = "\342\200\242", /* • */
86 [SPECIAL_GLYPH_MU
] = "\316\274", /* μ (actually called: GREEK SMALL LETTER MU) */
87 [SPECIAL_GLYPH_CHECK_MARK
] = "\342\234\223", /* ✓ */
88 [SPECIAL_GLYPH_CROSS_MARK
] = "\342\234\227", /* ✗ (actually called: BALLOT X) */
89 [SPECIAL_GLYPH_LIGHT_SHADE
] = "\342\226\221", /* ░ */
90 [SPECIAL_GLYPH_DARK_SHADE
] = "\342\226\223", /* ▒ */
91 [SPECIAL_GLYPH_SIGMA
] = "\316\243", /* Σ */
93 /* Single glyph in Unicode, two in ASCII */
94 [SPECIAL_GLYPH_ARROW
] = "\342\206\222", /* → (actually called: RIGHTWARDS ARROW) */
96 /* Single glyph in Unicode, three in ASCII */
97 [SPECIAL_GLYPH_ELLIPSIS
] = "\342\200\246", /* … (actually called: HORIZONTAL ELLIPSIS) */
99 /* Three glyphs in Unicode, five in ASCII */
100 [SPECIAL_GLYPH_EXTERNAL_LINK
] = "[\360\237\241\225]", /* 🡕 (actually called: NORTH EAST SANS-SERIF ARROW, enclosed in []) */
102 /* These smileys are a single glyph in Unicode, and three in ASCII */
103 [SPECIAL_GLYPH_ECSTATIC_SMILEY
] = "\360\237\230\207", /* 😇 (actually called: SMILING FACE WITH HALO) */
104 [SPECIAL_GLYPH_HAPPY_SMILEY
] = "\360\237\230\200", /* 😀 (actually called: GRINNING FACE) */
105 [SPECIAL_GLYPH_SLIGHTLY_HAPPY_SMILEY
] = "\360\237\231\202", /* 🙂 (actually called: SLIGHTLY SMILING FACE) */
106 [SPECIAL_GLYPH_NEUTRAL_SMILEY
] = "\360\237\230\220", /* 😐 (actually called: NEUTRAL FACE) */
107 [SPECIAL_GLYPH_SLIGHTLY_UNHAPPY_SMILEY
] = "\360\237\231\201", /* 🙁 (actually called: SLIGHTLY FROWNING FACE) */
108 [SPECIAL_GLYPH_UNHAPPY_SMILEY
] = "\360\237\230\250", /* 😨 (actually called: FEARFUL FACE) */
109 [SPECIAL_GLYPH_DEPRESSED_SMILEY
] = "\360\237\244\242", /* 🤢 (actually called: NAUSEATED FACE) */
111 /* This emoji is a single character cell glyph in Unicode, and three in ASCII */
112 [SPECIAL_GLYPH_LOCK_AND_KEY
] = "\360\237\224\220", /* 🔐 (actually called: CLOSED LOCK WITH KEY) */
114 /* This emoji is a single character cell glyph in Unicode, and two in ASCII */
115 [SPECIAL_GLYPH_TOUCH
] = "\360\237\221\206", /* 👆 (actually called: BACKHAND INDEX POINTING UP) */
117 /* These three emojis are single character cell glyphs in Unicode and also in ASCII. */
118 [SPECIAL_GLYPH_RECYCLING
] = "\u267B\uFE0F ", /* ♻️ (actually called: UNIVERSAL RECYCLNG SYMBOL) */
119 [SPECIAL_GLYPH_DOWNLOAD
] = "\u2935\uFE0F ", /* ⤵️ (actually called: RIGHT ARROW CURVING DOWN) */
120 [SPECIAL_GLYPH_SPARKLES
] = "\u2728", /* ✨ */
127 assert(code
< _SPECIAL_GLYPH_MAX
);
128 return draw_table
[code
>= _SPECIAL_GLYPH_FIRST_EMOJI
? emoji_enabled() : is_locale_utf8()][code
];