1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright (c) 1995-1998 by Sun Microsystems, Inc. 24 * All rights reserved. 25 */ 26 27 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 /* LINTLIBRARY */ 30 31 /* 32 * scr_dump.c 33 * 34 * XCurses Library 35 * 36 * Copyright 1990, 1995 by Mortice Kern Systems Inc. All rights reserved. 37 * 38 */ 39 40 #if M_RCSID 41 #ifndef lint 42 static char rcsID[] = 43 "$Header: /team/ps/sun_xcurses/archive/local_changes/xcurses/src/lib/" 44 "libxcurses/src/libc/xcurses/rcs/scr_dump.c 1.6 1998/06/01 16:25:23 " 45 "cbates Exp $"; 46 #endif 47 #endif 48 49 #include <private.h> 50 #include <sys/types.h> 51 #include <sys/stat.h> 52 53 /* 54 * Save the current screen image. 55 */ 56 int 57 scr_dump(const char *f) 58 { 59 int code; 60 FILE *fp; 61 62 code = ERR; 63 64 if ((fp = fopen(f, "wb")) != NULL) { 65 code = putwin(curscr, fp); 66 (void) fclose(fp); 67 } 68 69 return (code); 70 } 71 72 static int 73 scr_replace(WINDOW *w, const char *f) 74 { 75 int i; 76 FILE *fp; 77 WINDOW *new; 78 79 if ((fp = fopen(f, "rb")) == NULL) 80 return (ERR); 81 82 new = getwin(fp); 83 (void) fclose(fp); 84 85 if (new == NULL) 86 return (ERR); 87 88 if (new->_maxy != w->_maxy || new->_maxx != w->_maxx) { 89 (void) delwin(new); 90 return (ERR); 91 } 92 93 /* Replace contents of curscr window structure. */ 94 free(w->_base); 95 free(w->_line); 96 free(w->_first); 97 new->_flags &= ~W_CLEAR_WINDOW; /* Removed default clear command */ 98 *w = *new; 99 100 /* Rehash the current screen? */ 101 if (w == curscr) 102 for (i = 0; i < w->_maxy; ++i) 103 __m_cc_hash(w, __m_screen->_hash, i); 104 105 /* Discard the working window. */ 106 new->_base = NULL; 107 new->_line = NULL; 108 new->_first = NULL; 109 (void) delwin(new); 110 /* Make sure we know where the cursor is */ 111 (void) __m_mvcur(-1, -1, curscr->_cury, curscr->_curx, __m_outc); 112 return (OK); 113 } 114 115 /* 116 * A picture of what scr_restore(), scr_init(), and scr_set() do : 117 * 118 * scr_restore() scr_init() 119 * | | 120 * stdscr V V 121 * +----+ newscr curscr 122 * | | +-------+ +-------+ 123 * +----+ refresh() -> | | | | 124 * | | doupdate() -> | | 125 * w | | | | 126 * +----+ wrefresh(w) -> | | | | 127 * | | +-------+ +-------+ 128 * +----+ ^ ^ 129 * | | 130 * \---- scr_set() ----/ 131 */ 132 133 /* 134 * Get a screen image that will appear next doupdate(), 135 * replacing the current screen. 136 */ 137 int 138 scr_restore(const char *f) 139 { 140 int code; 141 142 code = scr_replace(__m_screen->_newscr, f); 143 144 return (code); 145 } 146 147 /* 148 * Get the screen image that really reflects what is on the screen, 149 * though the applicatiion may not want it. A subsequent doupdate() 150 * will compared and make changes against this image. 151 */ 152 int 153 scr_init(const char *f) 154 { 155 int code; 156 struct stat tty, dump; 157 char *name; 158 159 name = ttyname(cur_term->_ofd); 160 if ((non_rev_rmcup && exit_ca_mode != NULL) || 161 stat(f, &dump) != 0 || name == NULL || stat(name, &tty) != 0) 162 code = ERR; 163 else { 164 if (dump.st_mtime < tty.st_mtime) 165 code = ERR; 166 else { 167 code = scr_replace(__m_screen->_curscr, f); 168 } 169 } 170 171 return (code); 172 } 173 174 /* 175 * Get the screen image that is really on the screen and that the 176 * application wants on the screen. 177 */ 178 int 179 scr_set(const char *f) 180 { 181 int code; 182 183 if ((code = scr_init(f)) == OK) 184 code = scr_restore(f); 185 186 return (code); 187 } 188