summaryrefslogtreecommitdiffstats
path: root/usr.sbin/vidcontrol
diff options
context:
space:
mode:
authorsobomax <sobomax@FreeBSD.org>2001-05-19 06:47:36 +0000
committersobomax <sobomax@FreeBSD.org>2001-05-19 06:47:36 +0000
commit491129cbdf55fe72c10625b06b0c5143509c5fe5 (patch)
tree1339be1eba511859f9ec54dca00f13e6474f2fa4 /usr.sbin/vidcontrol
parentcd110221e4a2a99067a0a1442afce828b6c55d7e (diff)
downloadFreeBSD-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.1137
-rw-r--r--usr.sbin/vidcontrol/vidcontrol.c88
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;
OpenPOWER on IntegriCloud