date and time created 88/06/29 21:19:25 by bostic
[unix-history] / usr / src / usr.bin / window / wwopen.c
CommitLineData
60de5df9 1/*
46e9ea25
KB
2 * Copyright (c) 1983 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.
60de5df9
EW
11 */
12
46e9ea25
KB
13#ifndef lint
14static char sccsid[] = "@(#)wwopen.c 3.24 (Berkeley) %G%";
15#endif /* not lint */
16
138b737c 17#include "ww.h"
7ecf4dca
EW
18#include <sys/types.h>
19#include <sys/socket.h>
138b737c 20
138b737c 21struct ww *
bb05dfb5 22wwopen(flags, nrow, ncol, row, col, nline)
138b737c 23{
a8a39d2c 24 register struct ww *w;
bb05dfb5
EW
25 register i, j;
26 char m;
27 short nvis;
138b737c 28
03f0d462 29 w = (struct ww *)calloc(sizeof (struct ww), 1);
03e75950
EW
30 if (w == 0) {
31 wwerrno = WWE_NOMEM;
03f0d462 32 goto bad;
03e75950 33 }
eec72f58 34 w->ww_pty = -1;
7ecf4dca 35 w->ww_socket = -1;
03f0d462 36
bb05dfb5
EW
37 for (i = 0; i < NWW && wwindex[i] != 0; i++)
38 ;
03e75950
EW
39 if (i >= NWW) {
40 wwerrno = WWE_TOOMANY;
138b737c 41 goto bad;
03e75950 42 }
bb05dfb5 43 w->ww_index = i;
bb05dfb5 44
f2a77fe1
EW
45 if (nline < nrow)
46 nline = nrow;
47
19f9784c
EW
48 w->ww_w.t = row;
49 w->ww_w.b = row + nrow;
50 w->ww_w.l = col;
51 w->ww_w.r = col + ncol;
52 w->ww_w.nr = nrow;
53 w->ww_w.nc = ncol;
f2a77fe1
EW
54
55 w->ww_b.t = row;
56 w->ww_b.b = row + nline;
57 w->ww_b.l = col;
58 w->ww_b.r = col + ncol;
59 w->ww_b.nr = nline;
60 w->ww_b.nc = ncol;
61
19f9784c
EW
62 w->ww_i.t = MAX(w->ww_w.t, 0);
63 w->ww_i.b = MIN(w->ww_w.b, wwnrow);
64 w->ww_i.l = MAX(w->ww_w.l, 0);
65 w->ww_i.r = MIN(w->ww_w.r, wwncol);
66 w->ww_i.nr = w->ww_i.b - w->ww_i.t;
67 w->ww_i.nc = w->ww_i.r - w->ww_i.l;
68
f2a77fe1
EW
69 w->ww_cur.r = w->ww_w.t;
70 w->ww_cur.c = w->ww_w.l;
bb05dfb5 71
03f0d462 72 if (flags & WWO_PTY) {
b27a9cfb
EW
73 struct winsize winsize;
74
03f0d462
EW
75 if (wwgetpty(w) < 0)
76 goto bad;
4cbd8755 77 if (wwsettty(w->ww_pty, &wwwintty, (struct ww_tty *)0) < 0)
03f0d462 78 goto bad;
b27a9cfb
EW
79 winsize.ws_row = nrow;
80 winsize.ws_col = ncol;
81 winsize.ws_xpixel = winsize.ws_ypixel = 0;
20029082 82 if (ioctl(w->ww_pty, TIOCSWINSZ, (char *)&winsize) < 0) {
b27a9cfb
EW
83 wwerrno = WWE_SYS;
84 goto bad;
85 }
7ecf4dca
EW
86 w->ww_ispty = 1;
87 } else if (flags & WWO_SOCKET) {
88 int d[2];
89 if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, d) < 0) {
90 wwerrno = WWE_SYS;
8fa6d94c 91 goto bad;
7ecf4dca
EW
92 }
93 w->ww_pty = d[0];
94 w->ww_socket = d[1];
95 }
96 if (flags & (WWO_PTY|WWO_SOCKET)) {
97 if ((w->ww_ob = malloc(512)) == 0) {
98 wwerrno = WWE_NOMEM;
99 goto bad;
100 }
8fa6d94c 101 w->ww_obe = w->ww_ob + 512;
7ecf4dca 102 w->ww_obp = w->ww_obq = w->ww_ob;
03f0d462
EW
103 }
104
f2a77fe1
EW
105 w->ww_win = wwalloc(w->ww_w.t, w->ww_w.l,
106 w->ww_w.nr, w->ww_w.nc, sizeof (char));
bb05dfb5
EW
107 if (w->ww_win == 0)
108 goto bad;
109 m = 0;
110 if (flags & WWO_GLASS)
111 m |= WWM_GLS;
112 if (flags & WWO_REVERSE)
f4f5703a
EW
113 if (wwavailmodes & WWM_REV)
114 m |= WWM_REV;
115 else
116 flags &= ~WWO_REVERSE;
f2a77fe1
EW
117 for (i = w->ww_w.t; i < w->ww_w.b; i++)
118 for (j = w->ww_w.l; j < w->ww_w.r; j++)
bb05dfb5 119 w->ww_win[i][j] = m;
2357b64e
EW
120
121 if (flags & WWO_FRAME) {
f2a77fe1
EW
122 w->ww_fmap = wwalloc(w->ww_w.t, w->ww_w.l,
123 w->ww_w.nr, w->ww_w.nc, sizeof (char));
2357b64e 124 if (w->ww_fmap == 0)
b27a9cfb 125 goto bad;
f2a77fe1
EW
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++)
2357b64e
EW
128 w->ww_fmap[i][j] = 0;
129 }
b27a9cfb 130
bb05dfb5 131 w->ww_buf = (union ww_char **)
f2a77fe1
EW
132 wwalloc(w->ww_b.t, w->ww_b.l,
133 w->ww_b.nr, w->ww_b.nc, sizeof (union ww_char));
bb05dfb5
EW
134 if (w->ww_buf == 0)
135 goto bad;
f2a77fe1
EW
136 for (i = w->ww_b.t; i < w->ww_b.b; i++)
137 for (j = w->ww_b.l; j < w->ww_b.r; j++)
bb05dfb5
EW
138 w->ww_buf[i][j].c_w = ' ';
139
140 w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short));
03e75950
EW
141 if (w->ww_nvis == 0) {
142 wwerrno = WWE_NOMEM;
138b737c 143 goto bad;
03e75950 144 }
f2a77fe1 145 w->ww_nvis -= w->ww_w.t;
bb05dfb5 146 nvis = m ? 0 : w->ww_w.nc;
f2a77fe1 147 for (i = w->ww_w.t; i < w->ww_w.b; i++)
bb05dfb5
EW
148 w->ww_nvis[i] = nvis;
149
150 w->ww_state = WWS_INITIAL;
b27a9cfb 151 w->ww_oflags = flags;
03f0d462 152 return wwindex[w->ww_index] = w;
138b737c 153bad:
4711df8b 154 if (w != 0) {
bb05dfb5 155 if (w->ww_win != 0)
f2a77fe1 156 wwfree(w->ww_win, w->ww_w.t);
07f640ea 157 if (w->ww_fmap != 0)
f2a77fe1 158 wwfree(w->ww_fmap, w->ww_w.t);
bb05dfb5 159 if (w->ww_buf != 0)
f2a77fe1 160 wwfree((char **)w->ww_buf, w->ww_b.t);
bb05dfb5 161 if (w->ww_nvis != 0)
f2a77fe1 162 free((char *)(w->ww_nvis + w->ww_w.t));
8fa6d94c
EW
163 if (w->ww_ob != 0)
164 free(w->ww_ob);
7ecf4dca
EW
165 if (w->ww_pty >= 0)
166 (void) close(w->ww_pty);
167 if (w->ww_socket >= 0)
168 (void) close(w->ww_socket);
489d8a09 169 free((char *)w);
4711df8b 170 }
138b737c
EW
171 return 0;
172}