ff4ff35918
Red Bear OS is a full fork. All sources must be available from git clone with zero network access. Removed gitignore rules that excluded fetched source trees under recipes/*/source/, local/recipes/kde/*/source/, local/recipes/qt/*/source/, and vendor source trees. Build artifacts (target/, build/, source.tar, *.o, *.so) remain excluded. 127291 files added — kernel, relibc, base, bootloader, pkgar, all KDE/Qt frameworks, mesa, wayland, DRM drivers, and every other recipe source.
491 lines
13 KiB
Plaintext
491 lines
13 KiB
Plaintext
.\"***************************************************************************
|
|
.\" Copyright 2018-2024,2025 Thomas E. Dickey *
|
|
.\" Copyright 2017 Free Software Foundation, Inc. *
|
|
.\" *
|
|
.\" Permission is hereby granted, free of charge, to any person obtaining a *
|
|
.\" copy of this software and associated documentation files (the *
|
|
.\" "Software"), to deal in the Software without restriction, including *
|
|
.\" without limitation the rights to use, copy, modify, merge, publish, *
|
|
.\" distribute, distribute with modifications, sublicense, and/or sell *
|
|
.\" copies of the Software, and to permit persons to whom the Software is *
|
|
.\" furnished to do so, subject to the following conditions: *
|
|
.\" *
|
|
.\" The above copyright notice and this permission notice shall be included *
|
|
.\" in all copies or substantial portions of the Software. *
|
|
.\" *
|
|
.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
|
|
.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
|
|
.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
|
|
.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
|
|
.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
|
|
.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
|
|
.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
|
|
.\" *
|
|
.\" Except as contained in this notice, the name(s) of the above copyright *
|
|
.\" holders shall not be used in advertising or otherwise to promote the *
|
|
.\" sale, use or other dealings in this Software without prior written *
|
|
.\" authorization. *
|
|
.\"***************************************************************************
|
|
.\"
|
|
.\" $Id: scr_dump.5,v 1.52 2025/04/05 21:56:26 tom Exp $
|
|
.TH scr_dump 5 2025-04-05 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "File formats"
|
|
.ie \n(.g \{\
|
|
.ds `` \(lq
|
|
.ds '' \(rq
|
|
.\}
|
|
.el \{\
|
|
.ie t .ds `` ``
|
|
.el .ds `` ""
|
|
.ie t .ds '' ''
|
|
.el .ds '' ""
|
|
.\}
|
|
.
|
|
.de bP
|
|
.ie n .IP \(bu 4
|
|
.el .IP \(bu 2
|
|
..
|
|
.SH NAME
|
|
scr_dump \-
|
|
\fIcurses\fR screen dump
|
|
.\"SH SYNOPSIS
|
|
.SH DESCRIPTION
|
|
The curses library provides applications with the ability to write the
|
|
contents of a window to an external file using \fBscr_dump\fP or \fBputwin\fP,
|
|
and read it back using \fBscr_restore\fP or \fBgetwin\fP.
|
|
.PP
|
|
The \fBputwin\fP and \fBgetwin\fP functions do the work;
|
|
while \fBscr_dump\fP and \fBscr_restore\fP conveniently save and restore
|
|
the whole screen, i.e., \fBstdscr\fP.
|
|
.SS ncurses6
|
|
A longstanding implementation of screen-dump was
|
|
revised with ncurses6 to remedy problems with the earlier approach:
|
|
.IP \(bu 4
|
|
A \*(``magic number\*('' is written to the beginning of the dump file,
|
|
allowing applications (such as \fBfile\fP(1)) to recognize curses dump files.
|
|
.IP
|
|
Because ncurses6 uses a new format,
|
|
that requires a new magic number
|
|
was unused by other applications.
|
|
This 16-bit number was unused:
|
|
.RS 4
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
0x8888 (octal \*(``\e210\e210\*('')
|
|
.EE
|
|
.RE
|
|
.PP
|
|
but to be more certain, this 32-bit number was chosen:
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
0x88888888 (octal \*(``\e210\e210\e210\e210\*('')
|
|
.EE
|
|
.RE
|
|
.PP
|
|
This is the pattern submitted to the maintainers of the \fBfile\fP program:
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
.nf
|
|
#
|
|
# ncurses5 (and before) did not use a magic number,
|
|
# making screen dumps "data".
|
|
#
|
|
# ncurses6 (2015) uses this format, ignoring byte-order
|
|
0 string \e210\e210\e210\e210ncurses ncurses6 screen image
|
|
#
|
|
.fi
|
|
.EE
|
|
.RE
|
|
.RE
|
|
.bP
|
|
The screen dumps are written in textual form,
|
|
so that internal data sizes are not directly related to the dump-format, and
|
|
enabling the library to read dumps from either narrow- or wide-character-
|
|
configurations.
|
|
.IP
|
|
The \fInarrow\fP library configuration holds characters and video attributes
|
|
in a 32-bit \fBchtype\fP, while the \fIwide-character\fP library stores
|
|
this information in the \fBcchar_t\fP structure, which is much larger than
|
|
32-bits.
|
|
.bP
|
|
It is possible to read a screen dump into a terminal with a different
|
|
screen-size,
|
|
because the library truncates or fills the screen as necessary.
|
|
.bP
|
|
The ncurses6 \fBgetwin\fP reads the legacy screen dumps from ncurses5.
|
|
.SS "ncurses5 (Legacy)"
|
|
The screen-dump feature was added to \fI\%ncurses\fP in June 1995.
|
|
While there were fixes and improvements in succeeding years,
|
|
the basic scheme was unchanged:
|
|
.bP
|
|
The \fI\%WINDOW\fP structure was written in binary form.
|
|
.bP
|
|
The \fI\%WINDOW\fP structure refers to lines of data,
|
|
which were written as an array of binary data following the \fI\%WINDOW\fP.
|
|
.bP
|
|
When \fBgetwin\fP restored the window,
|
|
it would keep track of offsets into the array of line-data
|
|
and adjust the \fI\%WINDOW\fP structure which was read back into memory.
|
|
.PP
|
|
This is similar to Unix System\ V,
|
|
but does not write a \*(``magic number\*('' to identify the file format.
|
|
.SH PORTABILITY
|
|
There is no standard format for
|
|
.I curses
|
|
screen dumps.
|
|
A brief survey of the existing implementations follows.
|
|
.SS "X/Open Curses"
|
|
X/Open Curses Issue\ 7 specifies little.
|
|
It says
|
|
(boldface emphasis added)
|
|
.RS 3
|
|
.PP
|
|
\*(``[t]he \fI\%getwin()\fP function reads window-related data stored in
|
|
the file by \fI\%putwin()\fP.
|
|
The function then creates and initializes a new window using that data.
|
|
.PP
|
|
The \fI\%putwin()\fP function writes all data associated with \fIwin\fP
|
|
into the \fI\%stdio\fP stream to which \fIfilep\fP points,
|
|
using an \fBunspecified format\fP.
|
|
This information can be retrieved later using \fI\%getwin()\fP.\*(''
|
|
.RE
|
|
.PP
|
|
In the mid-1990s when the X/Open Curses document was written,
|
|
there were still System\ V systems using older,
|
|
less capable
|
|
.I curses
|
|
libraries.
|
|
BSD
|
|
.I curses
|
|
was not relevant to X/Open because it did not meet the criteria
|
|
for base-level conformance;
|
|
see \fB\%ncurses\fP(3X).
|
|
.SS "System V"
|
|
System\ V
|
|
.I curses
|
|
identified the file format by writing a \*(``magic number\*('' at the
|
|
beginning of the dump.
|
|
The \fI\%WINDOW\fP data and the lines of text follow, all in binary form.
|
|
.PP
|
|
Solaris
|
|
.I curses
|
|
has the following definitions.
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
.nf
|
|
/* terminfo magic number */
|
|
#define MAGNUM 0432
|
|
|
|
/* curses screen dump magic number */
|
|
#define SVR2_DUMP_MAGIC_NUMBER 0433
|
|
#define SVR3_DUMP_MAGIC_NUMBER 0434
|
|
.fi
|
|
.EE
|
|
.RE
|
|
.PP
|
|
That is, the feature was likely introduced in SVr2 (1984),
|
|
and improved in SVr3 (1987).
|
|
Solaris
|
|
.I curses
|
|
has no magic number for SVr4 (1989).
|
|
Other System\ V operating systems
|
|
(AIX and HP-UX)
|
|
use a magic number that would correspond to the following.
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
.nf
|
|
/* curses screen dump magic number */
|
|
#define SVR4_DUMP_MAGIC_NUMBER 0435
|
|
.fi
|
|
.EE
|
|
.RE
|
|
.PP
|
|
That octal number in bytes is 001, 035.
|
|
Because most Unix vendors at the time used big-endian hardware,
|
|
the magic number is written with the high-order byte first.
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
\e001\e035
|
|
.EE
|
|
.RE
|
|
.PP
|
|
After the magic number,
|
|
the \fI\%WINDOW\fP structure and line data are written in binary format.
|
|
While the magic number used by these systems can be observed with
|
|
\fIod\fP(1),
|
|
none of them documents the format used for screen dumps.
|
|
.PP
|
|
Nor do they use an identical format,
|
|
even with the System\ V family.
|
|
The
|
|
.I \%ncurses
|
|
.I \%savescreen
|
|
test program was used to collect information for this manual page.
|
|
It produced dumps of different size
|
|
(all on 64-bit hardware,
|
|
on 40x80 screens):
|
|
.bP
|
|
AIX (51817 bytes)
|
|
.bP
|
|
HP-UX (90093 bytes)
|
|
.bP
|
|
Solaris 10 (13273 bytes)
|
|
.bP
|
|
\fI\%ncurses\fP5 (12888 bytes)
|
|
.SS Solaris
|
|
As noted above,
|
|
Solaris
|
|
.I curses
|
|
has no magic number corresponding to SVr4
|
|
.IR curses .
|
|
This is odd,
|
|
since Solaris was the first operating system to meet the SVr4
|
|
guidelines.
|
|
Solaris furthermore supplies two versions of
|
|
.IR curses .
|
|
.bP
|
|
The default
|
|
.I curses
|
|
library uses the SVr3 magic number.
|
|
.bP
|
|
An alternate
|
|
.I curses
|
|
library
|
|
(which we term
|
|
.I \%xcurses),
|
|
available in
|
|
.IR /usr/xpg4 ,
|
|
uses a textual format with no magic number.
|
|
.IP
|
|
According to its copyright notice,
|
|
this
|
|
.I \%xcurses
|
|
library was developed by MKS
|
|
(Mortice Kern Systems) from 1990 to 1995.
|
|
.IP
|
|
Like ncurses6,
|
|
it includes a header with parameters.
|
|
Unlike ncurses6,
|
|
the contents of the window are written piecemeal,
|
|
with coordinates and attributes for each chunk of text rather than
|
|
writing the whole window from top to bottom.
|
|
.SS PDCurses
|
|
.I \%PDCurses
|
|
added support for screen dumps in version 2.7 (2005).
|
|
Like System\ V and ncurses5,
|
|
it writes the \fI\%WINDOW\fP structure in binary,
|
|
but begins the file with its three-byte identifier \*(``PDC\*('',
|
|
followed by a single-byte version number.
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
\*(``PDC\e001\*(''
|
|
.EE
|
|
.RE
|
|
.SS NetBSD
|
|
As of April 2017,
|
|
NetBSD
|
|
.I curses
|
|
does not support \fB\%scr_dump\fP and \fB\%scr_restore\fP
|
|
(or \fB\%scr_init\fP,
|
|
\fB\%scr_set\fP),
|
|
although it has \fB\%putwin\fP and \fB\%getwin\fP.
|
|
.PP
|
|
Like ncurses5,
|
|
NetBSD \fB\%putwin\fP does not identify its dumps with a useful magic
|
|
number.
|
|
It writes
|
|
.bP
|
|
the
|
|
.I curses
|
|
shared library major and minor versions as the first two bytes
|
|
(for example,
|
|
7 and 1),
|
|
.bP
|
|
followed by a binary dump of the \fI\%WINDOW\fP,
|
|
.bP
|
|
some data for wide characters referenced by the \fI\%WINDOW\fP
|
|
structure,
|
|
and
|
|
.bP
|
|
finally,
|
|
lines as done by other implementations.
|
|
.SH EXAMPLES
|
|
Given a simple program which writes text to the screen
|
|
(and for the sake of example, limiting the screen-size to 10x20):
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
.nf
|
|
#include <curses.h>
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
putenv("LINES=10");
|
|
putenv("COLUMNS=20");
|
|
initscr();
|
|
start_color();
|
|
init_pair(1, COLOR_WHITE, COLOR_BLUE);
|
|
init_pair(2, COLOR_RED, COLOR_BLACK);
|
|
bkgd(COLOR_PAIR(1));
|
|
move(4, 5);
|
|
attron(A_BOLD);
|
|
addstr("Hello");
|
|
move(5, 5);
|
|
attroff(A_BOLD);
|
|
attrset(A_REVERSE | COLOR_PAIR(2));
|
|
addstr("World!");
|
|
refresh();
|
|
scr_dump("foo.out");
|
|
endwin();
|
|
return 0;
|
|
}
|
|
.fi
|
|
.EE
|
|
.RE
|
|
.PP
|
|
When run using ncurses6, the output looks like this:
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
.nf
|
|
\e210\e210\e210\e210ncurses 6.0.20170415
|
|
_cury=5
|
|
_curx=11
|
|
_maxy=9
|
|
_maxx=19
|
|
_flags=14
|
|
_attrs=\e{REVERSE|C2}
|
|
flag=_idcok
|
|
_delay=-1
|
|
_regbottom=9
|
|
_bkgrnd=\e{NORMAL|C1}\es
|
|
rows:
|
|
1:\e{NORMAL|C1}\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es
|
|
2:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es
|
|
3:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es
|
|
4:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es
|
|
5:\es\es\es\es\es\e{BOLD}Hello\e{NORMAL}\es\es\es\es\es\es\es\es\es\es
|
|
6:\es\es\es\es\es\e{REVERSE|C2}World!\e{NORMAL|C1}\es\es\es\es\es\es\es\es\es
|
|
7:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es
|
|
8:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es
|
|
9:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es
|
|
10:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es
|
|
.fi
|
|
.EE
|
|
.RE
|
|
.PP
|
|
The first four octal escapes are actually nonprinting characters,
|
|
while the remainder of the file is printable text.
|
|
You may notice:
|
|
.bP
|
|
The actual color pair values are not written to the file.
|
|
.bP
|
|
All characters are shown in printable form; spaces are \*(``\es\*('' to
|
|
ensure they are not overlooked.
|
|
.bP
|
|
Attributes are written in escaped curly braces, e.g., \*(``\e{BOLD}\*('',
|
|
and may include a color pair (C1 or C2 in this example).
|
|
.bP
|
|
The parameters in the header are written out only if they are nonzero.
|
|
When reading back, order does not matter.
|
|
.ne 10
|
|
.PP
|
|
Running the same program with Solaris \fIxpg4\fP curses gives this dump:
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
.nf
|
|
MAX=10,20
|
|
BEG=0,0
|
|
SCROLL=0,10
|
|
VMIN=1
|
|
VTIME=0
|
|
FLAGS=0x1000
|
|
FG=0,0
|
|
BG=0,0,
|
|
0,0,0,1,
|
|
0,19,0,0,
|
|
1,0,0,1,
|
|
1,19,0,0,
|
|
2,0,0,1,
|
|
2,19,0,0,
|
|
3,0,0,1,
|
|
3,19,0,0,
|
|
4,0,0,1,
|
|
4,5,0x20,0,Hello
|
|
4,10,0,1,
|
|
4,19,0,0,
|
|
5,0,0,1,
|
|
5,5,0x4,2,World!
|
|
5,11,0,1,
|
|
5,19,0,0,
|
|
6,0,0,1,
|
|
6,19,0,0,
|
|
7,0,0,1,
|
|
7,19,0,0,
|
|
8,0,0,1,
|
|
8,19,0,0,
|
|
9,0,0,1,
|
|
9,19,0,0,
|
|
CUR=11,5
|
|
.fi
|
|
.EE
|
|
.RE
|
|
.PP
|
|
Solaris \fBgetwin\fP requires that all parameters are present, and
|
|
in the same order.
|
|
The \fIxpg4\fP curses library does not know about the \fBbce\fP
|
|
(back color erase) capability, and does not color the window background.
|
|
.ne 10
|
|
.PP
|
|
On the other hand, the SVr4 curses library does know about the background color.
|
|
However, its screen dumps are in binary.
|
|
Here is the corresponding dump (using \*(``od \-t x1\*(''):
|
|
.PP
|
|
.RS 4
|
|
.EX
|
|
.nf
|
|
0000000 1c 01 c3 d6 f3 58 05 00 0b 00 0a 00 14 00 00 00
|
|
0000020 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
0000040 00 00 b8 1a 06 08 cc 1a 06 08 00 00 09 00 10 00
|
|
0000060 00 00 00 80 00 00 20 00 00 00 ff ff ff ff 00 00
|
|
0000100 ff ff ff ff 00 00 00 00 20 80 00 00 20 80 00 00
|
|
0000120 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
|
|
*
|
|
0000620 20 80 00 00 20 80 00 00 20 80 00 00 48 80 00 04
|
|
0000640 65 80 00 04 6c 80 00 04 6c 80 00 04 6f 80 00 04
|
|
0000660 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
|
|
*
|
|
0000740 20 80 00 00 20 80 00 00 20 80 00 00 57 00 81 00
|
|
0000760 6f 00 81 00 72 00 81 00 6c 00 81 00 64 00 81 00
|
|
0001000 21 00 81 00 20 80 00 00 20 80 00 00 20 80 00 00
|
|
0001020 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
|
|
*
|
|
0001540 20 80 00 00 20 80 00 00 00 00 f6 d1 01 00 f6 d1
|
|
0001560 08 00 00 00 40 00 00 00 00 00 00 00 00 00 00 07
|
|
0001600 00 04 00 01 00 01 00 00 00 01 00 00 00 00 00 00
|
|
0001620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
|
*
|
|
0002371
|
|
.fi
|
|
.EE
|
|
.RE
|
|
.SH AUTHORS
|
|
Thomas E. Dickey
|
|
.br
|
|
extended screen-dump format for \fI\%ncurses\fP 6.0 (2015)
|
|
.sp
|
|
Eric S. Raymond
|
|
.br
|
|
screen dump feature in \fI\%ncurses\fP 1.9.2d (1995)
|
|
.SH SEE ALSO
|
|
\fB\%curs_scr_dump\fP(3X),
|
|
\fB\%curs_util\fP(3X)
|