1 /****************************************************************************
2 * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. *
4 * Permission is hereby granted, free of charge, to any person obtaining a *
5 * copy of this software and associated documentation files (the *
6 * "Software"), to deal in the Software without restriction, including *
7 * without limitation the rights to use, copy, modify, merge, publish, *
8 * distribute, distribute with modifications, sublicense, and/or sell *
9 * copies of the Software, and to permit persons to whom the Software is *
10 * furnished to do so, subject to the following conditions: *
12 * The above copyright notice and this permission notice shall be included *
13 * in all copies or substantial portions of the Software. *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
23 * Except as contained in this notice, the name(s) of the above copyright *
24 * holders shall not be used in advertising or otherwise to promote the *
25 * sale, use or other dealings in this Software without prior written *
27 ****************************************************************************/
29 /****************************************************************************
30 * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
31 * and: Eric S. Raymond <esr@snark.thyrsus.com> *
32 * and: Thomas E. Dickey 1996 on *
33 * and: Juergen Pfeifer 2009 *
34 ****************************************************************************/
36 #include <curses.priv.h>
39 #define CUR SP_TERMTYPE
42 MODULE_ID("$Id: lib_screen.c,v 1.38 2009/10/24 22:08:55 tom Exp $")
44 #define MAX_SIZE 0x3fff /* 16k is big enough for a window or pad */
46 NCURSES_EXPORT(WINDOW
*)
47 NCURSES_SP_NAME(getwin
) (NCURSES_SP_DCLx
FILE *filep
)
52 T((T_CALLED("getwin(%p)"), (void *) filep
));
55 if (fread(&tmp
, 1, sizeof(WINDOW
), filep
) < sizeof(WINDOW
)
58 || tmp
._maxy
> MAX_SIZE
60 || tmp
._maxx
> MAX_SIZE
) {
64 if (tmp
._flags
& _ISPAD
) {
65 nwin
= NCURSES_SP_NAME(newpad
) (NCURSES_SP_ARGx
69 nwin
= NCURSES_SP_NAME(newwin
) (NCURSES_SP_ARGx
75 * We deliberately do not restore the _parx, _pary, or _parent
76 * fields, because the window hierarchy within which they
77 * made sense is probably gone.
80 size_t linesize
= sizeof(NCURSES_CH_T
) * (size_t) (tmp
._maxx
+ 1);
82 nwin
->_curx
= tmp
._curx
;
83 nwin
->_cury
= tmp
._cury
;
84 nwin
->_maxy
= tmp
._maxy
;
85 nwin
->_maxx
= tmp
._maxx
;
86 nwin
->_begy
= tmp
._begy
;
87 nwin
->_begx
= tmp
._begx
;
88 nwin
->_yoffset
= tmp
._yoffset
;
89 nwin
->_flags
= tmp
._flags
& ~(_SUBWIN
);
91 WINDOW_ATTRS(nwin
) = WINDOW_ATTRS(&tmp
);
92 nwin
->_nc_bkgd
= tmp
._nc_bkgd
;
94 nwin
->_notimeout
= tmp
._notimeout
;
95 nwin
->_clear
= tmp
._clear
;
96 nwin
->_leaveok
= tmp
._leaveok
;
97 nwin
->_idlok
= tmp
._idlok
;
98 nwin
->_idcok
= tmp
._idcok
;
99 nwin
->_immed
= tmp
._immed
;
100 nwin
->_scroll
= tmp
._scroll
;
101 nwin
->_sync
= tmp
._sync
;
102 nwin
->_use_keypad
= tmp
._use_keypad
;
103 nwin
->_delay
= tmp
._delay
;
105 nwin
->_regtop
= tmp
._regtop
;
106 nwin
->_regbottom
= tmp
._regbottom
;
108 if (tmp
._flags
& _ISPAD
)
109 nwin
->_pad
= tmp
._pad
;
111 for (n
= 0; n
<= nwin
->_maxy
; n
++) {
113 if (fread(nwin
->_line
[n
].text
, 1, linesize
, filep
) < linesize
125 NCURSES_EXPORT(WINDOW
*)
128 return NCURSES_SP_NAME(getwin
) (CURRENT_SCREEN
, filep
);
133 putwin(WINDOW
*win
, FILE *filep
)
138 T((T_CALLED("putwin(%p,%p)"), (void *) win
, (void *) filep
));
141 size_t len
= (size_t) (win
->_maxx
+ 1);
144 if (fwrite(win
, sizeof(WINDOW
), 1, filep
) != 1
148 for (n
= 0; n
<= win
->_maxy
; n
++) {
149 if (fwrite(win
->_line
[n
].text
,
150 sizeof(NCURSES_CH_T
), len
, filep
) != len
161 NCURSES_SP_NAME(scr_restore
) (NCURSES_SP_DCLx
const char *file
)
165 T((T_CALLED("scr_restore(%p,%s)"), (void *) SP_PARM
, _nc_visbuf(file
)));
167 if (_nc_access(file
, R_OK
) < 0
168 || (fp
= fopen(file
, "rb")) == 0) {
171 delwin(NewScreen(SP_PARM
));
172 NewScreen(SP_PARM
) = getwin(fp
);
174 newscr
= NewScreen(SP_PARM
);
183 scr_restore(const char *file
)
185 return NCURSES_SP_NAME(scr_restore
) (CURRENT_SCREEN
, file
);
190 scr_dump(const char *file
)
194 T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file
)));
196 if (_nc_access(file
, W_OK
) < 0
197 || (fp
= fopen(file
, "wb")) == 0) {
200 (void) putwin(newscr
, fp
);
207 NCURSES_SP_NAME(scr_init
) (NCURSES_SP_DCLx
const char *file
)
212 T((T_CALLED("scr_init(%p,%s)"), (void *) SP_PARM
, _nc_visbuf(file
)));
215 #ifdef USE_TERM_DRIVER
216 InfoOf(SP_PARM
).caninit
218 !(exit_ca_mode
&& non_rev_rmcup
)
221 if (_nc_access(file
, R_OK
) >= 0
222 && (fp
= fopen(file
, "rb")) != 0) {
223 delwin(CurScreen(SP_PARM
));
224 CurScreen(SP_PARM
) = getwin(fp
);
226 curscr
= CurScreen(SP_PARM
);
237 scr_init(const char *file
)
239 return NCURSES_SP_NAME(scr_init
) (CURRENT_SCREEN
, file
);
244 NCURSES_SP_NAME(scr_set
) (NCURSES_SP_DCLx
const char *file
)
246 T((T_CALLED("scr_set(%p,%s)"), (void *) SP_PARM
, _nc_visbuf(file
)));
248 if (NCURSES_SP_NAME(scr_init
) (NCURSES_SP_ARGx file
) == ERR
) {
251 delwin(NewScreen(SP_PARM
));
252 NewScreen(SP_PARM
) = dupwin(curscr
);
254 newscr
= NewScreen(SP_PARM
);
262 scr_set(const char *file
)
264 return NCURSES_SP_NAME(scr_set
) (CURRENT_SCREEN
, file
);