new options to "window": shell, pty, frame
[unix-history] / usr / src / usr.bin / window / main.c
CommitLineData
fc38b21b 1#ifndef lint
7ecf4dca 2static char *sccsid = "@(#)main.c 3.23 84/04/08";
fc38b21b
EW
3#endif
4
2b44d852 5#include "defs.h"
b1189050
EW
6#include <sys/signal.h>
7#include <stdio.h>
7ecf4dca 8#include "string.h"
0e64e422 9#include "char.h"
fc38b21b 10
db4a5bb1 11#define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage()))
a9353152 12
bb05dfb5 13/*ARGSUSED*/
a9353152
EW
14main(argc, argv)
15char **argv;
fc38b21b 16{
fc38b21b 17 register char *p;
c8ec0306
EW
18 char fflag = 0;
19 char dflag = 0;
5a7d5d43 20 char xflag = 0;
ffa20db4
EW
21 char *cmd = 0;
22 char tflag = 0;
fc38b21b 23
db4a5bb1
EW
24 if (p = rindex(*argv, '/'))
25 p++;
26 else
27 p = *argv;
28 debug = strcmp(p, "a.out") == 0;
a9353152
EW
29 while (*++argv) {
30 if (**argv == '-') {
31 switch (*++*argv) {
db4a5bb1 32 case 'f':
c8ec0306 33 fflag++;
db4a5bb1 34 break;
ffa20db4
EW
35 case 'c':
36 if (cmd != 0) {
37 (void) fprintf(stderr,
38 "Only one -c allowed.\n");
39 (void) usage();
40 }
41 cmd = next(argv);
42 break;
a9353152
EW
43 case 'e':
44 setescape(next(argv));
45 break;
46 case 't':
ffa20db4 47 tflag++;
a9353152 48 break;
db4a5bb1 49 case 'd':
c8ec0306
EW
50 dflag++;
51 break;
52 case 'D':
ad5cb1cc 53 debug = !debug;
db4a5bb1 54 break;
5a7d5d43
EW
55 case 'x':
56 xflag++;
57 break;
a9353152 58 default:
bb05dfb5 59 (void) usage();
a9353152
EW
60 }
61 } else
bb05dfb5 62 (void) usage();
a9353152 63 }
4222244b 64 nbufline = 48; /* compatible */
0e64e422 65 escapec = ctrl(p);
7ecf4dca
EW
66 if ((p = getenv("SHELL")) == 0)
67 p = "/bin/csh";
68 if ((shellfile = str_cpy(p)) == 0)
69 nomem();
70 if (p = rindex(shellfile, '/'))
71 p++;
db4a5bb1 72 else
7ecf4dca
EW
73 p = shellfile;
74 shell[0] = p;
75 shell[1] = 0;
57fc9db6 76#ifndef O_4_1A
b1189050 77 (void) gettimeofday(&starttime, (struct timezone *)0);
57fc9db6 78#endif
4711df8b 79 if (wwinit() < 0) {
b416f8a6 80 (void) fprintf(stderr, "%s.\n", wwerror());
4711df8b
EW
81 exit(1);
82 }
5a7d5d43 83 if (debug)
db4a5bb1 84 wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc;
5a7d5d43
EW
85 if (xflag) {
86 wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc;
87 wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc;
db4a5bb1 88 }
5a7d5d43
EW
89 if (debug || xflag)
90 (void) wwsettty(0, &wwnewtty);
bb05dfb5
EW
91
92 if ((cmdwin = wwopen(WWO_REVERSE, 1, wwncol, 0, 0, 0)) == 0) {
93 (void) wwflush();
b416f8a6 94 (void) fprintf(stderr, "%s.\r\n", wwerror());
bb05dfb5
EW
95 goto bad;
96 }
bf3b96e9 97 cmdwin->ww_mapnl = 1;
b1189050 98 cmdwin->ww_nointr = 1;
0e64e422 99 cmdwin->ww_noupdate = 1;
7ecf4dca 100 cmdwin->ww_unctrl = 1;
2357b64e
EW
101 if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0))
102 == 0) {
bb05dfb5 103 (void) wwflush();
b416f8a6 104 (void) fprintf(stderr, "%s.\r\n", wwerror());
4711df8b
EW
105 goto bad;
106 }
bb05dfb5 107 wwadd(framewin, &wwhead);
43c1dd56
EW
108 if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) {
109 (void) wwflush();
b416f8a6 110 (void) fprintf(stderr, "%s.\r\n", wwerror());
43c1dd56
EW
111 goto bad;
112 }
e1dba5dd 113 fgwin = framewin;
bb05dfb5 114
bb05dfb5 115 wwupdate();
2b44d852 116 wwflush();
fc38b21b 117 (void) signal(SIGCHLD, wwchild);
6e1c2156 118 setvars();
ffa20db4
EW
119
120 setterse(tflag);
121 setcmd(1);
122 if (cmd != 0)
09e37cd5 123 (void) dolongcmd(cmd);
ffa20db4 124 if (!fflag) {
c8ec0306 125 if (dflag || doconfig() < 0)
db4a5bb1 126 dodefault();
ffa20db4
EW
127 if (selwin != 0)
128 setcmd(0);
db4a5bb1 129 }
b416f8a6
EW
130
131 mloop();
132
bb05dfb5
EW
133 wwupdate();
134 wwflush();
fc38b21b 135bad:
fc38b21b
EW
136 wwend();
137 return 0;
138}
a9353152
EW
139
140usage()
141{
7ecf4dca 142 (void) fprintf(stderr, "Usage: window [-e escape-char] [-c command] [-t] [-f] [-d]\n");
30647f51
EW
143 exit(1);
144 return 0; /* for lint */
a9353152 145}
7ecf4dca
EW
146
147nomem()
148{
149 (void) fprintf(stderr, "Out of memory.\n");
150 exit(1);
151}