10e3d5408SPeter Wemm /****************************************************************************
24a1a9510SRong-En Fan  * Copyright (c) 1998-2002,2006 Free Software Foundation, Inc.              *
30e3d5408SPeter Wemm  *                                                                          *
40e3d5408SPeter Wemm  * Permission is hereby granted, free of charge, to any person obtaining a  *
50e3d5408SPeter Wemm  * copy of this software and associated documentation files (the            *
60e3d5408SPeter Wemm  * "Software"), to deal in the Software without restriction, including      *
70e3d5408SPeter Wemm  * without limitation the rights to use, copy, modify, merge, publish,      *
80e3d5408SPeter Wemm  * distribute, distribute with modifications, sublicense, and/or sell       *
90e3d5408SPeter Wemm  * copies of the Software, and to permit persons to whom the Software is    *
100e3d5408SPeter Wemm  * furnished to do so, subject to the following conditions:                 *
110e3d5408SPeter Wemm  *                                                                          *
120e3d5408SPeter Wemm  * The above copyright notice and this permission notice shall be included  *
130e3d5408SPeter Wemm  * in all copies or substantial portions of the Software.                   *
140e3d5408SPeter Wemm  *                                                                          *
150e3d5408SPeter Wemm  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
160e3d5408SPeter Wemm  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
170e3d5408SPeter Wemm  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
180e3d5408SPeter Wemm  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
190e3d5408SPeter Wemm  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
200e3d5408SPeter Wemm  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
210e3d5408SPeter Wemm  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
220e3d5408SPeter Wemm  *                                                                          *
230e3d5408SPeter Wemm  * Except as contained in this notice, the name(s) of the above copyright   *
240e3d5408SPeter Wemm  * holders shall not be used in advertising or otherwise to promote the     *
250e3d5408SPeter Wemm  * sale, use or other dealings in this Software without prior written       *
260e3d5408SPeter Wemm  * authorization.                                                           *
270e3d5408SPeter Wemm  ****************************************************************************/
280e3d5408SPeter Wemm 
290e3d5408SPeter Wemm /****************************************************************************
300e3d5408SPeter Wemm  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
310e3d5408SPeter Wemm  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
324a1a9510SRong-En Fan  *     and: Thomas E. Dickey 1996 on                                        *
330e3d5408SPeter Wemm  ****************************************************************************/
340e3d5408SPeter Wemm 
350e3d5408SPeter Wemm #include <curses.priv.h>
360e3d5408SPeter Wemm 
374a1a9510SRong-En Fan MODULE_ID("$Id: lib_screen.c,v 1.29 2006/05/27 19:21:38 tom Exp $")
380e3d5408SPeter Wemm 
397a69bbfbSPeter Wemm NCURSES_EXPORT(WINDOW *)
407a69bbfbSPeter Wemm getwin(FILE *filep)
410e3d5408SPeter Wemm {
420e3d5408SPeter Wemm     WINDOW tmp, *nwin;
430e3d5408SPeter Wemm     int n;
440e3d5408SPeter Wemm 
450e3d5408SPeter Wemm     T((T_CALLED("getwin(%p)"), filep));
460e3d5408SPeter Wemm 
474a1a9510SRong-En Fan     clearerr(filep);
480e3d5408SPeter Wemm     (void) fread(&tmp, sizeof(WINDOW), 1, filep);
490e3d5408SPeter Wemm     if (ferror(filep))
500e3d5408SPeter Wemm 	returnWin(0);
510e3d5408SPeter Wemm 
524a1a9510SRong-En Fan     if (tmp._flags & _ISPAD) {
534a1a9510SRong-En Fan 	nwin = newpad(tmp._maxy + 1, tmp._maxx + 1);
544a1a9510SRong-En Fan     } else {
554a1a9510SRong-En Fan 	nwin = newwin(tmp._maxy + 1, tmp._maxx + 1, 0, 0);
564a1a9510SRong-En Fan     }
570e3d5408SPeter Wemm 
580e3d5408SPeter Wemm     /*
590e3d5408SPeter Wemm      * We deliberately do not restore the _parx, _pary, or _parent
600e3d5408SPeter Wemm      * fields, because the window hierarchy within which they
610e3d5408SPeter Wemm      * made sense is probably gone.
620e3d5408SPeter Wemm      */
634a1a9510SRong-En Fan     if (nwin != 0) {
640e3d5408SPeter Wemm 	nwin->_curx = tmp._curx;
650e3d5408SPeter Wemm 	nwin->_cury = tmp._cury;
660e3d5408SPeter Wemm 	nwin->_maxy = tmp._maxy;
670e3d5408SPeter Wemm 	nwin->_maxx = tmp._maxx;
680e3d5408SPeter Wemm 	nwin->_begy = tmp._begy;
690e3d5408SPeter Wemm 	nwin->_begx = tmp._begx;
700e3d5408SPeter Wemm 	nwin->_yoffset = tmp._yoffset;
714a1a9510SRong-En Fan 	nwin->_flags = tmp._flags & ~(_SUBWIN);
720e3d5408SPeter Wemm 
734a1a9510SRong-En Fan 	WINDOW_ATTRS(nwin) = WINDOW_ATTRS(&tmp);
7439f2269fSPeter Wemm 	nwin->_nc_bkgd = tmp._nc_bkgd;
750e3d5408SPeter Wemm 
764a1a9510SRong-En Fan 	nwin->_notimeout = tmp._notimeout;
770e3d5408SPeter Wemm 	nwin->_clear = tmp._clear;
780e3d5408SPeter Wemm 	nwin->_leaveok = tmp._leaveok;
794a1a9510SRong-En Fan 	nwin->_idlok = tmp._idlok;
804a1a9510SRong-En Fan 	nwin->_idcok = tmp._idcok;
814a1a9510SRong-En Fan 	nwin->_immed = tmp._immed;
824a1a9510SRong-En Fan 	nwin->_scroll = tmp._scroll;
834a1a9510SRong-En Fan 	nwin->_sync = tmp._sync;
840e3d5408SPeter Wemm 	nwin->_use_keypad = tmp._use_keypad;
850e3d5408SPeter Wemm 	nwin->_delay = tmp._delay;
860e3d5408SPeter Wemm 
870e3d5408SPeter Wemm 	nwin->_regtop = tmp._regtop;
880e3d5408SPeter Wemm 	nwin->_regbottom = tmp._regbottom;
890e3d5408SPeter Wemm 
904a1a9510SRong-En Fan 	if (tmp._flags & _ISPAD)
914a1a9510SRong-En Fan 	    nwin->_pad = tmp._pad;
924a1a9510SRong-En Fan 
934a1a9510SRong-En Fan 	for (n = 0; n <= nwin->_maxy; n++) {
944a1a9510SRong-En Fan 	    clearerr(filep);
950e3d5408SPeter Wemm 	    (void) fread(nwin->_line[n].text,
964a1a9510SRong-En Fan 			 sizeof(NCURSES_CH_T),
974a1a9510SRong-En Fan 			 (size_t) (nwin->_maxx + 1),
984a1a9510SRong-En Fan 			 filep);
997a69bbfbSPeter Wemm 	    if (ferror(filep)) {
1000e3d5408SPeter Wemm 		delwin(nwin);
1010e3d5408SPeter Wemm 		returnWin(0);
1020e3d5408SPeter Wemm 	    }
1030e3d5408SPeter Wemm 	}
1040e3d5408SPeter Wemm 	touchwin(nwin);
1054a1a9510SRong-En Fan     }
1060e3d5408SPeter Wemm     returnWin(nwin);
1070e3d5408SPeter Wemm }
1080e3d5408SPeter Wemm 
1097a69bbfbSPeter Wemm NCURSES_EXPORT(int)
1107a69bbfbSPeter Wemm putwin(WINDOW *win, FILE *filep)
1110e3d5408SPeter Wemm {
1120e3d5408SPeter Wemm     int code = ERR;
1130e3d5408SPeter Wemm     int n;
1140e3d5408SPeter Wemm 
1150e3d5408SPeter Wemm     T((T_CALLED("putwin(%p,%p)"), win, filep));
1160e3d5408SPeter Wemm 
1174a1a9510SRong-En Fan     if (win != 0) {
1184a1a9510SRong-En Fan 	size_t len = (win->_maxx + 1);
1194a1a9510SRong-En Fan 
1204a1a9510SRong-En Fan 	clearerr(filep);
1214a1a9510SRong-En Fan 	if (fwrite(win, sizeof(WINDOW), 1, filep) != 1
1224a1a9510SRong-En Fan 	    || ferror(filep))
1230e3d5408SPeter Wemm 	      returnCode(code);
1240e3d5408SPeter Wemm 
1254a1a9510SRong-En Fan 	for (n = 0; n <= win->_maxy; n++) {
1264a1a9510SRong-En Fan 	    if (fwrite(win->_line[n].text,
1274a1a9510SRong-En Fan 		       sizeof(NCURSES_CH_T), len, filep) != len
1284a1a9510SRong-En Fan 		|| ferror(filep)) {
1290e3d5408SPeter Wemm 		returnCode(code);
1300e3d5408SPeter Wemm 	    }
1314a1a9510SRong-En Fan 	}
1320e3d5408SPeter Wemm 	code = OK;
1330e3d5408SPeter Wemm     }
1340e3d5408SPeter Wemm     returnCode(code);
1350e3d5408SPeter Wemm }
1360e3d5408SPeter Wemm 
1377a69bbfbSPeter Wemm NCURSES_EXPORT(int)
1387a69bbfbSPeter Wemm scr_restore(const char *file)
1390e3d5408SPeter Wemm {
1400e3d5408SPeter Wemm     FILE *fp = 0;
1410e3d5408SPeter Wemm 
1420e3d5408SPeter Wemm     T((T_CALLED("scr_restore(%s)"), _nc_visbuf(file)));
1430e3d5408SPeter Wemm 
1440e3d5408SPeter Wemm     if (_nc_access(file, R_OK) < 0
1454a1a9510SRong-En Fan 	|| (fp = fopen(file, "rb")) == 0) {
1460e3d5408SPeter Wemm 	returnCode(ERR);
1474a1a9510SRong-En Fan     } else {
1480e3d5408SPeter Wemm 	delwin(newscr);
1494a1a9510SRong-En Fan 	SP->_newscr = newscr = getwin(fp);
1500e3d5408SPeter Wemm 	(void) fclose(fp);
1510e3d5408SPeter Wemm 	returnCode(OK);
1520e3d5408SPeter Wemm     }
1530e3d5408SPeter Wemm }
1540e3d5408SPeter Wemm 
1557a69bbfbSPeter Wemm NCURSES_EXPORT(int)
1567a69bbfbSPeter Wemm scr_dump(const char *file)
1570e3d5408SPeter Wemm {
1580e3d5408SPeter Wemm     FILE *fp = 0;
1590e3d5408SPeter Wemm 
1600e3d5408SPeter Wemm     T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file)));
1610e3d5408SPeter Wemm 
1620e3d5408SPeter Wemm     if (_nc_access(file, W_OK) < 0
1634a1a9510SRong-En Fan 	|| (fp = fopen(file, "wb")) == 0) {
1640e3d5408SPeter Wemm 	returnCode(ERR);
1654a1a9510SRong-En Fan     } else {
1660e3d5408SPeter Wemm 	(void) putwin(newscr, fp);
1670e3d5408SPeter Wemm 	(void) fclose(fp);
1680e3d5408SPeter Wemm 	returnCode(OK);
1690e3d5408SPeter Wemm     }
1700e3d5408SPeter Wemm }
1710e3d5408SPeter Wemm 
1727a69bbfbSPeter Wemm NCURSES_EXPORT(int)
1737a69bbfbSPeter Wemm scr_init(const char *file)
1740e3d5408SPeter Wemm {
1750e3d5408SPeter Wemm     FILE *fp = 0;
1760e3d5408SPeter Wemm 
1770e3d5408SPeter Wemm     T((T_CALLED("scr_init(%s)"), _nc_visbuf(file)));
1780e3d5408SPeter Wemm 
1790e3d5408SPeter Wemm     if (exit_ca_mode && non_rev_rmcup)
1800e3d5408SPeter Wemm 	returnCode(ERR);
1810e3d5408SPeter Wemm 
1820e3d5408SPeter Wemm     if (_nc_access(file, R_OK) < 0
1834a1a9510SRong-En Fan 	|| (fp = fopen(file, "rb")) == 0) {
1840e3d5408SPeter Wemm 	returnCode(ERR);
1854a1a9510SRong-En Fan     } else {
1860e3d5408SPeter Wemm 	delwin(curscr);
1874a1a9510SRong-En Fan 	SP->_curscr = curscr = getwin(fp);
1880e3d5408SPeter Wemm 	(void) fclose(fp);
1890e3d5408SPeter Wemm 	returnCode(OK);
1900e3d5408SPeter Wemm     }
1910e3d5408SPeter Wemm }
1920e3d5408SPeter Wemm 
1937a69bbfbSPeter Wemm NCURSES_EXPORT(int)
1947a69bbfbSPeter Wemm scr_set(const char *file)
1950e3d5408SPeter Wemm {
1960e3d5408SPeter Wemm     T((T_CALLED("scr_set(%s)"), _nc_visbuf(file)));
1970e3d5408SPeter Wemm 
1984a1a9510SRong-En Fan     if (scr_init(file) == ERR) {
1990e3d5408SPeter Wemm 	returnCode(ERR);
2004a1a9510SRong-En Fan     } else {
2010e3d5408SPeter Wemm 	delwin(newscr);
2024a1a9510SRong-En Fan 	SP->_newscr = newscr = dupwin(curscr);
2030e3d5408SPeter Wemm 	returnCode(OK);
2040e3d5408SPeter Wemm     }
2050e3d5408SPeter Wemm }
206