xref: /original-bsd/usr.bin/window/cmd1.c (revision 4b2c5e10)
1 #ifndef lint
2 static	char *sccsid = "@(#)cmd1.c	3.1 83/08/11";
3 #endif
4 
5 #include "defs.h"
6 
7 c_window()
8 {
9 	int col, row, xcol, xrow;
10 	int id;
11 
12 	if ((id = findid()) < 0) {
13 		error("Too many windows.");
14 		return;
15 	}
16 	if (!terse)
17 		(void) wwputs("Upper left corner: ", cmdwin);
18 	col = 0;
19 	row = 1;
20 	for (;;) {
21 		wwsetcursor(row, col);
22 		while (bpeekc() < 0)
23 			bread();
24 		switch (getpos(&row, &col, 1, 0)) {
25 		case -1:
26 			/*
27 			WBoxActive = 0;
28 			*/
29 			if (!terse)
30 				(void) wwputs("\r\nCancelled.  ", cmdwin);
31 			return;
32 		case 1:
33 			break;
34 		case 0:
35 			continue;
36 		}
37 		break;
38 	}
39 	if (!terse)
40 		(void) wwputs("\r\nLower right corner: ", cmdwin);
41 	xcol = col;
42 	xrow = row;
43 	for (;;) {
44 		/*
45 		Wbox(col, row, xcol - col + 1, xrow - row + 1);
46 		*/
47 		wwsetcursor(xrow, xcol);
48 		wwflush();
49 		while (bpeekc() < 0)
50 			bread();
51 		switch (getpos(&xrow, &xcol, row, col)) {
52 		case -1:
53 			/*
54 			WBoxActive = 0;
55 			*/
56 			if (!terse)
57 				(void) wwputs("\r\nCancelled.  ", cmdwin);
58 			return;
59 		case 1:
60 			break;
61 		case 0:
62 			continue;
63 		}
64 		break;
65 	}
66 	/*
67 	WBoxActive = 0;
68 	*/
69 	if (!terse)
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.");
74 }
75 
76 findid()
77 {
78 	register i;
79 
80 	for (i = 0; i < NWINDOW && window[i] != 0; i++)
81 		;
82 	return i < NWINDOW ? i : -1;
83 }
84 
85 getpos(row, col, minrow, mincol)
86 register 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':
110 			if ((*col += count) >= wwncol)
111 				*col = wwncol - 1;
112 			break;
113 		case 'L':
114 			*col = wwncol - 1;
115 			break;
116 		case 'j':
117 			if ((*row += count) >= wwnrow)
118 				*row = wwnrow - 1;
119 			break;
120 		case 'J':
121 			*row = wwnrow - 1;
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:
135 			if (!terse)
136 				(void) wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
137 			wwbell();
138 		}
139 	}
140 	return 0;
141 }
142 
143 struct ww *
144 openwin(id, nrow, ncol, row, col)
145 int id, nrow, ncol, row, col;
146 {
147 	register struct ww *w;
148 
149 	if (row <= 0)
150 		return 0;
151 	if (id < 0 && (id = findid()) < 0)
152 		return 0;
153 	if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, 0)) == 0)
154 		return 0;
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);
160 	switch (wwfork(w)) {
161 	case -1:
162 		c_close(w);
163 		return 0;
164 	case 0:
165 		execl(shell, shellname, 0);
166 		perror(shell);
167 		exit(1);
168 	}
169 	return w;
170 }
171 
172 reframe()
173 {
174 	register struct ww *w;
175 
176 	wwunframe(framewin);
177 	for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
178 		if (w->ww_hasframe)
179 			wwframe(w, framewin);
180 	for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
181 		if (w->ww_hasframe)
182 			labelwin(w);
183 }
184