Commit | Line | Data |
---|---|---|
827ef1a8 | 1 | #ifndef lint |
8baf70f5 | 2 | static char *sccsid = "@(#)cmd1.c 3.10 83/08/31"; |
827ef1a8 EW |
3 | #endif |
4 | ||
5 | #include "defs.h" | |
6 | ||
bb05dfb5 | 7 | c_window() |
827ef1a8 EW |
8 | { |
9 | int col, row, xcol, xrow; | |
827ef1a8 | 10 | int id; |
827ef1a8 | 11 | |
03e75950 | 12 | if ((id = findid()) < 0) |
827ef1a8 | 13 | return; |
101acab4 | 14 | if (!terse) |
bb05dfb5 | 15 | (void) wwputs("Upper left corner: ", cmdwin); |
827ef1a8 EW |
16 | col = 0; |
17 | row = 1; | |
43c1dd56 | 18 | wwadd(boxwin, framewin->ww_back); |
827ef1a8 | 19 | for (;;) { |
43c1dd56 | 20 | wwbox(boxwin, row - 1, col - 1, 3, 3); |
827ef1a8 | 21 | wwsetcursor(row, col); |
b4be6cd6 | 22 | while (bpeekc() < 0) |
827ef1a8 | 23 | bread(); |
8baf70f5 EW |
24 | wwunbox(boxwin); |
25 | switch (getpos(&row, &col, 1, 0, wwnrow - 1, wwncol - 1)) { | |
827ef1a8 | 26 | case -1: |
43c1dd56 | 27 | wwdelete(boxwin); |
101acab4 | 28 | if (!terse) |
bb05dfb5 | 29 | (void) wwputs("\r\nCancelled. ", cmdwin); |
b4be6cd6 | 30 | return; |
827ef1a8 EW |
31 | case 1: |
32 | break; | |
33 | case 0: | |
34 | continue; | |
35 | } | |
36 | break; | |
37 | } | |
101acab4 | 38 | if (!terse) |
bb05dfb5 EW |
39 | (void) wwputs("\r\nLower right corner: ", cmdwin); |
40 | xcol = col; | |
41 | xrow = row; | |
827ef1a8 | 42 | for (;;) { |
43c1dd56 EW |
43 | wwbox(boxwin, row - 1, col - 1, |
44 | xrow - row + 3, xcol - col + 3); | |
827ef1a8 EW |
45 | wwsetcursor(xrow, xcol); |
46 | wwflush(); | |
b4be6cd6 | 47 | while (bpeekc() < 0) |
827ef1a8 | 48 | bread(); |
8baf70f5 EW |
49 | wwunbox(boxwin); |
50 | switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1)) | |
51 | { | |
827ef1a8 | 52 | case -1: |
43c1dd56 | 53 | wwdelete(boxwin); |
101acab4 | 54 | if (!terse) |
bb05dfb5 | 55 | (void) wwputs("\r\nCancelled. ", cmdwin); |
b4be6cd6 | 56 | return; |
827ef1a8 EW |
57 | case 1: |
58 | break; | |
59 | case 0: | |
60 | continue; | |
61 | } | |
62 | break; | |
63 | } | |
43c1dd56 | 64 | wwdelete(boxwin); |
101acab4 | 65 | if (!terse) |
bb05dfb5 EW |
66 | (void) wwputs("\r\n", cmdwin); |
67 | wwcurtowin(cmdwin); | |
03e75950 | 68 | (void) openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline); |
8c4fb896 EW |
69 | } |
70 | ||
71 | findid() | |
72 | { | |
bb05dfb5 | 73 | register i; |
8c4fb896 | 74 | |
bb05dfb5 | 75 | for (i = 0; i < NWINDOW && window[i] != 0; i++) |
8c4fb896 | 76 | ; |
03e75950 EW |
77 | if (i >= NWINDOW) { |
78 | error("Too many windows."); | |
79 | return -1; | |
80 | } | |
81 | return i; | |
827ef1a8 EW |
82 | } |
83 | ||
8baf70f5 EW |
84 | getpos(row, col, minrow, mincol, maxrow, maxcol) |
85 | register int *row, *col; | |
86 | int minrow, mincol; | |
87 | int maxrow, maxcol; | |
827ef1a8 EW |
88 | { |
89 | static int scount = 0; | |
90 | int count; | |
91 | char c; | |
92 | ||
93 | while ((c = bgetc()) >= 0) { | |
94 | switch (c) { | |
95 | case '0': case '1': case '2': case '3': case '4': | |
96 | case '5': case '6': case '7': case '8': case '9': | |
97 | scount = scount * 10 + c - '0'; | |
98 | continue; | |
99 | } | |
100 | count = scount ? scount : 1; | |
101 | scount = 0; | |
102 | switch (c) { | |
103 | case 'h': | |
104 | if ((*col -= count) < mincol) | |
105 | *col = mincol; | |
106 | break; | |
107 | case 'H': | |
108 | *col = mincol; | |
109 | break; | |
110 | case 'l': | |
8baf70f5 EW |
111 | if ((*col += count) > maxcol) |
112 | *col = maxcol; | |
827ef1a8 EW |
113 | break; |
114 | case 'L': | |
8baf70f5 | 115 | *col = maxcol; |
827ef1a8 EW |
116 | break; |
117 | case 'j': | |
8baf70f5 EW |
118 | if ((*row += count) > maxrow) |
119 | *row = maxrow; | |
827ef1a8 EW |
120 | break; |
121 | case 'J': | |
8baf70f5 | 122 | *row = maxrow; |
827ef1a8 EW |
123 | break; |
124 | case 'k': | |
125 | if ((*row -= count) < minrow) | |
126 | *row = minrow; | |
127 | break; | |
128 | case 'K': | |
129 | *row = minrow; | |
130 | break; | |
131 | case CTRL([): | |
132 | return -1; | |
133 | case '\r': | |
134 | return 1; | |
135 | default: | |
101acab4 | 136 | if (!terse) |
bb05dfb5 EW |
137 | (void) wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin); |
138 | wwbell(); | |
827ef1a8 EW |
139 | } |
140 | } | |
141 | return 0; | |
142 | } | |
143 | ||
8c4fb896 | 144 | struct ww * |
4cbe417d | 145 | openwin(id, row, col, nrow, ncol, nline) |
8c4fb896 | 146 | int id, nrow, ncol, row, col; |
827ef1a8 EW |
147 | { |
148 | register struct ww *w; | |
149 | ||
8c4fb896 EW |
150 | if (id < 0 && (id = findid()) < 0) |
151 | return 0; | |
03e75950 EW |
152 | if (row <= 0) { |
153 | error("Bad row number."); | |
154 | return 0; | |
155 | } | |
156 | if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, nline)) == 0) { | |
157 | error("%s.", wwerror()); | |
8c4fb896 | 158 | return 0; |
03e75950 | 159 | } |
bb05dfb5 EW |
160 | w->ww_id = id; |
161 | window[id] = w; | |
162 | w->ww_hasframe = 1; | |
73218728 | 163 | wwcursor(w, 1); |
fe24a747 EW |
164 | wwadd(w, framewin); |
165 | selwin = w; | |
166 | reframe(); /* setselwin() won't do it */ | |
55ae5bf1 EW |
167 | wwupdate(); |
168 | wwflush(); | |
8c4fb896 EW |
169 | switch (wwfork(w)) { |
170 | case -1: | |
bb05dfb5 | 171 | c_close(w); |
03e75950 | 172 | error("%s.", wwerror()); |
8c4fb896 EW |
173 | return 0; |
174 | case 0: | |
f5db29dc EW |
175 | execl(shell, shellname, 0); |
176 | perror(shell); | |
8c4fb896 | 177 | exit(1); |
827ef1a8 | 178 | } |
8c4fb896 | 179 | return w; |
827ef1a8 | 180 | } |