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