svn commit: r327444 - in head: share/man/man4 sys/dev/vt/colors

Oleksandr Tymoshenko gonzo at FreeBSD.org
Sun Dec 31 20:21:08 UTC 2017


Author: gonzo
Date: Sun Dec 31 20:21:05 2017
New Revision: 327444
URL: https://svnweb.freebsd.org/changeset/base/327444

Log:
  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
  MFC after:	2 weeks
  Differential Revision:	https://reviews.freebsd.org/D13645

Modified:
  head/share/man/man4/vt.4
  head/sys/dev/vt/colors/vt_termcolors.c

Modified: head/share/man/man4/vt.4
==============================================================================
--- head/share/man/man4/vt.4	Sun Dec 31 20:20:55 2017	(r327443)
+++ head/share/man/man4/vt.4	Sun Dec 31 20:21:05 2017	(r327444)
@@ -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
@@ -206,6 +207,16 @@ The
 kernel uses
 .Nm
 when this value is not set.
+.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
@@ -310,6 +321,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: head/sys/dev/vt/colors/vt_termcolors.c
==============================================================================
--- head/sys/dev/vt/colors/vt_termcolors.c	Sun Dec 31 20:20:55 2017	(r327443)
+++ head/sys/dev/vt/colors/vt_termcolors.c	Sun Dec 31 20:21:05 2017	(r327444)
@@ -33,14 +33,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 */
@@ -65,19 +69,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()
+{
+	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, strlen(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];


More information about the svn-src-all mailing list