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