diff options
| -rw-r--r-- | usr.sbin/vidcontrol/vidcontrol.1 | 229 | ||||
| -rw-r--r-- | usr.sbin/vidcontrol/vidcontrol.c | 89 |
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; |
