Commit | Line | Data |
---|---|---|
f6dc361a | 1 | #ifndef lint |
6821e691 | 2 | static char *sccsid = "@(#)cmd.c 1.5 83/07/22"; |
f6dc361a EW |
3 | #endif |
4 | ||
5 | #include "defs.h" | |
6 | ||
7 | struct ww *getwin(); | |
8 | struct ww *openwin(); | |
9 | char *strtime(); | |
10 | ||
11 | docmd() | |
12 | { | |
13 | register char c; | |
14 | register struct ww *w; | |
15 | char buf; | |
16 | ||
17 | top: | |
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; |
136 | out: | |
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 | ||
144 | struct ww * | |
145 | getwin() | |
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 | ||
161 | setselwin(w) | |
162 | register 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 | ||
177 | labelwin(w, mode) | |
178 | register 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 | } |