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