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