changable escape character.
[unix-history] / usr / src / usr.bin / window / cmd.c
CommitLineData
f6dc361a 1#ifndef lint
6821e691 2static char *sccsid = "@(#)cmd.c 1.5 83/07/22";
f6dc361a
EW
3#endif
4
5#include "defs.h"
6
7struct ww *getwin();
8struct ww *openwin();
9char *strtime();
10
11docmd()
12{
13 register char c;
14 register struct ww *w;
15 char buf;
16
17top:
18 Wunhide(cmdwin->ww_win);
c417b691
EW
19 if (selwin != 0)
20 Woncursor(selwin->ww_win, 1);
f6dc361a
EW
21 while ((c = bgetc()) >= 0) {
22 wwputs("\r\n", cmdwin);
23 switch (c) {
24 case 'r':
25 case 'R':
c417b691
EW
26 case 'h': case 'j': case 'k': case 'l':
27 case CTRL(u):
28 case CTRL(d):
29 case CTRL(b):
30 case CTRL(f):
f6dc361a
EW
31 case CTRL([):
32 case ESCAPE:
33 if (selwin == 0) {
34 wwputs("No window. ", cmdwin);
35 continue;
36 }
37 }
38 switch (c) {
39 case '1': case '2': case '3': case '4': case '5':
40 case '6': case '7': case '8': case '9':
41 if ((w = wwfind(c - '0')) == 0) {
42 Ding();
43 break;
44 }
45 setselwin(w);
46 goto out;
47 case '%':
48 if ((w = getwin()) == 0)
49 break;
50 setselwin(w);
51 break;
52 case 'c':
c417b691
EW
53 doclose(CLOSE_ONE, getwin());
54 break;
f6dc361a 55 case 'C':
c417b691
EW
56 doclose(CLOSE_DEAD, (struct ww *)0);
57 break;
f6dc361a 58 case 'Z':
c417b691 59 doclose(CLOSE_ALL, (struct ww *)0);
f6dc361a
EW
60 break;
61 case 'w':
62 dowindow();
63 break;
b4be6cd6
EW
64 case 'Q':
65 doquery();
66 break;
f6dc361a
EW
67 case 'r':
68 selwin->ww_refresh = 0;
69 break;
70 case 'R':
71 selwin->ww_refresh = 1;
72 break;
6821e691
EW
73 case 's':
74 dostat();
75 break;
f6dc361a
EW
76 case 't':
77 dotime(RUSAGE_SELF);
78 break;
79 case 'T':
80 dotime(RUSAGE_CHILDREN);
81 break;
c417b691
EW
82 case 'h':
83 Wcurleft(selwin->ww_win, 1);
84 break;
85 case 'j':
86 Wcurdown(selwin->ww_win, 1);
87 break;
88 case 'k':
89 Wcurup(selwin->ww_win, 1);
90 break;
91 case 'l':
92 Wcurright(selwin->ww_win, 1);
93 break;
94 case CTRL(d):
95 doscroll(1);
96 break;
97 case CTRL(u):
98 doscroll(-1);
99 break;
100 case CTRL(f):
101 doscroll(2);
102 break;
103 case CTRL(b):
104 doscroll(-2);
105 break;
f6dc361a
EW
106 case CTRL(l):
107 ScreenGarbaged = 1;
108 break;
109 case '?':
110 dohelp();
111 break;
112 case ESCAPE:
113 buf = ESCAPE;
114 write(selwin->ww_pty, &buf, 1);
115 case CTRL([):
116 goto out;
117 case CTRL(z):
118 wwsuspend();
119 break;
120 case '.':
8c4fb896
EW
121 doquit();
122 if (quit)
123 goto out;
124 break;
f6dc361a
EW
125 default:
126 Ding();
8c4fb896 127 wwprintf(cmdwin, "Type ? for help. ");
f6dc361a
EW
128 break;
129 }
130 }
131 wwputs("Command: ", cmdwin);
132 wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
b4be6cd6 133 while (bpeekc() < 0)
f6dc361a 134 bread();
f6dc361a
EW
135 goto top;
136out:
137 if (!quit)
8c4fb896 138 wwsetcurwin(selwin);
c417b691
EW
139 if (selwin != 0)
140 Woncursor(selwin->ww_win, 0);
f6dc361a
EW
141 Whide(cmdwin->ww_win);
142}
143
144struct ww *
145getwin()
146{
147 register int c;
148 struct ww *w;
149
b4be6cd6 150 while ((c = bgetc()) < 0)
f6dc361a 151 bread();
f6dc361a
EW
152 if (c < '1' || c > '9') {
153 Ding();
154 return 0;
155 }
156 if ((w = wwfind(c - '0')) == 0)
157 Ding();
158 return w;
159}
160
161setselwin(w)
162register struct ww *w;
163{
c417b691 164 if (selwin) {
f6dc361a 165 labelwin(selwin, 0);
c417b691
EW
166 Woncursor(selwin->ww_win, 0);
167 }
168 if (selwin = w) {
f6dc361a
EW
169 labelwin(w, WINVERSE);
170 /* bring it to the top just below cmdwin */
8c4fb896
EW
171 wwsetcurwin(w);
172 wwsetcurwin(cmdwin);
c417b691 173 Woncursor(w->ww_win, 1);
f6dc361a
EW
174 }
175}
176
177labelwin(w, mode)
178register struct ww *w;
179{
180 char buf[2];
181
182 buf[0] = w->ww_ident + '0';
183 buf[1] = 0;
184 wwlabel(w, buf, mode);
185}