150276Speter/**************************************************************************** 2184989Srafan * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. * 350276Speter * * 450276Speter * Permission is hereby granted, free of charge, to any person obtaining a * 550276Speter * copy of this software and associated documentation files (the * 650276Speter * "Software"), to deal in the Software without restriction, including * 750276Speter * without limitation the rights to use, copy, modify, merge, publish, * 850276Speter * distribute, distribute with modifications, sublicense, and/or sell * 950276Speter * copies of the Software, and to permit persons to whom the Software is * 1050276Speter * furnished to do so, subject to the following conditions: * 1150276Speter * * 1250276Speter * The above copyright notice and this permission notice shall be included * 1350276Speter * in all copies or substantial portions of the Software. * 1450276Speter * * 1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 2250276Speter * * 2350276Speter * Except as contained in this notice, the name(s) of the above copyright * 2450276Speter * holders shall not be used in advertising or otherwise to promote the * 2550276Speter * sale, use or other dealings in this Software without prior written * 2650276Speter * authorization. * 2750276Speter ****************************************************************************/ 2850276Speter 2950276Speter/**************************************************************************** 3050276Speter * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 3150276Speter * and: Eric S. Raymond <esr@snark.thyrsus.com> * 32184989Srafan * and: Thomas E. Dickey 1996 on * 3350276Speter ****************************************************************************/ 3450276Speter 3550276Speter#include <curses.priv.h> 3650276Speter 37184989SrafanMODULE_ID("$Id: lib_screen.c,v 1.31 2008/08/16 19:05:37 tom Exp $") 3850276Speter 39184989Srafan#define MAX_SIZE 0x3fff /* 16k is big enough for a window or pad */ 40184989Srafan 4176726SpeterNCURSES_EXPORT(WINDOW *) 42166124Srafangetwin(FILE *filep) 4350276Speter{ 4476726Speter WINDOW tmp, *nwin; 4576726Speter int n; 4650276Speter 4776726Speter T((T_CALLED("getwin(%p)"), filep)); 4850276Speter 49166124Srafan clearerr(filep); 5076726Speter (void) fread(&tmp, sizeof(WINDOW), 1, filep); 51184989Srafan if (ferror(filep) 52184989Srafan || tmp._maxy == 0 53184989Srafan || tmp._maxy > MAX_SIZE 54184989Srafan || tmp._maxx == 0 55184989Srafan || tmp._maxx > MAX_SIZE) 5676726Speter returnWin(0); 5750276Speter 58166124Srafan if (tmp._flags & _ISPAD) { 59166124Srafan nwin = newpad(tmp._maxy + 1, tmp._maxx + 1); 60166124Srafan } else { 61166124Srafan nwin = newwin(tmp._maxy + 1, tmp._maxx + 1, 0, 0); 62166124Srafan } 6350276Speter 6476726Speter /* 6576726Speter * We deliberately do not restore the _parx, _pary, or _parent 6676726Speter * fields, because the window hierarchy within which they 6776726Speter * made sense is probably gone. 6876726Speter */ 69166124Srafan if (nwin != 0) { 70166124Srafan nwin->_curx = tmp._curx; 71166124Srafan nwin->_cury = tmp._cury; 72166124Srafan nwin->_maxy = tmp._maxy; 73166124Srafan nwin->_maxx = tmp._maxx; 74166124Srafan nwin->_begy = tmp._begy; 75166124Srafan nwin->_begx = tmp._begx; 76166124Srafan nwin->_yoffset = tmp._yoffset; 77166124Srafan nwin->_flags = tmp._flags & ~(_SUBWIN); 7850276Speter 79166124Srafan WINDOW_ATTRS(nwin) = WINDOW_ATTRS(&tmp); 80166124Srafan nwin->_nc_bkgd = tmp._nc_bkgd; 8150276Speter 82166124Srafan nwin->_notimeout = tmp._notimeout; 83166124Srafan nwin->_clear = tmp._clear; 84166124Srafan nwin->_leaveok = tmp._leaveok; 85166124Srafan nwin->_idlok = tmp._idlok; 86166124Srafan nwin->_idcok = tmp._idcok; 87166124Srafan nwin->_immed = tmp._immed; 88166124Srafan nwin->_scroll = tmp._scroll; 89166124Srafan nwin->_sync = tmp._sync; 90166124Srafan nwin->_use_keypad = tmp._use_keypad; 91166124Srafan nwin->_delay = tmp._delay; 9250276Speter 93166124Srafan nwin->_regtop = tmp._regtop; 94166124Srafan nwin->_regbottom = tmp._regbottom; 9550276Speter 96166124Srafan if (tmp._flags & _ISPAD) 97166124Srafan nwin->_pad = tmp._pad; 98166124Srafan 99166124Srafan for (n = 0; n <= nwin->_maxy; n++) { 100166124Srafan clearerr(filep); 101166124Srafan (void) fread(nwin->_line[n].text, 102166124Srafan sizeof(NCURSES_CH_T), 103166124Srafan (size_t) (nwin->_maxx + 1), 104166124Srafan filep); 105166124Srafan if (ferror(filep)) { 106166124Srafan delwin(nwin); 107166124Srafan returnWin(0); 108166124Srafan } 10950276Speter } 110166124Srafan touchwin(nwin); 11176726Speter } 11276726Speter returnWin(nwin); 11350276Speter} 11450276Speter 11576726SpeterNCURSES_EXPORT(int) 116166124Srafanputwin(WINDOW *win, FILE *filep) 11750276Speter{ 11876726Speter int code = ERR; 11976726Speter int n; 12050276Speter 12176726Speter T((T_CALLED("putwin(%p,%p)"), win, filep)); 12250276Speter 123166124Srafan if (win != 0) { 124184989Srafan size_t len = (size_t) (win->_maxx + 1); 12550276Speter 126166124Srafan clearerr(filep); 127166124Srafan if (fwrite(win, sizeof(WINDOW), 1, filep) != 1 128166124Srafan || ferror(filep)) 129166124Srafan returnCode(code); 130166124Srafan 131166124Srafan for (n = 0; n <= win->_maxy; n++) { 132166124Srafan if (fwrite(win->_line[n].text, 133166124Srafan sizeof(NCURSES_CH_T), len, filep) != len 134166124Srafan || ferror(filep)) { 13550276Speter returnCode(code); 136166124Srafan } 13750276Speter } 13876726Speter code = OK; 13976726Speter } 14076726Speter returnCode(code); 14150276Speter} 14250276Speter 14376726SpeterNCURSES_EXPORT(int) 14476726Speterscr_restore(const char *file) 14550276Speter{ 14676726Speter FILE *fp = 0; 14750276Speter 14876726Speter T((T_CALLED("scr_restore(%s)"), _nc_visbuf(file))); 14950276Speter 15076726Speter if (_nc_access(file, R_OK) < 0 151166124Srafan || (fp = fopen(file, "rb")) == 0) { 15276726Speter returnCode(ERR); 153166124Srafan } else { 15476726Speter delwin(newscr); 155174993Srafan SP->_newscr = getwin(fp); 156174993Srafan#if !USE_REENTRANT 157174993Srafan newscr = SP->_newscr; 158174993Srafan#endif 15976726Speter (void) fclose(fp); 16076726Speter returnCode(OK); 16176726Speter } 16250276Speter} 16350276Speter 16476726SpeterNCURSES_EXPORT(int) 16576726Speterscr_dump(const char *file) 16650276Speter{ 16776726Speter FILE *fp = 0; 16850276Speter 16976726Speter T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file))); 17050276Speter 17176726Speter if (_nc_access(file, W_OK) < 0 172166124Srafan || (fp = fopen(file, "wb")) == 0) { 17376726Speter returnCode(ERR); 174166124Srafan } else { 17576726Speter (void) putwin(newscr, fp); 17676726Speter (void) fclose(fp); 17776726Speter returnCode(OK); 17876726Speter } 17950276Speter} 18050276Speter 18176726SpeterNCURSES_EXPORT(int) 18276726Speterscr_init(const char *file) 18350276Speter{ 18476726Speter FILE *fp = 0; 18550276Speter 18676726Speter T((T_CALLED("scr_init(%s)"), _nc_visbuf(file))); 18750276Speter 18876726Speter if (exit_ca_mode && non_rev_rmcup) 18976726Speter returnCode(ERR); 19050276Speter 19176726Speter if (_nc_access(file, R_OK) < 0 192166124Srafan || (fp = fopen(file, "rb")) == 0) { 19376726Speter returnCode(ERR); 194166124Srafan } else { 19576726Speter delwin(curscr); 196174993Srafan SP->_curscr = getwin(fp); 197174993Srafan#if !USE_REENTRANT 198174993Srafan curscr = SP->_curscr; 199174993Srafan#endif 20076726Speter (void) fclose(fp); 20176726Speter returnCode(OK); 20276726Speter } 20350276Speter} 20450276Speter 20576726SpeterNCURSES_EXPORT(int) 20676726Speterscr_set(const char *file) 20750276Speter{ 20850276Speter T((T_CALLED("scr_set(%s)"), _nc_visbuf(file))); 20950276Speter 210166124Srafan if (scr_init(file) == ERR) { 21150276Speter returnCode(ERR); 212166124Srafan } else { 21350276Speter delwin(newscr); 214174993Srafan SP->_newscr = dupwin(curscr); 215174993Srafan#if !USE_REENTRANT 216174993Srafan newscr = SP->_newscr; 217174993Srafan#endif 21850276Speter returnCode(OK); 21950276Speter } 22050276Speter} 221