xref: /original-bsd/usr.bin/window/cmd1.c (revision 0cca9f5d)
1 #ifndef lint
2 static char sccsid[] = "@(#)cmd1.c	3.28 03/01/85";
3 #endif
4 
5 #include "defs.h"
6 #include "char.h"
7 
8 c_window()
9 {
10 	int col, row, xcol, xrow;
11 	int id;
12 
13 	if ((id = findid()) < 0)
14 		return;
15 	if (!terse)
16 		wwputs("New window (upper left corner): ", cmdwin);
17 	col = 0;
18 	row = 1;
19 	wwadd(boxwin, framewin->ww_back);
20 	for (;;) {
21 		wwbox(boxwin, row - 1, col - 1, 3, 3);
22 		wwsetcursor(row, col);
23 		while (wwpeekc() < 0)
24 			wwiomux();
25 		switch (getpos(&row, &col, row > 1, 0,
26 			wwnrow - 1, wwncol - 1)) {
27 		case 3:
28 			wwunbox(boxwin);
29 			wwdelete(boxwin);
30 			return;
31 		case 2:
32 			wwunbox(boxwin);
33 			break;
34 		case 1:
35 			wwunbox(boxwin);
36 		case 0:
37 			continue;
38 		}
39 		break;
40 	}
41 	if (!terse)
42 		wwputs("\nNew window (lower right corner): ", cmdwin);
43 	xcol = col;
44 	xrow = row;
45 	for (;;) {
46 		wwbox(boxwin, row - 1, col - 1,
47 			xrow - row + 3, xcol - col + 3);
48 		wwsetcursor(xrow, xcol);
49 		wwflush();
50 		while (wwpeekc() < 0)
51 			wwiomux();
52 		switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
53 		{
54 		case 3:
55 			wwunbox(boxwin);
56 			wwdelete(boxwin);
57 			return;
58 		case 2:
59 			wwunbox(boxwin);
60 			break;
61 		case 1:
62 			wwunbox(boxwin);
63 		case 0:
64 			continue;
65 		}
66 		break;
67 	}
68 	wwdelete(boxwin);
69 	if (!terse)
70 		wwputc('\n', cmdwin);
71 	wwcurtowin(cmdwin);
72 	(void) openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline,
73 		(char *) 0, 1, 1, shellfile, shell);
74 }
75 
76 getpos(row, col, minrow, mincol, maxrow, maxcol)
77 register int *row, *col;
78 int minrow, mincol;
79 int maxrow, maxcol;
80 {
81 	static int scount;
82 	int count;
83 	char c;
84 	int oldrow = *row, oldcol = *col;
85 
86 	while ((c = wwgetc()) >= 0) {
87 		switch (c) {
88 		case '0': case '1': case '2': case '3': case '4':
89 		case '5': case '6': case '7': case '8': case '9':
90 			scount = scount * 10 + c - '0';
91 			continue;
92 		}
93 		count = scount ? scount : 1;
94 		scount = 0;
95 		switch (c) {
96 		case 'h':
97 			if ((*col -= count) < mincol)
98 				*col = mincol;
99 			break;
100 		case 'H':
101 			*col = mincol;
102 			break;
103 		case 'l':
104 			if ((*col += count) > maxcol)
105 				*col = maxcol;
106 			break;
107 		case 'L':
108 			*col = maxcol;
109 			break;
110 		case 'j':
111 			if ((*row += count) > maxrow)
112 				*row = maxrow;
113 			break;
114 		case 'J':
115 			*row = maxrow;
116 			break;
117 		case 'k':
118 			if ((*row -= count) < minrow)
119 				*row = minrow;
120 			break;
121 		case 'K':
122 			*row = minrow;
123 			break;
124 		case ctrl([):
125 			if (!terse)
126 				wwputs("\nCanceled.  ", cmdwin);
127 			return 3;
128 		case '\r':
129 			return 2;
130 		default:
131 			if (!terse)
132 				wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
133 			wwbell();
134 		}
135 	}
136 	return oldrow != *row || oldcol != *col;
137 }
138