# 2.11BSD#431 - /usr/src/ucb/window/wwsize.c

##### Functions

    wwsize            X

       1: #ifndef lint
       2: static char sccsid[] = "@(#)wwsize.c	3.3 4/24/85";
       3: #endif
       4:
       5: /*
       6:  * Copyright (c) 1983 Regents of the University of California,
       7:  * All rights reserved.  Redistribution permitted subject to
       8:  * the terms of the Berkeley Software License Agreement.
       9:  */
      10:
      11: #include "ww.h"
      12:
      13: /*
      14:  * Resize a window.  Should be unattached.
      15:  */
      16: wwsize(w, nrow, ncol)
      17: register struct ww *w;
      18: {
      19:     register i, j;
      20:     int nline;
      21:     union ww_char **buf = 0;
      22:     char **win = 0;
      23:     short *nvis = 0;
      24:     char **fmap = 0;
      25:     char m;
      26:
      27:     /*
      28: 	 * First allocate new buffers.
      29: 	 */
      30:     win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
      31:     if (win == 0)
      32:         goto bad;
      33:     if (w->ww_fmap != 0) {
      34:         fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
      35:         if (fmap == 0)
      36:             goto bad;
      37:     }
      38:     if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) {
      39:         nline = MAX(w->ww_b.nr, nrow);
      40:         buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l,
      41:             nline, ncol, sizeof (union ww_char));
      42:         if (buf == 0)
      43:             goto bad;
      44:     }
      45:     nvis = (short *)malloc((unsigned) nrow * sizeof (short));
      46:     if (nvis == 0) {
      47:         wwerrno = WWE_NOMEM;
      48:         goto bad;
      49:     }
      50:     nvis -= w->ww_w.t;
      51:     /*
      52: 	 * Copy text buffer.
      53: 	 */
      54:     if (buf != 0) {
      55:         int b, r;
      56:
      57:         b = w->ww_b.t + nline;
      58:         r = w->ww_b.l + ncol;
      59:         if (ncol < w->ww_b.nc)
      60:             for (i = w->ww_b.t; i < w->ww_b.b; i++)
      61:                 for (j = w->ww_b.l; j < r; j++)
      62:                     buf[i][j] = w->ww_buf[i][j];
      63:         else
      64:             for (i = w->ww_b.t; i < w->ww_b.b; i++) {
      65:                 for (j = w->ww_b.l; j < w->ww_b.r; j++)
      66:                     buf[i][j] = w->ww_buf[i][j];
      67:                 for (; j < r; j++)
      68:                     buf[i][j].c_w = ' ';
      69:             }
      70:         for (; i < b; i++)
      71:             for (j = w->ww_b.l; j < r; j++)
      72:                 buf[i][j].c_w = ' ';
      73:     }
      74:     /*
      75: 	 * Now free the old stuff.
      76: 	 */
      77:     wwfree((char **)w->ww_win, w->ww_w.t);
      78:     w->ww_win = win;
      79:     if (buf != 0) {
      80:         wwfree((char **)w->ww_buf, w->ww_b.t);
      81:         w->ww_buf = buf;
      82:     }
      83:     if (w->ww_fmap != 0) {
      84:         wwfree((char **)w->ww_fmap, w->ww_w.t);
      85:         w->ww_fmap = fmap;
      86:     }
      87:     free((char *)(w->ww_nvis + w->ww_w.t));
      88:     w->ww_nvis = nvis;
      89:     /*
      90: 	 * Set new sizes.
      91: 	 */
      92:         /* window */
      93:     w->ww_w.b = w->ww_w.t + nrow;
      94:     w->ww_w.r = w->ww_w.l + ncol;
      95:     w->ww_w.nr = nrow;
      96:     w->ww_w.nc = ncol;
      97:         /* text buffer */
      98:     if (buf != 0) {
      99:         w->ww_b.b = w->ww_b.t + nline;
     100:         w->ww_b.r = w->ww_b.l + ncol;
     101:         w->ww_b.nr = nline;
     102:         w->ww_b.nc = ncol;
     103:     }
     104:         /* scroll */
     105:     if ((i = w->ww_b.b - w->ww_w.b) < 0 ||
     106:         (i = w->ww_cur.r - w->ww_w.b + 1) > 0) {
     107:         w->ww_buf += i;
     108:         w->ww_b.t -= i;
     109:         w->ww_b.b -= i;
     110:         w->ww_cur.r -= i;
     111:     }
     112:         /* interior */
     113:     w->ww_i.b = MIN(w->ww_w.b, wwnrow);
     114:     w->ww_i.r = MIN(w->ww_w.r, wwncol);
     115:     w->ww_i.nr = w->ww_i.b - w->ww_i.t;
     116:     w->ww_i.nc = w->ww_i.r - w->ww_i.l;
     117:     /*
     118: 	 * Initialize new buffers.
     119: 	 */
     120:         /* window */
     121:     m = 0;
     122:     if (w->ww_oflags & WWO_GLASS)
     123:         m |= WWM_GLS;
     124:     if (w->ww_oflags & WWO_REVERSE)
     125:         m |= WWM_REV;
     126:     for (i = w->ww_w.t; i < w->ww_w.b; i++)
     127:         for (j = w->ww_w.l; j < w->ww_w.r; j++)
     128:             w->ww_win[i][j] = m;
     129:         /* frame map */
     130:     if (fmap != 0)
     131:         for (i = w->ww_w.t; i < w->ww_w.b; i++)
     132:             for (j = w->ww_w.l; j < w->ww_w.r; j++)
     133:                 w->ww_fmap[i][j] = 0;
     134:         /* visibility */
     135:     j = m ? 0 : w->ww_w.nc;
     136:     for (i = w->ww_w.t; i < w->ww_w.b; i++)
     137:         w->ww_nvis[i] = j;
     138:     /*
     139: 	 * Put cursor back.
     140: 	 */
     141:     if (w->ww_hascursor) {
     142:         w->ww_hascursor = 0;
     143:         wwcursor(w, 1);
     144:     }
     145:     /*
     146: 	 * Fool with pty.
     147: 	 */
     148:     if (w->ww_ispty && w->ww_pty >= 0) {
     149:         struct winsize winsize;
     150:
     151:         winsize.ws_row = nrow;
     152:         winsize.ws_col = ncol;
     153:         winsize.ws_xpixel = winsize.ws_ypixel = 0;
     154:         (void) ioctl(w->ww_pty, TIOCSWINSZ, (char *)&winsize);
     155:     }
     156:     return 0;
     157: bad:
     158:     if (win != 0)
     159:         wwfree(win, w->ww_w.t);
     160:     if (fmap != 0)
     161:         wwfree(fmap, w->ww_w.t);
     162:     if (buf != 0)
     163:         wwfree((char **)buf, w->ww_b.t);
     164:     if (nvis != 0)
     165:         free((char *)(nvis + w->ww_w.t));
     166:     return -1;
     167: }

#### Defined functions

wwsize defined in line 16; used 1 times

- in /usr/src/ucb/window/win.c line 255

#### Defined variables

sccsid defined in line 2; never used

Last modified: 1988-06-14 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 551 |