| .\"*************************************************************************** |
| .\" Copyright 2018-2023,2024 Thomas E. Dickey * |
| .\" Copyright 1998-2015,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: curs_pad.3x,v 1.61 2024/04/27 17:55:43 tom Exp $ |
| .TH curs_pad 3X 2024-04-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" |
| .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 |
| \fB\%newpad\fP, |
| \fB\%subpad\fP, |
| \fB\%prefresh\fP, |
| \fB\%pnoutrefresh\fP, |
| \fB\%pechochar\fP, |
| \fB\%pecho_wchar\fP \- |
| create and display \fIcurses\fR pads |
| .SH SYNOPSIS |
| .nf |
| \fB#include <curses.h> |
| .PP |
| \fBWINDOW *newpad(int \fInlines\fP, int \fIncols\fP); |
| \fBWINDOW *subpad(WINDOW *\fIparent\fP, int \fInlines\fP, int \fIncols\fP, |
| \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR |
| .PP |
| \fBint prefresh(WINDOW *\fIpad\fB, int \fIpminrow\fB, int \fIpmincol\fB,\fR |
| \fBint \fIsminrow\fB, int \fIsmincol\fB, int \fIsmaxrow\fB, int \fIsmaxcol\fB);\fR |
| \fBint pnoutrefresh(WINDOW *\fIpad\fB, int \fIpminrow\fB, int \fIpmincol\fB,\fR |
| \fBint \fIsminrow\fB, int \fIsmincol\fB, int \fIsmaxrow\fB, int \fIsmaxcol\fB);\fR |
| .PP |
| \fBint pechochar(WINDOW *\fIpad\fB, chtype \fIch\fB);\fR |
| \fBint pecho_wchar(WINDOW *\fIpad\fB, const cchar_t *\fIwch\fB);\fR |
| .fi |
| .SH DESCRIPTION |
| A |
| .I curses |
| .I pad |
| is like a window, |
| except that it is not restricted by the screen size, |
| and is not necessarily associated with a particular part of the screen. |
| Pads can be used when a large window is needed, |
| only part of which is to be visible on the screen. |
| Pads are not automatically refreshed by scrolling or input-echoing |
| operations. |
| .PP |
| Pads cannot be refreshed with \fB\%wrefresh\fP(3X); |
| use |
| .B \%prefresh |
| or |
| .B \%pnoutrefresh |
| instead. |
| .SS newpad |
| \fB\%newpad\fP creates and returns a pointer to a new pad data structure |
| with the given number of lines, |
| .IR nlines , |
| and columns, |
| .IR ncols . |
| .SS subpad |
| .B \%subpad |
| creates and returns a pointer to a subwindow within a pad |
| with the given number of lines, |
| .IR nlines , |
| and columns, |
| .IR ncols . |
| Unlike \fB\%subwin\fP(3X), |
| which uses screen coordinates, |
| the new pad is placed at position |
| .RI ( begin_y , |
| .IR begin_x ) |
| relative to its parent. |
| Thus, |
| changes made to one pad can affect both. |
| When operating on a subpad, |
| it is often necessary to call \fB\%touchwin\fP(3X) or |
| \fB\%touchline\fP(3X) on |
| .I parent |
| before calling |
| .BR \%prefresh . |
| .SS "prefresh, pnoutrefresh" |
| .B \%prefresh\fP |
| and |
| .B \%pnoutrefresh |
| are analogous to \fB\%wrefresh\fP(3X) and \fB\%wnoutrefresh\fP(3X) |
| except that they operate on pads rather than windows. |
| They require additional parameters are needed to indicate what portions |
| of the pad and screen are involved. |
| .bP |
| .I pminrow |
| and |
| .I pmincol |
| specify the upper left-hand corner of a rectangular view of the pad. |
| .bP |
| .IR sminrow , |
| .IR smincol , |
| .IR smaxrow , |
| and |
| .I smaxcol |
| specify the vertices of the rectangle to be displayed on the screen. |
| .PP |
| The lower right-hand corner |
| of the rectangle to be displayed in the pad |
| is calculated from the screen coordinates, |
| since the rectangles must be the same size. |
| Both rectangles must be entirely contained |
| within their respective structures. |
| .I curses |
| treats |
| negative values of any of these parameters as zero. |
| .SS pechochar |
| .B \%pechochar |
| is functionally equivalent to calling \fB\%waddch\fP(3X) followed by |
| .BR \%prefresh . |
| It suggests to the |
| .I curses |
| optimizer that only a single character is being output; |
| a considerable performance benefit may be thus enjoyed. |
| The location of the character |
| .I ch |
| written to the pad is used to populate the arguments to |
| .BR \%prefresh . |
| .SS pecho_wchar |
| .B \%pecho_wchar\fP |
| is functionally equivalent to calling \fB\%wadd_wch\fP(3X) followed by |
| .BR \%prefresh . |
| It suggests to the |
| .I curses |
| optimizer that only a single wide character is being output; |
| a considerable performance benefit may be thus enjoyed. |
| The location of the character |
| .I wch |
| written to the pad is used to populate the arguments to |
| .BR \%prefresh . |
| .SH RETURN VALUE |
| Functions that return an integer return \fBERR\fP upon failure and |
| \fBOK\fP |
| (SVr4 specifies only |
| \*(``an integer value other than \fBERR\fP\*('') |
| upon successful completion. |
| .PP |
| Functions that return pointers return \fBNULL\fP on error, |
| and set \fB\%errno\fP to \fB\%ENOMEM\fP. |
| .PP |
| X/Open Curses does not specify any error conditions. |
| In this implementation |
| .RS 3 |
| .TP 5 |
| \fB\%prefresh\fP and \fB\%pnoutrefresh\fP |
| return an error |
| if the window pointer is null, or |
| if the window is not really a pad or |
| if the area to refresh extends off-screen or |
| if the minimum coordinates are greater than the maximum. |
| .TP 5 |
| \fBpechochar\fP |
| returns an error |
| if the window is not really a pad, and the associated call |
| to \fB\%wechochar\fP returns an error. |
| .TP 5 |
| \fBpecho_wchar\fP |
| returns an error |
| if the window is not really a pad, and the associated call |
| to \fB\%wecho_wchar\fP returns an error. |
| .RE |
| .SH NOTES |
| \fB\%pechochar\fP may be a macro. |
| .SH PORTABILITY |
| BSD \fIcurses\fP has no \fIpad\fP feature. |
| .PP |
| SVr2 \fIcurses\fP (1986) provided the \fB\%newpad\fP and related functions, |
| documenting them in a single line each. |
| SVr3 (1987) provided more extensive documentation. |
| .PP |
| The documentation does not explain the term \fIpad\fP. |
| However, the Apollo \fIAegis\fP workstation operating system |
| supported a graphical \fIpad\fP feature: |
| .bP |
| These graphical pads could be much larger than the computer's display. |
| .bP |
| The read-only output from a command could be scrolled back to inspect, |
| and select text from the pad. |
| .PP |
| The two uses may be related. |
| .PP |
| X/Open Curses, Issue 4 describes these functions, |
| without significant change from the SVr3 documentation. |
| It describes no error conditions. |
| The behavior of \fB\%subpad\fP if the parent window is not |
| a pad is undocumented, |
| and is not checked by the vendor Unix implementations: |
| .bP |
| SVr4 \fIcurses\fP sets a flag in the \fI\%WINDOW\fP structure in |
| \fB\%newpad\fP which tells if the window is a \fIpad\fP. |
| .IP |
| However, it uses this information only in |
| \fB\%waddch\fP (to decide if it should call \fB\%wrefresh\fP) and |
| \fB\%wscrl\fP (to avoid scrolling a pad), |
| and does not check in \fB\%wrefresh\fP to ensure that the pad |
| is refreshed properly. |
| .bP |
| Solaris \fI\%xcurses\fP checks whether a window is a pad in |
| \fB\%wnoutrefresh\fP, |
| returning \fBERR\fP in that case. |
| .IP |
| However, |
| it only sets the flag for subwindows if the parent window is a pad. |
| Its \fB\%newpad\fP function does not set this information. |
| Consequently, the check will never fail. |
| .IP |
| It makes no comparable check in \fB\%pnoutrefresh\fP, |
| though interestingly enough, a comment in the source code |
| states that the lack of a check was an MKS extension. |
| .bP |
| NetBSD 7 \fIcurses\fP |
| sets a flag in the \fI\%WINDOW\fP structure |
| for \fB\%newpad\fP and \fB\%subpad\fP, |
| using this to help with the distinction between \fB\%wnoutrefresh\fP |
| and \fB\%pnoutrefresh\fP. |
| .IP |
| It does not check for the case where a subwindow is created in |
| a pad using \fB\%subwin\fP or \fB\%derwin\fP. |
| .IP |
| The \fB\%dupwin\fP function returns a regular window when duplicating a pad. |
| Likewise, \fB\%getwin\fP always returns a window, even if the saved |
| data was from a pad. |
| .PP |
| This implementation |
| .bP |
| sets a flag in the \fI\%WINDOW\fP structure |
| for \fB\%newpad\fP and \fB\%subpad\fP, |
| .bP |
| allows a \fB\%subwin\fP or \fB\%derwin\fP call to succeed having a pad parent by |
| forcing the subwindow to be a pad, |
| .bP |
| checks in both \fB\%wnoutrefresh\fP and \fB\%pnoutrefresh\fP to ensure |
| that pads and windows are handled distinctly, and |
| .bP |
| ensures that \fB\%dupwin\fP and \fB\%getwin\fP treat |
| pads versus windows consistently. |
| .SH SEE ALSO |
| \fB\%curses\fP(3X), |
| \fB\%curs_addch\fP(3X), |
| \fB\%curs_refresh\fP(3X), |
| \fB\%curs_touch\fP(3X) |