inline expand some function calls
[unix-history] / usr / src / usr.bin / window / cmd1.c
CommitLineData
827ef1a8 1#ifndef lint
19f9784c 2static char *sccsid = "@(#)cmd1.c 3.11 83/09/14";
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
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
71findid()
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
84getpos(row, col, minrow, mincol, maxrow, maxcol)
85register int *row, *col;
86int minrow, mincol;
87int 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 144struct ww *
4cbe417d 145openwin(id, row, col, nrow, ncol, nline)
8c4fb896 146int 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;
19f9784c
EW
152 if (row + nrow <= 0 || row > wwnrow - 1
153 || col + ncol <= 0 || col > wwncol - 1) {
154 error("Illegal window size or position.");
03e75950
EW
155 return 0;
156 }
157 if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, nline)) == 0) {
158 error("%s.", wwerror());
8c4fb896 159 return 0;
03e75950 160 }
bb05dfb5
EW
161 w->ww_id = id;
162 window[id] = w;
163 w->ww_hasframe = 1;
73218728 164 wwcursor(w, 1);
fe24a747
EW
165 wwadd(w, framewin);
166 selwin = w;
167 reframe(); /* setselwin() won't do it */
55ae5bf1
EW
168 wwupdate();
169 wwflush();
8c4fb896
EW
170 switch (wwfork(w)) {
171 case -1:
bb05dfb5 172 c_close(w);
03e75950 173 error("%s.", wwerror());
8c4fb896
EW
174 return 0;
175 case 0:
f5db29dc
EW
176 execl(shell, shellname, 0);
177 perror(shell);
8c4fb896 178 exit(1);
827ef1a8 179 }
8c4fb896 180 return w;
827ef1a8 181}