summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/vidcontrol/vidcontrol.1229
-rw-r--r--usr.sbin/vidcontrol/vidcontrol.c89
2 files changed, 283 insertions, 35 deletions
diff --git a/usr.sbin/vidcontrol/vidcontrol.1 b/usr.sbin/vidcontrol/vidcontrol.1
index c950021cf25c..8a482e32a1cb 100644
--- a/usr.sbin/vidcontrol/vidcontrol.1
+++ b/usr.sbin/vidcontrol/vidcontrol.1
@@ -18,13 +18,17 @@
.Os
.Sh NAME
.Nm vidcontrol
-.Nd a utility for manipulating the syscons console driver.
+.Nd "a utility for manipulating the syscons console driver"
.Sh SYNOPSIS
.Nm
.Op Fl b Ar color
.Op Fl c Ar appearance
.Op Fl d
-.Op Fl f Ar size Ar file
+.Oo
+.Fl f
+.Op Ar size
+.Ar file
+.Oc
.Op Fl g Ar geometry
.Op Fl i Cm adapter | mode
.Op Fl l Ar screen_map
@@ -32,6 +36,8 @@
.Op Fl M Ar char
.Op Fl m Cm on | off
.Op Fl r Ar foreground Ar background
+.Op Fl p
+.Op Fl P
.Op Fl s Ar number
.Op Fl t Ar N | Cm off
.Op Fl x
@@ -67,6 +73,11 @@ The modes currently recognized are:
.Ar VGA_80x30 ,
.Ar VGA_80x50 ,
.Ar VGA_80x60 ,
+.Ar VGA_90x25 ,
+.Ar VGA_90x30 ,
+.Ar VGA_90x43 ,
+.Ar VGA_90x50 ,
+.Ar VGA_90x60 ,
.Ar EGA_80x25 ,
.Ar EGA_80x43 ,
.Ar VESA_132x25 ,
@@ -95,11 +106,6 @@ Use the
command below to see available colors.
.It Cm show
See the supported colors on a given platform.
-.It Fl r Ar foreground background
-Change reverse mode colors to
-.Ar foreground
-and
-.Ar background .
.It Fl b Ar color
Set border color to
.Ar color .
@@ -115,29 +121,11 @@ Or it can be like the old hardware cursor
The latter is actually a simulation.
.It Fl d
Print out current output screen map.
-.It Fl l Ar screen_map
-Install screen output map file from
-.Ar screen_map .
-See also
-.Xr syscons 4 .
-.It Fl L
-Install default screen output map.
-.It Fl i Cm adapter
-Shows info about the current video adapter.
-.It Fl i Cm mode
-Shows the possible video modes with the current video hardware.
-.It Fl M Ar char
-Sets the base character used to render the mouse pointer to
-.Ar char .
-.It Fl m Cm on | off
-Switch the mouse pointer
-.Cm on
-or
-.Cm off .
-Used together with the
-.Xr moused 8
-daemon for text mode cut & paste functionality.
-.It Fl f Ar size Ar file
+.It Xo
+.Fl f
+.Op Ar size
+.Ar file
+.Xc
Load font
.Ar file
for
@@ -152,6 +140,11 @@ You can also use the menu-driven
.Xr vidfont 1
command to load the font of your choice.
.Pp
+.Ar Size
+may be omitted, in this case
+.Nm
+will try to guess it from the size of font file.
+.Pp
Note that older video cards, such as MDA and CGA, do not support
software font.
See also
@@ -172,6 +165,48 @@ See also
and
.Sx EXAMPLES
below.
+.It Fl i Cm adapter
+Shows info about the current video adapter.
+.It Fl i Cm mode
+Shows the possible video modes with the current video hardware.
+.It Fl l Ar screen_map
+Install screen output map file from
+.Ar screen_map .
+See also
+.Xr syscons 4 .
+.It Fl L
+Install default screen output map.
+.It Fl M Ar char
+Sets the base character used to render the mouse pointer to
+.Ar char .
+.It Fl m Cm on | off
+Switch the mouse pointer
+.Cm on
+or
+.Cm off .
+Used together with the
+.Xr moused 8
+daemon for text mode cut & paste functionality.
+.It Fl p
+Capture the current contents of the video buffer corresponding
+to the terminal device referred to by standard input.
+.Nm
+writes contents of the video buffer to the standard
+output in a raw binary format. For details about that
+format see
+.Sx Format of Video Buffer Dump
+below.
+.It Fl P
+Same as
+.Fl p ,
+but dump contents of the video buffer in a plain text format
+ignoring nonprintable characters and information about text
+attributes.
+.It Fl r Ar foreground background
+Change reverse mode colors to
+.Ar foreground
+and
+.Ar background .
.It Fl s Ar number
Set the current vty to
.Ar number .
@@ -195,6 +230,11 @@ or loaded as a KLD module if you wish to use VESA video modes
or 132 column modes
.Pq see Xr vga 4 .
.Pp
+You need to compile your kernel with the
+.Ar VGA_WIDTH90
+option if you wish to use VGA 90 column modes
+.Pq see Xr vga 4 .
+.Pp
Video modes other than 25 and 30 line modes may require specific size of font.
Use
.Fl f
@@ -225,11 +265,111 @@ See below.
.Pp
If you want to use the raster text mode
.Ar VESA_800x600 ,
-you need to recomile your kernel with the
-.Em SC_PIXEL_MODE
+you need to recompile your kernel with the
+.Dv SC_PIXEL_MODE
option. See
.Xr syscons 4
for more details on this kernel option.
+.Ss Format of Video Buffer Dump
+The
+.Nm
+utility uses the
+.Xr syscons 4
+.Dv CONS_SCRSHOT
+.Xr ioctl 2
+to capture the current contents of the video buffer.
+.Nm
+writes version and additional information to the standard
+output, followed by the contents of the terminal device.
+.Pp
+PC video memory is typically arranged in two byte tuples,
+one per character position. In each tuple, the first byte
+will be the character code, and the second byte is the
+character's color attribute.
+.Pp
+The color attribute byte is further broken down in to the
+low nibble, which specifies which of 16 different foreground
+colors is active, and the high nibble, which specifies which
+of 16 different background colors is active.
+.Pp
+.Bl -hang -offset indent -compact
+.It 0
+Black
+.It 1
+Blue
+.It 2
+Green
+.It 3
+Cyan
+.It 4
+Red
+.It 5
+Magenta
+.It 6
+Brown
+.It 7
+White
+.It 8
+Grey
+.It 9
+Light Blue
+.It 10
+Light Green
+.It 11
+Light Cyan
+.It 12
+Light Red
+.It 13
+Light Magenta
+.It 14
+Yellow
+.It 15
+White
+.El
+.Pp
+It can be seen that the last 8 colors are brighter
+versions of the first 8.
+.Pp
+For example, the two bytes
+.Pp
+.Dl "65 158"
+.Pp
+specify an uppercase A (character code 65), in
+yellow (low nibble 15) on a light blue background
+(high nibble 9).
+.Pp
+The
+.Nm
+output contains a small header which includes additional
+information which may be useful to utilities processing
+the output.
+.Pp
+The first 10 bytes are always arranged as follows:
+.Bl -column "Byte range" "Contents" -offset indent
+.It Sy "Byte Range Contents"
+.It "1 thru 8 Literal text" Dq Li SCRSHOT_
+.It "9 File format version number"
+.It "10 Remaining number of bytes in the header"
+.El
+.Pp
+Subsequent bytes depend on the version number.
+.Bl -column "Version" "13 and up" -offset indent
+.It Sy "Version Byte Meaning"
+.It "1 11 Terminal width, in characters"
+.It " 12 Terminal depth, in characters"
+.It " 13 and up The snapshot data"
+.El
+.Pp
+So a dump of an 80x25 screen would start (in hex)
+.Bd -literal -offset indent
+53 43 52 53 48 4f 54 5f 01 02 50 19
+----------------------- -- -- -- --
+ | | | | ` 25 decimal
+ | | | `--- 80 decimal
+ | | `------ 2 remaining bytes of header data
+ | `--------- File format version 1
+ `------------------------ Literal "SCRSHOT_"
+.Ed
.Sh VIDEO OUTPUT CONFIGURATION
.Ss Boot Time Configuration
You may set the following variables in
@@ -286,6 +426,11 @@ you may abbreviate the file name as
.Pp
.Dl vidcontrol -f 8x16 iso-8x16
.Pp
+Furthermore, you can also omit font size
+.Dq Li 8x16 :
+.Pp
+.Dl vidcontrol -f iso-8x16
+.Pp
Likewise, you can also abbreviate the screen output map file name for
the
.Fl l
@@ -301,6 +446,18 @@ The following command will set-up a 100x37 raster text mode (useful for
some LCD models):
.Pp
.Dl vidcontrol -g 100x37 VESA_800x600
+.Pp
+The following command will capture the contents of the first virtual
+terminal, and redirect the output to the
+.Pa shot.scr
+file:
+.Pp
+.Dl vidcontrol -p < /dev/ttyv0 > shot.scr
+.Pp
+The following command will dump contents of the forth virtual terminal
+to the standard output in the human readable format:
+.Pp
+.Dl vidcontrol -P < /dev/ttyv3
.Sh SEE ALSO
.Xr kbdcontrol 1 ,
.Xr vidfont 1 ,
@@ -311,5 +468,13 @@ some LCD models):
.Xr rc.conf 5 ,
.Xr kldload 8 ,
.Xr moused 8
+.Xr watch 8
+.Pp
+The various
+.Li shot2*
+utilities in the
+.Li textproc
+category of the
+.Em "Ports Collection" .
.Sh AUTHORS
.An S\(/oren Schmidt Aq sos@FreeBSD.org
diff --git a/usr.sbin/vidcontrol/vidcontrol.c b/usr.sbin/vidcontrol/vidcontrol.c
index c467b9f0e33c..e3ea32d26adc 100644
--- a/usr.sbin/vidcontrol/vidcontrol.c
+++ b/usr.sbin/vidcontrol/vidcontrol.c
@@ -39,6 +39,7 @@ static const char rcsid[] =
#include <string.h>
#include <unistd.h>
#include <machine/console.h>
+#include <sys/consio.h>
#include <sys/errno.h>
#include "path.h"
#include "decode.h"
@@ -47,6 +48,11 @@ static const char rcsid[] =
#define _VESA_800x600_DFL_ROWS 25
#define _VESA_800x600_DFL_FNSZ 16
+#define DUMP_RAW 0
+#define DUMP_TXT 1
+
+#define DUMP_FMT_REV 1
+
char legal_colors[16][16] = {
"black", "blue", "green", "cyan",
"red", "magenta", "brown", "white",
@@ -67,8 +73,8 @@ usage()
fprintf(stderr, "%s\n%s\n%s\n%s\n",
"usage: vidcontrol [-r fg bg] [-b color] [-c appearance] [-d] [-l scrmap]",
" [-i adapter | mode] [-L] [-M char] [-m on|off]",
-" [-f size file] [-s number] [-t N|off] [-x] [-g geometry]",
-" [mode] [fgcol [bgcol]] [show]");
+" [-f size file] [-s number] [-t N|off] [-x] [-g geometry]",
+" [-p] [-P] [mode] [fgcol [bgcol]] [show]");
exit(1);
}
@@ -586,6 +592,77 @@ test_frame()
info.mv_rev.fore, info.mv_rev.back);
}
+/*
+ * Snapshot the video memory of that terminal, using the CONS_SCRSHOT
+ * ioctl, and writes the results to stdout either in the special
+ * binary format (see manual page for details), or in the plain
+ * text format.
+ */
+void
+dump_screen(int mode)
+{
+ scrshot_t shot;
+ vid_info_t info;
+
+ info.size = sizeof(info);
+ if (ioctl(0, CONS_GETINFO, &info) == -1) {
+ warn("failed to obtain current video mode parameters");
+ return;
+ }
+
+ shot.buf = alloca(info.mv_csz * info.mv_rsz * sizeof(u_int16_t));
+ if (shot.buf == NULL) {
+ warn("failed to allocate memory for dump");
+ return;
+ }
+
+ shot.xsize = info.mv_csz;
+ shot.ysize = info.mv_rsz;
+ if (ioctl(0, CONS_SCRSHOT, &shot) == -1) {
+ warn("failed to get dump of the screen");
+ return;
+ }
+
+ if (mode == DUMP_RAW) {
+ printf("SCRSHOT_%c%c%c%c", DUMP_FMT_REV, 2,
+ shot.xsize, shot.ysize);
+ fflush(stdout);
+
+ (void)write(STDOUT_FILENO, shot.buf,
+ shot.xsize * shot.ysize * sizeof(u_int16_t));
+ } else {
+ char *line;
+ int x, y;
+ u_int16_t ch;
+
+ line = alloca(shot.xsize + 1);
+ if (line == NULL) {
+ warn("failed to allocate memory for line buffer");
+ return;
+ }
+
+ for (y = 0; y < shot.ysize; y++) {
+ for (x = 0; x < shot.xsize; x++) {
+ ch = shot.buf[x + (y * shot.xsize)];
+ ch &= 0xff;
+ if (isprint(ch) == 0)
+ ch = ' ';
+ line[x] = (char)ch;
+ }
+
+ /* Trim trailing spaces */
+ do {
+ line[x--] = '\0';
+ } while (line[x] == ' ' && x != 0);
+
+ puts(line);
+ }
+ fflush(stdout);
+ }
+
+ return;
+}
+
int
main(int argc, char **argv)
{
@@ -595,7 +672,7 @@ main(int argc, char **argv)
info.size = sizeof(info);
if (ioctl(0, CONS_GETINFO, &info) < 0)
err(1, "must be on a virtual console");
- while((opt = getopt(argc, argv, "b:c:df:g:i:l:LM:m:r:s:t:x")) != -1)
+ while((opt = getopt(argc, argv, "b:c:df:g:i:l:LM:m:pPr:s:t:x")) != -1)
switch(opt) {
case 'b':
set_border_color(optarg);
@@ -632,6 +709,12 @@ main(int argc, char **argv)
case 'm':
set_mouse(optarg);
break;
+ case 'p':
+ dump_screen(DUMP_RAW);
+ break;
+ case 'P':
+ dump_screen(DUMP_TXT);
+ break;
case 'r':
set_reverse_colors(argc, argv, &optind);
break;