Commit | Line | Data |
---|---|---|
827ef1a8 | 1 | #ifndef lint |
101acab4 | 2 | static char *sccsid = "@(#)cmd1.c 1.6 83/07/28"; |
827ef1a8 EW |
3 | #endif |
4 | ||
5 | #include "defs.h" | |
6 | ||
8c4fb896 | 7 | struct ww *doopen(); |
827ef1a8 EW |
8 | |
9 | dowindow() | |
10 | { | |
11 | int col, row, xcol, xrow; | |
827ef1a8 | 12 | int id; |
827ef1a8 | 13 | |
8c4fb896 | 14 | if ((id = findid()) < 0) { |
101acab4 EW |
15 | if (terse) |
16 | Ding(); | |
17 | else | |
18 | wwputs("Too many windows. ", cmdwin); | |
827ef1a8 EW |
19 | return; |
20 | } | |
101acab4 EW |
21 | if (!terse) |
22 | wwputs("Upper left corner: ", cmdwin); | |
827ef1a8 EW |
23 | col = 0; |
24 | row = 1; | |
25 | for (;;) { | |
26 | wwsetcursor(row, col); | |
b4be6cd6 | 27 | while (bpeekc() < 0) |
827ef1a8 | 28 | bread(); |
827ef1a8 EW |
29 | switch (getpos(&row, &col, 0, 0)) { |
30 | case -1: | |
31 | WBoxActive = 0; | |
101acab4 EW |
32 | if (!terse) |
33 | wwputs("\r\nCancelled. ", cmdwin); | |
b4be6cd6 | 34 | return; |
827ef1a8 EW |
35 | case 1: |
36 | break; | |
37 | case 0: | |
38 | continue; | |
39 | } | |
40 | break; | |
41 | } | |
101acab4 EW |
42 | if (!terse) |
43 | wwputs("\r\nLower right corner: ", cmdwin); | |
827ef1a8 EW |
44 | xcol = col + 1; |
45 | xrow = row + 1; | |
46 | for (;;) { | |
47 | Wbox(col, row, xcol - col + 1, xrow - row + 1); | |
48 | wwsetcursor(xrow, xcol); | |
49 | wwflush(); | |
b4be6cd6 | 50 | while (bpeekc() < 0) |
827ef1a8 | 51 | bread(); |
827ef1a8 EW |
52 | switch (getpos(&xrow, &xcol, row + 1, col + 1)) { |
53 | case -1: | |
54 | WBoxActive = 0; | |
101acab4 EW |
55 | if (!terse) |
56 | wwputs("\r\nCancelled. ", cmdwin); | |
b4be6cd6 | 57 | return; |
827ef1a8 EW |
58 | case 1: |
59 | break; | |
60 | case 0: | |
61 | continue; | |
62 | } | |
63 | break; | |
64 | } | |
65 | WBoxActive = 0; | |
101acab4 EW |
66 | if (!terse) |
67 | wwputs("\r\n", cmdwin); | |
8c4fb896 EW |
68 | wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win)); |
69 | if (doopen(id, xrow-row+1, xcol-col+1, row, col) == 0) | |
101acab4 EW |
70 | if (terse) |
71 | Ding(); | |
72 | else | |
73 | wwputs("Can't open window. ", cmdwin); | |
8c4fb896 EW |
74 | } |
75 | ||
76 | findid() | |
77 | { | |
78 | register id; | |
79 | char ids[10]; | |
80 | register struct ww *w; | |
8c4fb896 EW |
81 | |
82 | for (id = 1; id <= NWINDOW; id++) | |
83 | ids[id] = 0; | |
84 | for (w = wwhead; w; w = w->ww_next) { | |
85 | if (w->ww_ident < 1 || w->ww_ident > NWINDOW) | |
86 | continue; | |
87 | ids[w->ww_ident]++; | |
827ef1a8 | 88 | } |
8c4fb896 EW |
89 | for (id = 1; id <= NWINDOW && ids[id]; id++) |
90 | ; | |
91 | return id < 10 ? id : -1; | |
827ef1a8 EW |
92 | } |
93 | ||
94 | getpos(row, col, minrow, mincol) | |
95 | register int *row, *col, minrow, mincol; | |
96 | { | |
97 | static int scount = 0; | |
98 | int count; | |
99 | char c; | |
100 | ||
101 | while ((c = bgetc()) >= 0) { | |
102 | switch (c) { | |
103 | case '0': case '1': case '2': case '3': case '4': | |
104 | case '5': case '6': case '7': case '8': case '9': | |
105 | scount = scount * 10 + c - '0'; | |
106 | continue; | |
107 | } | |
108 | count = scount ? scount : 1; | |
109 | scount = 0; | |
110 | switch (c) { | |
111 | case 'h': | |
112 | if ((*col -= count) < mincol) | |
113 | *col = mincol; | |
114 | break; | |
115 | case 'H': | |
116 | *col = mincol; | |
117 | break; | |
118 | case 'l': | |
c417b691 EW |
119 | if ((*col += count) >= wwncol) |
120 | *col = wwncol - 1; | |
827ef1a8 EW |
121 | break; |
122 | case 'L': | |
c417b691 | 123 | *col = wwncol - 1; |
827ef1a8 EW |
124 | break; |
125 | case 'j': | |
c417b691 EW |
126 | if ((*row += count) >= wwnrow) |
127 | *row = wwnrow - 1; | |
827ef1a8 EW |
128 | break; |
129 | case 'J': | |
c417b691 | 130 | *row = wwnrow - 1; |
827ef1a8 EW |
131 | break; |
132 | case 'k': | |
133 | if ((*row -= count) < minrow) | |
134 | *row = minrow; | |
135 | break; | |
136 | case 'K': | |
137 | *row = minrow; | |
138 | break; | |
139 | case CTRL([): | |
140 | return -1; | |
141 | case '\r': | |
142 | return 1; | |
143 | default: | |
101acab4 EW |
144 | if (!terse) |
145 | wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin); | |
827ef1a8 EW |
146 | Ding(); |
147 | } | |
148 | } | |
149 | return 0; | |
150 | } | |
151 | ||
8c4fb896 EW |
152 | struct ww * |
153 | doopen(id, nrow, ncol, row, col) | |
154 | int id, nrow, ncol, row, col; | |
827ef1a8 EW |
155 | { |
156 | register struct ww *w; | |
157 | ||
8c4fb896 EW |
158 | if (id < 0 && (id = findid()) < 0) |
159 | return 0; | |
160 | if ((w = wwopen(WW_PTY, id, nrow, ncol, row, col)) == 0) | |
161 | return 0; | |
8c4fb896 | 162 | reframe(); |
c417b691 EW |
163 | if (selwin == 0) |
164 | setselwin(w); | |
165 | else | |
166 | wwsetcurwin(cmdwin); | |
8c4fb896 EW |
167 | wwflush(); |
168 | switch (wwfork(w)) { | |
169 | case -1: | |
101acab4 | 170 | doclose(w); |
8c4fb896 EW |
171 | return 0; |
172 | case 0: | |
173 | execl("/bin/csh", "csh", 0); | |
174 | perror("exec(csh)"); | |
175 | exit(1); | |
827ef1a8 | 176 | } |
8c4fb896 | 177 | return w; |
827ef1a8 | 178 | } |
c417b691 EW |
179 | |
180 | reframe() | |
181 | { | |
182 | register struct ww *w; | |
183 | ||
184 | for (w = wwhead; w; w = w->ww_next) { | |
185 | if (w == cmdwin) | |
186 | continue; | |
187 | wwunframe(w); | |
188 | wwframe(w); | |
799e7001 | 189 | labelwin(w); |
c417b691 EW |
190 | } |
191 | } |