front() must reframe() when called from setselwin()
[unix-history] / usr / src / usr.bin / window / cmd1.c
CommitLineData
827ef1a8 1#ifndef lint
eec72f58 2static char *sccsid = "@(#)cmd1.c 3.17 83/12/01";
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
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
74findid()
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
87getpos(row, col, minrow, mincol, maxrow, maxcol)
88register int *row, *col;
89int minrow, mincol;
90int 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 150struct ww *
74bf1c32 151openwin(id, row, col, nrow, ncol, nline, label)
8c4fb896 152int id, nrow, ncol, row, col;
74bf1c32 153char *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}