Teach vidcontrol(1) and vt(4) to restore default font

From: Marcin Cieslak <saper_at_saper.info>
Date: Sat, 13 Sep 2014 14:05:40 +0000 (UTC)
Hello,

I tried loading gallant.fnt which I did not
like and I was wondering how to come back to
the nice default font.

There does not seem to be the way to do this,
so please find below a simple patch to add
this functionality.

It adds a new ioctl PIO_VDFFONT to the vt(4)
driver. I hope I got the reference counting
on the vt_font_default structure right.

With this patch applied, "vidcontrol -f" restores
the built-in font.

//Marcin

Index: sys/dev/vt/vt_core.c
===================================================================
--- sys/dev/vt/vt_core.c	(wersja 271197)
+++ sys/dev/vt/vt_core.c	(kopia robocza)
_at__at_ -1948,6 +1948,10 _at__at_
  		vtfont_unref(vf);
  		return (error);
  	}
+	case PIO_VDFTFONT: {
+		error = vt_change_font(vw, &vt_font_default);
+		return (error);
+	}
  	case GIO_SCRNMAP: {
  		scrmap_t *sm = (scrmap_t *)data;

Index: sys/sys/consio.h
===================================================================
--- sys/sys/consio.h	(wersja 271197)
+++ sys/sys/consio.h	(kopia robocza)
_at__at_ -239,6 +239,7 _at__at_
  #define GIO_FONT8x16	_IOR('c', 69, fnt16_t)
  #define PIO_VFONT	_IOW('c', 70, vfnt_t)
  #define GIO_VFONT	_IOR('c', 71, vfnt_t)
+#define PIO_VDFTFONT	_IO('c', 72)

  /* get video mode information */
  struct colors	{
Index: usr.sbin/vidcontrol/vidcontrol.1
===================================================================
--- usr.sbin/vidcontrol/vidcontrol.1	(wersja 271197)
+++ usr.sbin/vidcontrol/vidcontrol.1	(kopia robocza)
_at__at_ -26,9 +26,11 _at__at_
  .Op Fl c Ar appearance
  .Oo
  .Fl f
+.Oo
  .Op Ar size
  .Ar file
  .Oc
+.Oc
  .Op Fl g Ar geometry
  .Op Fl h Ar size
  .Op Fl i Cm adapter | mode
_at__at_ -136,8 +138,10 _at__at_
  Print out current output screen map.
  .It Xo
  .Fl f
+.Oo
  .Op Ar size
  .Ar file
+.Oc
  .Xc
  Load font
  .Ar file
_at__at_ -158,6 +162,14 _at__at_
  .Nm
  will try to guess it from the size of font file.
  .Pp
+When using
+.Xr vt 4
+both
+.Ar size
+and
+.Ar font
+can be omitted, and the default font will be loaded.
+.Pp
  Note that older video cards, such as MDA and CGA, do not support
  software font.
  See also
Index: usr.sbin/vidcontrol/vidcontrol.c
===================================================================
--- usr.sbin/vidcontrol/vidcontrol.c	(wersja 271197)
+++ usr.sbin/vidcontrol/vidcontrol.c	(kopia robocza)
_at__at_ -197,7 +197,7 _at__at_
  {
  	if (vt4_mode)
  		fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
-"usage: vidcontrol [-CHPpx] [-b color] [-c appearance] [-f [size] file]",
+"usage: vidcontrol [-CHPpx] [-b color] [-c appearance] [-f [[size] file]]",
  "                  [-g geometry] [-h size] [-i adapter | mode]",
  "                  [-M char] [-m on | off] [-r foreground background]",
  "                  [-S on | off] [-s number] [-T xterm | cons25] [-t N | off]",
_at__at_ -409,6 +409,19 _at__at_
  	return (t);
  }

+/*
+ * Set the default vt font.
+ */
+
+static void
+load_default_vt4font(void)
+{
+	if (ioctl(0, PIO_VDFTFONT) == -1) {
+		revert();
+		errc(1, errno, "loading default vt font");
+	}
+}
+
  static int
  load_vt4font(FILE *f)
  {
_at__at_ -1328,7 +1341,7 _at__at_
  	dumpopt = DUMP_FBF;
  	termmode = NULL;
  	if (vt4_mode)
-		opts = "b:Cc:f:g:h:Hi:M:m:pPr:S:s:T:t:x";
+		opts = "b:Cc:fg:h:Hi:M:m:pPr:S:s:T:t:x";
  	else
  		opts = "b:Cc:df:g:h:Hi:l:LM:m:pPr:S:s:T:t:x";

_at__at_ -1349,15 +1362,23 _at__at_
  			print_scrnmap();
  			break;
  		case 'f':
-			type = optarg;
-			font = nextarg(argc, argv, &optind, 'f', 0);
+			optarg = nextarg(argc, argv, &optind, 'f', 0);
+			if (optarg != NULL) {
+				font = nextarg(argc, argv, &optind, 'f', 0);

-			if (font == NULL) {
-				type = NULL;
-				font = optarg;
+				if (font == NULL) {
+					type = NULL;
+					font = optarg;
+				} else
+					type = optarg;
+
+				load_font(type, font);
+			} else {
+				if (!vt4_mode)
+					usage(); /* Switch syscons to ROM? */
+ 
+				load_default_vt4font();
  			}
-
-			load_font(type, font);
  			break;
  		case 'g':
  			if (sscanf(optarg, "%dx%d",
Received on Sat Sep 13 2014 - 12:05:45 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:52 UTC