Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Feb 2018 23:51:44 +0000 (UTC)
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r329283 - in stable/11: share/man/man4 sys/dev/vt/colors
Message-ID:  <201802142351.w1ENpi1u009989@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gonzo
Date: Wed Feb 14 23:51:44 2018
New Revision: 329283
URL: https://svnweb.freebsd.org/changeset/base/329283

Log:
  MFC r327444, r327449, r327454
  
  r327444:
  vt(4): add support for configurable console palette
  
  Introduce new set of loader tunables kern.vt.color.N.rgb, where N is a
  number from 0 to 15. The value is either comma-separated list decimal
  numbers ranging from 0 to 255 that represent values of red, green, and
  blue components respectively (i.e. "128,128,128") or 6-digit hex triplet
  commonly used to represent colors in HTML or xterm settings (i.e. #808080)
  
  Each tunable overrides one of the 16 hardcoded palette codes and can be set
  in loader.conf(5)
  
  Reviewed by:	bcr(docs), jilles, manu, ray
  Differential Revision:	https://reviews.freebsd.org/D13645
  
  r327449:
  Unbreak build broken by r327444
  
  During review iterations function signature has changed in definition
  but not in actual call. Fix call to match the definition.
  
  Reported by:	Herbert J. Skuhra
  Pointyhat to: gonzo
  
  r327454:
  Fix GCC build broken by r32744
  
  Indicate in function declaration that vt_palette_init does not take any arguments

Modified:
  stable/11/share/man/man4/vt.4
  stable/11/sys/dev/vt/colors/vt_termcolors.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/share/man/man4/vt.4
==============================================================================
--- stable/11/share/man/man4/vt.4	Wed Feb 14 23:47:04 2018	(r329282)
+++ stable/11/share/man/man4/vt.4	Wed Feb 14 23:51:44 2018	(r329283)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 19, 2016
+.Dd December 28, 2017
 .Dt "VT" 4
 .Os
 .Sh NAME
@@ -45,6 +45,7 @@ In
 .Xr loader.conf 5 :
 .Cd hw.vga.textmode=1
 .Cd kern.vty=vt
+.Cd kern.vt.color.<colornum>.rgb="<colorspec>"
 .Cd kern.vt.fb.default_mode="<X>x<Y>"
 .Cd kern.vt.fb.modes.<connector>="<X>x<Y>"
 .Pp
@@ -205,6 +206,16 @@ If not set, the default in the
 .Pa GENERIC
 kernel is
 .Nm .
+.It Va kern.vt.color. Ns Ar colornum Ns Va .rgb
+Set this value to override default palette entry for color
+.Pa colornum
+which should be in a range from 0 to 15 inclusive.
+The value should be either a comma-separated triplet of
+red, green, and blue values in a range from 0 to 255 or
+HTML-like hex triplet.
+See
+.Sx EXAMPLES
+below.
 .It Va kern.vt.fb.default_mode
 Set this value to a graphic mode to override the default mode picked by the
 .Nm
@@ -309,6 +320,11 @@ The connector name was found in
 .Dl info: [drm] Connector LVDS-1: get mode from tunables:
 .Dl info: [drm]   - kern.vt.fb.modes.LVDS-1
 .Dl info: [drm]   - kern.vt.fb.default_mode
+.Pp
+To set black and white colors of console palette
+.Pp
+.Dl kern.vt.color.0.rgb="10,10,10"
+.Dl kern.vt.color.15.rgb="#f0f0f0"
 .Sh SEE ALSO
 .Xr kbdcontrol 1 ,
 .Xr login 1 ,

Modified: stable/11/sys/dev/vt/colors/vt_termcolors.c
==============================================================================
--- stable/11/sys/dev/vt/colors/vt_termcolors.c	Wed Feb 14 23:47:04 2018	(r329282)
+++ stable/11/sys/dev/vt/colors/vt_termcolors.c	Wed Feb 14 23:51:44 2018	(r329283)
@@ -31,14 +31,18 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/libkern.h>
 
 #include <dev/vt/colors/vt_termcolors.h>
 
-static const struct {
+#define NCOLORS	16
+
+static struct {
 	unsigned char r;	/* Red percentage value. */
 	unsigned char g;	/* Green percentage value. */
 	unsigned char b;	/* Blue percentage value. */
-} color_def[16] = {
+} color_def[NCOLORS] = {
 	{0,	0,	0},	/* black */
 	{50,	0,	0},	/* dark red */
 	{0,	50,	0},	/* dark green */
@@ -63,19 +67,112 @@ static const struct {
  *   - blue and red are swapped (1 <-> 4)
  *   - yellow ad cyan are swapped (3 <-> 6)
  */
-static const int cons_to_vga_colors[16] = {
+static const int cons_to_vga_colors[NCOLORS] = {
 	0, 4, 2, 6, 1, 5, 3, 7,
 	0, 4, 2, 6, 1, 5, 3, 7
 };
 
+static int
+vt_parse_rgb_triplet(const char *rgb, unsigned char *r,
+    unsigned char *g, unsigned char *b)
+{
+	unsigned long v;
+	const char *ptr;
+	char *endptr;
+
+	ptr = rgb;
+
+	/* Handle #rrggbb case */
+	if (*ptr == '#') {
+		if (strlen(ptr) != 7)
+			return (-1);
+		v = strtoul(ptr + 1, &endptr, 16);
+		if (*endptr != '\0')
+			return (-1);
+
+		*r = (v >> 16) & 0xff;
+		*g = (v >>  8) & 0xff;
+		*b = v & 0xff;
+
+		return (0);
+	}
+
+	/* "r, g, b" case */
+	v = strtoul(ptr, &endptr, 10);
+	if (ptr == endptr)
+		return (-1);
+	if (v > 255)
+		return (-1);
+	*r = v & 0xff;
+	ptr = endptr;
+
+	/* skip separator */
+	while (*ptr == ',' || *ptr == ' ')
+		ptr++;
+
+	v = strtoul(ptr, &endptr, 10);
+	if (ptr == endptr)
+		return (-1);
+	if (v > 255)
+		return (-1);
+	*g = v & 0xff;
+	ptr = endptr;
+
+	/* skip separator */
+	while (*ptr == ',' || *ptr == ' ')
+		ptr++;
+
+	v = strtoul(ptr, &endptr, 10);
+	if (ptr == endptr)
+		return (-1);
+	if (v > 255)
+		return (-1);
+	*b = v & 0xff;
+	ptr = endptr;
+
+	/* skip trailing spaces */
+	while (*ptr == ' ')
+		ptr++;
+
+	/* unexpected characters at the end of the string */
+	if (*ptr != 0)
+		return (-1);
+
+	return (0);
+}
+
+static void
+vt_palette_init(void)
+{
+	int i;
+	char rgb[32];
+	char tunable[32];
+	unsigned char r, g, b;
+
+	for (i = 0; i < NCOLORS; i++) {
+		snprintf(tunable, sizeof(tunable),
+		    "kern.vt.color.%d.rgb", i);
+		if (TUNABLE_STR_FETCH(tunable, rgb, sizeof(rgb))) {
+			if (vt_parse_rgb_triplet(rgb, &r, &g, &b) == 0) {
+				/* convert to percentages */
+				color_def[i].r = r*100/255;
+				color_def[i].g = g*100/255;
+				color_def[i].b = b*100/255;
+			}
+		}
+	}
+}
+
 int
 vt_generate_cons_palette(uint32_t *palette, int format, uint32_t rmax,
     int roffset, uint32_t gmax, int goffset, uint32_t bmax, int boffset)
 {
 	int i;
 
+	vt_palette_init();
+
 #define	CF(_f, _i) ((_f ## max * color_def[(_i)]._f / 100) << _f ## offset)
-	for (i = 0; i < 16; i++) {
+	for (i = 0; i < NCOLORS; i++) {
 		switch (format) {
 		case COLOR_FORMAT_VGA:
 			palette[i] = cons_to_vga_colors[i];



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802142351.w1ENpi1u009989>