summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVojtech Bubela <vbubela@redhat.com>2021-03-22 17:55:28 +0100
committerThomas Haller <thaller@redhat.com>2021-04-08 16:00:28 +0200
commit6c9728d0d5a3f99207d22f38e68942b96d13851e (patch)
treeef9bdb7f2bd0e30cf1faeeaed4c2f87bbcd955fd
parent3ce2dd49591d83ab0a20d6f8b47436fb194fdd61 (diff)
downloadNetworkManager-6c9728d0d5a3f99207d22f38e68942b96d13851e.tar.gz
nmtui: support setting nmtui colors via environment variables
Previously, nmtui would set the newt color "checkbox" to a hard coded value. This made it impossible to override the color via "$NEWT_COLORS". With this change, nmtui also parses "$NEWT_COLORS" to allow setting newt colors: $ NEWT_COLORS=' window=white,red border=white,red checkbox=white,red actcheckbox=white,green ' nmtui Custom nmtui colors can now also be set via "$NMT_NEWT_COLORS": "badLabel" "plainLabel" "disabledButton" "textboxWithBackground" For example: $ NMT_NEWT_COLORS='plainLabel=green,lightgray' nmtui The environment variables "$NEWT_COLORS_FILE" and "NMT_NEWT_COLORS_FILE" are honored too. The code is based on libnewt code ([1]), authored by Miroslav Lichvar. That patch is originally LGPL-2.0-only licensed, but for inclusion in NetworkManager we require it to be LGPL-2.1-or-later. Miroslav kindly agreed to use his original contribution in NetworkManager. [1] https://pagure.io/newt/c/34e56d12931a25222d7debb22f95bb2f9fa696a0 Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com> https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/653 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/793
-rw-r--r--src/libnmt-newt/nmt-newt-utils.c107
1 files changed, 106 insertions, 1 deletions
diff --git a/src/libnmt-newt/nmt-newt-utils.c b/src/libnmt-newt/nmt-newt-utils.c
index 1216b8d356..cc8e8bb47d 100644
--- a/src/libnmt-newt/nmt-newt-utils.c
+++ b/src/libnmt-newt/nmt-newt-utils.c
@@ -13,6 +13,7 @@
#include <stdarg.h>
#include <unistd.h>
#include <sys/wait.h>
+#include "libnm-glib-aux/nm-io-utils.h"
#include "nmt-newt-utils.h"
@@ -101,8 +102,109 @@ nmt_newt_suspend_callback(gpointer user_data)
newtResume();
}
+static void
+_newtSetColor(int colorset, const char *fg, const char *bg)
+{
+ newtSetColor(colorset, (char *) fg, (char *) bg);
+}
+
+/**
+ * nmt_newt_parse_colors:
+ * @s: buffer with color settings
+ * @is_newt: boolean indicating if buffer s
+ * contains NEWT (true) or NMT (false) color setting
+ *
+ * Parses content of buffer s and sets color accordingly
+ * with newtSetColor()
+ */
+static void
+nmt_newt_parse_colors(const char *s, bool is_newt)
+{
+ gs_free const char **lines = NULL;
+ size_t i;
+
+ lines = nm_utils_strsplit_set(s, ";:\n\r\t ");
+
+ if (!lines)
+ return;
+
+ for (i = 0; lines[i]; i++) {
+ const char *name;
+ const char *fg;
+ const char *bg;
+ char * parsed_s;
+
+ parsed_s = (char *) lines[i];
+ name = parsed_s;
+
+ if (!(parsed_s = strchr(parsed_s, '=')) || !*parsed_s)
+ continue;
+
+ *parsed_s = '\0';
+ fg = ++parsed_s;
+
+ if (!(parsed_s = strchr(parsed_s, ',')) || !*parsed_s)
+ continue;
+
+ *parsed_s = '\0';
+
+ bg = ++parsed_s;
+
+ if (is_newt) {
+ if (nm_streq(name, "checkbox"))
+ _newtSetColor(NEWT_COLORSET_CHECKBOX, fg, bg);
+ } else {
+ if (nm_streq(name, "badLabel")) {
+ _newtSetColor(NMT_NEWT_COLORSET_BAD_LABEL, fg, bg);
+ } else if (nm_streq(name, "plainLabel")) {
+ _newtSetColor(NMT_NEWT_COLORSET_PLAIN_LABEL, fg, bg);
+ } else if (nm_streq(name, "disabledButton")) {
+ _newtSetColor(NMT_NEWT_COLORSET_DISABLED_BUTTON, fg, bg);
+ } else if (nm_streq(name, "textboxWithBackground")) {
+ _newtSetColor(NMT_NEWT_COLORSET_TEXTBOX_WITH_BACKGROUND, fg, bg);
+ }
+ }
+ }
+}
+
/**
- * nmt_newt_init:
+ * nmt_newt_nit_colors:
+ * @is_newt: boolean indicating if the function is looking for NEWT or NMT env var
+ *
+ * Looks for enviroment variables for aditional
+ * color set up in nmtui
+ */
+static void
+nmt_newt_init_colors(gboolean is_newt)
+{
+ const char * colors;
+ gs_free char *file_content = NULL;
+
+ colors = getenv(is_newt ? "NEWT_COLORS" : "NMT_NEWT_COLORS");
+
+ if (!colors) {
+ const char *file_name;
+
+ file_name = getenv(is_newt ? "NEWT_COLORS_FILE" : "NMT_NEWT_COLORS_FILE");
+
+ if (file_name && file_name[0] != '\0'
+ && (nm_utils_file_get_contents(-1,
+ file_name,
+ 16384,
+ NM_UTILS_FILE_GET_CONTENTS_FLAG_NONE,
+ &file_content,
+ NULL,
+ NULL,
+ NULL))) {
+ colors = file_content;
+ }
+ }
+
+ nmt_newt_parse_colors(colors, is_newt);
+}
+
+/**
+libnm-client-aux-extern * nmt_newt_init:
*
* Wrapper for newtInit() that also does some nmt-newt-internal setup.
* This should be called once, before any other nmt-newt functions.
@@ -119,6 +221,9 @@ nmt_newt_init(void)
newtSetColor(NMT_NEWT_COLORSET_DISABLED_BUTTON, "blue", "lightgray");
newtSetColor(NMT_NEWT_COLORSET_TEXTBOX_WITH_BACKGROUND, "black", "white");
+ nmt_newt_init_colors(TRUE);
+ nmt_newt_init_colors(FALSE);
+
if (g_getenv("NMTUI_DEBUG"))
g_log_set_default_handler(nmt_newt_dialog_g_log_handler, NULL);
else