1 /* 2 * Copyright (c) 1981 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that this notice is preserved and that due credit is given 7 * to the University of California at Berkeley. The name of the University 8 * may not be used to endorse or promote products derived from this 9 * software without specific prior written permission. This software 10 * is provided ``as is'' without express or implied warranty. 11 */ 12 13 #ifndef lint 14 static char sccsid[] = "@(#)newwin.c 5.2 (Berkeley) 06/08/88"; 15 #endif /* not lint */ 16 17 /* 18 * allocate space for and set up defaults for a new window 19 * 20 */ 21 22 # include "curses.ext" 23 24 char *malloc(); 25 26 # define SMALLOC (short *) malloc 27 28 static WINDOW *makenew(); 29 30 # undef nl /* don't need it here, and it interferes */ 31 32 WINDOW * 33 newwin(num_lines, num_cols, begy, begx) 34 int num_lines, num_cols, begy, begx; 35 { 36 reg WINDOW *win; 37 reg char *sp; 38 reg int i, by, bx, nl, nc; 39 reg int j; 40 41 by = begy; 42 bx = begx; 43 nl = num_lines; 44 nc = num_cols; 45 46 if (nl == 0) 47 nl = LINES - by; 48 if (nc == 0) 49 nc = COLS - bx; 50 if ((win = makenew(nl, nc, by, bx)) == NULL) 51 return ERR; 52 if ((win->_firstch = SMALLOC(nl * sizeof win->_firstch[0])) == NULL) { 53 free(win->_y); 54 free(win); 55 return NULL; 56 } 57 if ((win->_lastch = SMALLOC(nl * sizeof win->_lastch[0])) == NULL) { 58 free(win->_y); 59 free(win->_firstch); 60 free(win); 61 return NULL; 62 } 63 win->_nextp = win; 64 for (i = 0; i < nl; i++) { 65 win->_firstch[i] = _NOCHANGE; 66 win->_lastch[i] = _NOCHANGE; 67 } 68 for (i = 0; i < nl; i++) 69 if ((win->_y[i] = malloc(nc * sizeof win->_y[0])) == NULL) { 70 for (j = 0; j < i; j++) 71 free(win->_y[j]); 72 free(win->_firstch); 73 free(win->_lastch); 74 free(win->_y); 75 free(win); 76 return ERR; 77 } 78 else 79 for (sp = win->_y[i]; sp < win->_y[i] + nc; ) 80 *sp++ = ' '; 81 win->_ch_off = 0; 82 # ifdef DEBUG 83 fprintf(outf, "NEWWIN: win->_ch_off = %d\n", win->_ch_off); 84 # endif 85 return win; 86 } 87 88 WINDOW * 89 subwin(orig, num_lines, num_cols, begy, begx) 90 reg WINDOW *orig; 91 int num_lines, num_cols, begy, begx; 92 { 93 reg int i; 94 reg WINDOW *win; 95 reg int by, bx, nl, nc; 96 97 by = begy; 98 bx = begx; 99 nl = num_lines; 100 nc = num_cols; 101 102 /* 103 * make sure window fits inside the original one 104 */ 105 # ifdef DEBUG 106 fprintf(outf, "SUBWIN(%0.2o, %d, %d, %d, %d)\n", orig, nl, nc, by, bx); 107 # endif 108 if (by < orig->_begy || bx < orig->_begx 109 || by + nl > orig->_maxy + orig->_begy 110 || bx + nc > orig->_maxx + orig->_begx) 111 return ERR; 112 if (nl == 0) 113 nl = orig->_maxy + orig->_begy - by; 114 if (nc == 0) 115 nc = orig->_maxx + orig->_begx - bx; 116 if ((win = makenew(nl, nc, by, bx)) == NULL) 117 return ERR; 118 win->_nextp = orig->_nextp; 119 orig->_nextp = win; 120 win->_orig = orig; 121 _set_subwin_(orig, win); 122 return win; 123 } 124 125 /* 126 * this code is shared with mvwin() 127 */ 128 _set_subwin_(orig, win) 129 register WINDOW *orig, *win; 130 { 131 register int i, j, k; 132 133 j = win->_begy - orig->_begy; 134 k = win->_begx - orig->_begx; 135 win->_ch_off = k; 136 # ifdef DEBUG 137 fprintf(outf, "_SET_SUBWIN_: win->_ch_off = %d\n", win->_ch_off); 138 # endif 139 win->_firstch = &orig->_firstch[j]; 140 win->_lastch = &orig->_lastch[j]; 141 for (i = 0; i < win->_maxy; i++, j++) 142 win->_y[i] = &orig->_y[j][k]; 143 144 } 145 146 /* 147 * This routine sets up a window buffer and returns a pointer to it. 148 */ 149 static WINDOW * 150 makenew(num_lines, num_cols, begy, begx) 151 int num_lines, num_cols, begy, begx; { 152 153 reg int i; 154 reg WINDOW *win; 155 reg int by, bx, nl, nc; 156 157 by = begy; 158 bx = begx; 159 nl = num_lines; 160 nc = num_cols; 161 162 # ifdef DEBUG 163 fprintf(outf, "MAKENEW(%d, %d, %d, %d)\n", nl, nc, by, bx); 164 # endif 165 if ((win = (WINDOW *) malloc(sizeof *win)) == NULL) 166 return NULL; 167 # ifdef DEBUG 168 fprintf(outf, "MAKENEW: nl = %d\n", nl); 169 # endif 170 if ((win->_y = (char **) malloc(nl * sizeof win->_y[0])) == NULL) { 171 free(win); 172 return NULL; 173 } 174 # ifdef DEBUG 175 fprintf(outf, "MAKENEW: nc = %d\n", nc); 176 # endif 177 win->_cury = win->_curx = 0; 178 win->_clear = FALSE; 179 win->_maxy = nl; 180 win->_maxx = nc; 181 win->_begy = by; 182 win->_begx = bx; 183 win->_flags = 0; 184 win->_scroll = win->_leave = FALSE; 185 _swflags_(win); 186 # ifdef DEBUG 187 fprintf(outf, "MAKENEW: win->_clear = %d\n", win->_clear); 188 fprintf(outf, "MAKENEW: win->_leave = %d\n", win->_leave); 189 fprintf(outf, "MAKENEW: win->_scroll = %d\n", win->_scroll); 190 fprintf(outf, "MAKENEW: win->_flags = %0.2o\n", win->_flags); 191 fprintf(outf, "MAKENEW: win->_maxy = %d\n", win->_maxy); 192 fprintf(outf, "MAKENEW: win->_maxx = %d\n", win->_maxx); 193 fprintf(outf, "MAKENEW: win->_begy = %d\n", win->_begy); 194 fprintf(outf, "MAKENEW: win->_begx = %d\n", win->_begx); 195 # endif 196 return win; 197 } 198 199 _swflags_(win) 200 register WINDOW *win; 201 { 202 win->_flags &= ~(_ENDLINE|_FULLLINE|_FULLWIN|_SCROLLWIN); 203 if (win->_begx + win->_maxx == COLS) { 204 win->_flags |= _ENDLINE; 205 if (win->_begx == 0) { 206 if (AL && DL) 207 win->_flags |= _FULLLINE; 208 if (win->_maxy == LINES && win->_begy == 0) 209 win->_flags |= _FULLWIN; 210 } 211 if (win->_begy + win->_maxy == LINES) 212 win->_flags |= _SCROLLWIN; 213 } 214 } 215