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