scrolling has come
[unix-history] / usr / src / usr.bin / window / cmd1.c
CommitLineData
827ef1a8 1#ifndef lint
b0d4d9e2 2static char *sccsid = "@(#)cmd1.c 3.3 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;
20 for (;;) {
21 wwsetcursor(row, col);
b4be6cd6 22 while (bpeekc() < 0)
827ef1a8 23 bread();
bb05dfb5 24 switch (getpos(&row, &col, 1, 0)) {
827ef1a8 25 case -1:
bb05dfb5 26 /*
827ef1a8 27 WBoxActive = 0;
bb05dfb5 28 */
101acab4 29 if (!terse)
bb05dfb5 30 (void) wwputs("\r\nCancelled. ", cmdwin);
b4be6cd6 31 return;
827ef1a8
EW
32 case 1:
33 break;
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 (;;) {
bb05dfb5 44 /*
827ef1a8 45 Wbox(col, row, xcol - col + 1, xrow - row + 1);
bb05dfb5 46 */
827ef1a8
EW
47 wwsetcursor(xrow, xcol);
48 wwflush();
b4be6cd6 49 while (bpeekc() < 0)
827ef1a8 50 bread();
bb05dfb5 51 switch (getpos(&xrow, &xcol, row, col)) {
827ef1a8 52 case -1:
bb05dfb5 53 /*
827ef1a8 54 WBoxActive = 0;
bb05dfb5 55 */
101acab4 56 if (!terse)
bb05dfb5 57 (void) wwputs("\r\nCancelled. ", cmdwin);
b4be6cd6 58 return;
827ef1a8
EW
59 case 1:
60 break;
61 case 0:
62 continue;
63 }
64 break;
65 }
bb05dfb5 66 /*
827ef1a8 67 WBoxActive = 0;
bb05dfb5 68 */
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);
8c4fb896
EW
160 switch (wwfork(w)) {
161 case -1:
bb05dfb5 162 c_close(w);
8c4fb896
EW
163 return 0;
164 case 0:
f5db29dc
EW
165 execl(shell, shellname, 0);
166 perror(shell);
8c4fb896 167 exit(1);
827ef1a8 168 }
8c4fb896 169 return w;
827ef1a8 170}
c417b691
EW
171
172reframe()
173{
174 register struct ww *w;
175
bb05dfb5
EW
176 wwunframe(framewin);
177 for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
0896e17e 178 if (w->ww_hasframe) {
bb05dfb5 179 wwframe(w, framewin);
bb05dfb5 180 labelwin(w);
0896e17e 181 }
c417b691 182}