[PATCH BlueZ] monitor: Add option to force output color

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sometimes we want to force output color even when stdout is not a
terminal, for example when piping the output to a filter script and then
piping it further to a pager which can display colors.

This patch provides a general option to force whether color is on or off
(always and never), or leave btmon to decide (auto).

Reviewed-by: Daniel Winkler <danielwinkler@xxxxxxxxxx>

---
 monitor/display.c | 12 +++++++++++-
 monitor/display.h |  3 +++
 monitor/main.c    | 17 ++++++++++++++++-
 3 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/monitor/display.c b/monitor/display.c
index 4e5693b04..d61a79a38 100644
--- a/monitor/display.c
+++ b/monitor/display.c
@@ -29,12 +29,22 @@
 
 static pid_t pager_pid = 0;
 int default_pager_num_columns = FALLBACK_TERMINAL_WIDTH;
+enum monitor_color setting_monitor_color = COLOR_AUTO;
+
+void set_monitor_color(enum monitor_color color)
+{
+	setting_monitor_color = color;
+}
 
 bool use_color(void)
 {
 	static int cached_use_color = -1;
 
-	if (__builtin_expect(!!(cached_use_color < 0), 0))
+	if (setting_monitor_color == COLOR_ALWAYS)
+		cached_use_color = 1;
+	else if (setting_monitor_color == COLOR_NEVER)
+		cached_use_color = 0;
+	else if (__builtin_expect(!!(cached_use_color < 0), 0))
 		cached_use_color = isatty(STDOUT_FILENO) > 0 || pager_pid > 0;
 
 	return cached_use_color;
diff --git a/monitor/display.h b/monitor/display.h
index cba39ec7f..be5739833 100644
--- a/monitor/display.h
+++ b/monitor/display.h
@@ -14,6 +14,9 @@
 
 bool use_color(void);
 
+enum monitor_color { COLOR_AUTO, COLOR_ALWAYS, COLOR_NEVER };
+void set_monitor_color(enum monitor_color);
+
 #define COLOR_OFF	"\x1B[0m"
 #define COLOR_BLACK	"\x1B[0;30m"
 #define COLOR_RED	"\x1B[0;31m"
diff --git a/monitor/main.c b/monitor/main.c
index 969c88103..3ec3a5f08 100644
--- a/monitor/main.c
+++ b/monitor/main.c
@@ -69,6 +69,7 @@ static void usage(void)
 		"\t-R  --rtt [<address>],[<area>],[<name>]\n"
 		"\t                       RTT control block parameters\n"
 		"\t-C, --columns [width]  Output width if not a terminal\n"
+		"\t-c, --color [mode]     Output color: auto/always/never\n"
 		"\t-h, --help             Show help options\n");
 }
 
@@ -93,6 +94,7 @@ static const struct option main_options[] = {
 	{ "jlink",     required_argument, NULL, 'J' },
 	{ "rtt",       required_argument, NULL, 'R' },
 	{ "columns",   required_argument, NULL, 'C' },
+	{ "color",     required_argument, NULL, 'c' },
 	{ "todo",      no_argument,       NULL, '#' },
 	{ "version",   no_argument,       NULL, 'v' },
 	{ "help",      no_argument,       NULL, 'h' },
@@ -124,7 +126,7 @@ int main(int argc, char *argv[])
 		struct sockaddr_un addr;
 
 		opt = getopt_long(argc, argv,
-					"r:w:a:s:p:i:d:B:V:MNtTSAE:PJ:R:C:vh",
+					"r:w:a:s:p:i:d:B:V:MNtTSAE:PJ:R:C:c:vh",
 					main_options, NULL);
 		if (opt < 0)
 			break;
@@ -211,6 +213,19 @@ int main(int argc, char *argv[])
 		case 'C':
 			set_default_pager_num_columns(atoi(optarg));
 			break;
+		case 'c':
+			if (strcmp("always", optarg) == 0)
+				set_monitor_color(COLOR_ALWAYS);
+			else if (strcmp("never", optarg) == 0)
+				set_monitor_color(COLOR_NEVER);
+			else if (strcmp("auto", optarg) == 0)
+				set_monitor_color(COLOR_AUTO);
+			else {
+				fprintf(stderr, "Color option must be one of "
+						"auto/always/never\n");
+				return EXIT_FAILURE;
+			}
+			break;
 		case '#':
 			packet_todo();
 			lmp_todo();
-- 
2.29.2




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux