diff options
author | sobomax <sobomax@FreeBSD.org> | 2001-05-19 06:47:36 +0000 |
---|---|---|
committer | sobomax <sobomax@FreeBSD.org> | 2001-05-19 06:47:36 +0000 |
commit | 491129cbdf55fe72c10625b06b0c5143509c5fe5 (patch) | |
tree | 1339be1eba511859f9ec54dca00f13e6474f2fa4 /usr.sbin/vidcontrol | |
parent | cd110221e4a2a99067a0a1442afce828b6c55d7e (diff) | |
download | FreeBSD-src-491129cbdf55fe72c10625b06b0c5143509c5fe5.zip FreeBSD-src-491129cbdf55fe72c10625b06b0c5143509c5fe5.tar.gz |
Move scrshot(1) functionality into vidcontrol(1).
Suggested by: many
Not objected to by: nik (scrshot co-author)
Diffstat (limited to 'usr.sbin/vidcontrol')
-rw-r--r-- | usr.sbin/vidcontrol/vidcontrol.1 | 137 | ||||
-rw-r--r-- | usr.sbin/vidcontrol/vidcontrol.c | 88 |
2 files changed, 222 insertions, 3 deletions
diff --git a/usr.sbin/vidcontrol/vidcontrol.1 b/usr.sbin/vidcontrol/vidcontrol.1 index c1657ff..8a482e3 100644 --- a/usr.sbin/vidcontrol/vidcontrol.1 +++ b/usr.sbin/vidcontrol/vidcontrol.1 @@ -36,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 @@ -185,6 +187,21 @@ or 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 @@ -253,6 +270,106 @@ you need to recompile your kernel with the 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 @@ -329,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 , @@ -339,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 5516462..2fbf7d0 100644 --- a/usr.sbin/vidcontrol/vidcontrol.c +++ b/usr.sbin/vidcontrol/vidcontrol.c @@ -50,6 +50,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", @@ -70,8 +75,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); } @@ -638,6 +643,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) { @@ -648,7 +724,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); @@ -690,6 +766,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; |