summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-11-06 17:59:58 +0100
committerLennart Poettering <lennart@poettering.net>2018-11-30 16:19:29 +0100
commit5f1b0cc6d064f7847982e7b680cab3d080aef52e (patch)
tree7a940cb921b53827c2e2e302afd28d9ea6c0c153
parentMerge pull request #10996 from poettering/oci-prep (diff)
downloadsystemd-5f1b0cc6d064f7847982e7b680cab3d080aef52e.tar.xz
systemd-5f1b0cc6d064f7847982e7b680cab3d080aef52e.zip
locale-util: add logic to output smiley emojis at various happiness levels
-rw-r--r--docs/ENVIRONMENT.md7
-rw-r--r--src/basic/locale-util.c89
-rw-r--r--src/basic/locale-util.h8
-rw-r--r--src/test/test-locale-util.c9
4 files changed, 84 insertions, 29 deletions
diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md
index 3e61ea51e7..e965cb885a 100644
--- a/docs/ENVIRONMENT.md
+++ b/docs/ENVIRONMENT.md
@@ -46,9 +46,14 @@ All tools:
are understood, too (us, ms, s, min, h, d, w, month, y). If it is not set or set
to 0, then the built-in default is used.
-* `$SYSTEMD_MEMPOOL=0` — if set the internal memory caching logic employed by
+* `$SYSTEMD_MEMPOOL=0` — if set, the internal memory caching logic employed by
hash tables is turned off, and libc malloc() is used for all allocations.
+* `$SYSTEMD_EMOJI=0` — if set, tools such as "systemd-analyze security" will
+ not output graphical smiley emojis, but ASCII alternatives instead. Note that
+ this only controls use of Unicode emoji glyphs, and has no effect on other
+ Unicode glyphs.
+
systemctl:
* `$SYSTEMCTL_FORCE_BUS=1` — if set, do not connect to PID1's private D-Bus
diff --git a/src/basic/locale-util.c b/src/basic/locale-util.c
index b2ef66392e..2225208cd2 100644
--- a/src/basic/locale-util.c
+++ b/src/basic/locale-util.c
@@ -16,6 +16,7 @@
#include "def.h"
#include "dirent-util.h"
+#include "env-util.h"
#include "fd-util.h"
#include "hashmap.h"
#include "locale-util.h"
@@ -347,6 +348,24 @@ bool keymap_is_valid(const char *name) {
return true;
}
+static bool emoji_enabled(void) {
+ static int cached_emoji_enabled = -1;
+
+ if (cached_emoji_enabled < 0) {
+ int val;
+
+ val = getenv_bool("SYSTEMD_EMOJI");
+ if (val < 0)
+ cached_emoji_enabled =
+ is_locale_utf8() &&
+ !STRPTR_IN_SET(getenv("TERM"), "dumb", "linux");
+ else
+ cached_emoji_enabled = val;
+ }
+
+ return cached_emoji_enabled;
+}
+
const char *special_glyph(SpecialGlyph code) {
/* A list of a number of interesting unicode glyphs we can use to decorate our output. It's probably wise to be
@@ -359,40 +378,56 @@ const char *special_glyph(SpecialGlyph code) {
static const char* const draw_table[2][_SPECIAL_GLYPH_MAX] = {
/* ASCII fallback */
[false] = {
- [TREE_VERTICAL] = "| ",
- [TREE_BRANCH] = "|-",
- [TREE_RIGHT] = "`-",
- [TREE_SPACE] = " ",
- [TRIANGULAR_BULLET] = ">",
- [BLACK_CIRCLE] = "*",
- [BULLET] = "*",
- [ARROW] = "->",
- [MDASH] = "-",
- [ELLIPSIS] = "...",
- [MU] = "u",
- [CHECK_MARK] = "+",
- [CROSS_MARK] = "-",
+ [TREE_VERTICAL] = "| ",
+ [TREE_BRANCH] = "|-",
+ [TREE_RIGHT] = "`-",
+ [TREE_SPACE] = " ",
+ [TRIANGULAR_BULLET] = ">",
+ [BLACK_CIRCLE] = "*",
+ [BULLET] = "*",
+ [ARROW] = "->",
+ [MDASH] = "-",
+ [ELLIPSIS] = "...",
+ [MU] = "u",
+ [CHECK_MARK] = "+",
+ [CROSS_MARK] = "-",
+ [ECSTATIC_SMILEY] = ":-]",
+ [HAPPY_SMILEY] = ":-}",
+ [SLIGHTLY_HAPPY_SMILEY] = ":-)",
+ [NEUTRAL_SMILEY] = ":-|",
+ [SLIGHTLY_UNHAPPY_SMILEY] = ":-(",
+ [UNHAPPY_SMILEY] = ":-{️",
+ [DEPRESSED_SMILEY] = ":-[",
},
/* UTF-8 */
[true] = {
- [TREE_VERTICAL] = "\342\224\202 ", /* │ */
- [TREE_BRANCH] = "\342\224\234\342\224\200", /* ├─ */
- [TREE_RIGHT] = "\342\224\224\342\224\200", /* └─ */
- [TREE_SPACE] = " ", /* */
- [TRIANGULAR_BULLET] = "\342\200\243", /* ‣ */
- [BLACK_CIRCLE] = "\342\227\217", /* ● */
- [BULLET] = "\342\200\242", /* • */
- [ARROW] = "\342\206\222", /* → */
- [MDASH] = "\342\200\223", /* – */
- [ELLIPSIS] = "\342\200\246", /* … */
- [MU] = "\316\274", /* μ */
- [CHECK_MARK] = "\342\234\223", /* ✓ */
- [CROSS_MARK] = "\342\234\227", /* ✗ */
+ [TREE_VERTICAL] = "\342\224\202 ", /* │ */
+ [TREE_BRANCH] = "\342\224\234\342\224\200", /* ├─ */
+ [TREE_RIGHT] = "\342\224\224\342\224\200", /* └─ */
+ [TREE_SPACE] = " ", /* */
+ [TRIANGULAR_BULLET] = "\342\200\243", /* ‣ */
+ [BLACK_CIRCLE] = "\342\227\217", /* ● */
+ [BULLET] = "\342\200\242", /* • */
+ [ARROW] = "\342\206\222", /* → */
+ [MDASH] = "\342\200\223", /* – */
+ [ELLIPSIS] = "\342\200\246", /* … */
+ [MU] = "\316\274", /* μ */
+ [CHECK_MARK] = "\342\234\223", /* ✓ */
+ [CROSS_MARK] = "\342\234\227", /* ✗ */
+ [ECSTATIC_SMILEY] = "\360\237\230\207", /* 😇 */
+ [HAPPY_SMILEY] = "\360\237\230\200", /* 😀 */
+ [SLIGHTLY_HAPPY_SMILEY] = "\360\237\231\202", /* 🙂 */
+ [NEUTRAL_SMILEY] = "\360\237\230\220", /* 😐 */
+ [SLIGHTLY_UNHAPPY_SMILEY] = "\360\237\231\201", /* 🙁 */
+ [UNHAPPY_SMILEY] = "\360\237\230\250", /* 😨️️ */
+ [DEPRESSED_SMILEY] = "\360\237\244\242", /* 🤢 */
},
};
- return draw_table[is_locale_utf8()][code];
+ assert(code < _SPECIAL_GLYPH_MAX);
+
+ return draw_table[code >= _SPECIAL_GLYPH_FIRST_SMILEY ? emoji_enabled() : is_locale_utf8()][code];
}
void locale_variables_free(char*l[_VARIABLE_LC_MAX]) {
diff --git a/src/basic/locale-util.h b/src/basic/locale-util.h
index 2aa2bef8c5..8f4ce5485d 100644
--- a/src/basic/locale-util.h
+++ b/src/basic/locale-util.h
@@ -52,6 +52,14 @@ typedef enum {
MU,
CHECK_MARK,
CROSS_MARK,
+ _SPECIAL_GLYPH_FIRST_SMILEY,
+ ECSTATIC_SMILEY = _SPECIAL_GLYPH_FIRST_SMILEY,
+ HAPPY_SMILEY,
+ SLIGHTLY_HAPPY_SMILEY,
+ NEUTRAL_SMILEY,
+ SLIGHTLY_UNHAPPY_SMILEY,
+ UNHAPPY_SMILEY,
+ DEPRESSED_SMILEY,
_SPECIAL_GLYPH_MAX
} SpecialGlyph;
diff --git a/src/test/test-locale-util.c b/src/test/test-locale-util.c
index a1d4307eb5..48994547ac 100644
--- a/src/test/test-locale-util.c
+++ b/src/test/test-locale-util.c
@@ -65,7 +65,7 @@ static void test_keymaps(void) {
#define dump_glyph(x) log_info(STRINGIFY(x) ": %s", special_glyph(x))
static void dump_special_glyphs(void) {
- assert_cc(CROSS_MARK + 1 == _SPECIAL_GLYPH_MAX);
+ assert_cc(DEPRESSED_SMILEY + 1 == _SPECIAL_GLYPH_MAX);
log_info("/* %s */", __func__);
@@ -84,6 +84,13 @@ static void dump_special_glyphs(void) {
dump_glyph(MU);
dump_glyph(CHECK_MARK);
dump_glyph(CROSS_MARK);
+ dump_glyph(ECSTATIC_SMILEY);
+ dump_glyph(HAPPY_SMILEY);
+ dump_glyph(SLIGHTLY_HAPPY_SMILEY);
+ dump_glyph(NEUTRAL_SMILEY);
+ dump_glyph(SLIGHTLY_UNHAPPY_SMILEY);
+ dump_glyph(UNHAPPY_SMILEY);
+ dump_glyph(DEPRESSED_SMILEY);
}
int main(int argc, char *argv[]) {